[#5289] Added features to include personal details
diff --git a/Allura/allura/command/create_trove_categories.py b/Allura/allura/command/create_trove_categories.py
index 586aac5..0dc8c47 100644
--- a/Allura/allura/command/create_trove_categories.py
+++ b/Allura/allura/command/create_trove_categories.py
@@ -18,651 +18,652 @@
 
     def create_trove_cat(self,cat_data):
         M.TroveCategory(trove_cat_id=cat_data[0], trove_parent_id=cat_data[1],
-                        shortname=cat_data[2], fullname=cat_data[3], fullpath=cat_data[4])
+                        shortname=cat_data[2], fullname=cat_data[3], fullpath=cat_data[4],
+                        show_as_skill=cat_data[5])
 
     def command(self):
         self.basic_setup()
         M.TroveCategory.query.remove()
-        self.create_trove_cat((617,274,"kirghiz","Kirghiz","Translations :: Kirghiz"))
-        self.create_trove_cat((372,274,"croatian","Croatian","Translations :: Croatian"))
-        self.create_trove_cat((351,274,"thai","Thai","Translations :: Thai"))
-        self.create_trove_cat((349,274,"tamil","Tamil","Translations :: Tamil"))
-        self.create_trove_cat((347,274,"romanian","Romanian","Translations :: Romanian"))
-        self.create_trove_cat((339,274,"korean","Korean","Translations :: Korean"))
-        self.create_trove_cat((632,160,"cobol","COBOL","Programming Language :: COBOL"))
-        self.create_trove_cat((598,160,"aspectj","AspectJ","Programming Language :: AspectJ"))
-        self.create_trove_cat((167,160,"euler","Euler","Programming Language :: Euler"))
-        self.create_trove_cat((185,160,"shell","Unix Shell","Programming Language :: Unix Shell"))
-        self.create_trove_cat((184,160,"asp","ASP","Programming Language :: ASP"))
-        self.create_trove_cat((273,160,"Pike","Pike","Programming Language :: Pike"))
-        self.create_trove_cat((271,160,"csharp","C#","Programming Language :: C#"))
-        self.create_trove_cat((170,160,"lisp","Lisp","Programming Language :: Lisp"))
-        self.create_trove_cat((169,160,"fortran","Fortran","Programming Language :: Fortran"))
-        self.create_trove_cat((625,160,"simulink","Simulink","Programming Language :: Simulink"))
-        self.create_trove_cat((626,160,"matlab","MATLAB","Programming Language :: MATLAB"))
-        self.create_trove_cat((1,0,"audience","Intended Audience","Intended Audience"))
-        self.create_trove_cat((618,535,"nonprofit","Non-Profit Organizations","Intended Audience :: by Industry or Sector :: Non-Profit Organizations"))
-        self.create_trove_cat((599,535,"aerospace","Aerospace","Intended Audience :: by Industry or Sector :: Aerospace"))
-        self.create_trove_cat((569,535,"government","Government","Intended Audience :: by Industry or Sector :: Government"))
-        self.create_trove_cat((363,535,"informationtechnology","Information Technology","Intended Audience :: by Industry or Sector :: Information Technology"))
-        self.create_trove_cat((361,535,"financialinsurance","Financial and Insurance Industry","Intended Audience :: by Industry or Sector :: Financial and Insurance Industry"))
-        self.create_trove_cat((362,535,"healthcareindustry","Healthcare Industry","Intended Audience :: by Industry or Sector :: Healthcare Industry"))
-        self.create_trove_cat((367,535,"scienceresearch","Science/Research","Intended Audience :: by Industry or Sector :: Science/Research"))
-        self.create_trove_cat((359,535,"customerservice","Customer Service","Intended Audience :: by Industry or Sector :: Customer Service"))
-        self.create_trove_cat((360,535,"education","Education","Intended Audience :: by Industry or Sector :: Education"))
-        self.create_trove_cat((365,535,"manufacturing","Manufacturing","Intended Audience :: by Industry or Sector :: Manufacturing"))
-        self.create_trove_cat((368,535,"telecommunications","Telecommunications Industry","Intended Audience :: by Industry or Sector :: Telecommunications Industry"))
-        self.create_trove_cat((166,160,"eiffel","Eiffel","Programming Language :: Eiffel"))
-        self.create_trove_cat((550,160,"oberon","Oberon","Programming Language :: Oberon"))
-        self.create_trove_cat((553,160,"realbasic","REALbasic","Programming Language :: REALbasic"))
-        self.create_trove_cat((178,160,"python","Python","Programming Language :: Python"))
-        self.create_trove_cat((179,160,"rexx","Rexx","Programming Language :: Rexx"))
-        self.create_trove_cat((177,160,"prolog","Prolog","Programming Language :: Prolog"))
-        self.create_trove_cat((176,160,"perl","Perl","Programming Language :: Perl"))
-        self.create_trove_cat((175,160,"pascal","Pascal","Programming Language :: Pascal"))
-        self.create_trove_cat((536,534,"enduser_advanced","Advanced End Users","Intended Audience :: by End-User Class :: Advanced End Users"))
-        self.create_trove_cat((4,534,"sysadmins","System Administrators","Intended Audience :: by End-User Class :: System Administrators"))
-        self.create_trove_cat((471,456,"ui_swing","Java Swing","User Interface :: Graphical :: Java Swing"))
-        self.create_trove_cat((469,456,"ui_dotnet",".NET/Mono","User Interface :: Graphical :: .NET/Mono"))
-        self.create_trove_cat((231,456,"gnome","Gnome","User Interface :: Graphical :: Gnome"))
-        self.create_trove_cat((229,456,"x11","X Window System (X11)","User Interface :: Graphical :: X Window System (X11)"))
-        self.create_trove_cat((475,456,"ui_opengl","OpenGL","User Interface :: Graphical :: OpenGL"))
-        self.create_trove_cat((474,456,"ui_framebuffer","Framebuffer","User Interface :: Graphical :: Framebuffer"))
-        self.create_trove_cat((472,456,"ui_swt","Java SWT","User Interface :: Graphical :: Java SWT"))
-        self.create_trove_cat((470,456,"ui_awt","Java AWT","User Interface :: Graphical :: Java AWT"))
-        self.create_trove_cat((230,456,"win32","Win32 (MS Windows)","User Interface :: Graphical :: Win32 (MS Windows)"))
-        self.create_trove_cat((232,456,"kde","KDE","User Interface :: Graphical :: KDE"))
-        self.create_trove_cat((310,456,"cocoa","Cocoa (MacOS X)","User Interface :: Graphical :: Cocoa (MacOS X)"))
-        self.create_trove_cat((476,456,"ui_tabletpc","TabletPC","User Interface :: Graphical :: TabletPC"))
-        self.create_trove_cat((314,456,"handhelds","Handheld/Mobile/PDA","User Interface :: Graphical :: Handheld/Mobile/PDA"))
-        self.create_trove_cat((462,225,"ui_groupingdesc","Grouping and Descriptive Categories (UI)","User Interface :: Grouping and Descriptive Categories (UI)"))
-        self.create_trove_cat((466,462,"ui_meta_3d","Project is a 3D engine","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a 3D engine"))
-        self.create_trove_cat((464,462,"ui_meta_template","Project is a templating system","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a templating system"))
-        self.create_trove_cat((463,462,"ui_meta_system","Project is a user interface (UI) system","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a user interface (UI) system"))
-        self.create_trove_cat((465,462,"ui_meta_windowmanager","Project is a window manager","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a window manager"))
-        self.create_trove_cat((467,462,"ui_meta_toolkit","Project is a graphics toolkit","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a graphics toolkit"))
-        self.create_trove_cat((468,462,"ui_meta_remotecontrol","Project is a remote control application","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a remote control application"))
-        self.create_trove_cat((237,225,"web","Web-based","User Interface :: Web-based"))
-        self.create_trove_cat((238,225,"daemon","Non-interactive (Daemon)","User Interface :: Non-interactive (Daemon)"))
-        self.create_trove_cat((457,225,"textual_ui","Textual","User Interface :: Textual"))
-        self.create_trove_cat((460,457,"ui_consoleterm","Console/Terminal","User Interface :: Textual :: Console/Terminal"))
-        self.create_trove_cat((459,457,"ui_commandline","Command-line","User Interface :: Textual :: Command-line"))
-        self.create_trove_cat((225,0,"environment","User Interface","User Interface"))
-        self.create_trove_cat((461,225,"ui_plugins","Plugins","User Interface :: Plugins"))
-        self.create_trove_cat((583,461,"eclipse_plugins","Eclipse","User Interface :: Plugins :: Eclipse"))
-        self.create_trove_cat((458,225,"ui_toolkit","Toolkits/Libraries","User Interface :: Toolkits/Libraries"))
-        self.create_trove_cat((495,458,"ui_othertoolkit","Other toolkit","User Interface :: Toolkits/Libraries :: Other toolkit"))
-        self.create_trove_cat((493,458,"ui_motif","Motif/LessTif","User Interface :: Toolkits/Libraries :: Motif/LessTif"))
-        self.create_trove_cat((491,458,"ui_crystalspace","Crystal Space","User Interface :: Toolkits/Libraries :: Crystal Space"))
-        self.create_trove_cat((489,458,"ui_clanlib","ClanLib","User Interface :: Toolkits/Libraries :: ClanLib"))
-        self.create_trove_cat((516,500,"db_group_objmap","Project is a relational object mapper","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a relational object mapper"))
-        self.create_trove_cat((487,458,"ui_ggi","GGI","User Interface :: Toolkits/Libraries :: GGI"))
-        self.create_trove_cat((485,458,"ui_directx","DirectX","User Interface :: Toolkits/Libraries :: DirectX"))
-        self.create_trove_cat((483,458,"ui_svgalib","SVGAlib","User Interface :: Toolkits/Libraries :: SVGAlib"))
-        self.create_trove_cat((481,458,"ui_wxwidgets","wxWidgets","User Interface :: Toolkits/Libraries :: wxWidgets"))
-        self.create_trove_cat((511,500,"db_group_mgmt","Project is a database management tool","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database management tool"))
-        self.create_trove_cat((479,458,"ui_qt","Qt","User Interface :: Toolkits/Libraries :: Qt"))
-        self.create_trove_cat((477,458,"ui_gtk","GTK+","User Interface :: Toolkits/Libraries :: GTK+"))
-        self.create_trove_cat((513,500,"db_group_netdbms","Project is a network-based DBMS (database system)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a network-based DBMS (database system)"))
-        self.create_trove_cat((228,458,"newt","Newt","User Interface :: Toolkits/Libraries :: Newt"))
-        self.create_trove_cat((227,458,"curses","Curses/Ncurses","User Interface :: Toolkits/Libraries :: Curses/Ncurses"))
-        self.create_trove_cat((515,500,"db_group_conv","Project is a database conversion tool","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database conversion tool"))
-        self.create_trove_cat((478,458,"ui_tk","Tk","User Interface :: Toolkits/Libraries :: Tk"))
-        self.create_trove_cat((480,458,"ui_sdl","SDL","User Interface :: Toolkits/Libraries :: SDL"))
-        self.create_trove_cat((33,28,"postoffice","Post-Office","Topic :: Communications :: Email :: Post-Office"))
-        self.create_trove_cat((514,500,"db_group_propfmt","Project is a tool for a proprietary database file format","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a tool for a proprietary database file format"))
-        self.create_trove_cat((482,458,"ui_aalib","AAlib","User Interface :: Toolkits/Libraries :: AAlib"))
-        self.create_trove_cat((484,458,"ui_fltk","FLTK","User Interface :: Toolkits/Libraries :: FLTK"))
-        self.create_trove_cat((512,500,"db_group_filedbms","Project is a file-based DBMS (database system)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a file-based DBMS (database system)"))
-        self.create_trove_cat((486,458,"ui_plib","Plib","User Interface :: Toolkits/Libraries :: Plib"))
-        self.create_trove_cat((488,458,"ui_glide","Glide","User Interface :: Toolkits/Libraries :: Glide"))
-        self.create_trove_cat((510,500,"db_group_api","Project is a database abstraction layer (API)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database abstraction layer (API)"))
-        self.create_trove_cat((490,458,"ui_glut","GLUT","User Interface :: Toolkits/Libraries :: GLUT"))
-        self.create_trove_cat((492,458,"ui_allegro","Allegro","User Interface :: Toolkits/Libraries :: Allegro"))
-        self.create_trove_cat((500,496,"db_grouping","Grouping and Descriptive Categories (DB)","Database Environment :: Grouping and Descriptive Categories (DB)"))
-        self.create_trove_cat((494,458,"ui_quartz","Quartz","User Interface :: Toolkits/Libraries :: Quartz"))
-        self.create_trove_cat((456,225,"graphical_ui","Graphical","User Interface :: Graphical"))
-        self.create_trove_cat((276,274,"french","French","Translations :: French"))
-        self.create_trove_cat((473,456,"ui_carbon","Carbon (Mac OS X)","User Interface :: Graphical :: Carbon (Mac OS X)"))
-        self.create_trove_cat((535,1,"by_industrysector","by Industry or Sector","Intended Audience :: by Industry or Sector"))
-        self.create_trove_cat((364,535,"legalindustry","Legal Industry","Intended Audience :: by Industry or Sector :: Legal Industry"))
-        self.create_trove_cat((353,274,"ukrainian","Ukrainian","Translations :: Ukrainian"))
-        self.create_trove_cat((330,274,"dutch","Dutch","Translations :: Dutch"))
-        self.create_trove_cat((343,274,"persian","Persian","Translations :: Persian"))
-        self.create_trove_cat((344,274,"polish","Polish","Translations :: Polish"))
-        self.create_trove_cat((455,274,"irish_gaelic","Irish Gaelic","Translations :: Irish Gaelic"))
-        self.create_trove_cat((413,274,"lithuanian","Lithuanian","Translations :: Lithuanian"))
-        self.create_trove_cat((414,274,"albanian","Albanian","Translations :: Albanian"))
-        self.create_trove_cat((415,274,"malagasy","Malagasy","Translations :: Malagasy"))
-        self.create_trove_cat((416,274,"mongolian","Mongolian","Translations :: Mongolian"))
-        self.create_trove_cat((417,274,"maltese","Maltese","Translations :: Maltese"))
-        self.create_trove_cat((380,274,"slovenian","Slovene","Translations :: Slovene"))
-        self.create_trove_cat((374,274,"icelandic","Icelandic","Translations :: Icelandic"))
-        self.create_trove_cat((376,274,"macedonian","Macedonian","Translations :: Macedonian"))
-        self.create_trove_cat((377,274,"latin","Latin","Translations :: Latin"))
-        self.create_trove_cat((375,274,"latvian","Latvian","Translations :: Latvian"))
-        self.create_trove_cat((373,274,"czech","Czech","Translations :: Czech"))
-        self.create_trove_cat((369,274,"afrikaans","Afrikaans","Translations :: Afrikaans"))
-        self.create_trove_cat((357,274,"finnish","Finnish","Translations :: Finnish"))
-        self.create_trove_cat((186,160,"visualbasic","Visual Basic","Programming Language :: Visual Basic"))
-        self.create_trove_cat((505,499,"db_pear","PHP Pear::DB","Database Environment :: Database API :: PHP Pear::DB"))
-        self.create_trove_cat((507,499,"db_api_xml","XML-based","Database Environment :: Database API :: XML-based"))
-        self.create_trove_cat((509,499,"db_api_other","Other API","Database Environment :: Database API :: Other API"))
-        self.create_trove_cat((532,497,"db_net_hsql","HSQL","Database Environment :: Network-based DBMS :: HSQL"))
-        self.create_trove_cat((547,160,"applescript","AppleScript","Programming Language :: AppleScript"))
-        self.create_trove_cat((173,160,"modula","Modula","Programming Language :: Modula"))
-        self.create_trove_cat((337,274,"italian","Italian","Translations :: Italian"))
-        self.create_trove_cat((333,274,"hebrew","Hebrew","Translations :: Hebrew"))
-        self.create_trove_cat((331,274,"esperanto","Esperanto","Translations :: Esperanto"))
-        self.create_trove_cat((329,274,"catalan","Catalan","Translations :: Catalan"))
-        self.create_trove_cat((327,274,"bengali","Bengali","Translations :: Bengali"))
-        self.create_trove_cat((332,274,"greek","Greek","Translations :: Greek"))
-        self.create_trove_cat((341,274,"marathi","Marathi","Translations :: Marathi"))
-        self.create_trove_cat((355,274,"vietnamese","Vietnamese","Translations :: Vietnamese"))
-        self.create_trove_cat((275,274,"english","English","Translations :: English"))
-        self.create_trove_cat((345,274,"portuguese","Portuguese","Translations :: Portuguese"))
-        self.create_trove_cat((171,160,"logo","Logo","Programming Language :: Logo"))
-        self.create_trove_cat((502,499,"db_api_jdbc","JDBC","Database Environment :: Database API :: JDBC"))
-        self.create_trove_cat((504,499,"db_api_perldbi","Perl DBI/DBD","Database Environment :: Database API :: Perl DBI/DBD"))
-        self.create_trove_cat((274,0,"natlanguage","Translations","Translations"))
-        self.create_trove_cat((506,499,"db_python","Python Database API","Database Environment :: Database API :: Python Database API"))
-        self.create_trove_cat((526,497,"db_net_oracle","Oracle","Database Environment :: Network-based DBMS :: Oracle"))
-        self.create_trove_cat((524,497,"db_net_mysql","MySQL","Database Environment :: Network-based DBMS :: MySQL"))
-        self.create_trove_cat((525,497,"db_net_pgsql","PostgreSQL (pgsql)","Database Environment :: Network-based DBMS :: PostgreSQL (pgsql)"))
-        self.create_trove_cat((527,497,"db_net_ibmdb2","IBM DB2","Database Environment :: Network-based DBMS :: IBM DB2"))
-        self.create_trove_cat((529,497,"db_net_sybase","Sybase","Database Environment :: Network-based DBMS :: Sybase"))
-        self.create_trove_cat((531,497,"db_net_sqlite","SQLite","Database Environment :: Network-based DBMS :: SQLite"))
-        self.create_trove_cat((533,497,"db_net_other","Other network-based DBMS","Database Environment :: Network-based DBMS :: Other network-based DBMS"))
-        self.create_trove_cat((497,496,"db_networkbased","Network-based DBMS","Database Environment :: Network-based DBMS"))
-        self.create_trove_cat((426,199,"os_emu_api","Emulation and API Compatibility","Operating System :: Emulation and API Compatibility"))
-        self.create_trove_cat((311,236,"macos9","Apple Mac OS Classic","Operating System :: Other Operating Systems :: Apple Mac OS Classic"))
-        self.create_trove_cat((224,236,"beos","BeOS","Operating System :: Other Operating Systems :: BeOS"))
-        self.create_trove_cat((215,236,"msdos","MS-DOS","Operating System :: Other Operating Systems :: MS-DOS"))
-        self.create_trove_cat((421,236,"mswin_95","Win95","Operating System :: Other Operating Systems :: Win95"))
-        self.create_trove_cat((508,499,"db_api_sql","SQL-based","Database Environment :: Database API :: SQL-based"))
-        self.create_trove_cat((499,496,"db_api","Database API","Database Environment :: Database API"))
-        self.create_trove_cat((378,274,"serbian","Serbian","Translations :: Serbian"))
-        self.create_trove_cat((379,274,"slovak","Slovak","Translations :: Slovak"))
-        self.create_trove_cat((371,274,"chinesetraditional","Chinese (Traditional)","Translations :: Chinese (Traditional)"))
-        self.create_trove_cat((410,274,"belarusian","Belarusian","Translations :: Belarusian"))
-        self.create_trove_cat((411,274,"estonian","Estonian","Translations :: Estonian"))
-        self.create_trove_cat((412,274,"galician","Galician","Translations :: Galician"))
-        self.create_trove_cat((34,33,"pop3","POP3","Topic :: Communications :: Email :: Post-Office :: POP3"))
-        self.create_trove_cat((35,33,"imap","IMAP","Topic :: Communications :: Email :: Post-Office :: IMAP"))
-        self.create_trove_cat((29,28,"filters","Filters","Topic :: Communications :: Email :: Filters"))
-        self.create_trove_cat((30,28,"listservers","Mailing List Servers","Topic :: Communications :: Email :: Mailing List Servers"))
-        self.create_trove_cat((597,80,"card_games","Card Games","Topic :: Games/Entertainment :: Card Games"))
-        self.create_trove_cat((63,18,"editors","Text Editors","Topic :: Text Editors"))
-        self.create_trove_cat((366,535,"religion","Religion","Intended Audience :: by Industry or Sector :: Religion"))
-        self.create_trove_cat((534,1,"by_enduser","by End-User Class","Intended Audience :: by End-User Class"))
-        self.create_trove_cat((528,497,"db_net_firebird","Firebird/InterBase","Database Environment :: Network-based DBMS :: Firebird/InterBase"))
-        self.create_trove_cat((3,534,"developers","Developers","Intended Audience :: by End-User Class :: Developers"))
-        self.create_trove_cat((530,497,"db_net_mssql","Microsoft SQL Server","Database Environment :: Network-based DBMS :: Microsoft SQL Server"))
-        self.create_trove_cat((2,534,"endusers","End Users/Desktop","Intended Audience :: by End-User Class :: End Users/Desktop"))
-        self.create_trove_cat((498,496,"db_filebased","File-based DBMS","Database Environment :: File-based DBMS"))
-        self.create_trove_cat((537,534,"enduser_qa","Quality Engineers","Intended Audience :: by End-User Class :: Quality Engineers"))
-        self.create_trove_cat((5,1,"other","Other Audience","Intended Audience :: Other Audience"))
-        self.create_trove_cat((517,498,"db_file_dbm","Berkeley/Sleepycat/Gdbm (DBM)","Database Environment :: File-based DBMS :: Berkeley/Sleepycat/Gdbm (DBM)"))
-        self.create_trove_cat((358,6,"inactive","7 - Inactive","Development Status :: 7 - Inactive"))
-        self.create_trove_cat((520,498,"db_file_palm","PalmOS PDB","Database Environment :: File-based DBMS :: PalmOS PDB"))
-        self.create_trove_cat((523,498,"db_file_other","Other file-based DBMS","Database Environment :: File-based DBMS :: Other file-based DBMS"))
-        self.create_trove_cat((165,160,"cpp","C++","Programming Language :: C++"))
-        self.create_trove_cat((163,160,"ada","Ada","Programming Language :: Ada"))
-        self.create_trove_cat((328,274,"bulgarian","Bulgarian","Translations :: Bulgarian"))
-        self.create_trove_cat((546,274,"swahili","Swahili","Translations :: Swahili"))
-        self.create_trove_cat((348,274,"swedish","Swedish","Translations :: Swedish"))
-        self.create_trove_cat((350,274,"telugu","Telugu","Translations :: Telugu"))
-        self.create_trove_cat((162,160,"assembly","Assembly","Programming Language :: Assembly"))
-        self.create_trove_cat((164,160,"c","C","Programming Language :: C"))
-        self.create_trove_cat((161,160,"apl","APL","Programming Language :: APL"))
-        self.create_trove_cat((267,160,"zope","Zope","Programming Language :: Zope"))
-        self.create_trove_cat((264,160,"erlang","Erlang","Programming Language :: Erlang"))
-        self.create_trove_cat((263,160,"euphoria","Euphoria","Programming Language :: Euphoria"))
-        self.create_trove_cat((183,160,"php","PHP","Programming Language :: PHP"))
-        self.create_trove_cat((182,160,"tcl","Tcl","Programming Language :: Tcl"))
-        self.create_trove_cat((181,160,"smalltalk","Smalltalk","Programming Language :: Smalltalk"))
-        self.create_trove_cat((180,160,"simula","Simula","Programming Language :: Simula"))
-        self.create_trove_cat((174,160,"objectivec","Objective C","Programming Language :: Objective C"))
-        self.create_trove_cat((560,160,"xsl","XSL (XSLT/XPath/XSL-FO)","Programming Language :: XSL (XSLT/XPath/XSL-FO)"))
-        self.create_trove_cat((293,160,"ruby","Ruby","Programming Language :: Ruby"))
-        self.create_trove_cat((265,160,"Delphi","Delphi/Kylix","Programming Language :: Delphi/Kylix"))
-        self.create_trove_cat((281,160,"REBOL","REBOL","Programming Language :: REBOL"))
-        self.create_trove_cat((454,160,"ocaml","OCaml (Objective Caml)","Programming Language :: OCaml (Objective Caml)"))
-        self.create_trove_cat((453,160,"vb_net","Visual Basic .NET","Programming Language :: Visual Basic .NET"))
-        self.create_trove_cat((452,160,"visual_foxpro","Visual FoxPro","Programming Language :: Visual FoxPro"))
-        self.create_trove_cat((451,160,"haskell","Haskell","Programming Language :: Haskell"))
-        self.create_trove_cat((450,160,"lua","Lua","Programming Language :: Lua"))
-        self.create_trove_cat((280,160,"JavaScript","JavaScript","Programming Language :: JavaScript"))
-        self.create_trove_cat((262,160,"coldfusion","Cold Fusion","Programming Language :: Cold Fusion"))
-        self.create_trove_cat((261,160,"xbasic","XBasic","Programming Language :: XBasic"))
-        self.create_trove_cat((258,160,"objectpascal","Object Pascal","Programming Language :: Object Pascal"))
-        self.create_trove_cat((539,160,"proglang_basic","BASIC","Programming Language :: BASIC"))
-        self.create_trove_cat((543,160,"groovy","Groovy","Programming Language :: Groovy"))
-        self.create_trove_cat((545,160,"proglang_labview","LabVIEW","Programming Language :: LabVIEW"))
-        self.create_trove_cat((548,160,"vbscript","VBScript","Programming Language :: VBScript"))
-        self.create_trove_cat((552,160,"d_proglang","D","Programming Language :: D"))
-        self.create_trove_cat((551,160,"vhdl_verilog","VHDL/Verilog","Programming Language :: VHDL/Verilog"))
-        self.create_trove_cat((549,160,"proglang_lpc","LPC","Programming Language :: LPC"))
-        self.create_trove_cat((544,160,"yacc","Yacc","Programming Language :: Yacc"))
-        self.create_trove_cat((352,274,"turkish","Turkish","Translations :: Turkish"))
-        self.create_trove_cat((354,274,"urdu","Urdu","Translations :: Urdu"))
-        self.create_trove_cat((160,0,"language","Programming Language","Programming Language"))
-        self.create_trove_cat((542,160,"emacs_lisp","Emacs-Lisp","Programming Language :: Emacs-Lisp"))
-        self.create_trove_cat((540,160,"clisp","Common Lisp","Programming Language :: Common Lisp"))
-        self.create_trove_cat((12,6,"mature","6 - Mature","Development Status :: 6 - Mature"))
-        self.create_trove_cat((538,160,"awk","AWK","Programming Language :: AWK"))
-        self.create_trove_cat((572,160,"jsp","JSP","Programming Language :: JSP"))
-        self.create_trove_cat((172,160,"ml","Standard ML","Programming Language :: Standard ML"))
-        self.create_trove_cat((255,160,"progress","PROGRESS","Programming Language :: PROGRESS"))
-        self.create_trove_cat((254,160,"plsql","PL/SQL","Programming Language :: PL/SQL"))
-        self.create_trove_cat((242,160,"scheme","Scheme","Programming Language :: Scheme"))
-        self.create_trove_cat((624,160,"idl","IDL","Programming Language :: IDL"))
-        self.create_trove_cat((198,160,"java","Java","Programming Language :: Java"))
-        self.create_trove_cat((589,160,"asp_dot_net","ASP.NET","Programming Language :: ASP.NET"))
-        self.create_trove_cat((608,160,"mumps","MUMPS","Programming Language :: MUMPS"))
-        self.create_trove_cat((541,160,"dylan","Dylan","Programming Language :: Dylan"))
-        self.create_trove_cat((573,160,"s_slash_r","S/R","Programming Language :: S/R"))
-        self.create_trove_cat((584,160,"actionscript","ActionScript","Programming Language :: ActionScript"))
-        self.create_trove_cat((168,160,"forth","Forth","Programming Language :: Forth"))
-        self.create_trove_cat((334,274,"hindi","Hindi","Translations :: Hindi"))
-        self.create_trove_cat((336,274,"indonesian","Indonesian","Translations :: Indonesian"))
-        self.create_trove_cat((521,498,"db_file_flat","Flat-file","Database Environment :: File-based DBMS :: Flat-file"))
-        self.create_trove_cat((519,498,"db_file_xbase","xBase","Database Environment :: File-based DBMS :: xBase"))
-        self.create_trove_cat((338,274,"javanese","Javanese","Translations :: Javanese"))
-        self.create_trove_cat((518,498,"db_msaccess","Microsoft Access","Database Environment :: File-based DBMS :: Microsoft Access"))
-        self.create_trove_cat((522,498,"db_file_proprietary","Proprietary file format","Database Environment :: File-based DBMS :: Proprietary file format"))
-        self.create_trove_cat((496,0,"root_database","Database Environment","Database Environment"))
-        self.create_trove_cat((501,499,"db_api_odbc","ODBC","Database Environment :: Database API :: ODBC"))
-        self.create_trove_cat((503,499,"db_adodb","ADOdb","Database Environment :: Database API :: ADOdb"))
-        self.create_trove_cat((340,274,"malay","Malay","Translations :: Malay"))
-        self.create_trove_cat((6,0,"developmentstatus","Development Status","Development Status"))
-        self.create_trove_cat((342,274,"norwegian","Norwegian","Translations :: Norwegian"))
-        self.create_trove_cat((381,274,"portuguesebrazilian","Brazilian Portuguese","Translations :: Brazilian Portuguese"))
-        self.create_trove_cat((382,274,"chinesesimplified","Chinese (Simplified)","Translations :: Chinese (Simplified)"))
-        self.create_trove_cat((356,274,"danish","Danish","Translations :: Danish"))
-        self.create_trove_cat((346,274,"panjabi","Panjabi","Translations :: Panjabi"))
-        self.create_trove_cat((370,274,"bosnian","Bosnian","Translations :: Bosnian"))
-        self.create_trove_cat((279,274,"german","German","Translations :: German"))
-        self.create_trove_cat((278,274,"japanese","Japanese","Translations :: Japanese"))
-        self.create_trove_cat((277,274,"spanish","Spanish","Translations :: Spanish"))
-        self.create_trove_cat((11,6,"production","5 - Production/Stable","Development Status :: 5 - Production/Stable"))
-        self.create_trove_cat((10,6,"beta","4 - Beta","Development Status :: 4 - Beta"))
-        self.create_trove_cat((9,6,"alpha","3 - Alpha","Development Status :: 3 - Alpha"))
-        self.create_trove_cat((8,6,"prealpha","2 - Pre-Alpha","Development Status :: 2 - Pre-Alpha"))
-        self.create_trove_cat((7,6,"planning","1 - Planning","Development Status :: 1 - Planning"))
-        self.create_trove_cat((295,274,"russian","Russian","Translations :: Russian"))
-        self.create_trove_cat((326,274,"arabic","Arabic","Translations :: Arabic"))
-        self.create_trove_cat((335,274,"hungarian","Hungarian","Translations :: Hungarian"))
-        self.create_trove_cat((13,0,"license","License","License"))
-        self.create_trove_cat((14,13,"osi","OSI-Approved Open Source","License :: OSI-Approved Open Source"))
-        self.create_trove_cat((388,14,"osl","Open Software License","License :: OSI-Approved Open Source :: Open Software License"))
-        self.create_trove_cat((321,14,"motosoto","Motosoto License","License :: OSI-Approved Open Source :: Motosoto License"))
-        self.create_trove_cat((325,14,"attribut","Attribution Assurance License","License :: OSI-Approved Open Source :: Attribution Assurance License"))
-        self.create_trove_cat((304,14,"mpl","Mozilla Public License 1.0 (MPL)","License :: OSI-Approved Open Source :: Mozilla Public License 1.0 (MPL)"))
-        self.create_trove_cat((398,14,"plan9","Lucent Public License (Plan9)","License :: OSI-Approved Open Source :: Lucent Public License (Plan9)"))
-        self.create_trove_cat((187,14,"bsd","BSD License","License :: OSI-Approved Open Source :: BSD License"))
-        self.create_trove_cat((393,14,"historical","Historical Permission Notice and Disclaimer","License :: OSI-Approved Open Source :: Historical Permission Notice and Disclaimer"))
-        self.create_trove_cat((395,14,"real","RealNetworks Public Source License V1.0","License :: OSI-Approved Open Source :: RealNetworks Public Source License V1.0"))
-        self.create_trove_cat((396,14,"rpl","Reciprocal Public License","License :: OSI-Approved Open Source :: Reciprocal Public License"))
-        self.create_trove_cat((392,14,"eiffel2","Eiffel Forum License V2.0","License :: OSI-Approved Open Source :: Eiffel Forum License V2.0"))
-        self.create_trove_cat((320,14,"w3c","W3C License","License :: OSI-Approved Open Source :: W3C License"))
-        self.create_trove_cat((400,14,"frameworx","Frameworx Open License","License :: OSI-Approved Open Source :: Frameworx Open License"))
-        self.create_trove_cat((194,14,"python","Python License (CNRI Python License)","License :: OSI-Approved Open Source :: Python License (CNRI Python License)"))
-        self.create_trove_cat((296,14,"apache","Apache Software License","License :: OSI-Approved Open Source :: Apache Software License"))
-        self.create_trove_cat((298,14,"sissl","Sun Industry Standards Source License (SISSL)","License :: OSI-Approved Open Source :: Sun Industry Standards Source License (SISSL)"))
-        self.create_trove_cat((196,13,"other","Other/Proprietary License","License :: Other/Proprietary License"))
-        self.create_trove_cat((197,13,"publicdomain","Public Domain","License :: Public Domain"))
-        self.create_trove_cat((301,14,"nokia","Nokia Open Source License","License :: OSI-Approved Open Source :: Nokia Open Source License"))
-        self.create_trove_cat((319,14,"eiffel","Eiffel Forum License","License :: OSI-Approved Open Source :: Eiffel Forum License"))
-        self.create_trove_cat((318,14,"sunpublic","Sun Public License","License :: OSI-Approved Open Source :: Sun Public License"))
-        self.create_trove_cat((190,14,"qpl","Qt Public License (QPL)","License :: OSI-Approved Open Source :: Qt Public License (QPL)"))
-        self.create_trove_cat((390,14,"oclc","OCLC Research Public License 2.0","License :: OSI-Approved Open Source :: OCLC Research Public License 2.0"))
-        self.create_trove_cat((407,14,"nasalicense","NASA Open Source Agreement","License :: OSI-Approved Open Source :: NASA Open Source Agreement"))
-        self.create_trove_cat((406,14,"eclipselicense","Eclipse Public License","License :: OSI-Approved Open Source :: Eclipse Public License"))
-        self.create_trove_cat((316,14,"opengroup","Open Group Test Suite License","License :: OSI-Approved Open Source :: Open Group Test Suite License"))
-        self.create_trove_cat((300,14,"jabber","Jabber Open Source License","License :: OSI-Approved Open Source :: Jabber Open Source License"))
-        self.create_trove_cat((297,14,"vovida","Vovida Software License 1.0","License :: OSI-Approved Open Source :: Vovida Software License 1.0"))
-        self.create_trove_cat((324,14,"afl","Academic Free License (AFL)","License :: OSI-Approved Open Source :: Academic Free License (AFL)"))
-        self.create_trove_cat((189,14,"psfl","Python Software Foundation License","License :: OSI-Approved Open Source :: Python Software Foundation License"))
-        self.create_trove_cat((193,14,"rscpl","Ricoh Source Code Public License","License :: OSI-Approved Open Source :: Ricoh Source Code Public License"))
-        self.create_trove_cat((17,14,"artistic","Artistic License","License :: OSI-Approved Open Source :: Artistic License"))
-        self.create_trove_cat((389,14,"sybase","Sybase Open Watcom Public License","License :: OSI-Approved Open Source :: Sybase Open Watcom Public License"))
-        self.create_trove_cat((391,14,"wxwindows","wxWindows Library Licence","License :: OSI-Approved Open Source :: wxWindows Library Licence"))
-        self.create_trove_cat((397,14,"entessa","Entessa Public License","License :: OSI-Approved Open Source :: Entessa Public License"))
-        self.create_trove_cat((16,14,"lgpl","GNU Library or Lesser General Public License (LGPL)","License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License (LGPL)"))
-        self.create_trove_cat((629,14,"educom","Educational Community License","License :: OSI-Approved Open Source :: Educational Community License"))
-        self.create_trove_cat((15,14,"gpl","GNU General Public License (GPL)","License :: OSI-Approved Open Source :: GNU General Public License (GPL)"))
-        self.create_trove_cat((191,14,"ibm","IBM Public License","License :: OSI-Approved Open Source :: IBM Public License"))
-        self.create_trove_cat((192,14,"cvw","MITRE Collaborative Virtual Workspace License (CVW)","License :: OSI-Approved Open Source :: MITRE Collaborative Virtual Workspace License (CVW)"))
-        self.create_trove_cat((299,14,"iosl","Intel Open Source License","License :: OSI-Approved Open Source :: Intel Open Source License"))
-        self.create_trove_cat((399,14,"php-license","PHP License","License :: OSI-Approved Open Source :: PHP License"))
-        self.create_trove_cat((188,14,"mit","MIT License","License :: OSI-Approved Open Source :: MIT License"))
-        self.create_trove_cat((405,14,"public102","Lucent Public License Version 1.02","License :: OSI-Approved Open Source :: Lucent Public License Version 1.02"))
-        self.create_trove_cat((404,14,"fair","Fair License","License :: OSI-Approved Open Source :: Fair License"))
-        self.create_trove_cat((403,14,"datagrid","EU DataGrid Software License","License :: OSI-Approved Open Source :: EU DataGrid Software License"))
-        self.create_trove_cat((307,14,"ibmcpl","Common Public License","License :: OSI-Approved Open Source :: Common Public License"))
-        self.create_trove_cat((402,14,"cua","CUA Office Public License Version 1.0","License :: OSI-Approved Open Source :: CUA Office Public License Version 1.0"))
-        self.create_trove_cat((401,14,"apache2","Apache License V2.0","License :: OSI-Approved Open Source :: Apache License V2.0"))
-        self.create_trove_cat((394,14,"nausite","Naumen Public License","License :: OSI-Approved Open Source :: Naumen Public License"))
-        self.create_trove_cat((317,14,"xnet","X.Net License","License :: OSI-Approved Open Source :: X.Net License"))
-        self.create_trove_cat((195,14,"zlib","zlib/libpng License","License :: OSI-Approved Open Source :: zlib/libpng License"))
-        self.create_trove_cat((323,14,"ncsa","University of Illinois/NCSA Open Source License","License :: OSI-Approved Open Source :: University of Illinois/NCSA Open Source License"))
-        self.create_trove_cat((322,14,"zope","Zope Public License","License :: OSI-Approved Open Source :: Zope Public License"))
-        self.create_trove_cat((302,14,"sleepycat","Sleepycat License","License :: OSI-Approved Open Source :: Sleepycat License"))
-        self.create_trove_cat((303,14,"nethack","Nethack General Public License","License :: OSI-Approved Open Source :: Nethack General Public License"))
-        self.create_trove_cat((306,14,"apsl","Apple Public Source License","License :: OSI-Approved Open Source :: Apple Public Source License"))
-        self.create_trove_cat((305,14,"mpl11","Mozilla Public License 1.1 (MPL 1.1)","License :: OSI-Approved Open Source :: Mozilla Public License 1.1 (MPL 1.1)"))
-        self.create_trove_cat((628,14,"adaptive","Adaptive Public License","License :: OSI-Approved Open Source :: Adaptive Public License"))
-        self.create_trove_cat((630,14,"cddl","Common Development and Distribution License","License :: OSI-Approved Open Source :: Common Development and Distribution License"))
-        self.create_trove_cat((631,14,"catosl","Computer Associates Trusted Open Source License","License :: OSI-Approved Open Source :: Computer Associates Trusted Open Source License"))
-        self.create_trove_cat((199,0,"os","Operating System","Operating System"))
-        self.create_trove_cat((429,426,"fink","Fink (Mac OS X)","Operating System :: Emulation and API Compatibility :: Fink (Mac OS X)"))
-        self.create_trove_cat((427,426,"cygwin","Cygwin (MS Windows)","Operating System :: Emulation and API Compatibility :: Cygwin (MS Windows)"))
-        self.create_trove_cat((428,426,"dosemu","DOSEMU","Operating System :: Emulation and API Compatibility :: DOSEMU"))
-        self.create_trove_cat((430,426,"wine","WINE","Operating System :: Emulation and API Compatibility :: WINE"))
-        self.create_trove_cat((431,426,"emx","EMX (OS/2 and MS-DOS)","Operating System :: Emulation and API Compatibility :: EMX (OS/2 and MS-DOS)"))
-        self.create_trove_cat((445,426,"mingw_msys","MinGW/MSYS (MS Windows)","Operating System :: Emulation and API Compatibility :: MinGW/MSYS (MS Windows)"))
-        self.create_trove_cat((315,199,"pdasystems","Handheld/Embedded Operating Systems","Operating System :: Handheld/Embedded Operating Systems"))
-        self.create_trove_cat((222,315,"wince","WinCE","Operating System :: Handheld/Embedded Operating Systems :: WinCE"))
-        self.create_trove_cat((223,315,"palmos","PalmOS","Operating System :: Handheld/Embedded Operating Systems :: PalmOS"))
-        self.create_trove_cat((441,315,"ecos","eCos","Operating System :: Handheld/Embedded Operating Systems :: eCos"))
-        self.create_trove_cat((443,315,"vxworks","VxWorks","Operating System :: Handheld/Embedded Operating Systems :: VxWorks"))
-        self.create_trove_cat((444,315,"symbianos","SymbianOS","Operating System :: Handheld/Embedded Operating Systems :: SymbianOS"))
-        self.create_trove_cat((442,315,"qnx","QNX","Operating System :: Handheld/Embedded Operating Systems :: QNX"))
-        self.create_trove_cat((440,315,"uclinux","uClinux","Operating System :: Handheld/Embedded Operating Systems :: uClinux"))
-        self.create_trove_cat((418,199,"modern_oses","Modern (Vendor-Supported) Desktop Operating Systems","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems"))
-        self.create_trove_cat((420,418,"mswin_2000","Win2K","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Win2K"))
-        self.create_trove_cat((207,418,"sun","Solaris","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Solaris"))
-        self.create_trove_cat((201,418,"linux","Linux","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Linux"))
-        self.create_trove_cat((205,418,"openbsd","OpenBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: OpenBSD"))
-        self.create_trove_cat((203,418,"freebsd","FreeBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: FreeBSD"))
-        self.create_trove_cat((204,418,"netbsd","NetBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: NetBSD"))
-        self.create_trove_cat((309,418,"macosx","OS X","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: OS X"))
-        self.create_trove_cat((419,418,"mswin_xp","WinXP","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: WinXP"))
-        self.create_trove_cat((236,199,"other","Other Operating Systems","Operating System :: Other Operating Systems"))
-        self.create_trove_cat((206,236,"bsdos","BSD/OS","Operating System :: Other Operating Systems :: BSD/OS"))
-        self.create_trove_cat((634,236,"console-platforms","Console-based Platforms","Operating System :: Other Operating Systems :: Console-based Platforms"))
-        self.create_trove_cat((637,634,"sega-dreamcast","Sega Dreamcast","Operating System :: Other Operating Systems :: Console-based Platforms :: Sega Dreamcast"))
-        self.create_trove_cat((635,634,"xbox","Microsoft Xbox","Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox"))
-        self.create_trove_cat((636,634,"sony-ps2","Sony Playstation 2","Operating System :: Other Operating Systems :: Console-based Platforms :: Sony Playstation 2"))
-        self.create_trove_cat((422,236,"mswin_98","Win98","Operating System :: Other Operating Systems :: Win98"))
-        self.create_trove_cat((425,422,"mswin_98_osr2","Win98 OSR2","Operating System :: Other Operating Systems :: Win98 :: Win98 OSR2"))
-        self.create_trove_cat((424,236,"mswin_me","WinME","Operating System :: Other Operating Systems :: WinME"))
-        self.create_trove_cat((423,236,"mswin_nt","WinNT","Operating System :: Other Operating Systems :: WinNT"))
-        self.create_trove_cat((220,236,"os2","IBM OS/2","Operating System :: Other Operating Systems :: IBM OS/2"))
-        self.create_trove_cat((211,236,"irix","SGI IRIX","Operating System :: Other Operating Systems :: SGI IRIX"))
-        self.create_trove_cat((210,236,"aix","IBM AIX","Operating System :: Other Operating Systems :: IBM AIX"))
-        self.create_trove_cat((212,236,"other","Other","Operating System :: Other Operating Systems :: Other"))
-        self.create_trove_cat((446,236,"openvms","OpenVMS","Operating System :: Other Operating Systems :: OpenVMS"))
-        self.create_trove_cat((434,236,"amigaos","AmigaOS","Operating System :: Other Operating Systems :: AmigaOS"))
-        self.create_trove_cat((448,236,"mswin_server2003","Microsoft Windows Server 2003","Operating System :: Other Operating Systems :: Microsoft Windows Server 2003"))
-        self.create_trove_cat((447,236,"morphos","MorphOS","Operating System :: Other Operating Systems :: MorphOS"))
-        self.create_trove_cat((209,236,"hpux","HP-UX","Operating System :: Other Operating Systems :: HP-UX"))
-        self.create_trove_cat((208,236,"sco","SCO","Operating System :: Other Operating Systems :: SCO"))
-        self.create_trove_cat((240,236,"gnuhurd","GNU Hurd","Operating System :: Other Operating Systems :: GNU Hurd"))
-        self.create_trove_cat((217,236,"win31","Microsoft Windows 3.x","Operating System :: Other Operating Systems :: Microsoft Windows 3.x"))
-        self.create_trove_cat((432,199,"os_groups","Grouping and Descriptive Categories","Operating System :: Grouping and Descriptive Categories"))
-        self.create_trove_cat((218,432,"win95","32-bit MS Windows (95/98)","Operating System :: Grouping and Descriptive Categories :: 32-bit MS Windows (95/98)"))
-        self.create_trove_cat((439,432,"os_projectdistrospecific","Project is OS Distribution-Specific","Operating System :: Grouping and Descriptive Categories :: Project is OS Distribution-Specific"))
-        self.create_trove_cat((449,432,"eightbit_oses","Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)","Operating System :: Grouping and Descriptive Categories :: Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)"))
-        self.create_trove_cat((436,432,"os_portable","OS Portable (Source code to work with many OS platforms)","Operating System :: Grouping and Descriptive Categories :: OS Portable (Source code to work with many OS platforms)"))
-        self.create_trove_cat((438,432,"os_projectdistro","Project is an Operating System Distribution","Operating System :: Grouping and Descriptive Categories :: Project is an Operating System Distribution"))
-        self.create_trove_cat((235,432,"independent","OS Independent (Written in an interpreted language)","Operating System :: Grouping and Descriptive Categories :: OS Independent (Written in an interpreted language)"))
-        self.create_trove_cat((200,432,"posix","All POSIX (Linux/BSD/UNIX-like OSes)","Operating System :: Grouping and Descriptive Categories :: All POSIX (Linux/BSD/UNIX-like OSes)"))
-        self.create_trove_cat((219,432,"winnt","32-bit MS Windows (NT/2000/XP)","Operating System :: Grouping and Descriptive Categories :: 32-bit MS Windows (NT/2000/XP)"))
-        self.create_trove_cat((202,432,"bsd","All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)","Operating System :: Grouping and Descriptive Categories :: All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)"))
-        self.create_trove_cat((435,432,"mswin_all32bit","All 32-bit MS Windows (95/98/NT/2000/XP)","Operating System :: Grouping and Descriptive Categories :: All 32-bit MS Windows (95/98/NT/2000/XP)"))
-        self.create_trove_cat((437,432,"os_projectkernel","Project is an Operating System Kernel","Operating System :: Grouping and Descriptive Categories :: Project is an Operating System Kernel"))
-        self.create_trove_cat((64,63,"emacs","Emacs","Topic :: Text Editors :: Emacs"))
-        self.create_trove_cat((65,63,"ide","Integrated Development Environments (IDE)","Topic :: Text Editors :: Integrated Development Environments (IDE)"))
-        self.create_trove_cat((69,63,"documentation","Documentation","Topic :: Text Editors :: Documentation"))
-        self.create_trove_cat((70,63,"wordprocessors","Word Processors","Topic :: Text Editors :: Word Processors"))
-        self.create_trove_cat((285,63,"textprocessing","Text Processing","Topic :: Text Editors :: Text Processing"))
-        self.create_trove_cat((611,18,"formats_and_protocols","Formats and Protocols","Topic :: Formats and Protocols"))
-        self.create_trove_cat((554,611,"data_formats","Data Formats","Topic :: Formats and Protocols :: Data Formats"))
-        self.create_trove_cat((559,554,"xml","XML","Topic :: Formats and Protocols :: Data Formats :: XML"))
-        self.create_trove_cat((557,554,"sgml","SGML","Topic :: Formats and Protocols :: Data Formats :: SGML"))
-        self.create_trove_cat((555,554,"docbook","DocBook","Topic :: Formats and Protocols :: Data Formats :: DocBook"))
-        self.create_trove_cat((556,554,"html_xhtml","HTML/XHTML","Topic :: Formats and Protocols :: Data Formats :: HTML/XHTML"))
-        self.create_trove_cat((558,554,"tex_latex","TeX/LaTeX","Topic :: Formats and Protocols :: Data Formats :: TeX/LaTeX"))
-        self.create_trove_cat((612,611,"protocols","Protocols","Topic :: Formats and Protocols :: Protocols"))
-        self.create_trove_cat((616,612,"xml_rpc","XML-RPC","Topic :: Formats and Protocols :: Protocols :: XML-RPC"))
-        self.create_trove_cat((614,612,"nntp","NNTP","Topic :: Formats and Protocols :: Protocols :: NNTP"))
-        self.create_trove_cat((613,612,"soap","SOAP","Topic :: Formats and Protocols :: Protocols :: SOAP"))
-        self.create_trove_cat((615,612,"rss","RSS","Topic :: Formats and Protocols :: Protocols :: RSS"))
-        self.create_trove_cat((156,18,"terminals","Terminals","Topic :: Terminals"))
-        self.create_trove_cat((157,156,"serial","Serial","Topic :: Terminals :: Serial"))
-        self.create_trove_cat((158,156,"virtual","Terminal Emulators/X Terminals","Topic :: Terminals :: Terminal Emulators/X Terminals"))
-        self.create_trove_cat((159,156,"telnet","Telnet","Topic :: Terminals :: Telnet"))
-        self.create_trove_cat((20,18,"communications","Communications","Topic :: Communications"))
-        self.create_trove_cat((37,20,"fido","FIDO","Topic :: Communications :: FIDO"))
-        self.create_trove_cat((38,20,"hamradio","Ham Radio","Topic :: Communications :: Ham Radio"))
-        self.create_trove_cat((39,20,"usenet","Usenet News","Topic :: Communications :: Usenet News"))
-        self.create_trove_cat((40,20,"internetphone","Internet Phone","Topic :: Communications :: Internet Phone"))
-        self.create_trove_cat((36,20,"fax","Fax","Topic :: Communications :: Fax"))
-        self.create_trove_cat((22,20,"chat","Chat","Topic :: Communications :: Chat"))
-        self.create_trove_cat((574,22,"msn_messenger","MSN Messenger","Topic :: Communications :: Chat :: MSN Messenger"))
-        self.create_trove_cat((26,22,"aim","AOL Instant Messenger","Topic :: Communications :: Chat :: AOL Instant Messenger"))
-        self.create_trove_cat((24,22,"irc","Internet Relay Chat","Topic :: Communications :: Chat :: Internet Relay Chat"))
-        self.create_trove_cat((25,22,"talk","Unix Talk","Topic :: Communications :: Chat :: Unix Talk"))
-        self.create_trove_cat((23,22,"icq","ICQ","Topic :: Communications :: Chat :: ICQ"))
-        self.create_trove_cat((590,20,"streaming_comms","Streaming","Topic :: Communications :: Streaming"))
-        self.create_trove_cat((27,20,"conferencing","Conferencing","Topic :: Communications :: Conferencing"))
-        self.create_trove_cat((247,20,"telephony","Telephony","Topic :: Communications :: Telephony"))
-        self.create_trove_cat((251,20,"filesharing","File Sharing","Topic :: Communications :: File Sharing"))
-        self.create_trove_cat((622,251,"bittorrent","BitTorrent","Topic :: Communications :: File Sharing :: BitTorrent"))
-        self.create_trove_cat((286,251,"gnutella","Gnutella","Topic :: Communications :: File Sharing :: Gnutella"))
-        self.create_trove_cat((241,251,"napster","Napster","Topic :: Communications :: File Sharing :: Napster"))
-        self.create_trove_cat((21,20,"bbs","BBS","Topic :: Communications :: BBS"))
-        self.create_trove_cat((28,20,"email","Email","Topic :: Communications :: Email"))
-        self.create_trove_cat((31,28,"mua","Email Clients (MUA)","Topic :: Communications :: Email :: Email Clients (MUA)"))
-        self.create_trove_cat((32,28,"mta","Mail Transport Agents","Topic :: Communications :: Email :: Mail Transport Agents"))
-        self.create_trove_cat((234,18,"other","Other/Nonlisted Topic","Topic :: Other/Nonlisted Topic"))
-        self.create_trove_cat((129,18,"office","Office/Business","Topic :: Office/Business"))
-        self.create_trove_cat((576,129,"enterprise","Enterprise","Topic :: Office/Business :: Enterprise"))
-        self.create_trove_cat((579,576,"crm","CRM","Topic :: Office/Business :: Enterprise :: CRM"))
-        self.create_trove_cat((577,576,"erp","ERP","Topic :: Office/Business :: Enterprise :: ERP"))
-        self.create_trove_cat((578,576,"olap","OLAP","Topic :: Office/Business :: Enterprise :: OLAP"))
-        self.create_trove_cat((580,576,"data_warehousing","Data Warehousing","Topic :: Office/Business :: Enterprise :: Data Warehousing"))
-        self.create_trove_cat((587,129,"time_tracking","Time Tracking","Topic :: Office/Business :: Time Tracking"))
-        self.create_trove_cat((75,129,"financial","Financial","Topic :: Office/Business :: Financial"))
-        self.create_trove_cat((76,75,"accounting","Accounting","Topic :: Office/Business :: Financial :: Accounting"))
-        self.create_trove_cat((77,75,"investment","Investment","Topic :: Office/Business :: Financial :: Investment"))
-        self.create_trove_cat((78,75,"spreadsheet","Spreadsheet","Topic :: Office/Business :: Financial :: Spreadsheet"))
-        self.create_trove_cat((79,75,"pointofsale","Point-Of-Sale","Topic :: Office/Business :: Financial :: Point-Of-Sale"))
-        self.create_trove_cat((130,129,"scheduling","Scheduling","Topic :: Office/Business :: Scheduling"))
-        self.create_trove_cat((585,130,"calendar","Calendar","Topic :: Office/Business :: Scheduling :: Calendar"))
-        self.create_trove_cat((586,130,"resource_booking","Resource Booking","Topic :: Office/Business :: Scheduling :: Resource Booking"))
-        self.create_trove_cat((131,129,"suites","Office Suites","Topic :: Office/Business :: Office Suites"))
-        self.create_trove_cat((588,129,"todo_lists","To-Do Lists","Topic :: Office/Business :: To-Do Lists"))
-        self.create_trove_cat((607,129,"project_management","Project Management","Topic :: Office/Business :: Project Management"))
-        self.create_trove_cat((66,18,"database","Database","Topic :: Database"))
-        self.create_trove_cat((68,66,"frontends","Front-Ends","Topic :: Database :: Front-Ends"))
-        self.create_trove_cat((67,66,"engines","Database Engines/Servers","Topic :: Database :: Database Engines/Servers"))
-        self.create_trove_cat((43,18,"security","Security","Topic :: Security"))
-        self.create_trove_cat((44,43,"cryptography","Cryptography","Topic :: Security :: Cryptography"))
-        self.create_trove_cat((55,18,"desktop","Desktop Environment","Topic :: Desktop Environment"))
-        self.create_trove_cat((56,55,"windowmanagers","Window Managers","Topic :: Desktop Environment :: Window Managers"))
-        self.create_trove_cat((59,56,"enlightenment","Enlightenment","Topic :: Desktop Environment :: Window Managers :: Enlightenment"))
-        self.create_trove_cat((60,59,"themes","Themes","Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes"))
-        self.create_trove_cat((57,55,"kde","K Desktop Environment (KDE)","Topic :: Desktop Environment :: K Desktop Environment (KDE)"))
-        self.create_trove_cat((61,57,"themes","Themes","Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes"))
-        self.create_trove_cat((58,55,"gnome","Gnome","Topic :: Desktop Environment :: Gnome"))
-        self.create_trove_cat((62,55,"screensavers","Screen Savers","Topic :: Desktop Environment :: Screen Savers"))
-        self.create_trove_cat((80,18,"games","Games/Entertainment","Topic :: Games/Entertainment"))
-        self.create_trove_cat((633,80,"console-games","Console-based Games","Topic :: Games/Entertainment :: Console-based Games"))
-        self.create_trove_cat((287,80,"boardgames","Board Games","Topic :: Games/Entertainment :: Board Games"))
-        self.create_trove_cat((288,80,"sidescrolling","Side-Scrolling/Arcade Games","Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games"))
-        self.create_trove_cat((81,80,"realtimestrategy","Real Time Strategy","Topic :: Games/Entertainment :: Real Time Strategy"))
-        self.create_trove_cat((82,80,"firstpersonshooters","First Person Shooters","Topic :: Games/Entertainment :: First Person Shooters"))
-        self.create_trove_cat((83,80,"turnbasedstrategy","Turn Based Strategy","Topic :: Games/Entertainment :: Turn Based Strategy"))
-        self.create_trove_cat((84,80,"rpg","Role-Playing","Topic :: Games/Entertainment :: Role-Playing"))
-        self.create_trove_cat((85,80,"simulation","Simulation","Topic :: Games/Entertainment :: Simulation"))
-        self.create_trove_cat((86,80,"mud","Multi-User Dungeons (MUD)","Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)"))
-        self.create_trove_cat((268,80,"Puzzles","Puzzle Games","Topic :: Games/Entertainment :: Puzzle Games"))
-        self.create_trove_cat((88,87,"finger","Finger","Topic :: Internet :: Finger"))
-        self.create_trove_cat((89,87,"ftp","File Transfer Protocol (FTP)","Topic :: Internet :: File Transfer Protocol (FTP)"))
-        self.create_trove_cat((270,87,"WAP","WAP","Topic :: Internet :: WAP"))
-        self.create_trove_cat((90,87,"www","WWW/HTTP","Topic :: Internet :: WWW/HTTP"))
-        self.create_trove_cat((91,90,"browsers","Browsers","Topic :: Internet :: WWW/HTTP :: Browsers"))
-        self.create_trove_cat((92,90,"dynamic","Dynamic Content","Topic :: Internet :: WWW/HTTP :: Dynamic Content"))
-        self.create_trove_cat((95,92,"messageboards","Message Boards","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards"))
-        self.create_trove_cat((96,92,"cgi","CGI Tools/Libraries","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries"))
-        self.create_trove_cat((94,92,"counters","Page Counters","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters"))
-        self.create_trove_cat((93,90,"indexing","Indexing/Search","Topic :: Internet :: WWW/HTTP :: Indexing/Search"))
-        self.create_trove_cat((243,90,"sitemanagement","Site Management","Topic :: Internet :: WWW/HTTP :: Site Management"))
-        self.create_trove_cat((244,243,"linkchecking","Link Checking","Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking"))
-        self.create_trove_cat((250,90,"httpservers","HTTP Servers","Topic :: Internet :: WWW/HTTP :: HTTP Servers"))
-        self.create_trove_cat((149,87,"dns","Name Service (DNS)","Topic :: Internet :: Name Service (DNS)"))
-        self.create_trove_cat((245,87,"loganalysis","Log Analysis","Topic :: Internet :: Log Analysis"))
-        self.create_trove_cat((45,18,"development","Software Development","Topic :: Software Development"))
-        self.create_trove_cat((563,45,"modeling","Modeling","Topic :: Software Development :: Modeling"))
-        self.create_trove_cat((46,45,"build","Build Tools","Topic :: Software Development :: Build Tools"))
-        self.create_trove_cat((575,45,"testing","Testing","Topic :: Software Development :: Testing"))
-        self.create_trove_cat((620,45,"algorithms","Algorithms","Topic :: Software Development :: Algorithms"))
-        self.create_trove_cat((621,620,"genetic_algorithms","Genetic Algorithms","Topic :: Software Development :: Algorithms :: Genetic Algorithms"))
-        self.create_trove_cat((606,45,"frameworks","Frameworks","Topic :: Software Development :: Frameworks"))
-        self.create_trove_cat((564,45,"documentation","Documentation","Topic :: Software Development :: Documentation"))
-        self.create_trove_cat((562,45,"swdev_oo","Object Oriented","Topic :: Software Development :: Object Oriented"))
-        self.create_trove_cat((409,45,"l10n","L10N (Localization)","Topic :: Software Development :: L10N (Localization)"))
-        self.create_trove_cat((408,45,"i18n","I18N (Internationalization)","Topic :: Software Development :: I18N (Internationalization)"))
-        self.create_trove_cat((50,45,"objectbrokering","Object Brokering","Topic :: Software Development :: Object Brokering"))
-        self.create_trove_cat((51,50,"corba","CORBA","Topic :: Software Development :: Object Brokering :: CORBA"))
-        self.create_trove_cat((52,45,"versioncontrol","Version Control","Topic :: Software Development :: Version Control"))
-        self.create_trove_cat((53,52,"cvs","CVS","Topic :: Software Development :: Version Control :: CVS"))
-        self.create_trove_cat((54,52,"rcs","RCS","Topic :: Software Development :: Version Control :: RCS"))
-        self.create_trove_cat((260,52,"SCCS","SCCS","Topic :: Software Development :: Version Control :: SCCS"))
-        self.create_trove_cat((259,45,"codegen","Code Generators","Topic :: Software Development :: Code Generators"))
-        self.create_trove_cat((47,45,"debuggers","Debuggers","Topic :: Software Development :: Debuggers"))
-        self.create_trove_cat((48,45,"compilers","Compilers","Topic :: Software Development :: Compilers"))
-        self.create_trove_cat((49,45,"interpreters","Interpreters","Topic :: Software Development :: Interpreters"))
-        self.create_trove_cat((561,45,"softwaredev_ui","User Interfaces","Topic :: Software Development :: User Interfaces"))
-        self.create_trove_cat((565,45,"quality_assurance","Quality Assurance","Topic :: Software Development :: Quality Assurance"))
-        self.create_trove_cat((570,45,"case_tools","CASE","Topic :: Software Development :: CASE"))
-        self.create_trove_cat((582,45,"design","Design","Topic :: Software Development :: Design"))
-        self.create_trove_cat((593,45,"cross_compilers","Cross Compilers","Topic :: Software Development :: Cross Compilers"))
-        self.create_trove_cat((603,45,"profilers","Profiling","Topic :: Software Development :: Profiling"))
-        self.create_trove_cat((610,45,"virtual_machines","Virtual Machines","Topic :: Software Development :: Virtual Machines"))
-        self.create_trove_cat((619,45,"usability","Usability","Topic :: Software Development :: Usability"))
-        self.create_trove_cat((581,71,"library","Library","Topic :: Education :: Library"))
-        self.create_trove_cat((604,581,"opac","OPAC","Topic :: Education :: Library :: OPAC"))
-        self.create_trove_cat((605,581,"marc_and_metadata","MARC and Book/Library Metadata","Topic :: Education :: Library :: MARC and Book/Library Metadata"))
-        self.create_trove_cat((132,18,"religion","Religion and Philosophy","Topic :: Religion and Philosophy"))
-        self.create_trove_cat((571,132,"new_age","New Age","Topic :: Religion and Philosophy :: New Age"))
-        self.create_trove_cat((136,18,"system","System","Topic :: System"))
-        self.create_trove_cat((638,136,"storage","Storage","Topic :: System :: Storage"))
-        self.create_trove_cat((601,638,"file_management","File Management","Topic :: System :: Storage :: File Management"))
-        self.create_trove_cat((19,638,"archiving","Archiving","Topic :: System :: Storage :: Archiving"))
-        self.create_trove_cat((42,19,"compression","Compression","Topic :: System :: Storage :: Archiving :: Compression"))
-        self.create_trove_cat((137,19,"backup","Backup","Topic :: System :: Storage :: Archiving :: Backup"))
-        self.create_trove_cat((41,19,"packaging","Packaging","Topic :: System :: Storage :: Archiving :: Packaging"))
-        self.create_trove_cat((294,136,"shells","System Shells","Topic :: System :: System Shells"))
-        self.create_trove_cat((74,136,"emulators","Emulators","Topic :: System :: Emulators"))
-        self.create_trove_cat((627,136,"system_search","Search","Topic :: System :: Search"))
-        self.create_trove_cat((257,136,"softwaredist","Software Distribution","Topic :: System :: Software Distribution"))
-        self.create_trove_cat((122,113,"players","Players","Topic :: Multimedia :: Sound/Audio :: Players"))
-        self.create_trove_cat((253,136,"sysadministration","Systems Administration","Topic :: System :: Systems Administration"))
-        self.create_trove_cat((289,253,"authentication","Authentication/Directory","Topic :: System :: Systems Administration :: Authentication/Directory"))
-        self.create_trove_cat((290,289,"nis","NIS","Topic :: System :: Systems Administration :: Authentication/Directory :: NIS"))
-        self.create_trove_cat((291,289,"ldap","LDAP","Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP"))
-        self.create_trove_cat((153,136,"power","Power (UPS)","Topic :: System :: Power (UPS)"))
-        self.create_trove_cat((150,136,"networking","Networking","Topic :: System :: Networking"))
-        self.create_trove_cat((566,150,"wireless","Wireless","Topic :: System :: Networking :: Wireless"))
-        self.create_trove_cat((151,150,"firewalls","Firewalls","Topic :: System :: Networking :: Firewalls"))
-        self.create_trove_cat((152,150,"monitoring","Monitoring","Topic :: System :: Networking :: Monitoring"))
-        self.create_trove_cat((155,152,"watchdog","Hardware Watchdog","Topic :: System :: Networking :: Monitoring :: Hardware Watchdog"))
-        self.create_trove_cat((148,136,"logging","Logging","Topic :: System :: Logging"))
-        self.create_trove_cat((592,148,"log_rotation","Log Rotation","Topic :: System :: Logging :: Log Rotation"))
-        self.create_trove_cat((144,136,"kernels","Operating System Kernels","Topic :: System :: Operating System Kernels"))
-        self.create_trove_cat((145,144,"bsd","BSD","Topic :: System :: Operating System Kernels :: BSD"))
-        self.create_trove_cat((239,144,"gnuhurd","GNU Hurd","Topic :: System :: Operating System Kernels :: GNU Hurd"))
-        self.create_trove_cat((143,144,"linux","Linux","Topic :: System :: Operating System Kernels :: Linux"))
-        self.create_trove_cat((147,136,"setup","Installation/Setup","Topic :: System :: Installation/Setup"))
-        self.create_trove_cat((146,136,"hardware","Hardware","Topic :: System :: Hardware"))
-        self.create_trove_cat((313,146,"mainframe","Mainframes","Topic :: System :: Hardware :: Mainframes"))
-        self.create_trove_cat((312,146,"smp","Symmetric Multi-processing","Topic :: System :: Hardware :: Symmetric Multi-processing"))
-        self.create_trove_cat((292,146,"drivers","Hardware Drivers","Topic :: System :: Hardware :: Hardware Drivers"))
-        self.create_trove_cat((138,136,"benchmark","Benchmark","Topic :: System :: Benchmark"))
-        self.create_trove_cat((139,136,"boot","Boot","Topic :: System :: Boot"))
-        self.create_trove_cat((140,139,"init","Init","Topic :: System :: Boot :: Init"))
-        self.create_trove_cat((141,136,"clustering","Clustering","Topic :: System :: Clustering"))
-        self.create_trove_cat((308,136,"distributed_computing","Distributed Computing","Topic :: System :: Distributed Computing"))
-        self.create_trove_cat((142,136,"filesystems","Filesystems","Topic :: System :: Filesystems"))
-        self.create_trove_cat((154,18,"printing","Printing","Topic :: Printing"))
-        self.create_trove_cat((87,18,"internet","Internet","Topic :: Internet"))
-        self.create_trove_cat((118,116,"cdripping","CD Ripping","Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping"))
-        self.create_trove_cat((119,113,"conversion","Conversion","Topic :: Multimedia :: Sound/Audio :: Conversion"))
-        self.create_trove_cat((120,113,"editors","Editors","Topic :: Multimedia :: Sound/Audio :: Editors"))
-        self.create_trove_cat((121,113,"mixers","Mixers","Topic :: Multimedia :: Sound/Audio :: Mixers"))
-        self.create_trove_cat((100,99,"graphics","Graphics","Topic :: Multimedia :: Graphics"))
-        self.create_trove_cat((109,100,"3dmodeling","3D Modeling","Topic :: Multimedia :: Graphics :: 3D Modeling"))
-        self.create_trove_cat((110,100,"3drendering","3D Rendering","Topic :: Multimedia :: Graphics :: 3D Rendering"))
-        self.create_trove_cat((111,100,"presentation","Presentation","Topic :: Multimedia :: Graphics :: Presentation"))
-        self.create_trove_cat((112,100,"viewers","Viewers","Topic :: Multimedia :: Graphics :: Viewers"))
-        self.create_trove_cat((101,100,"capture","Capture","Topic :: Multimedia :: Graphics :: Capture"))
-        self.create_trove_cat((104,101,"screencapture","Screen Capture","Topic :: Multimedia :: Graphics :: Capture :: Screen Capture"))
-        self.create_trove_cat((103,101,"cameras","Digital Camera","Topic :: Multimedia :: Graphics :: Capture :: Digital Camera"))
-        self.create_trove_cat((102,101,"scanners","Scanners","Topic :: Multimedia :: Graphics :: Capture :: Scanners"))
-        self.create_trove_cat((105,100,"conversion","Graphics Conversion","Topic :: Multimedia :: Graphics :: Graphics Conversion"))
-        self.create_trove_cat((106,100,"editors","Editors","Topic :: Multimedia :: Graphics :: Editors"))
-        self.create_trove_cat((108,106,"raster","Raster-Based","Topic :: Multimedia :: Graphics :: Editors :: Raster-Based"))
-        self.create_trove_cat((107,106,"vector","Vector-Based","Topic :: Multimedia :: Graphics :: Editors :: Vector-Based"))
-        self.create_trove_cat((97,18,"scientific","Scientific/Engineering","Topic :: Scientific/Engineering"))
-        self.create_trove_cat((609,97,"molecular_science","Molecular Science","Topic :: Scientific/Engineering :: Molecular Science"))
-        self.create_trove_cat((602,97,"robotics","Robotics","Topic :: Scientific/Engineering :: Robotics"))
-        self.create_trove_cat((600,97,"simulations","Simulations","Topic :: Scientific/Engineering :: Simulations"))
-        self.create_trove_cat((568,97,"ecosystem_sciences","Ecosystem Sciences","Topic :: Scientific/Engineering :: Ecosystem Sciences"))
-        self.create_trove_cat((386,97,"interfaceengine","Interface Engine/Protocol Translator","Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator"))
-        self.create_trove_cat((384,97,"chemistry","Chemistry","Topic :: Scientific/Engineering :: Chemistry"))
-        self.create_trove_cat((252,97,"bioinformatics","Bio-Informatics","Topic :: Scientific/Engineering :: Bio-Informatics"))
-        self.create_trove_cat((246,97,"eda","Electronic Design Automation (EDA)","Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)"))
-        self.create_trove_cat((135,97,"visualization","Visualization","Topic :: Scientific/Engineering :: Visualization"))
-        self.create_trove_cat((134,97,"astronomy","Astronomy","Topic :: Scientific/Engineering :: Astronomy"))
-        self.create_trove_cat((133,97,"ai","Artificial Intelligence","Topic :: Scientific/Engineering :: Artificial Intelligence"))
-        self.create_trove_cat((591,133,"intelligent_agents","Intelligent Agents","Topic :: Scientific/Engineering :: Artificial Intelligence :: Intelligent Agents"))
-        self.create_trove_cat((98,97,"mathematics","Mathematics","Topic :: Scientific/Engineering :: Mathematics"))
-        self.create_trove_cat((272,97,"HMI","Human Machine Interfaces","Topic :: Scientific/Engineering :: Human Machine Interfaces"))
-        self.create_trove_cat((266,97,"medical","Medical Science Apps.","Topic :: Scientific/Engineering :: Medical Science Apps."))
-        self.create_trove_cat((383,97,"gis","GIS","Topic :: Scientific/Engineering :: GIS"))
-        self.create_trove_cat((385,97,"informationanalysis","Information Analysis","Topic :: Scientific/Engineering :: Information Analysis"))
-        self.create_trove_cat((387,97,"physics","Physics","Topic :: Scientific/Engineering :: Physics"))
-        self.create_trove_cat((567,97,"earth_science","Earth Sciences","Topic :: Scientific/Engineering :: Earth Sciences"))
-        self.create_trove_cat((282,18,"Sociology","Sociology","Topic :: Sociology"))
-        self.create_trove_cat((284,282,"Genealogy","Genealogy","Topic :: Sociology :: Genealogy"))
-        self.create_trove_cat((283,282,"History","History","Topic :: Sociology :: History"))
-        self.create_trove_cat((71,18,"education","Education","Topic :: Education"))
-        self.create_trove_cat((73,71,"testing","Testing","Topic :: Education :: Testing"))
-        self.create_trove_cat((72,71,"cai","Computer Aided Instruction (CAI)","Topic :: Education :: Computer Aided Instruction (CAI)"))
-        self.create_trove_cat((18,0,"topic","Topic","Topic"))
-        self.create_trove_cat((125,99,"video","Video","Topic :: Multimedia :: Video"))
-        self.create_trove_cat((594,125,"still_capture","Still Capture","Topic :: Multimedia :: Video :: Still Capture"))
-        self.create_trove_cat((596,125,"codec","Codec","Topic :: Multimedia :: Video :: Codec"))
-        self.create_trove_cat((127,125,"conversion","Conversion","Topic :: Multimedia :: Video :: Conversion"))
-        self.create_trove_cat((128,125,"display","Display","Topic :: Multimedia :: Video :: Display"))
-        self.create_trove_cat((256,125,"nonlineareditor","Non-Linear Editor","Topic :: Multimedia :: Video :: Non-Linear Editor"))
-        self.create_trove_cat((595,125,"special_effects","Special Effects","Topic :: Multimedia :: Video :: Special Effects"))
-        self.create_trove_cat((623,125,"video_realtime","Realtime Processing","Topic :: Multimedia :: Video :: Realtime Processing"))
-        self.create_trove_cat((126,125,"vidcapture","Video Capture","Topic :: Multimedia :: Video :: Video Capture"))
-        self.create_trove_cat((113,99,"sound","Sound/Audio","Topic :: Multimedia :: Sound/Audio"))
-        self.create_trove_cat((123,122,"mp3","MP3","Topic :: Multimedia :: Sound/Audio :: Players :: MP3"))
-        self.create_trove_cat((124,113,"speech","Speech","Topic :: Multimedia :: Sound/Audio :: Speech"))
-        self.create_trove_cat((114,113,"analysis","Analysis","Topic :: Multimedia :: Sound/Audio :: Analysis"))
-        self.create_trove_cat((115,113,"capture","Capture/Recording","Topic :: Multimedia :: Sound/Audio :: Capture/Recording"))
-        self.create_trove_cat((248,113,"midi","MIDI","Topic :: Multimedia :: Sound/Audio :: MIDI"))
-        self.create_trove_cat((249,113,"synthesis","Sound Synthesis","Topic :: Multimedia :: Sound/Audio :: Sound Synthesis"))
-        self.create_trove_cat((116,113,"cdaudio","CD Audio","Topic :: Multimedia :: Sound/Audio :: CD Audio"))
-        self.create_trove_cat((117,116,"cdplay","CD Playing","Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing"))
-        self.create_trove_cat((99,18,"multimedia","Multimedia","Topic :: Multimedia"))
-        self.create_trove_cat((670,14,"agpl","Affero GNU Public License ","License :: OSI-Approved Open Source :: Affero GNU Public License"))
-        self.create_trove_cat((862,14,"lppl","LaTeX Project Public License","License :: OSI-Approved Open Source :: LaTeX Project Public License"))
-        self.create_trove_cat((655,432,"win64","64-bit MS Windows","Operating System :: Grouping and Descriptive Categories :: 64-bit MS Windows"))
-        self.create_trove_cat((657,418,"vista","Vista","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Vista"))
-        self.create_trove_cat((851,418,"win7","Windows 7","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Windows 7"))
-        self.create_trove_cat((728,315,"android","Android","Operating System :: Handheld/Embedded Operating Systems :: Android"))
-        self.create_trove_cat((780,315,"ios","Apple iPhone","Operating System :: Handheld/Embedded Operating Systems :: Apple iPhone"))
-        self.create_trove_cat((863,534,"architects","Architects","Intended Audience :: by End-User Class :: Architects"))
-        self.create_trove_cat((864,534,"auditors","Auditors","Intended Audience :: by End-User Class :: Auditors"))
-        self.create_trove_cat((865,534,"testers","Testers","Intended Audience :: by End-User Class :: Testers"))
-        self.create_trove_cat((866,534,"secpros","Security Professionals","Intended Audience :: by End-User Class :: Security Professionals"))
-        self.create_trove_cat((867,535,"secindustry","Security","Intended Audience :: by Industry or Sector :: Security"))
+        self.create_trove_cat((617,274,"kirghiz","Kirghiz","Translations :: Kirghiz",True))
+        self.create_trove_cat((372,274,"croatian","Croatian","Translations :: Croatian",True))
+        self.create_trove_cat((351,274,"thai","Thai","Translations :: Thai",True))
+        self.create_trove_cat((349,274,"tamil","Tamil","Translations :: Tamil",True))
+        self.create_trove_cat((347,274,"romanian","Romanian","Translations :: Romanian",True))
+        self.create_trove_cat((339,274,"korean","Korean","Translations :: Korean",True))
+        self.create_trove_cat((632,160,"cobol","COBOL","Programming Language :: COBOL",True))
+        self.create_trove_cat((598,160,"aspectj","AspectJ","Programming Language :: AspectJ",True))
+        self.create_trove_cat((167,160,"euler","Euler","Programming Language :: Euler",True))
+        self.create_trove_cat((185,160,"shell","Unix Shell","Programming Language :: Unix Shell",True))
+        self.create_trove_cat((184,160,"asp","ASP","Programming Language :: ASP",True))
+        self.create_trove_cat((273,160,"Pike","Pike","Programming Language :: Pike",True))
+        self.create_trove_cat((271,160,"csharp","C#","Programming Language :: C#",True))
+        self.create_trove_cat((170,160,"lisp","Lisp","Programming Language :: Lisp",True))
+        self.create_trove_cat((169,160,"fortran","Fortran","Programming Language :: Fortran",True))
+        self.create_trove_cat((625,160,"simulink","Simulink","Programming Language :: Simulink",True))
+        self.create_trove_cat((626,160,"matlab","MATLAB","Programming Language :: MATLAB",True))
+        self.create_trove_cat((1,0,"audience","Intended Audience","Intended Audience",False))
+        self.create_trove_cat((618,535,"nonprofit","Non-Profit Organizations","Intended Audience :: by Industry or Sector :: Non-Profit Organizations",False))
+        self.create_trove_cat((599,535,"aerospace","Aerospace","Intended Audience :: by Industry or Sector :: Aerospace",False))
+        self.create_trove_cat((569,535,"government","Government","Intended Audience :: by Industry or Sector :: Government",False))
+        self.create_trove_cat((363,535,"informationtechnology","Information Technology","Intended Audience :: by Industry or Sector :: Information Technology",False))
+        self.create_trove_cat((361,535,"financialinsurance","Financial and Insurance Industry","Intended Audience :: by Industry or Sector :: Financial and Insurance Industry",False))
+        self.create_trove_cat((362,535,"healthcareindustry","Healthcare Industry","Intended Audience :: by Industry or Sector :: Healthcare Industry",False))
+        self.create_trove_cat((367,535,"scienceresearch","Science/Research","Intended Audience :: by Industry or Sector :: Science/Research",False))
+        self.create_trove_cat((359,535,"customerservice","Customer Service","Intended Audience :: by Industry or Sector :: Customer Service",False))
+        self.create_trove_cat((360,535,"education","Education","Intended Audience :: by Industry or Sector :: Education",False))
+        self.create_trove_cat((365,535,"manufacturing","Manufacturing","Intended Audience :: by Industry or Sector :: Manufacturing",False))
+        self.create_trove_cat((368,535,"telecommunications","Telecommunications Industry","Intended Audience :: by Industry or Sector :: Telecommunications Industry",False))
+        self.create_trove_cat((166,160,"eiffel","Eiffel","Programming Language :: Eiffel",True))
+        self.create_trove_cat((550,160,"oberon","Oberon","Programming Language :: Oberon",True))
+        self.create_trove_cat((553,160,"realbasic","REALbasic","Programming Language :: REALbasic",True))
+        self.create_trove_cat((178,160,"python","Python","Programming Language :: Python",True))
+        self.create_trove_cat((179,160,"rexx","Rexx","Programming Language :: Rexx",True))
+        self.create_trove_cat((177,160,"prolog","Prolog","Programming Language :: Prolog",True))
+        self.create_trove_cat((176,160,"perl","Perl","Programming Language :: Perl",True))
+        self.create_trove_cat((175,160,"pascal","Pascal","Programming Language :: Pascal",True))
+        self.create_trove_cat((536,534,"enduser_advanced","Advanced End Users","Intended Audience :: by End-User Class :: Advanced End Users",False))
+        self.create_trove_cat((4,534,"sysadmins","System Administrators","Intended Audience :: by End-User Class :: System Administrators",False))
+        self.create_trove_cat((471,456,"ui_swing","Java Swing","User Interface :: Graphical :: Java Swing",True))
+        self.create_trove_cat((469,456,"ui_dotnet",".NET/Mono","User Interface :: Graphical :: .NET/Mono",True))
+        self.create_trove_cat((231,456,"gnome","Gnome","User Interface :: Graphical :: Gnome",True))
+        self.create_trove_cat((229,456,"x11","X Window System (X11)","User Interface :: Graphical :: X Window System (X11)",True))
+        self.create_trove_cat((475,456,"ui_opengl","OpenGL","User Interface :: Graphical :: OpenGL",True))
+        self.create_trove_cat((474,456,"ui_framebuffer","Framebuffer","User Interface :: Graphical :: Framebuffer",True))
+        self.create_trove_cat((472,456,"ui_swt","Java SWT","User Interface :: Graphical :: Java SWT",True))
+        self.create_trove_cat((470,456,"ui_awt","Java AWT","User Interface :: Graphical :: Java AWT",True))
+        self.create_trove_cat((230,456,"win32","Win32 (MS Windows)","User Interface :: Graphical :: Win32 (MS Windows)",True))
+        self.create_trove_cat((232,456,"kde","KDE","User Interface :: Graphical :: KDE",True))
+        self.create_trove_cat((310,456,"cocoa","Cocoa (MacOS X)","User Interface :: Graphical :: Cocoa (MacOS X)",True))
+        self.create_trove_cat((476,456,"ui_tabletpc","TabletPC","User Interface :: Graphical :: TabletPC",True))
+        self.create_trove_cat((314,456,"handhelds","Handheld/Mobile/PDA","User Interface :: Graphical :: Handheld/Mobile/PDA",True))
+        self.create_trove_cat((462,225,"ui_groupingdesc","Grouping and Descriptive Categories (UI)","User Interface :: Grouping and Descriptive Categories (UI)",True))
+        self.create_trove_cat((466,462,"ui_meta_3d","Project is a 3D engine","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a 3D engine",True))
+        self.create_trove_cat((464,462,"ui_meta_template","Project is a templating system","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a templating system",True))
+        self.create_trove_cat((463,462,"ui_meta_system","Project is a user interface (UI) system","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a user interface (UI) system",True))
+        self.create_trove_cat((465,462,"ui_meta_windowmanager","Project is a window manager","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a window manager",True))
+        self.create_trove_cat((467,462,"ui_meta_toolkit","Project is a graphics toolkit","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a graphics toolkit",True))
+        self.create_trove_cat((468,462,"ui_meta_remotecontrol","Project is a remote control application","User Interface :: Grouping and Descriptive Categories (UI) :: Project is a remote control application",True))
+        self.create_trove_cat((237,225,"web","Web-based","User Interface :: Web-based",True))
+        self.create_trove_cat((238,225,"daemon","Non-interactive (Daemon)","User Interface :: Non-interactive (Daemon)",True))
+        self.create_trove_cat((457,225,"textual_ui","Textual","User Interface :: Textual",True))
+        self.create_trove_cat((460,457,"ui_consoleterm","Console/Terminal","User Interface :: Textual :: Console/Terminal",True))
+        self.create_trove_cat((459,457,"ui_commandline","Command-line","User Interface :: Textual :: Command-line",True))
+        self.create_trove_cat((225,0,"environment","User Interface","User Interface",True))
+        self.create_trove_cat((461,225,"ui_plugins","Plugins","User Interface :: Plugins",True))
+        self.create_trove_cat((583,461,"eclipse_plugins","Eclipse","User Interface :: Plugins :: Eclipse",True))
+        self.create_trove_cat((458,225,"ui_toolkit","Toolkits/Libraries","User Interface :: Toolkits/Libraries",True))
+        self.create_trove_cat((495,458,"ui_othertoolkit","Other toolkit","User Interface :: Toolkits/Libraries :: Other toolkit",True))
+        self.create_trove_cat((493,458,"ui_motif","Motif/LessTif","User Interface :: Toolkits/Libraries :: Motif/LessTif",True))
+        self.create_trove_cat((491,458,"ui_crystalspace","Crystal Space","User Interface :: Toolkits/Libraries :: Crystal Space",True))
+        self.create_trove_cat((489,458,"ui_clanlib","ClanLib","User Interface :: Toolkits/Libraries :: ClanLib",True))
+        self.create_trove_cat((516,500,"db_group_objmap","Project is a relational object mapper","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a relational object mapper",True))
+        self.create_trove_cat((487,458,"ui_ggi","GGI","User Interface :: Toolkits/Libraries :: GGI",True))
+        self.create_trove_cat((485,458,"ui_directx","DirectX","User Interface :: Toolkits/Libraries :: DirectX",True))
+        self.create_trove_cat((483,458,"ui_svgalib","SVGAlib","User Interface :: Toolkits/Libraries :: SVGAlib",True))
+        self.create_trove_cat((481,458,"ui_wxwidgets","wxWidgets","User Interface :: Toolkits/Libraries :: wxWidgets",True))
+        self.create_trove_cat((511,500,"db_group_mgmt","Project is a database management tool","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database management tool",True))
+        self.create_trove_cat((479,458,"ui_qt","Qt","User Interface :: Toolkits/Libraries :: Qt",True))
+        self.create_trove_cat((477,458,"ui_gtk","GTK+","User Interface :: Toolkits/Libraries :: GTK+",True))
+        self.create_trove_cat((513,500,"db_group_netdbms","Project is a network-based DBMS (database system)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a network-based DBMS (database system)",True))
+        self.create_trove_cat((228,458,"newt","Newt","User Interface :: Toolkits/Libraries :: Newt",True))
+        self.create_trove_cat((227,458,"curses","Curses/Ncurses","User Interface :: Toolkits/Libraries :: Curses/Ncurses",True))
+        self.create_trove_cat((515,500,"db_group_conv","Project is a database conversion tool","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database conversion tool",True))
+        self.create_trove_cat((478,458,"ui_tk","Tk","User Interface :: Toolkits/Libraries :: Tk",True))
+        self.create_trove_cat((480,458,"ui_sdl","SDL","User Interface :: Toolkits/Libraries :: SDL",True))
+        self.create_trove_cat((33,28,"postoffice","Post-Office","Topic :: Communications :: Email :: Post-Office",True))
+        self.create_trove_cat((514,500,"db_group_propfmt","Project is a tool for a proprietary database file format","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a tool for a proprietary database file format",True))
+        self.create_trove_cat((482,458,"ui_aalib","AAlib","User Interface :: Toolkits/Libraries :: AAlib",True))
+        self.create_trove_cat((484,458,"ui_fltk","FLTK","User Interface :: Toolkits/Libraries :: FLTK",True))
+        self.create_trove_cat((512,500,"db_group_filedbms","Project is a file-based DBMS (database system)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a file-based DBMS (database system)",True))
+        self.create_trove_cat((486,458,"ui_plib","Plib","User Interface :: Toolkits/Libraries :: Plib",True))
+        self.create_trove_cat((488,458,"ui_glide","Glide","User Interface :: Toolkits/Libraries :: Glide",True))
+        self.create_trove_cat((510,500,"db_group_api","Project is a database abstraction layer (API)","Database Environment :: Grouping and Descriptive Categories (DB) :: Project is a database abstraction layer (API)",True))
+        self.create_trove_cat((490,458,"ui_glut","GLUT","User Interface :: Toolkits/Libraries :: GLUT",True))
+        self.create_trove_cat((492,458,"ui_allegro","Allegro","User Interface :: Toolkits/Libraries :: Allegro",True))
+        self.create_trove_cat((500,496,"db_grouping","Grouping and Descriptive Categories (DB)","Database Environment :: Grouping and Descriptive Categories (DB)",True))
+        self.create_trove_cat((494,458,"ui_quartz","Quartz","User Interface :: Toolkits/Libraries :: Quartz",True))
+        self.create_trove_cat((456,225,"graphical_ui","Graphical","User Interface :: Graphical",True))
+        self.create_trove_cat((276,274,"french","French","Translations :: French",True))
+        self.create_trove_cat((473,456,"ui_carbon","Carbon (Mac OS X)","User Interface :: Graphical :: Carbon (Mac OS X)",True))
+        self.create_trove_cat((535,1,"by_industrysector","by Industry or Sector","Intended Audience :: by Industry or Sector",False))
+        self.create_trove_cat((364,535,"legalindustry","Legal Industry","Intended Audience :: by Industry or Sector :: Legal Industry",False))
+        self.create_trove_cat((353,274,"ukrainian","Ukrainian","Translations :: Ukrainian",True))
+        self.create_trove_cat((330,274,"dutch","Dutch","Translations :: Dutch",True))
+        self.create_trove_cat((343,274,"persian","Persian","Translations :: Persian",True))
+        self.create_trove_cat((344,274,"polish","Polish","Translations :: Polish",True))
+        self.create_trove_cat((455,274,"irish_gaelic","Irish Gaelic","Translations :: Irish Gaelic",True))
+        self.create_trove_cat((413,274,"lithuanian","Lithuanian","Translations :: Lithuanian",True))
+        self.create_trove_cat((414,274,"albanian","Albanian","Translations :: Albanian",True))
+        self.create_trove_cat((415,274,"malagasy","Malagasy","Translations :: Malagasy",True))
+        self.create_trove_cat((416,274,"mongolian","Mongolian","Translations :: Mongolian",True))
+        self.create_trove_cat((417,274,"maltese","Maltese","Translations :: Maltese",True))
+        self.create_trove_cat((380,274,"slovenian","Slovene","Translations :: Slovene",True))
+        self.create_trove_cat((374,274,"icelandic","Icelandic","Translations :: Icelandic",True))
+        self.create_trove_cat((376,274,"macedonian","Macedonian","Translations :: Macedonian",True))
+        self.create_trove_cat((377,274,"latin","Latin","Translations :: Latin",True))
+        self.create_trove_cat((375,274,"latvian","Latvian","Translations :: Latvian",True))
+        self.create_trove_cat((373,274,"czech","Czech","Translations :: Czech",True))
+        self.create_trove_cat((369,274,"afrikaans","Afrikaans","Translations :: Afrikaans",True))
+        self.create_trove_cat((357,274,"finnish","Finnish","Translations :: Finnish",True))
+        self.create_trove_cat((186,160,"visualbasic","Visual Basic","Programming Language :: Visual Basic",True))
+        self.create_trove_cat((505,499,"db_pear","PHP Pear::DB","Database Environment :: Database API :: PHP Pear::DB",True))
+        self.create_trove_cat((507,499,"db_api_xml","XML-based","Database Environment :: Database API :: XML-based",True))
+        self.create_trove_cat((509,499,"db_api_other","Other API","Database Environment :: Database API :: Other API",True))
+        self.create_trove_cat((532,497,"db_net_hsql","HSQL","Database Environment :: Network-based DBMS :: HSQL",True))
+        self.create_trove_cat((547,160,"applescript","AppleScript","Programming Language :: AppleScript",True))
+        self.create_trove_cat((173,160,"modula","Modula","Programming Language :: Modula",True))
+        self.create_trove_cat((337,274,"italian","Italian","Translations :: Italian",True))
+        self.create_trove_cat((333,274,"hebrew","Hebrew","Translations :: Hebrew",True))
+        self.create_trove_cat((331,274,"esperanto","Esperanto","Translations :: Esperanto",True))
+        self.create_trove_cat((329,274,"catalan","Catalan","Translations :: Catalan",True))
+        self.create_trove_cat((327,274,"bengali","Bengali","Translations :: Bengali",True))
+        self.create_trove_cat((332,274,"greek","Greek","Translations :: Greek",True))
+        self.create_trove_cat((341,274,"marathi","Marathi","Translations :: Marathi",True))
+        self.create_trove_cat((355,274,"vietnamese","Vietnamese","Translations :: Vietnamese",True))
+        self.create_trove_cat((275,274,"english","English","Translations :: English",True))
+        self.create_trove_cat((345,274,"portuguese","Portuguese","Translations :: Portuguese",True))
+        self.create_trove_cat((171,160,"logo","Logo","Programming Language :: Logo",True))
+        self.create_trove_cat((502,499,"db_api_jdbc","JDBC","Database Environment :: Database API :: JDBC",True))
+        self.create_trove_cat((504,499,"db_api_perldbi","Perl DBI/DBD","Database Environment :: Database API :: Perl DBI/DBD",True))
+        self.create_trove_cat((274,0,"natlanguage","Translations","Translations",True))
+        self.create_trove_cat((506,499,"db_python","Python Database API","Database Environment :: Database API :: Python Database API",True))
+        self.create_trove_cat((526,497,"db_net_oracle","Oracle","Database Environment :: Network-based DBMS :: Oracle",True))
+        self.create_trove_cat((524,497,"db_net_mysql","MySQL","Database Environment :: Network-based DBMS :: MySQL",True))
+        self.create_trove_cat((525,497,"db_net_pgsql","PostgreSQL (pgsql)","Database Environment :: Network-based DBMS :: PostgreSQL (pgsql)",True))
+        self.create_trove_cat((527,497,"db_net_ibmdb2","IBM DB2","Database Environment :: Network-based DBMS :: IBM DB2",True))
+        self.create_trove_cat((529,497,"db_net_sybase","Sybase","Database Environment :: Network-based DBMS :: Sybase",True))
+        self.create_trove_cat((531,497,"db_net_sqlite","SQLite","Database Environment :: Network-based DBMS :: SQLite",True))
+        self.create_trove_cat((533,497,"db_net_other","Other network-based DBMS","Database Environment :: Network-based DBMS :: Other network-based DBMS",True))
+        self.create_trove_cat((497,496,"db_networkbased","Network-based DBMS","Database Environment :: Network-based DBMS",True))
+        self.create_trove_cat((426,199,"os_emu_api","Emulation and API Compatibility","Operating System :: Emulation and API Compatibility",True))
+        self.create_trove_cat((311,236,"macos9","Apple Mac OS Classic","Operating System :: Other Operating Systems :: Apple Mac OS Classic",True))
+        self.create_trove_cat((224,236,"beos","BeOS","Operating System :: Other Operating Systems :: BeOS",True))
+        self.create_trove_cat((215,236,"msdos","MS-DOS","Operating System :: Other Operating Systems :: MS-DOS",True))
+        self.create_trove_cat((421,236,"mswin_95","Win95","Operating System :: Other Operating Systems :: Win95",True))
+        self.create_trove_cat((508,499,"db_api_sql","SQL-based","Database Environment :: Database API :: SQL-based",True))
+        self.create_trove_cat((499,496,"db_api","Database API","Database Environment :: Database API",True))
+        self.create_trove_cat((378,274,"serbian","Serbian","Translations :: Serbian",True))
+        self.create_trove_cat((379,274,"slovak","Slovak","Translations :: Slovak",True))
+        self.create_trove_cat((371,274,"chinesetraditional","Chinese (Traditional)","Translations :: Chinese (Traditional)",True))
+        self.create_trove_cat((410,274,"belarusian","Belarusian","Translations :: Belarusian",True))
+        self.create_trove_cat((411,274,"estonian","Estonian","Translations :: Estonian",True))
+        self.create_trove_cat((412,274,"galician","Galician","Translations :: Galician",True))
+        self.create_trove_cat((34,33,"pop3","POP3","Topic :: Communications :: Email :: Post-Office :: POP3",True))
+        self.create_trove_cat((35,33,"imap","IMAP","Topic :: Communications :: Email :: Post-Office :: IMAP",True))
+        self.create_trove_cat((29,28,"filters","Filters","Topic :: Communications :: Email :: Filters",True))
+        self.create_trove_cat((30,28,"listservers","Mailing List Servers","Topic :: Communications :: Email :: Mailing List Servers",True))
+        self.create_trove_cat((597,80,"card_games","Card Games","Topic :: Games/Entertainment :: Card Games",True))
+        self.create_trove_cat((63,18,"editors","Text Editors","Topic :: Text Editors",True))
+        self.create_trove_cat((366,535,"religion","Religion","Intended Audience :: by Industry or Sector :: Religion",False))
+        self.create_trove_cat((534,1,"by_enduser","by End-User Class","Intended Audience :: by End-User Class",False))
+        self.create_trove_cat((528,497,"db_net_firebird","Firebird/InterBase","Database Environment :: Network-based DBMS :: Firebird/InterBase",True))
+        self.create_trove_cat((3,534,"developers","Developers","Intended Audience :: by End-User Class :: Developers",False))
+        self.create_trove_cat((530,497,"db_net_mssql","Microsoft SQL Server","Database Environment :: Network-based DBMS :: Microsoft SQL Server",True))
+        self.create_trove_cat((2,534,"endusers","End Users/Desktop","Intended Audience :: by End-User Class :: End Users/Desktop",False))
+        self.create_trove_cat((498,496,"db_filebased","File-based DBMS","Database Environment :: File-based DBMS",True))
+        self.create_trove_cat((537,534,"enduser_qa","Quality Engineers","Intended Audience :: by End-User Class :: Quality Engineers",False))
+        self.create_trove_cat((5,1,"other","Other Audience","Intended Audience :: Other Audience",False))
+        self.create_trove_cat((517,498,"db_file_dbm","Berkeley/Sleepycat/Gdbm (DBM)","Database Environment :: File-based DBMS :: Berkeley/Sleepycat/Gdbm (DBM)",True))
+        self.create_trove_cat((358,6,"inactive","7 - Inactive","Development Status :: 7 - Inactive",False))
+        self.create_trove_cat((520,498,"db_file_palm","PalmOS PDB","Database Environment :: File-based DBMS :: PalmOS PDB",True))
+        self.create_trove_cat((523,498,"db_file_other","Other file-based DBMS","Database Environment :: File-based DBMS :: Other file-based DBMS",True))
+        self.create_trove_cat((165,160,"cpp","C++","Programming Language :: C++",True))
+        self.create_trove_cat((163,160,"ada","Ada","Programming Language :: Ada",True))
+        self.create_trove_cat((328,274,"bulgarian","Bulgarian","Translations :: Bulgarian",True))
+        self.create_trove_cat((546,274,"swahili","Swahili","Translations :: Swahili",True))
+        self.create_trove_cat((348,274,"swedish","Swedish","Translations :: Swedish",True))
+        self.create_trove_cat((350,274,"telugu","Telugu","Translations :: Telugu",True))
+        self.create_trove_cat((162,160,"assembly","Assembly","Programming Language :: Assembly",True))
+        self.create_trove_cat((164,160,"c","C","Programming Language :: C",True))
+        self.create_trove_cat((161,160,"apl","APL","Programming Language :: APL",True))
+        self.create_trove_cat((267,160,"zope","Zope","Programming Language :: Zope",True))
+        self.create_trove_cat((264,160,"erlang","Erlang","Programming Language :: Erlang",True))
+        self.create_trove_cat((263,160,"euphoria","Euphoria","Programming Language :: Euphoria",True))
+        self.create_trove_cat((183,160,"php","PHP","Programming Language :: PHP",True))
+        self.create_trove_cat((182,160,"tcl","Tcl","Programming Language :: Tcl",True))
+        self.create_trove_cat((181,160,"smalltalk","Smalltalk","Programming Language :: Smalltalk",True))
+        self.create_trove_cat((180,160,"simula","Simula","Programming Language :: Simula",True))
+        self.create_trove_cat((174,160,"objectivec","Objective C","Programming Language :: Objective C",True))
+        self.create_trove_cat((560,160,"xsl","XSL (XSLT/XPath/XSL-FO)","Programming Language :: XSL (XSLT/XPath/XSL-FO)",True))
+        self.create_trove_cat((293,160,"ruby","Ruby","Programming Language :: Ruby",True))
+        self.create_trove_cat((265,160,"Delphi","Delphi/Kylix","Programming Language :: Delphi/Kylix",True))
+        self.create_trove_cat((281,160,"REBOL","REBOL","Programming Language :: REBOL",True))
+        self.create_trove_cat((454,160,"ocaml","OCaml (Objective Caml)","Programming Language :: OCaml (Objective Caml)",True))
+        self.create_trove_cat((453,160,"vb_net","Visual Basic .NET","Programming Language :: Visual Basic .NET",True))
+        self.create_trove_cat((452,160,"visual_foxpro","Visual FoxPro","Programming Language :: Visual FoxPro",True))
+        self.create_trove_cat((451,160,"haskell","Haskell","Programming Language :: Haskell",True))
+        self.create_trove_cat((450,160,"lua","Lua","Programming Language :: Lua",True))
+        self.create_trove_cat((280,160,"JavaScript","JavaScript","Programming Language :: JavaScript",True))
+        self.create_trove_cat((262,160,"coldfusion","Cold Fusion","Programming Language :: Cold Fusion",True))
+        self.create_trove_cat((261,160,"xbasic","XBasic","Programming Language :: XBasic",True))
+        self.create_trove_cat((258,160,"objectpascal","Object Pascal","Programming Language :: Object Pascal",True))
+        self.create_trove_cat((539,160,"proglang_basic","BASIC","Programming Language :: BASIC",True))
+        self.create_trove_cat((543,160,"groovy","Groovy","Programming Language :: Groovy",True))
+        self.create_trove_cat((545,160,"proglang_labview","LabVIEW","Programming Language :: LabVIEW",True))
+        self.create_trove_cat((548,160,"vbscript","VBScript","Programming Language :: VBScript",True))
+        self.create_trove_cat((552,160,"d_proglang","D","Programming Language :: D",True))
+        self.create_trove_cat((551,160,"vhdl_verilog","VHDL/Verilog","Programming Language :: VHDL/Verilog",True))
+        self.create_trove_cat((549,160,"proglang_lpc","LPC","Programming Language :: LPC",True))
+        self.create_trove_cat((544,160,"yacc","Yacc","Programming Language :: Yacc",True))
+        self.create_trove_cat((352,274,"turkish","Turkish","Translations :: Turkish",True))
+        self.create_trove_cat((354,274,"urdu","Urdu","Translations :: Urdu",True))
+        self.create_trove_cat((160,0,"language","Programming Language","Programming Language",True))
+        self.create_trove_cat((542,160,"emacs_lisp","Emacs-Lisp","Programming Language :: Emacs-Lisp",True))
+        self.create_trove_cat((540,160,"clisp","Common Lisp","Programming Language :: Common Lisp",True))
+        self.create_trove_cat((12,6,"mature","6 - Mature","Development Status :: 6 - Mature",False))
+        self.create_trove_cat((538,160,"awk","AWK","Programming Language :: AWK",True))
+        self.create_trove_cat((572,160,"jsp","JSP","Programming Language :: JSP",True))
+        self.create_trove_cat((172,160,"ml","Standard ML","Programming Language :: Standard ML",True))
+        self.create_trove_cat((255,160,"progress","PROGRESS","Programming Language :: PROGRESS",True))
+        self.create_trove_cat((254,160,"plsql","PL/SQL","Programming Language :: PL/SQL",True))
+        self.create_trove_cat((242,160,"scheme","Scheme","Programming Language :: Scheme",True))
+        self.create_trove_cat((624,160,"idl","IDL","Programming Language :: IDL",True))
+        self.create_trove_cat((198,160,"java","Java","Programming Language :: Java",True))
+        self.create_trove_cat((589,160,"asp_dot_net","ASP.NET","Programming Language :: ASP.NET",True))
+        self.create_trove_cat((608,160,"mumps","MUMPS","Programming Language :: MUMPS",True))
+        self.create_trove_cat((541,160,"dylan","Dylan","Programming Language :: Dylan",True))
+        self.create_trove_cat((573,160,"s_slash_r","S/R","Programming Language :: S/R",True))
+        self.create_trove_cat((584,160,"actionscript","ActionScript","Programming Language :: ActionScript",True))
+        self.create_trove_cat((168,160,"forth","Forth","Programming Language :: Forth",True))
+        self.create_trove_cat((334,274,"hindi","Hindi","Translations :: Hindi",True))
+        self.create_trove_cat((336,274,"indonesian","Indonesian","Translations :: Indonesian",True))
+        self.create_trove_cat((521,498,"db_file_flat","Flat-file","Database Environment :: File-based DBMS :: Flat-file",True))
+        self.create_trove_cat((519,498,"db_file_xbase","xBase","Database Environment :: File-based DBMS :: xBase",True))
+        self.create_trove_cat((338,274,"javanese","Javanese","Translations :: Javanese",True))
+        self.create_trove_cat((518,498,"db_msaccess","Microsoft Access","Database Environment :: File-based DBMS :: Microsoft Access",True))
+        self.create_trove_cat((522,498,"db_file_proprietary","Proprietary file format","Database Environment :: File-based DBMS :: Proprietary file format",True))
+        self.create_trove_cat((496,0,"root_database","Database Environment","Database Environment",True))
+        self.create_trove_cat((501,499,"db_api_odbc","ODBC","Database Environment :: Database API :: ODBC",True))
+        self.create_trove_cat((503,499,"db_adodb","ADOdb","Database Environment :: Database API :: ADOdb",True))
+        self.create_trove_cat((340,274,"malay","Malay","Translations :: Malay",True))
+        self.create_trove_cat((6,0,"developmentstatus","Development Status","Development Status",False))
+        self.create_trove_cat((342,274,"norwegian","Norwegian","Translations :: Norwegian",True))
+        self.create_trove_cat((381,274,"portuguesebrazilian","Brazilian Portuguese","Translations :: Brazilian Portuguese",True))
+        self.create_trove_cat((382,274,"chinesesimplified","Chinese (Simplified)","Translations :: Chinese (Simplified)",True))
+        self.create_trove_cat((356,274,"danish","Danish","Translations :: Danish",True))
+        self.create_trove_cat((346,274,"panjabi","Panjabi","Translations :: Panjabi",True))
+        self.create_trove_cat((370,274,"bosnian","Bosnian","Translations :: Bosnian",True))
+        self.create_trove_cat((279,274,"german","German","Translations :: German",True))
+        self.create_trove_cat((278,274,"japanese","Japanese","Translations :: Japanese",True))
+        self.create_trove_cat((277,274,"spanish","Spanish","Translations :: Spanish",True))
+        self.create_trove_cat((11,6,"production","5 - Production/Stable","Development Status :: 5 - Production/Stable",False))
+        self.create_trove_cat((10,6,"beta","4 - Beta","Development Status :: 4 - Beta",False))
+        self.create_trove_cat((9,6,"alpha","3 - Alpha","Development Status :: 3 - Alpha",False))
+        self.create_trove_cat((8,6,"prealpha","2 - Pre-Alpha","Development Status :: 2 - Pre-Alpha",False))
+        self.create_trove_cat((7,6,"planning","1 - Planning","Development Status :: 1 - Planning",False))
+        self.create_trove_cat((295,274,"russian","Russian","Translations :: Russian",True))
+        self.create_trove_cat((326,274,"arabic","Arabic","Translations :: Arabic",True))
+        self.create_trove_cat((335,274,"hungarian","Hungarian","Translations :: Hungarian",True))
+        self.create_trove_cat((13,0,"license","License","License",False))
+        self.create_trove_cat((14,13,"osi","OSI-Approved Open Source","License :: OSI-Approved Open Source",False))
+        self.create_trove_cat((388,14,"osl","Open Software License","License :: OSI-Approved Open Source :: Open Software License",False))
+        self.create_trove_cat((321,14,"motosoto","Motosoto License","License :: OSI-Approved Open Source :: Motosoto License",False))
+        self.create_trove_cat((325,14,"attribut","Attribution Assurance License","License :: OSI-Approved Open Source :: Attribution Assurance License",False))
+        self.create_trove_cat((304,14,"mpl","Mozilla Public License 1.0 (MPL)","License :: OSI-Approved Open Source :: Mozilla Public License 1.0 (MPL)",False))
+        self.create_trove_cat((398,14,"plan9","Lucent Public License (Plan9)","License :: OSI-Approved Open Source :: Lucent Public License (Plan9)",False))
+        self.create_trove_cat((187,14,"bsd","BSD License","License :: OSI-Approved Open Source :: BSD License",False))
+        self.create_trove_cat((393,14,"historical","Historical Permission Notice and Disclaimer","License :: OSI-Approved Open Source :: Historical Permission Notice and Disclaimer",False))
+        self.create_trove_cat((395,14,"real","RealNetworks Public Source License V1.0","License :: OSI-Approved Open Source :: RealNetworks Public Source License V1.0",False))
+        self.create_trove_cat((396,14,"rpl","Reciprocal Public License","License :: OSI-Approved Open Source :: Reciprocal Public License",False))
+        self.create_trove_cat((392,14,"eiffel2","Eiffel Forum License V2.0","License :: OSI-Approved Open Source :: Eiffel Forum License V2.0",False))
+        self.create_trove_cat((320,14,"w3c","W3C License","License :: OSI-Approved Open Source :: W3C License",False))
+        self.create_trove_cat((400,14,"frameworx","Frameworx Open License","License :: OSI-Approved Open Source :: Frameworx Open License",False))
+        self.create_trove_cat((194,14,"python","Python License (CNRI Python License)","License :: OSI-Approved Open Source :: Python License (CNRI Python License)",False))
+        self.create_trove_cat((296,14,"apache","Apache Software License","License :: OSI-Approved Open Source :: Apache Software License",False))
+        self.create_trove_cat((298,14,"sissl","Sun Industry Standards Source License (SISSL)","License :: OSI-Approved Open Source :: Sun Industry Standards Source License (SISSL)",False))
+        self.create_trove_cat((196,13,"other","Other/Proprietary License","License :: Other/Proprietary License",False))
+        self.create_trove_cat((197,13,"publicdomain","Public Domain","License :: Public Domain",False))
+        self.create_trove_cat((301,14,"nokia","Nokia Open Source License","License :: OSI-Approved Open Source :: Nokia Open Source License",False))
+        self.create_trove_cat((319,14,"eiffel","Eiffel Forum License","License :: OSI-Approved Open Source :: Eiffel Forum License",False))
+        self.create_trove_cat((318,14,"sunpublic","Sun Public License","License :: OSI-Approved Open Source :: Sun Public License",False))
+        self.create_trove_cat((190,14,"qpl","Qt Public License (QPL)","License :: OSI-Approved Open Source :: Qt Public License (QPL)",False))
+        self.create_trove_cat((390,14,"oclc","OCLC Research Public License 2.0","License :: OSI-Approved Open Source :: OCLC Research Public License 2.0",False))
+        self.create_trove_cat((407,14,"nasalicense","NASA Open Source Agreement","License :: OSI-Approved Open Source :: NASA Open Source Agreement",False))
+        self.create_trove_cat((406,14,"eclipselicense","Eclipse Public License","License :: OSI-Approved Open Source :: Eclipse Public License",False))
+        self.create_trove_cat((316,14,"opengroup","Open Group Test Suite License","License :: OSI-Approved Open Source :: Open Group Test Suite License",False))
+        self.create_trove_cat((300,14,"jabber","Jabber Open Source License","License :: OSI-Approved Open Source :: Jabber Open Source License",False))
+        self.create_trove_cat((297,14,"vovida","Vovida Software License 1.0","License :: OSI-Approved Open Source :: Vovida Software License 1.0",False))
+        self.create_trove_cat((324,14,"afl","Academic Free License (AFL)","License :: OSI-Approved Open Source :: Academic Free License (AFL)",False))
+        self.create_trove_cat((189,14,"psfl","Python Software Foundation License","License :: OSI-Approved Open Source :: Python Software Foundation License",False))
+        self.create_trove_cat((193,14,"rscpl","Ricoh Source Code Public License","License :: OSI-Approved Open Source :: Ricoh Source Code Public License",False))
+        self.create_trove_cat((17,14,"artistic","Artistic License","License :: OSI-Approved Open Source :: Artistic License",False))
+        self.create_trove_cat((389,14,"sybase","Sybase Open Watcom Public License","License :: OSI-Approved Open Source :: Sybase Open Watcom Public License",False))
+        self.create_trove_cat((391,14,"wxwindows","wxWindows Library Licence","License :: OSI-Approved Open Source :: wxWindows Library Licence",False))
+        self.create_trove_cat((397,14,"entessa","Entessa Public License","License :: OSI-Approved Open Source :: Entessa Public License",False))
+        self.create_trove_cat((16,14,"lgpl","GNU Library or Lesser General Public License (LGPL)","License :: OSI-Approved Open Source :: GNU Library or Lesser General Public License (LGPL)",False))
+        self.create_trove_cat((629,14,"educom","Educational Community License","License :: OSI-Approved Open Source :: Educational Community License",False))
+        self.create_trove_cat((15,14,"gpl","GNU General Public License (GPL)","License :: OSI-Approved Open Source :: GNU General Public License (GPL)",False))
+        self.create_trove_cat((191,14,"ibm","IBM Public License","License :: OSI-Approved Open Source :: IBM Public License",False))
+        self.create_trove_cat((192,14,"cvw","MITRE Collaborative Virtual Workspace License (CVW)","License :: OSI-Approved Open Source :: MITRE Collaborative Virtual Workspace License (CVW)",False))
+        self.create_trove_cat((299,14,"iosl","Intel Open Source License","License :: OSI-Approved Open Source :: Intel Open Source License",False))
+        self.create_trove_cat((399,14,"php-license","PHP License","License :: OSI-Approved Open Source :: PHP License",False))
+        self.create_trove_cat((188,14,"mit","MIT License","License :: OSI-Approved Open Source :: MIT License",False))
+        self.create_trove_cat((405,14,"public102","Lucent Public License Version 1.02","License :: OSI-Approved Open Source :: Lucent Public License Version 1.02",False))
+        self.create_trove_cat((404,14,"fair","Fair License","License :: OSI-Approved Open Source :: Fair License",False))
+        self.create_trove_cat((403,14,"datagrid","EU DataGrid Software License","License :: OSI-Approved Open Source :: EU DataGrid Software License",False))
+        self.create_trove_cat((307,14,"ibmcpl","Common Public License","License :: OSI-Approved Open Source :: Common Public License",False))
+        self.create_trove_cat((402,14,"cua","CUA Office Public License Version 1.0","License :: OSI-Approved Open Source :: CUA Office Public License Version 1.0",False))
+        self.create_trove_cat((401,14,"apache2","Apache License V2.0","License :: OSI-Approved Open Source :: Apache License V2.0",False))
+        self.create_trove_cat((394,14,"nausite","Naumen Public License","License :: OSI-Approved Open Source :: Naumen Public License",False))
+        self.create_trove_cat((317,14,"xnet","X.Net License","License :: OSI-Approved Open Source :: X.Net License",False))
+        self.create_trove_cat((195,14,"zlib","zlib/libpng License","License :: OSI-Approved Open Source :: zlib/libpng License",False))
+        self.create_trove_cat((323,14,"ncsa","University of Illinois/NCSA Open Source License","License :: OSI-Approved Open Source :: University of Illinois/NCSA Open Source License",False))
+        self.create_trove_cat((322,14,"zope","Zope Public License","License :: OSI-Approved Open Source :: Zope Public License",False))
+        self.create_trove_cat((302,14,"sleepycat","Sleepycat License","License :: OSI-Approved Open Source :: Sleepycat License",False))
+        self.create_trove_cat((303,14,"nethack","Nethack General Public License","License :: OSI-Approved Open Source :: Nethack General Public License",False))
+        self.create_trove_cat((306,14,"apsl","Apple Public Source License","License :: OSI-Approved Open Source :: Apple Public Source License",False))
+        self.create_trove_cat((305,14,"mpl11","Mozilla Public License 1.1 (MPL 1.1)","License :: OSI-Approved Open Source :: Mozilla Public License 1.1 (MPL 1.1)",False))
+        self.create_trove_cat((628,14,"adaptive","Adaptive Public License","License :: OSI-Approved Open Source :: Adaptive Public License",False))
+        self.create_trove_cat((630,14,"cddl","Common Development and Distribution License","License :: OSI-Approved Open Source :: Common Development and Distribution License",False))
+        self.create_trove_cat((631,14,"catosl","Computer Associates Trusted Open Source License","License :: OSI-Approved Open Source :: Computer Associates Trusted Open Source License",False))
+        self.create_trove_cat((199,0,"os","Operating System","Operating System",True))
+        self.create_trove_cat((429,426,"fink","Fink (Mac OS X)","Operating System :: Emulation and API Compatibility :: Fink (Mac OS X)",True))
+        self.create_trove_cat((427,426,"cygwin","Cygwin (MS Windows)","Operating System :: Emulation and API Compatibility :: Cygwin (MS Windows)",True))
+        self.create_trove_cat((428,426,"dosemu","DOSEMU","Operating System :: Emulation and API Compatibility :: DOSEMU",True))
+        self.create_trove_cat((430,426,"wine","WINE","Operating System :: Emulation and API Compatibility :: WINE",True))
+        self.create_trove_cat((431,426,"emx","EMX (OS/2 and MS-DOS)","Operating System :: Emulation and API Compatibility :: EMX (OS/2 and MS-DOS)",True))
+        self.create_trove_cat((445,426,"mingw_msys","MinGW/MSYS (MS Windows)","Operating System :: Emulation and API Compatibility :: MinGW/MSYS (MS Windows)",True))
+        self.create_trove_cat((315,199,"pdasystems","Handheld/Embedded Operating Systems","Operating System :: Handheld/Embedded Operating Systems",True))
+        self.create_trove_cat((222,315,"wince","WinCE","Operating System :: Handheld/Embedded Operating Systems :: WinCE",True))
+        self.create_trove_cat((223,315,"palmos","PalmOS","Operating System :: Handheld/Embedded Operating Systems :: PalmOS",True))
+        self.create_trove_cat((441,315,"ecos","eCos","Operating System :: Handheld/Embedded Operating Systems :: eCos",True))
+        self.create_trove_cat((443,315,"vxworks","VxWorks","Operating System :: Handheld/Embedded Operating Systems :: VxWorks",True))
+        self.create_trove_cat((444,315,"symbianos","SymbianOS","Operating System :: Handheld/Embedded Operating Systems :: SymbianOS",True))
+        self.create_trove_cat((442,315,"qnx","QNX","Operating System :: Handheld/Embedded Operating Systems :: QNX",True))
+        self.create_trove_cat((440,315,"uclinux","uClinux","Operating System :: Handheld/Embedded Operating Systems :: uClinux",True))
+        self.create_trove_cat((418,199,"modern_oses","Modern (Vendor-Supported) Desktop Operating Systems","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems",True))
+        self.create_trove_cat((420,418,"mswin_2000","Win2K","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Win2K",True))
+        self.create_trove_cat((207,418,"sun","Solaris","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Solaris",True))
+        self.create_trove_cat((201,418,"linux","Linux","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Linux",True))
+        self.create_trove_cat((205,418,"openbsd","OpenBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: OpenBSD",True))
+        self.create_trove_cat((203,418,"freebsd","FreeBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: FreeBSD",True))
+        self.create_trove_cat((204,418,"netbsd","NetBSD","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: NetBSD",True))
+        self.create_trove_cat((309,418,"macosx","OS X","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: OS X",True))
+        self.create_trove_cat((419,418,"mswin_xp","WinXP","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: WinXP",True))
+        self.create_trove_cat((236,199,"other","Other Operating Systems","Operating System :: Other Operating Systems",True))
+        self.create_trove_cat((206,236,"bsdos","BSD/OS","Operating System :: Other Operating Systems :: BSD/OS",True))
+        self.create_trove_cat((634,236,"console-platforms","Console-based Platforms","Operating System :: Other Operating Systems :: Console-based Platforms",True))
+        self.create_trove_cat((637,634,"sega-dreamcast","Sega Dreamcast","Operating System :: Other Operating Systems :: Console-based Platforms :: Sega Dreamcast",True))
+        self.create_trove_cat((635,634,"xbox","Microsoft Xbox","Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox",True))
+        self.create_trove_cat((636,634,"sony-ps2","Sony Playstation 2","Operating System :: Other Operating Systems :: Console-based Platforms :: Sony Playstation 2",True))
+        self.create_trove_cat((422,236,"mswin_98","Win98","Operating System :: Other Operating Systems :: Win98",True))
+        self.create_trove_cat((425,422,"mswin_98_osr2","Win98 OSR2","Operating System :: Other Operating Systems :: Win98 :: Win98 OSR2",True))
+        self.create_trove_cat((424,236,"mswin_me","WinME","Operating System :: Other Operating Systems :: WinME",True))
+        self.create_trove_cat((423,236,"mswin_nt","WinNT","Operating System :: Other Operating Systems :: WinNT",True))
+        self.create_trove_cat((220,236,"os2","IBM OS/2","Operating System :: Other Operating Systems :: IBM OS/2",True))
+        self.create_trove_cat((211,236,"irix","SGI IRIX","Operating System :: Other Operating Systems :: SGI IRIX",True))
+        self.create_trove_cat((210,236,"aix","IBM AIX","Operating System :: Other Operating Systems :: IBM AIX",True))
+        self.create_trove_cat((212,236,"other","Other","Operating System :: Other Operating Systems :: Other",True))
+        self.create_trove_cat((446,236,"openvms","OpenVMS","Operating System :: Other Operating Systems :: OpenVMS",True))
+        self.create_trove_cat((434,236,"amigaos","AmigaOS","Operating System :: Other Operating Systems :: AmigaOS",True))
+        self.create_trove_cat((448,236,"mswin_server2003","Microsoft Windows Server 2003","Operating System :: Other Operating Systems :: Microsoft Windows Server 2003",True))
+        self.create_trove_cat((447,236,"morphos","MorphOS","Operating System :: Other Operating Systems :: MorphOS",True))
+        self.create_trove_cat((209,236,"hpux","HP-UX","Operating System :: Other Operating Systems :: HP-UX",True))
+        self.create_trove_cat((208,236,"sco","SCO","Operating System :: Other Operating Systems :: SCO",True))
+        self.create_trove_cat((240,236,"gnuhurd","GNU Hurd","Operating System :: Other Operating Systems :: GNU Hurd",True))
+        self.create_trove_cat((217,236,"win31","Microsoft Windows 3.x","Operating System :: Other Operating Systems :: Microsoft Windows 3.x",True))
+        self.create_trove_cat((432,199,"os_groups","Grouping and Descriptive Categories","Operating System :: Grouping and Descriptive Categories",True))
+        self.create_trove_cat((218,432,"win95","32-bit MS Windows (95/98)","Operating System :: Grouping and Descriptive Categories :: 32-bit MS Windows (95/98)",True))
+        self.create_trove_cat((439,432,"os_projectdistrospecific","Project is OS Distribution-Specific","Operating System :: Grouping and Descriptive Categories :: Project is OS Distribution-Specific",True))
+        self.create_trove_cat((449,432,"eightbit_oses","Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)","Operating System :: Grouping and Descriptive Categories :: Classic 8-bit Operating Systems (Apple, Atari, Commodore, etc.)",True))
+        self.create_trove_cat((436,432,"os_portable","OS Portable (Source code to work with many OS platforms)","Operating System :: Grouping and Descriptive Categories :: OS Portable (Source code to work with many OS platforms)",True))
+        self.create_trove_cat((438,432,"os_projectdistro","Project is an Operating System Distribution","Operating System :: Grouping and Descriptive Categories :: Project is an Operating System Distribution",True))
+        self.create_trove_cat((235,432,"independent","OS Independent (Written in an interpreted language)","Operating System :: Grouping and Descriptive Categories :: OS Independent (Written in an interpreted language)",True))
+        self.create_trove_cat((200,432,"posix","All POSIX (Linux/BSD/UNIX-like OSes)","Operating System :: Grouping and Descriptive Categories :: All POSIX (Linux/BSD/UNIX-like OSes)",True))
+        self.create_trove_cat((219,432,"winnt","32-bit MS Windows (NT/2000/XP)","Operating System :: Grouping and Descriptive Categories :: 32-bit MS Windows (NT/2000/XP)",True))
+        self.create_trove_cat((202,432,"bsd","All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)","Operating System :: Grouping and Descriptive Categories :: All BSD Platforms (FreeBSD/NetBSD/OpenBSD/Apple Mac OS X)",True))
+        self.create_trove_cat((435,432,"mswin_all32bit","All 32-bit MS Windows (95/98/NT/2000/XP)","Operating System :: Grouping and Descriptive Categories :: All 32-bit MS Windows (95/98/NT/2000/XP)",True))
+        self.create_trove_cat((437,432,"os_projectkernel","Project is an Operating System Kernel","Operating System :: Grouping and Descriptive Categories :: Project is an Operating System Kernel",True))
+        self.create_trove_cat((64,63,"emacs","Emacs","Topic :: Text Editors :: Emacs",True))
+        self.create_trove_cat((65,63,"ide","Integrated Development Environments (IDE)","Topic :: Text Editors :: Integrated Development Environments (IDE)",True))
+        self.create_trove_cat((69,63,"documentation","Documentation","Topic :: Text Editors :: Documentation",True))
+        self.create_trove_cat((70,63,"wordprocessors","Word Processors","Topic :: Text Editors :: Word Processors",True))
+        self.create_trove_cat((285,63,"textprocessing","Text Processing","Topic :: Text Editors :: Text Processing",True))
+        self.create_trove_cat((611,18,"formats_and_protocols","Formats and Protocols","Topic :: Formats and Protocols",True))
+        self.create_trove_cat((554,611,"data_formats","Data Formats","Topic :: Formats and Protocols :: Data Formats",True))
+        self.create_trove_cat((559,554,"xml","XML","Topic :: Formats and Protocols :: Data Formats :: XML",True))
+        self.create_trove_cat((557,554,"sgml","SGML","Topic :: Formats and Protocols :: Data Formats :: SGML",True))
+        self.create_trove_cat((555,554,"docbook","DocBook","Topic :: Formats and Protocols :: Data Formats :: DocBook",True))
+        self.create_trove_cat((556,554,"html_xhtml","HTML/XHTML","Topic :: Formats and Protocols :: Data Formats :: HTML/XHTML",True))
+        self.create_trove_cat((558,554,"tex_latex","TeX/LaTeX","Topic :: Formats and Protocols :: Data Formats :: TeX/LaTeX",True))
+        self.create_trove_cat((612,611,"protocols","Protocols","Topic :: Formats and Protocols :: Protocols",True))
+        self.create_trove_cat((616,612,"xml_rpc","XML-RPC","Topic :: Formats and Protocols :: Protocols :: XML-RPC",True))
+        self.create_trove_cat((614,612,"nntp","NNTP","Topic :: Formats and Protocols :: Protocols :: NNTP",True))
+        self.create_trove_cat((613,612,"soap","SOAP","Topic :: Formats and Protocols :: Protocols :: SOAP",True))
+        self.create_trove_cat((615,612,"rss","RSS","Topic :: Formats and Protocols :: Protocols :: RSS",True))
+        self.create_trove_cat((156,18,"terminals","Terminals","Topic :: Terminals",True))
+        self.create_trove_cat((157,156,"serial","Serial","Topic :: Terminals :: Serial",True))
+        self.create_trove_cat((158,156,"virtual","Terminal Emulators/X Terminals","Topic :: Terminals :: Terminal Emulators/X Terminals",True))
+        self.create_trove_cat((159,156,"telnet","Telnet","Topic :: Terminals :: Telnet",True))
+        self.create_trove_cat((20,18,"communications","Communications","Topic :: Communications",True))
+        self.create_trove_cat((37,20,"fido","FIDO","Topic :: Communications :: FIDO",True))
+        self.create_trove_cat((38,20,"hamradio","Ham Radio","Topic :: Communications :: Ham Radio",True))
+        self.create_trove_cat((39,20,"usenet","Usenet News","Topic :: Communications :: Usenet News",True))
+        self.create_trove_cat((40,20,"internetphone","Internet Phone","Topic :: Communications :: Internet Phone",True))
+        self.create_trove_cat((36,20,"fax","Fax","Topic :: Communications :: Fax",True))
+        self.create_trove_cat((22,20,"chat","Chat","Topic :: Communications :: Chat",True))
+        self.create_trove_cat((574,22,"msn_messenger","MSN Messenger","Topic :: Communications :: Chat :: MSN Messenger",True))
+        self.create_trove_cat((26,22,"aim","AOL Instant Messenger","Topic :: Communications :: Chat :: AOL Instant Messenger",True))
+        self.create_trove_cat((24,22,"irc","Internet Relay Chat","Topic :: Communications :: Chat :: Internet Relay Chat",True))
+        self.create_trove_cat((25,22,"talk","Unix Talk","Topic :: Communications :: Chat :: Unix Talk",True))
+        self.create_trove_cat((23,22,"icq","ICQ","Topic :: Communications :: Chat :: ICQ",True))
+        self.create_trove_cat((590,20,"streaming_comms","Streaming","Topic :: Communications :: Streaming",True))
+        self.create_trove_cat((27,20,"conferencing","Conferencing","Topic :: Communications :: Conferencing",True))
+        self.create_trove_cat((247,20,"telephony","Telephony","Topic :: Communications :: Telephony",True))
+        self.create_trove_cat((251,20,"filesharing","File Sharing","Topic :: Communications :: File Sharing",True))
+        self.create_trove_cat((622,251,"bittorrent","BitTorrent","Topic :: Communications :: File Sharing :: BitTorrent",True))
+        self.create_trove_cat((286,251,"gnutella","Gnutella","Topic :: Communications :: File Sharing :: Gnutella",True))
+        self.create_trove_cat((241,251,"napster","Napster","Topic :: Communications :: File Sharing :: Napster",True))
+        self.create_trove_cat((21,20,"bbs","BBS","Topic :: Communications :: BBS",True))
+        self.create_trove_cat((28,20,"email","Email","Topic :: Communications :: Email",True))
+        self.create_trove_cat((31,28,"mua","Email Clients (MUA)","Topic :: Communications :: Email :: Email Clients (MUA)",True))
+        self.create_trove_cat((32,28,"mta","Mail Transport Agents","Topic :: Communications :: Email :: Mail Transport Agents",True))
+        self.create_trove_cat((234,18,"other","Other/Nonlisted Topic","Topic :: Other/Nonlisted Topic",True))
+        self.create_trove_cat((129,18,"office","Office/Business","Topic :: Office/Business",True))
+        self.create_trove_cat((576,129,"enterprise","Enterprise","Topic :: Office/Business :: Enterprise",True))
+        self.create_trove_cat((579,576,"crm","CRM","Topic :: Office/Business :: Enterprise :: CRM",True))
+        self.create_trove_cat((577,576,"erp","ERP","Topic :: Office/Business :: Enterprise :: ERP",True))
+        self.create_trove_cat((578,576,"olap","OLAP","Topic :: Office/Business :: Enterprise :: OLAP",True))
+        self.create_trove_cat((580,576,"data_warehousing","Data Warehousing","Topic :: Office/Business :: Enterprise :: Data Warehousing",True))
+        self.create_trove_cat((587,129,"time_tracking","Time Tracking","Topic :: Office/Business :: Time Tracking",True))
+        self.create_trove_cat((75,129,"financial","Financial","Topic :: Office/Business :: Financial",True))
+        self.create_trove_cat((76,75,"accounting","Accounting","Topic :: Office/Business :: Financial :: Accounting",True))
+        self.create_trove_cat((77,75,"investment","Investment","Topic :: Office/Business :: Financial :: Investment",True))
+        self.create_trove_cat((78,75,"spreadsheet","Spreadsheet","Topic :: Office/Business :: Financial :: Spreadsheet",True))
+        self.create_trove_cat((79,75,"pointofsale","Point-Of-Sale","Topic :: Office/Business :: Financial :: Point-Of-Sale",True))
+        self.create_trove_cat((130,129,"scheduling","Scheduling","Topic :: Office/Business :: Scheduling",True))
+        self.create_trove_cat((585,130,"calendar","Calendar","Topic :: Office/Business :: Scheduling :: Calendar",True))
+        self.create_trove_cat((586,130,"resource_booking","Resource Booking","Topic :: Office/Business :: Scheduling :: Resource Booking",True))
+        self.create_trove_cat((131,129,"suites","Office Suites","Topic :: Office/Business :: Office Suites",True))
+        self.create_trove_cat((588,129,"todo_lists","To-Do Lists","Topic :: Office/Business :: To-Do Lists",True))
+        self.create_trove_cat((607,129,"project_management","Project Management","Topic :: Office/Business :: Project Management",True))
+        self.create_trove_cat((66,18,"database","Database","Topic :: Database",True))
+        self.create_trove_cat((68,66,"frontends","Front-Ends","Topic :: Database :: Front-Ends",True))
+        self.create_trove_cat((67,66,"engines","Database Engines/Servers","Topic :: Database :: Database Engines/Servers",True))
+        self.create_trove_cat((43,18,"security","Security","Topic :: Security",True))
+        self.create_trove_cat((44,43,"cryptography","Cryptography","Topic :: Security :: Cryptography",True))
+        self.create_trove_cat((55,18,"desktop","Desktop Environment","Topic :: Desktop Environment",True))
+        self.create_trove_cat((56,55,"windowmanagers","Window Managers","Topic :: Desktop Environment :: Window Managers",True))
+        self.create_trove_cat((59,56,"enlightenment","Enlightenment","Topic :: Desktop Environment :: Window Managers :: Enlightenment",True))
+        self.create_trove_cat((60,59,"themes","Themes","Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes",True))
+        self.create_trove_cat((57,55,"kde","K Desktop Environment (KDE)","Topic :: Desktop Environment :: K Desktop Environment (KDE)",True))
+        self.create_trove_cat((61,57,"themes","Themes","Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes",True))
+        self.create_trove_cat((58,55,"gnome","Gnome","Topic :: Desktop Environment :: Gnome",True))
+        self.create_trove_cat((62,55,"screensavers","Screen Savers","Topic :: Desktop Environment :: Screen Savers",True))
+        self.create_trove_cat((80,18,"games","Games/Entertainment","Topic :: Games/Entertainment",True))
+        self.create_trove_cat((633,80,"console-games","Console-based Games","Topic :: Games/Entertainment :: Console-based Games",True))
+        self.create_trove_cat((287,80,"boardgames","Board Games","Topic :: Games/Entertainment :: Board Games",True))
+        self.create_trove_cat((288,80,"sidescrolling","Side-Scrolling/Arcade Games","Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games",True))
+        self.create_trove_cat((81,80,"realtimestrategy","Real Time Strategy","Topic :: Games/Entertainment :: Real Time Strategy",True))
+        self.create_trove_cat((82,80,"firstpersonshooters","First Person Shooters","Topic :: Games/Entertainment :: First Person Shooters",True))
+        self.create_trove_cat((83,80,"turnbasedstrategy","Turn Based Strategy","Topic :: Games/Entertainment :: Turn Based Strategy",True))
+        self.create_trove_cat((84,80,"rpg","Role-Playing","Topic :: Games/Entertainment :: Role-Playing",True))
+        self.create_trove_cat((85,80,"simulation","Simulation","Topic :: Games/Entertainment :: Simulation",True))
+        self.create_trove_cat((86,80,"mud","Multi-User Dungeons (MUD)","Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)",True))
+        self.create_trove_cat((268,80,"Puzzles","Puzzle Games","Topic :: Games/Entertainment :: Puzzle Games",True))
+        self.create_trove_cat((88,87,"finger","Finger","Topic :: Internet :: Finger",True))
+        self.create_trove_cat((89,87,"ftp","File Transfer Protocol (FTP)","Topic :: Internet :: File Transfer Protocol (FTP)",True))
+        self.create_trove_cat((270,87,"WAP","WAP","Topic :: Internet :: WAP",True))
+        self.create_trove_cat((90,87,"www","WWW/HTTP","Topic :: Internet :: WWW/HTTP",True))
+        self.create_trove_cat((91,90,"browsers","Browsers","Topic :: Internet :: WWW/HTTP :: Browsers",True))
+        self.create_trove_cat((92,90,"dynamic","Dynamic Content","Topic :: Internet :: WWW/HTTP :: Dynamic Content",True))
+        self.create_trove_cat((95,92,"messageboards","Message Boards","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards",True))
+        self.create_trove_cat((96,92,"cgi","CGI Tools/Libraries","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",True))
+        self.create_trove_cat((94,92,"counters","Page Counters","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters",True))
+        self.create_trove_cat((93,90,"indexing","Indexing/Search","Topic :: Internet :: WWW/HTTP :: Indexing/Search",True))
+        self.create_trove_cat((243,90,"sitemanagement","Site Management","Topic :: Internet :: WWW/HTTP :: Site Management",True))
+        self.create_trove_cat((244,243,"linkchecking","Link Checking","Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking",True))
+        self.create_trove_cat((250,90,"httpservers","HTTP Servers","Topic :: Internet :: WWW/HTTP :: HTTP Servers",True))
+        self.create_trove_cat((149,87,"dns","Name Service (DNS)","Topic :: Internet :: Name Service (DNS)",True))
+        self.create_trove_cat((245,87,"loganalysis","Log Analysis","Topic :: Internet :: Log Analysis",True))
+        self.create_trove_cat((45,18,"development","Software Development","Topic :: Software Development",True))
+        self.create_trove_cat((563,45,"modeling","Modeling","Topic :: Software Development :: Modeling",True))
+        self.create_trove_cat((46,45,"build","Build Tools","Topic :: Software Development :: Build Tools",True))
+        self.create_trove_cat((575,45,"testing","Testing","Topic :: Software Development :: Testing",True))
+        self.create_trove_cat((620,45,"algorithms","Algorithms","Topic :: Software Development :: Algorithms",True))
+        self.create_trove_cat((621,620,"genetic_algorithms","Genetic Algorithms","Topic :: Software Development :: Algorithms :: Genetic Algorithms",True))
+        self.create_trove_cat((606,45,"frameworks","Frameworks","Topic :: Software Development :: Frameworks",True))
+        self.create_trove_cat((564,45,"documentation","Documentation","Topic :: Software Development :: Documentation",True))
+        self.create_trove_cat((562,45,"swdev_oo","Object Oriented","Topic :: Software Development :: Object Oriented",True))
+        self.create_trove_cat((409,45,"l10n","L10N (Localization)","Topic :: Software Development :: L10N (Localization)",True))
+        self.create_trove_cat((408,45,"i18n","I18N (Internationalization)","Topic :: Software Development :: I18N (Internationalization)",True))
+        self.create_trove_cat((50,45,"objectbrokering","Object Brokering","Topic :: Software Development :: Object Brokering",True))
+        self.create_trove_cat((51,50,"corba","CORBA","Topic :: Software Development :: Object Brokering :: CORBA",True))
+        self.create_trove_cat((52,45,"versioncontrol","Version Control","Topic :: Software Development :: Version Control",True))
+        self.create_trove_cat((53,52,"cvs","CVS","Topic :: Software Development :: Version Control :: CVS",True))
+        self.create_trove_cat((54,52,"rcs","RCS","Topic :: Software Development :: Version Control :: RCS",True))
+        self.create_trove_cat((260,52,"SCCS","SCCS","Topic :: Software Development :: Version Control :: SCCS",True))
+        self.create_trove_cat((259,45,"codegen","Code Generators","Topic :: Software Development :: Code Generators",True))
+        self.create_trove_cat((47,45,"debuggers","Debuggers","Topic :: Software Development :: Debuggers",True))
+        self.create_trove_cat((48,45,"compilers","Compilers","Topic :: Software Development :: Compilers",True))
+        self.create_trove_cat((49,45,"interpreters","Interpreters","Topic :: Software Development :: Interpreters",True))
+        self.create_trove_cat((561,45,"softwaredev_ui","User Interfaces","Topic :: Software Development :: User Interfaces",True))
+        self.create_trove_cat((565,45,"quality_assurance","Quality Assurance","Topic :: Software Development :: Quality Assurance",True))
+        self.create_trove_cat((570,45,"case_tools","CASE","Topic :: Software Development :: CASE",True))
+        self.create_trove_cat((582,45,"design","Design","Topic :: Software Development :: Design",True))
+        self.create_trove_cat((593,45,"cross_compilers","Cross Compilers","Topic :: Software Development :: Cross Compilers",True))
+        self.create_trove_cat((603,45,"profilers","Profiling","Topic :: Software Development :: Profiling",True))
+        self.create_trove_cat((610,45,"virtual_machines","Virtual Machines","Topic :: Software Development :: Virtual Machines",True))
+        self.create_trove_cat((619,45,"usability","Usability","Topic :: Software Development :: Usability",True))
+        self.create_trove_cat((581,71,"library","Library","Topic :: Education :: Library",True))
+        self.create_trove_cat((604,581,"opac","OPAC","Topic :: Education :: Library :: OPAC",True))
+        self.create_trove_cat((605,581,"marc_and_metadata","MARC and Book/Library Metadata","Topic :: Education :: Library :: MARC and Book/Library Metadata",True))
+        self.create_trove_cat((132,18,"religion","Religion and Philosophy","Topic :: Religion and Philosophy",True))
+        self.create_trove_cat((571,132,"new_age","New Age","Topic :: Religion and Philosophy :: New Age",True))
+        self.create_trove_cat((136,18,"system","System","Topic :: System",True))
+        self.create_trove_cat((638,136,"storage","Storage","Topic :: System :: Storage",True))
+        self.create_trove_cat((601,638,"file_management","File Management","Topic :: System :: Storage :: File Management",True))
+        self.create_trove_cat((19,638,"archiving","Archiving","Topic :: System :: Storage :: Archiving",True))
+        self.create_trove_cat((42,19,"compression","Compression","Topic :: System :: Storage :: Archiving :: Compression",True))
+        self.create_trove_cat((137,19,"backup","Backup","Topic :: System :: Storage :: Archiving :: Backup",True))
+        self.create_trove_cat((41,19,"packaging","Packaging","Topic :: System :: Storage :: Archiving :: Packaging",True))
+        self.create_trove_cat((294,136,"shells","System Shells","Topic :: System :: System Shells",True))
+        self.create_trove_cat((74,136,"emulators","Emulators","Topic :: System :: Emulators",True))
+        self.create_trove_cat((627,136,"system_search","Search","Topic :: System :: Search",True))
+        self.create_trove_cat((257,136,"softwaredist","Software Distribution","Topic :: System :: Software Distribution",True))
+        self.create_trove_cat((122,113,"players","Players","Topic :: Multimedia :: Sound/Audio :: Players",True))
+        self.create_trove_cat((253,136,"sysadministration","Systems Administration","Topic :: System :: Systems Administration",True))
+        self.create_trove_cat((289,253,"authentication","Authentication/Directory","Topic :: System :: Systems Administration :: Authentication/Directory",True))
+        self.create_trove_cat((290,289,"nis","NIS","Topic :: System :: Systems Administration :: Authentication/Directory :: NIS",True))
+        self.create_trove_cat((291,289,"ldap","LDAP","Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP",True))
+        self.create_trove_cat((153,136,"power","Power (UPS)","Topic :: System :: Power (UPS)",True))
+        self.create_trove_cat((150,136,"networking","Networking","Topic :: System :: Networking",True))
+        self.create_trove_cat((566,150,"wireless","Wireless","Topic :: System :: Networking :: Wireless",True))
+        self.create_trove_cat((151,150,"firewalls","Firewalls","Topic :: System :: Networking :: Firewalls",True))
+        self.create_trove_cat((152,150,"monitoring","Monitoring","Topic :: System :: Networking :: Monitoring",True))
+        self.create_trove_cat((155,152,"watchdog","Hardware Watchdog","Topic :: System :: Networking :: Monitoring :: Hardware Watchdog",True))
+        self.create_trove_cat((148,136,"logging","Logging","Topic :: System :: Logging",True))
+        self.create_trove_cat((592,148,"log_rotation","Log Rotation","Topic :: System :: Logging :: Log Rotation",True))
+        self.create_trove_cat((144,136,"kernels","Operating System Kernels","Topic :: System :: Operating System Kernels",True))
+        self.create_trove_cat((145,144,"bsd","BSD","Topic :: System :: Operating System Kernels :: BSD",True))
+        self.create_trove_cat((239,144,"gnuhurd","GNU Hurd","Topic :: System :: Operating System Kernels :: GNU Hurd",True))
+        self.create_trove_cat((143,144,"linux","Linux","Topic :: System :: Operating System Kernels :: Linux",True))
+        self.create_trove_cat((147,136,"setup","Installation/Setup","Topic :: System :: Installation/Setup",True))
+        self.create_trove_cat((146,136,"hardware","Hardware","Topic :: System :: Hardware",True))
+        self.create_trove_cat((313,146,"mainframe","Mainframes","Topic :: System :: Hardware :: Mainframes",True))
+        self.create_trove_cat((312,146,"smp","Symmetric Multi-processing","Topic :: System :: Hardware :: Symmetric Multi-processing",True))
+        self.create_trove_cat((292,146,"drivers","Hardware Drivers","Topic :: System :: Hardware :: Hardware Drivers",True))
+        self.create_trove_cat((138,136,"benchmark","Benchmark","Topic :: System :: Benchmark",True))
+        self.create_trove_cat((139,136,"boot","Boot","Topic :: System :: Boot",True))
+        self.create_trove_cat((140,139,"init","Init","Topic :: System :: Boot :: Init",True))
+        self.create_trove_cat((141,136,"clustering","Clustering","Topic :: System :: Clustering",True))
+        self.create_trove_cat((308,136,"distributed_computing","Distributed Computing","Topic :: System :: Distributed Computing",True))
+        self.create_trove_cat((142,136,"filesystems","Filesystems","Topic :: System :: Filesystems",True))
+        self.create_trove_cat((154,18,"printing","Printing","Topic :: Printing",True))
+        self.create_trove_cat((87,18,"internet","Internet","Topic :: Internet",True))
+        self.create_trove_cat((118,116,"cdripping","CD Ripping","Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping",True))
+        self.create_trove_cat((119,113,"conversion","Conversion","Topic :: Multimedia :: Sound/Audio :: Conversion",True))
+        self.create_trove_cat((120,113,"editors","Editors","Topic :: Multimedia :: Sound/Audio :: Editors",True))
+        self.create_trove_cat((121,113,"mixers","Mixers","Topic :: Multimedia :: Sound/Audio :: Mixers",True))
+        self.create_trove_cat((100,99,"graphics","Graphics","Topic :: Multimedia :: Graphics",True))
+        self.create_trove_cat((109,100,"3dmodeling","3D Modeling","Topic :: Multimedia :: Graphics :: 3D Modeling",True))
+        self.create_trove_cat((110,100,"3drendering","3D Rendering","Topic :: Multimedia :: Graphics :: 3D Rendering",True))
+        self.create_trove_cat((111,100,"presentation","Presentation","Topic :: Multimedia :: Graphics :: Presentation",True))
+        self.create_trove_cat((112,100,"viewers","Viewers","Topic :: Multimedia :: Graphics :: Viewers",True))
+        self.create_trove_cat((101,100,"capture","Capture","Topic :: Multimedia :: Graphics :: Capture",True))
+        self.create_trove_cat((104,101,"screencapture","Screen Capture","Topic :: Multimedia :: Graphics :: Capture :: Screen Capture",True))
+        self.create_trove_cat((103,101,"cameras","Digital Camera","Topic :: Multimedia :: Graphics :: Capture :: Digital Camera",True))
+        self.create_trove_cat((102,101,"scanners","Scanners","Topic :: Multimedia :: Graphics :: Capture :: Scanners",True))
+        self.create_trove_cat((105,100,"conversion","Graphics Conversion","Topic :: Multimedia :: Graphics :: Graphics Conversion",True))
+        self.create_trove_cat((106,100,"editors","Editors","Topic :: Multimedia :: Graphics :: Editors",True))
+        self.create_trove_cat((108,106,"raster","Raster-Based","Topic :: Multimedia :: Graphics :: Editors :: Raster-Based",True))
+        self.create_trove_cat((107,106,"vector","Vector-Based","Topic :: Multimedia :: Graphics :: Editors :: Vector-Based",True))
+        self.create_trove_cat((97,18,"scientific","Scientific/Engineering","Topic :: Scientific/Engineering",True))
+        self.create_trove_cat((609,97,"molecular_science","Molecular Science","Topic :: Scientific/Engineering :: Molecular Science",True))
+        self.create_trove_cat((602,97,"robotics","Robotics","Topic :: Scientific/Engineering :: Robotics",True))
+        self.create_trove_cat((600,97,"simulations","Simulations","Topic :: Scientific/Engineering :: Simulations",True))
+        self.create_trove_cat((568,97,"ecosystem_sciences","Ecosystem Sciences","Topic :: Scientific/Engineering :: Ecosystem Sciences",True))
+        self.create_trove_cat((386,97,"interfaceengine","Interface Engine/Protocol Translator","Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator",True))
+        self.create_trove_cat((384,97,"chemistry","Chemistry","Topic :: Scientific/Engineering :: Chemistry",True))
+        self.create_trove_cat((252,97,"bioinformatics","Bio-Informatics","Topic :: Scientific/Engineering :: Bio-Informatics",True))
+        self.create_trove_cat((246,97,"eda","Electronic Design Automation (EDA)","Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",True))
+        self.create_trove_cat((135,97,"visualization","Visualization","Topic :: Scientific/Engineering :: Visualization",True))
+        self.create_trove_cat((134,97,"astronomy","Astronomy","Topic :: Scientific/Engineering :: Astronomy",True))
+        self.create_trove_cat((133,97,"ai","Artificial Intelligence","Topic :: Scientific/Engineering :: Artificial Intelligence",True))
+        self.create_trove_cat((591,133,"intelligent_agents","Intelligent Agents","Topic :: Scientific/Engineering :: Artificial Intelligence :: Intelligent Agents",True))
+        self.create_trove_cat((98,97,"mathematics","Mathematics","Topic :: Scientific/Engineering :: Mathematics",True))
+        self.create_trove_cat((272,97,"HMI","Human Machine Interfaces","Topic :: Scientific/Engineering :: Human Machine Interfaces",True))
+        self.create_trove_cat((266,97,"medical","Medical Science Apps.","Topic :: Scientific/Engineering :: Medical Science Apps.",True))
+        self.create_trove_cat((383,97,"gis","GIS","Topic :: Scientific/Engineering :: GIS",True))
+        self.create_trove_cat((385,97,"informationanalysis","Information Analysis","Topic :: Scientific/Engineering :: Information Analysis",True))
+        self.create_trove_cat((387,97,"physics","Physics","Topic :: Scientific/Engineering :: Physics",True))
+        self.create_trove_cat((567,97,"earth_science","Earth Sciences","Topic :: Scientific/Engineering :: Earth Sciences",True))
+        self.create_trove_cat((282,18,"Sociology","Sociology","Topic :: Sociology",True))
+        self.create_trove_cat((284,282,"Genealogy","Genealogy","Topic :: Sociology :: Genealogy",True))
+        self.create_trove_cat((283,282,"History","History","Topic :: Sociology :: History",True))
+        self.create_trove_cat((71,18,"education","Education","Topic :: Education",True))
+        self.create_trove_cat((73,71,"testing","Testing","Topic :: Education :: Testing",True))
+        self.create_trove_cat((72,71,"cai","Computer Aided Instruction (CAI)","Topic :: Education :: Computer Aided Instruction (CAI)",True))
+        self.create_trove_cat((18,0,"topic","Topic","Topic",True))
+        self.create_trove_cat((125,99,"video","Video","Topic :: Multimedia :: Video",True))
+        self.create_trove_cat((594,125,"still_capture","Still Capture","Topic :: Multimedia :: Video :: Still Capture",True))
+        self.create_trove_cat((596,125,"codec","Codec","Topic :: Multimedia :: Video :: Codec",True))
+        self.create_trove_cat((127,125,"conversion","Conversion","Topic :: Multimedia :: Video :: Conversion",True))
+        self.create_trove_cat((128,125,"display","Display","Topic :: Multimedia :: Video :: Display",True))
+        self.create_trove_cat((256,125,"nonlineareditor","Non-Linear Editor","Topic :: Multimedia :: Video :: Non-Linear Editor",True))
+        self.create_trove_cat((595,125,"special_effects","Special Effects","Topic :: Multimedia :: Video :: Special Effects",True))
+        self.create_trove_cat((623,125,"video_realtime","Realtime Processing","Topic :: Multimedia :: Video :: Realtime Processing",True))
+        self.create_trove_cat((126,125,"vidcapture","Video Capture","Topic :: Multimedia :: Video :: Video Capture",True))
+        self.create_trove_cat((113,99,"sound","Sound/Audio","Topic :: Multimedia :: Sound/Audio",True))
+        self.create_trove_cat((123,122,"mp3","MP3","Topic :: Multimedia :: Sound/Audio :: Players :: MP3",True))
+        self.create_trove_cat((124,113,"speech","Speech","Topic :: Multimedia :: Sound/Audio :: Speech",True))
+        self.create_trove_cat((114,113,"analysis","Analysis","Topic :: Multimedia :: Sound/Audio :: Analysis",True))
+        self.create_trove_cat((115,113,"capture","Capture/Recording","Topic :: Multimedia :: Sound/Audio :: Capture/Recording",True))
+        self.create_trove_cat((248,113,"midi","MIDI","Topic :: Multimedia :: Sound/Audio :: MIDI",True))
+        self.create_trove_cat((249,113,"synthesis","Sound Synthesis","Topic :: Multimedia :: Sound/Audio :: Sound Synthesis",True))
+        self.create_trove_cat((116,113,"cdaudio","CD Audio","Topic :: Multimedia :: Sound/Audio :: CD Audio",True))
+        self.create_trove_cat((117,116,"cdplay","CD Playing","Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing",True))
+        self.create_trove_cat((99,18,"multimedia","Multimedia","Topic :: Multimedia",True))
+        self.create_trove_cat((670,14,"agpl","Affero GNU Public License ","License :: OSI-Approved Open Source :: Affero GNU Public License",True))
+        self.create_trove_cat((862,14,"lppl","LaTeX Project Public License","License :: OSI-Approved Open Source :: LaTeX Project Public License",True))
+        self.create_trove_cat((655,432,"win64","64-bit MS Windows","Operating System :: Grouping and Descriptive Categories :: 64-bit MS Windows",True))
+        self.create_trove_cat((657,418,"vista","Vista","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Vista",True))
+        self.create_trove_cat((851,418,"win7","Windows 7","Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Windows 7",True))
+        self.create_trove_cat((728,315,"android","Android","Operating System :: Handheld/Embedded Operating Systems :: Android",True))
+        self.create_trove_cat((780,315,"ios","Apple iPhone","Operating System :: Handheld/Embedded Operating Systems :: Apple iPhone",True))
+        self.create_trove_cat((863,534,"architects","Architects","Intended Audience :: by End-User Class :: Architects",False))
+        self.create_trove_cat((864,534,"auditors","Auditors","Intended Audience :: by End-User Class :: Auditors",False))
+        self.create_trove_cat((865,534,"testers","Testers","Intended Audience :: by End-User Class :: Testers",False))
+        self.create_trove_cat((866,534,"secpros","Security Professionals","Intended Audience :: by End-User Class :: Security Professionals",False))
+        self.create_trove_cat((867,535,"secindustry","Security","Intended Audience :: by Industry or Sector :: Security",False))
         session(M.TroveCategory).flush()
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index 0c2c060..0ef414a 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -9,6 +9,7 @@
 
 import allura.tasks.repo_tasks
 from allura import model as M
+from allura.model.project import TroveCategory
 from allura.lib import validators as V
 from allura.lib.oid_helper import verify_oid, process_oid
 from allura.lib.security import require_authenticated, has_access
@@ -43,6 +44,19 @@
     registration_form = forms.RegistrationForm(action='/auth/save_new')
     oauth_application_form = OAuthApplicationForm(action='register')
     oauth_revocation_form = OAuthRevocationForm(action='revoke_oauth')
+    change_personal_data_form = forms.PersonalDataForm()
+    add_socialnetwork_form = forms.AddSocialNetworkForm()
+    remove_socialnetwork_form = forms.RemoveSocialNetworkForm()
+    add_telnumber_form = forms.AddTelNumberForm()
+    add_website_form = forms.AddWebsiteForm()
+    skype_account_form = forms.SkypeAccountForm()
+    remove_textvalue_form = forms.RemoveTextValueForm()
+    add_timeslot_form = forms.AddTimeSlotForm()
+    remove_timeslot_form = forms.RemoveTimeSlotForm()
+    add_inactive_period_form = forms.AddInactivePeriodForm()
+    remove_inactive_period_form = forms.RemoveInactivePeriodForm()
+    save_skill_form = forms.AddUserSkillForm()
+    remove_skill_form = forms.RemoveSkillForm()
 
 class AuthController(BaseController):
 
@@ -278,8 +292,83 @@
                     allow_write=has_access(c.app, 'write')(user=user),
                     allow_create=has_access(c.app, 'create')(user=user))
 
+class UserSkillsController(BaseController):
+
+    def __init__(self, category=None):
+        self.category = category
+        super(UserSkillsController, self).__init__()
+
+    @expose()
+    def _lookup(self, catshortname, *remainder):
+        cat = M.TroveCategory.query.get(shortname=catshortname)
+        return UserSkillsController(category=cat), remainder
+
+    @expose('jinja:allura:templates/user_skills.html')
+    def index(self, **kw):
+        require_authenticated()
+
+        l = []
+        parents = []
+        if kw.get('selected_category') is not None:
+            selected_skill = M.TroveCategory.query.get(trove_cat_id=int(kw.get('selected_category')))
+        elif self.category:
+            selected_skill = self.category
+        else:
+            l = M.TroveCategory.query.find(dict(trove_parent_id=0, show_as_skill=True))
+            selected_skill = None
+        if selected_skill:
+            l = [scat for scat in selected_skill.subcategories
+                 if scat.show_as_skill]
+            temp_cat = selected_skill.parent_category
+            while temp_cat:
+                parents = [temp_cat] + parents
+                temp_cat = temp_cat.parent_category
+        return dict(
+            skills_list = l,
+            selected_skill = selected_skill,
+            parents = parents, 
+            add_details_fields=(len(l)==0))
+
+    @expose()
+    @require_post()
+    @validate(F.save_skill_form, error_handler=index)
+    def save_skill(self, **kw):
+        require_authenticated()
+        
+        trove_id = int(kw.get('selected_skill'))
+        category = M.TroveCategory.query.get(trove_cat_id=trove_id)
+
+        new_skill = dict(
+            category_id=category._id,
+            level=kw.get('level'),
+            comment=kw.get('comment'))
+
+        s = [skill for skill in c.user.skills 
+             if str(skill.category_id) != str(new_skill['category_id'])]
+        s.append(new_skill)
+        c.user.set_pref('skills', s)
+        flash('Your skills list was successfully updated!')
+        redirect('/auth/prefs/user_skills')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_skill_form, error_handler=index)
+    def remove_skill(self, **kw):
+        require_authenticated()
+
+        trove_id = int(kw.get('categoryid'))
+        category = M.TroveCategory.query.get(trove_cat_id=trove_id)
+
+        s = [skill for skill in c.user.skills 
+             if str(skill.category_id) != str(category._id)]
+        c.user.set_pref('skills', s)
+        flash('Your skills list was successfully updated!')
+        redirect('/auth/prefs/user_skills')
+
 class PreferencesController(BaseController):
 
+    user_skills = UserSkillsController()
+
     @with_trailing_slash
     @expose('jinja:allura:templates/user_preferences.html')
     def index(self, **kw):
@@ -457,6 +546,119 @@
 
     @expose()
     @require_post()
+    @validate(F.change_personal_data_form, error_handler=index)
+    def change_personal_data(self, **kw):
+        require_authenticated()
+        c.user.set_pref('sex', kw['sex'])
+        c.user.set_pref('birthdate', kw.get('birthdate'))
+        localization={'country':kw.get('country'), 'city':kw.get('city')}
+        c.user.set_pref('localization', localization)
+        c.user.set_pref('timezone', kw['timezone'])
+
+        flash('Your personal data was successfully updated!')
+        redirect('.')
+
+    @expose()
+    @require_post()
+    @validate(F.add_socialnetwork_form, error_handler=index)
+    def add_social_network(self, **kw):
+        require_authenticated()
+        c.user.add_socialnetwork(kw['socialnetwork'], kw['accounturl'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_socialnetwork_form, error_handler=index)
+    def remove_social_network(self, **kw):
+        require_authenticated()
+        c.user.remove_socialnetwork(kw['socialnetwork'], kw['account'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.add_telnumber_form, error_handler=index)
+    def add_telnumber(self, **kw):
+        require_authenticated()
+        c.user.add_telephonenumber(kw['newnumber'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_textvalue_form, error_handler=index)
+    def remove_telnumber(self, **kw):
+        require_authenticated()
+        c.user.remove_telephonenumber(kw['oldvalue'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.add_website_form, error_handler=index)
+    def add_webpage(self, **kw):
+        require_authenticated()
+        c.user.add_webpage(kw['newwebsite'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_textvalue_form, error_handler=index)
+    def remove_webpage(self, **kw):
+        require_authenticated()
+        c.user.remove_webpage(kw['oldvalue'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.skype_account_form, error_handler=index)
+    def skype_account(self, **kw):
+        require_authenticated()
+        c.user.set_pref('skypeaccount', kw['skypeaccount'])
+        flash('Your personal contacts were successfully updated!')
+        redirect('.#Contacts')
+
+    @expose()
+    @require_post()
+    @validate(F.add_timeslot_form, error_handler=index)
+    def add_timeslot(self, **kw):
+        require_authenticated()
+        c.user.add_timeslot(kw['weekday'], kw['starttime'], kw['endtime'])
+        flash('Your availability timeslots were successfully updated!')
+        redirect('.#Availability')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_timeslot_form, error_handler=index)
+    def remove_timeslot(self, **kw):
+        require_authenticated()
+        c.user.remove_timeslot(kw['weekday'], kw['starttime'], kw['endtime'])
+        flash('Your availability timeslots were successfully updated!')
+        redirect('.#Availability')
+
+    @expose()
+    @require_post()
+    @validate(F.add_inactive_period_form, error_handler=index)
+    def add_inactive_period(self, **kw):
+        require_authenticated()
+        c.user.add_inactive_period(kw['startdate'], kw['enddate'])
+        flash('Your inactivity periods were successfully updated!')
+        redirect('.#Availability')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_inactive_period_form, error_handler=index)
+    def remove_inactive_period(self, **kw):
+        require_authenticated()
+        c.user.remove_inactive_period(kw['startdate'], kw['enddate'])
+        flash('Your availability timeslots were successfully updated!')
+        redirect('.#Availability')
+
+    @expose()
+    @require_post()
     def upload_sshkey(self, key=None):
         ap = plugin.AuthenticationProvider.get(request)
         try:
diff --git a/Allura/allura/controllers/root.py b/Allura/allura/controllers/root.py
index 4fdf305..19719e1 100644
--- a/Allura/allura/controllers/root.py
+++ b/Allura/allura/controllers/root.py
@@ -22,6 +22,7 @@
 from allura import model as M
 from allura.lib.widgets import project_list as plw
 from .auth import AuthController
+from .trovecategories import TroveCategoryController
 from .search import SearchController, ProjectBrowseController
 from .static import NewForgeController
 from .site_admin import SiteAdminController
@@ -58,6 +59,8 @@
     nf.admin = SiteAdminController()
     search = SearchController()
     rest = RestController()
+    if config.get('trovecategories.enableediting', 'false')=='true':
+        categories=TroveCategoryController()
 
     def __init__(self):
         n_url_prefix = '/%s/' % request.path.split('/')[1]
diff --git a/Allura/allura/controllers/trovecategories.py b/Allura/allura/controllers/trovecategories.py
new file mode 100644
index 0000000..773e506
--- /dev/null
+++ b/Allura/allura/controllers/trovecategories.py
@@ -0,0 +1,191 @@
+import logging, string, os
+from urllib import urlencode
+
+import bson
+from tg import expose, session, flash, redirect, validate, config
+from tg.decorators import with_trailing_slash
+from pylons import c, g, request, response
+from string import digits, lowercase
+
+from allura.lib.security import require_authenticated
+from allura import model as M
+from allura.lib.decorators import require_post
+from allura.controllers import BaseController
+from allura.lib.widgets import forms
+from allura.model import TroveCategory
+
+class F(object):
+    remove_category_form = forms.RemoveTroveCategoryForm()
+    add_category_form = forms.AddTroveCategoryForm()
+
+class TroveCategoryController(BaseController):
+    @expose()
+    def _lookup(self, catshortname, *remainder):
+        cat = M.TroveCategory.query.get(shortname=catshortname)
+        return TroveCategoryController(category=cat), remainder
+        
+    def __init__(self, category=None):
+        self.category = category
+        super(TroveCategoryController, self).__init__()
+
+    @expose('jinja:allura:templates/trovecategories.html')
+    def index(self, **kw):
+        require_authenticated()
+
+        if self.category:
+            selected_cat = self.category
+            l = self.category.subcategories
+            hierarchy = []
+            temp_cat = self.category.parent_category
+            while temp_cat:
+               hierarchy = [temp_cat] + hierarchy
+               temp_cat = temp_cat.parent_category
+        else:
+            l = M.TroveCategory.query.find(dict(trove_parent_id=0))
+            selected_cat = None
+            hierarchy = []
+        return dict(
+            categories=l, 
+            selected_cat=selected_cat, 
+            hierarchy=hierarchy)
+
+    @expose()
+    @require_post()
+    @validate(F.add_category_form, error_handler=index)
+    def create(self, **kw):
+        require_authenticated()
+
+        name = kw.get('categoryname')
+        upper_id = int(kw.get('uppercategory_id', 0))
+
+        upper = M.TroveCategory.query.get(trove_cat_id=upper_id)
+        if upper_id == 0:
+            path = name
+            show_as_skill = True
+        elif upper is None:
+            flash('Invalid upper category.', "error")
+            redirect('/categories')
+            return
+        else:
+            path = upper.fullpath + " :: " + name
+            show_as_skill = upper.show_as_skill
+
+        newid=max([el.trove_cat_id for el in M.TroveCategory.query.find()]) + 1
+        shortname=name.replace(" ", "_").lower()
+        shortname=''.join([(c if (c in digits or c in lowercase) else "_")
+                           for c in shortname])
+
+        oldcat=M.TroveCategory.query.get(shortname=shortname)
+        if oldcat:
+            flash('Category "%s" already exists.' % name, "error")
+        else:
+            category = M.TroveCategory(
+               trove_cat_id=newid,
+               trove_parent_id=upper_id,
+               fullname=name,
+               shortname=shortname,
+               fullpath=path,
+               show_as_skill=show_as_skill)
+            if category:
+                flash('Category "%s" successfully created.' % name)
+            else:
+                flash('An error occured while crearing the category.', "error")
+        if upper:
+            redirect('/categories/%s' % upper.shortname)
+        else:
+            redirect('/categories')
+
+    @expose()
+    @require_post()
+    @validate(F.remove_category_form, error_handler=index)
+    def remove(self, **kw):
+        require_authenticated()
+
+        cat = M.TroveCategory.query.get(trove_cat_id=int(kw['categoryid']))
+        if cat.trove_parent_id:
+            parent=M.TroveCategory.query.get(trove_cat_id=cat.trove_parent_id)
+            redirecturl = '/categories/%s' % parent.shortname
+        else:
+            redirecturl = '/categories'
+        if len(cat.subcategories) > 0:
+            m = "This category contains at least one sub-category, "
+            m = m + "therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl)
+            return
+        
+        if len(M.User.withskill(cat)) > 0:
+            m = "This category is used as a skill by at least a user, "
+            m = m + "therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_root_database=cat._id):
+            m = "This category is used as a database by at least a project, "
+            m = m + "therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_developmentstatus=cat._id):
+            m = "This category is used as development status by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_audience=cat._id):
+            m = "This category is used as intended audience by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_license=cat._id):
+            m = "This category is used as a license by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_os=cat._id):
+            m = "This category is used as operating system by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_language=cat._id):
+            m = "This category is used as programming language by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_topic=cat._id):
+            m = "This category is used as a topic by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_natlanguage=cat._id):
+            m = "This category is used as a natural language by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        if M.Project.query.get(trove_environment=cat._id):
+            m = "This category is used as an environment by at least a "
+            m = m + "project, therefore it can't be removed."
+            flash(m, "error")
+            redirect(redirecturl) 
+            return
+
+        M.TroveCategory.delete(cat)
+
+        flash('Category removed.')
+        redirect(redirecturl)
+
diff --git a/Allura/allura/ext/user_profile/templates/user_index.html b/Allura/allura/ext/user_profile/templates/user_index.html
index 1f6819d..2614953 100644
--- a/Allura/allura/ext/user_profile/templates/user_index.html
+++ b/Allura/allura/ext/user_profile/templates/user_index.html
@@ -35,6 +35,207 @@
       {% endfor %}
     </ul>
   </div>
+
+  <div class="grid-24">
+    <div class="grid-24" style="margin:0;"><b>Personal data</b></div>
+    {% if user.get_pref('sex') == 'Male' or user.get_pref('sex') == 'Female' %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Gender:</div>
+        <div class="grid-8">{{user.get_pref('sex')}}</div>
+      </div>
+    {% endif %}
+    {% if user.get_pref('birthdate') %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Birthdate:</div>
+        <div class="grid-8">
+          {{ user.get_pref('birthdate').strftime('%d %B %Y')}}
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('localization').country or user.get_pref('localization').city %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Localization:</div>
+        <div class="grid-8">
+          {% if user.get_pref('localization').city %}
+            {{user.get_pref('localization').city}}{{ ',' if user.get_pref('localization').country else '' }}
+          {% endif %}
+          {% if user.get_pref('localization').country %}
+            {{user.get_pref('localization').country}}
+         {% endif %}
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('timezone') %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Timezone:</div>
+        <div class="grid-8">
+          {{user.get_pref('timezone')}}
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('socialnetworks')|length > 0 %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Social networks:</div>
+        <div class="grid-18">
+           {{user.get_pref('display_name')}}'s account(s):
+           <ul>
+             {% for i in user.get_pref('socialnetworks') %}            
+                <li>{{i.socialnetwork}}: <a href="{{i.accounturl}}">{{i.accounturl}}</a></li>
+             {% endfor %}
+           </ul>
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('webpages')|length > 0 %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Websites:</div>
+        <div class="grid-18">
+           {{user.get_pref('display_name')}}'s website(s):
+           <ul>
+             {% for i in user.get_pref('webpages') %}            
+                <li><a href="{{i}}">{{i}}</a></li>
+             {% endfor %}
+           </ul>
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('telnumbers')|length > 0 %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Telephone number(s):</div>
+        <div class="grid-18">
+           {{user.get_pref('display_name')}}'s telephone number(s):
+           <ul>
+             {% for i in user.get_pref('telnumbers') %}            
+                <li>{{i}}</li>
+             {% endfor %}
+           </ul>
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('skypeaccount') %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Skype account:</div>
+        <div class="grid-8">{{user.get_pref('skypeaccount')}}</div>
+      </div>
+    {% endif %}
+
+    {% if user.get_pref('timezone') and user.get_availability_timeslots() |length > 0 %}
+      <div class="grid-24" style="margin:0;">
+        <div class="grid-4">Availability:</div>
+
+          {% if c.user.get_pref('timezone') %}
+          <div class="grid-18" id="timeslotsconverted" style="visibility: visible; display:none;">
+             {{user.get_pref('display_name')}}'s availability time-slots. 
+             <div style="float:right;">
+               See timeslots in:
+               <a href="JavaScript:void(0);" onclick="changeTimezone('utc')">UTC</a> | 
+               <a href="JavaScript:void(0);" onclick="changeTimezone('local')"> 
+                  {{user.get_pref('display_name')}}'s local time
+               </a> |
+               <b>Your local time</b> 
+             </div>
+             <ul>
+               {% for i in user.get_localized_availability(c.user.get_pref('timezone')) %}
+                  <li>{{i.week_day}}: from {{i.start_time.strftime("%H:%M")}} to {{i.end_time.strftime("%H:%M")}} </li>
+               {% endfor %}
+             </ul>
+          </div>
+          {% endif %}
+
+          <div class="grid-18" id="timeslotsutc" style="visibility: visible; display:block;">
+             {{user.get_pref('display_name')}}'s availability time-slots. 
+             <div style="float:right;">
+               See timeslots in:
+               <b>UTC</b> | 
+               <a href="JavaScript:void(0);" onclick="changeTimezone('local')"> 
+                  {{user.get_pref('display_name')}}'s local time
+               </a> 
+               {% if c.user.get_pref('timezone') %} |
+                  <a href="JavaScript:void(0);" onclick="changeTimezone('converted')">
+                    Your local time
+                  </a>
+               {% endif %}
+             </div>
+             <ul>
+               {% for i in user.get_localized_availability('utc') %}
+                  <li>{{i.week_day}}: from {{i.start_time.strftime("%H:%M")}} to {{i.end_time.strftime("%H:%M")}} </li>
+               {% endfor %}
+             </ul>
+          </div>
+
+          <div class="grid-18" id="timeslotslocal" style="visibility: visible; display:none;">
+             {{user.get_pref('display_name')}}'s availability time-slots. 
+             <div style="float:right;">
+               See timeslots in:
+               <a href="JavaScript:void(0);" onclick="changeTimezone('utc')">UTC</a> | 
+               <b> 
+                  {{user.get_pref('display_name')}}'s local time
+               </b> 
+               {% if c.user.get_pref('timezone') %} |
+                  <a href="JavaScript:void(0);" onclick="changeTimezone('converted')">
+                    Your local time
+                  </a>
+               {% endif %}
+             </div>
+             <ul>
+               {% for i in user.get_availability_timeslots() %}
+                  <li>{{i.week_day}}: from {{i.start_time.strftime("%H:%M")}} to {{i.end_time.strftime("%H:%M")}} </li>
+               {% endfor %}
+             </ul>
+          </div>
+
+        </div>
+      </div>
+    {% endif %}
+
+    {% if user.get_inactive_periods(include_past_periods=False)|length > 0 %}
+      <div class="grid-24">
+        <div class="grid-4">Inactive periods:</div>
+        <div class="grid-18">
+          This user won't be able to work on the forge in the following period(s):
+          <ul>
+            {% for p in user.get_inactive_periods(include_past_periods=False) %}
+              <li>From {{p.start_date.strftime('%d %B %Y')}} to {{p.end_date.strftime('%d %B %Y')}}.</li>
+            {% endfor %}
+        </div>
+      </div>
+    {% endif %}
+
+  </div><!-- end of Personal data section -->
+  <div class="grid-24">
+    <b>Current {{user.get_pref('display_name')}}'s skills list</b>
+    <div class="grid-24">
+      {% if user.get_skills()|length > 0 %}
+        <table>
+          <thead>
+            <tr>
+              <th>Skill</th>
+              <th>Level</th>
+              <th>Comments</th>
+            </tr>
+          </thead>
+          <tbody>
+            {% for s in user.get_skills() %}
+              <tr>
+                <td>{{s.skill.fullpath}}</td>
+                <td>{{s.level}}</td>
+                <td>{{s.comment}}</td>
+              </tr>
+            {% endfor %}
+          </tbody>
+        </table>
+      {% else %}
+        <div class="grid-24">At the moment, {{user.get_pref('display_name')}}'s skills list is empty!</div>
+      {% endif %}
+    </div>
+  </div>
+
   {% if c.user.username == user.username %}
       <div class="address-list grid-18">
         <b>Email Addresses</b>
@@ -63,3 +264,14 @@
       </div>
   {% endif %}
 {% endblock %}
+
+{% block extra_js %}
+  <script type="text/javascript">
+     function changeTimezone(opt){
+       $("#timeslotslocal").hide();
+       $("#timeslotsutc").hide();
+       $("#timeslotsconverted").hide();
+       $("#timeslots" + opt).show();
+     }
+  </script>
+{% endblock %}
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index ed32e01..b477d83 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -604,6 +604,150 @@
         from allura.lib.widgets.forms import PasswordChangeForm
         return PasswordChangeForm(action='/auth/prefs/change_password')
 
+    @LazyProperty 
+    def personal_data_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page 
+        ''' 
+        from allura.lib.widgets.forms import PersonalDataForm 
+        return PersonalDataForm()
+
+    @LazyProperty 
+    def add_telnumber_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page to 
+                 allow adding a telephone number.
+        ''' 
+        from allura.lib.widgets.forms import AddTelNumberForm 
+        return AddTelNumberForm()
+
+    @LazyProperty 
+    def add_website_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page to 
+                 allow adding a personal website url.
+        ''' 
+        from allura.lib.widgets.forms import AddWebsiteForm 
+        return AddWebsiteForm()
+
+    @LazyProperty 
+    def skype_account_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page to 
+                 allow setting the user's Skype account.
+        ''' 
+        from allura.lib.widgets.forms import SkypeAccountForm 
+        return SkypeAccountForm()
+
+    @LazyProperty 
+    def remove_textvalue_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page to 
+                 allow removing a single text value from a list.
+        ''' 
+        from allura.lib.widgets.forms import RemoveTextValueForm 
+        return RemoveTextValueForm()
+
+    @LazyProperty 
+    def add_socialnetwork_form(self):
+        '''
+        :return: None, or an easywidgets Form to render on  the user preferences page to 
+                 allow adding a social network account.
+        '''
+        from allura.lib.widgets.forms import AddSocialNetworkForm
+        return AddSocialNetworkForm(action='/auth/prefs/add_social_network')
+
+    @LazyProperty 
+    def remove_socialnetwork_form(self):
+        '''
+        :return: None, or an easywidgets Form to render on  the user preferences page to 
+                 allow removing a social network account.
+        '''
+        from allura.lib.widgets.forms import RemoveSocialNetworkForm
+        return RemoveSocialNetworkForm(action='/auth/prefs/remove_social_network')
+
+    @LazyProperty 
+    def add_timeslot_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page
+                 to allow creating a new availability timeslot
+        ''' 
+        from allura.lib.widgets.forms import AddTimeSlotForm 
+        return AddTimeSlotForm()
+
+    @LazyProperty 
+    def remove_timeslot_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page
+                 to remove a timeslot
+        ''' 
+        from allura.lib.widgets.forms import RemoveTimeSlotForm 
+        return RemoveTimeSlotForm()
+
+    @LazyProperty 
+    def add_inactive_period_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page
+                 to allow creating a new period of inactivity
+        ''' 
+        from allura.lib.widgets.forms import AddInactivePeriodForm
+        return AddInactivePeriodForm()
+
+    @LazyProperty 
+    def remove_inactive_period_form(self): 
+        ''' 
+        :return: None, or an easywidgets Form to render on the user preferences page
+                 to allow removing an existing period of inactivity
+        ''' 
+        from allura.lib.widgets.forms import RemoveInactivePeriodForm
+        return RemoveInactivePeriodForm()
+
+    @LazyProperty
+    def add_trove_category(self):
+        '''
+        :return: None, or an easywidgets Form to render on the page to create a
+                 new trove_category
+        '''
+        from allura.lib.widgets.forms import AddTroveCategoryForm
+        return AddTroveCategoryForm(action='/categories/create')
+
+    @LazyProperty
+    def remove_trove_category(self):
+        '''
+        :return: None, or an easywidgets Form to render on the page to remove 
+                 an existing trove_category
+        '''
+        from allura.lib.widgets.forms import RemoveTroveCategoryForm
+        return RemoveTroveCategoryForm(action='/categories/remove')
+
+    @LazyProperty
+    def add_user_skill(self):
+        '''
+        :return: None, or an easywidgets Form to render on the page to add a
+                 new skill to a user profile
+        '''
+        from allura.lib.widgets.forms import AddUserSkillForm
+        return AddUserSkillForm(action='/auth/prefs/user_skills/save_skill')
+
+    @LazyProperty
+    def select_subcategory_form(self):
+        '''
+        :return: None, or an easywidgets Form to render on the page to add a
+                 new skill to a user profile, allowing to select a category in
+                 order to see its sub-categories
+        '''
+        from allura.lib.widgets.forms import SelectSubCategoryForm
+        return SelectSubCategoryForm(action='/auth/prefs/user_skills')
+
+    @LazyProperty
+    def remove_user_skill(self):
+        '''
+        :return: None, or an easywidgets Form to render on the page to remove
+                 an existing skill from a user profile
+        '''
+        from allura.lib.widgets.forms import RemoveSkillForm
+        return RemoveSkillForm(action='/auth/prefs/user_skills/remove_skill')
+
     @LazyProperty
     def upload_key_form(self):
         '''
diff --git a/Allura/allura/lib/validators.py b/Allura/allura/lib/validators.py
index 5bab308..b7ff459 100644
--- a/Allura/allura/lib/validators.py
+++ b/Allura/allura/lib/validators.py
@@ -3,6 +3,7 @@
 import formencode as fe
 from formencode import validators as fev
 from . import helpers as h
+from datetime import datetime
 
 class Ming(fev.FancyValidator):
 
@@ -61,3 +62,86 @@
         except ValueError, e:
             raise fe.Invalid('Invalid JSON: ' + str(e), value, state)
         return value
+
+class DateValidator(fev.FancyValidator):
+    def _to_python(self, value, state):
+        value = convertDate(value)
+        if not value:
+            raise fe.Invalid(
+                "Please enter a valid date in the format DD/MM/YYYY.",
+                value, state)
+        return value
+
+class TimeValidator(fev.FancyValidator):
+    def _to_python(self, value, state):
+        value = convertTime(value)
+        if not value:
+            raise fe.Invalid(
+                "Please enter a valid time in the format HH:MM.",
+                value, state)
+        return value
+
+class OneOfValidator(fev.FancyValidator):
+    def __init__(self, validvalues, not_empty = True):
+        self.validvalues = validvalues
+        self.not_empty = not_empty
+        super(OneOfValidator, self).__init__()
+
+    def _to_python(self, value, state):
+        if not value.strip():
+            if self.not_empty:
+                raise fe.Invalid("This field can't be empty.", value, state)
+            else:
+                return None
+        if not value in self.validvalues:
+            allowed = ''
+            for v in self.validvalues:
+                if allowed != '':
+                    allowed = allowed + ', '
+                allowed = allowed + '"%s"' % v
+            raise fe.Invalid(
+                "Invalid value. The allowed values are %s." %allowed,
+                value, state)
+        return value
+
+class MapValidator(fev.FancyValidator):
+    def __init__(self, mapvalues, not_empty = True):
+        self.map = mapvalues
+        self.not_empty = not_empty
+        super(MapValidator, self).__init__()
+
+    def _to_python(self, value, state):
+        if not value.strip():
+            if self.not_empty:
+                raise fe.Invalid("This field can't be empty.", value, state)
+            else:
+                return None
+        conv_value = self.map.get(value)
+        if not conv_value:
+            raise fe.Invalid(
+                "Invalid value. Please, choose one of the valid values.",
+                value, state)
+        return conv_value
+
+def convertDate(datestring):
+    formats = ['%Y-%m-%d', '%Y.%m.%d', '%Y/%m/%d', '%Y\%m\%d', '%Y %m %d',
+               '%d-%m-%Y', '%d.%m.%Y', '%d/%m/%Y', '%d\%m\%Y', '%d %m %Y']
+
+    for f in formats:
+        try:
+            date = datetime.strptime(datestring, f)       
+            return date
+        except:
+            pass
+    return None
+
+def convertTime(timestring):
+    formats = ['%H:%M', '%H.%M', '%H %M', '%H,%M']
+
+    for f in formats:
+        try:
+            time = datetime.strptime(timestring, f)       
+            return {'h':time.hour, 'm':time.minute}
+        except:
+            pass
+    return None
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index 35281d1..5fe3923 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -6,6 +6,7 @@
 from allura.lib import plugin
 from allura.lib.widgets import form_fields as ffw
 from allura import model as M
+from datetime import datetime
 
 from formencode import validators as fev
 import formencode
@@ -13,8 +14,20 @@
 import ew as ew_core
 import ew.jinja2_ew as ew
 
+from pytz import common_timezones, country_timezones, country_names
+
 log = logging.getLogger(__name__)
 
+socialnetworks=['Facebook','Linkedin','Twitter','Google+']
+weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
+
+class _HTMLExplanation(ew.InputField):
+    template=ew.Snippet(
+        '''<label class="grid-4">&nbsp;</label>
+           <div class="grid-14" style="margin:2px;">{{widget.text}}</div>
+        ''',
+        'jinja2')
+
 class NeighborhoodProjectTakenValidator(fev.FancyValidator):
 
     def _to_python(self, value, state):
@@ -88,6 +101,517 @@
             raise formencode.Invalid('Passwords must match', value, state)
         return d
 
+class PersonalDataForm(ForgeForm):
+    class fields(ew_core.NameList):
+        sex = ew.SingleSelectField(
+            label='Gender', 
+            options=[ew.Option(py_value=v,label=v,selected=False)
+                     for v in ['Male', 'Female', 'Unknown', 'Other']],
+            validator=formencode.All(
+                V.OneOfValidator(['Male', 'Female', 'Unknown', 'Other']),
+                fev.UnicodeString(not_empty=True)))
+        birthdate = ew.TextField(
+            label='Birth date', 
+            validator=V.DateValidator(),
+            attrs=dict(value=None))
+        exp = _HTMLExplanation(
+            text="Use the format DD/MM/YYYY",
+            show_errors=False)
+        country = ew.SingleSelectField(
+            label='Country of residence', 
+            validator=V.MapValidator(country_names, not_empty=False),
+            options = [
+                ew.Option(
+                    py_value=" ", label=" -- Unknown -- ", selected=False)] +\
+                [ew.Option(py_value=c, label=n, selected=False)
+                 for c,n in sorted(country_names.items(), 
+                                   key=lambda (k,v):v)],
+            attrs={'onchange':'selectTimezone(this.value)'})
+        city = ew.TextField(
+            label='City of residence', 
+            attrs=dict(value=None),
+            validator=fev.UnicodeString(not_empty=False))
+        timezone=ew.SingleSelectField(
+            label='Timezone', 
+            attrs={'id':'tz'},
+            validator=V.OneOfValidator(common_timezones, not_empty=False),
+            options=[
+                 ew.Option(
+                     py_value=" ",
+                     label=" -- Unknown -- ")] + \
+                 [ew.Option(py_value=n, label=n)
+                  for n in sorted(common_timezones)])
+
+    def display(self, **kw):
+        user = kw.get('user')
+
+        for opt in self.fields['sex'].options:
+            if opt.label == user.sex:
+                opt.selected = True
+            else:
+                opt.selected = False
+
+        if user.get_pref('birthdate'):
+            self.fields['birthdate'].attrs['value'] = \
+                user.get_pref('birthdate').strftime('%d/%m/%Y')
+        else:
+            self.fields['birthdate'].attrs['value'] = ''
+
+        for opt in self.fields['country'].options:
+            if opt.label == user.localization.country:
+                opt.selected = True
+            elif opt.py_value == " " and user.localization.country is None:
+                opt.selected = True
+            else:
+                opt.selected = False
+
+        if user.localization.city:
+            self.fields['city'].attrs['value'] = user.localization.city
+        else:
+            self.fields['city'].attrs['value'] = ''
+
+        for opt in self.fields['timezone'].options:
+            if opt.label == user.timezone:
+                opt.selected = True
+            elif opt.py_value == " " and user.timezone is None:
+                opt.selected = True
+            else:
+                opt.selected = False
+
+        return super(ForgeForm, self).display(**kw)
+        
+    def resources(self):
+        def _append(x, y):
+            return x + y
+
+        yield ew.JSScript('''
+var $allTimezones = $("#tz").clone();
+var $t = {};
+''' + \
+    reduce(_append, [
+        '$t["'+ el +'"] = ' + str([name.encode('utf-8') 
+                                  for name in country_timezones[el]]) + ";\n"
+        for el in country_timezones]) + '''
+function selectTimezone($country){
+     if($country == " "){
+         $("#tz").replaceWith($allTimezones);
+     }
+     else{
+         $("#tz option:gt(0)").remove();
+         $.each($t[$country], function(index, value){
+             $("#tz").append($("<option></option>").attr("value", value).text(value))
+         })
+     }
+}''')
+
+class AddTelNumberForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        newnumber = ew.TextField(
+            label='New telephone number',
+            attrs={'value':''},
+            validator=fev.UnicodeString(not_empty=True))
+        
+    def display(self, **kw):
+        initial_value = kw.get('initial_value','')
+        self.fields['newnumber'].attrs['value'] = initial_value
+        return super(ForgeForm, self).display(**kw)
+
+class AddWebsiteForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        newwebsite = ew.TextField(
+            label='New website url',
+            attrs={'value':''},
+            validator=fev.UnicodeString(not_empty=True))
+        
+    def display(self, **kw):
+        initial_value = kw.get('initial_value','')
+        self.fields['newwebsite'].attrs['value'] = initial_value
+        return super(ForgeForm, self).display(**kw)
+
+class SkypeAccountForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        skypeaccount = ew.TextField(
+            label='Skype account',
+            attrs={'value':''},
+            validator=fev.UnicodeString(not_empty=False))
+        
+    def display(self, **kw):
+        initial_value = kw.get('initial_value','')
+        self.fields['skypeaccount'].attrs['value'] = initial_value
+        return super(ForgeForm, self).display(**kw)
+
+class RemoveTextValueForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        initial_value = kw.get('value','')
+        label = kw.get('label','')
+        description = kw.get('description')
+        
+        self.fields = [
+            ew.RowField(
+                show_errors=False,
+                hidden_fields=[
+                    ew.HiddenField(
+                        name="oldvalue",
+                        attrs={'value':initial_value},
+                        show_errors=False)
+                ],
+                fields=[
+                    ew.HTMLField(
+                        text=label,
+                        show_errors=False),
+                    ew.HTMLField(
+                        show_label=False,
+                        text=initial_value),
+                    ew.SubmitButton(
+                        show_label=False,
+                        attrs={'value':'Remove'},
+                        show_errors=False)])]
+        if description:
+            self.fields.append(
+                _HTMLExplanation(
+                    text=description,
+                    show_errors=False))
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveTextValueForm, self).to_python(kw, state)
+        d["oldvalue"] = kw.get('oldvalue', '')
+        return d
+
+class AddSocialNetworkForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        socialnetwork = ew.SingleSelectField(
+            label='Social network', 
+            options=[ew.Option(py_value=name, label=name)
+                     for name in socialnetworks],
+            validator=formencode.All(
+                V.OneOfValidator(socialnetworks),
+                fev.UnicodeString(not_empty=True)))
+        accounturl = ew.TextField(
+            label='Account url',
+            validator=fev.UnicodeString(not_empty=True))
+
+class RemoveSocialNetworkForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        account = kw.get('account','')
+        socialnetwork = kw.get('socialnetwork','')
+        
+        self.fields = [
+            ew.RowField(
+                show_errors=False,
+                hidden_fields=[
+                    ew.HiddenField(
+                        name="account",
+                        attrs={'value':account},
+                        show_errors=False),
+                    ew.HiddenField(
+                        name="socialnetwork",
+                        attrs={'value':socialnetwork},
+                        show_errors=False)],
+                fields=[
+                    ew.HTMLField(
+                        text='%s account' % socialnetwork,
+                        show_errors=False),
+                    ew.HTMLField(
+                        show_label=False,
+                        text=account),
+                    ew.SubmitButton(
+                        show_label=False,
+                        attrs={'value':'Remove'},
+                        show_errors=False)])]
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveSocialNetworkForm, self).to_python(kw, state)
+        d["account"] = kw.get('account', '')
+        d["socialnetwork"] = kw.get('socialnetwork', '')
+        return d
+
+class AddInactivePeriodForm(ForgeForm):
+    class fields(ew_core.NameList):
+        startdate = ew.TextField(
+            label='Start date',
+            validator=formencode.All(
+                V.DateValidator(),
+                fev.UnicodeString(not_empty=True)))
+        enddate = ew.TextField(
+            label='End date',
+            validator=formencode.All(
+                V.DateValidator(),
+                fev.UnicodeString(not_empty=True)))
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(AddInactivePeriodForm, self).to_python(kw, state)
+        if d['startdate'] > d['enddate']:
+                raise formencode.Invalid(
+                   'Invalid period: start date greater than end date.', 
+                    kw, state)
+        return d
+
+class RemoveInactivePeriodForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        startdate = kw.get('startdate')
+        enddate = kw.get('enddate')
+
+        self.fields = [
+            ew.RowField(
+                show_label=False,
+                show_errors=False,
+                fields=[
+                    ew.HTMLField(text=startdate.strftime('%d/%m/%Y'),
+                                 show_errors=False),
+                    ew.HTMLField(text=enddate.strftime('%d/%m/%Y'),
+                                 show_errors=False),
+                    ew.SubmitButton(
+                        attrs={'value':'Remove'},
+                        show_errors=False)],
+                hidden_fields=[
+                    ew.HiddenField(
+                        name='startdate',
+                        attrs={'value':startdate.strftime('%d/%m/%Y')},
+                        show_errors=False),
+                    ew.HiddenField(
+                        name='enddate',
+                        attrs={'value':enddate.strftime('%d/%m/%Y')},
+                        show_errors=False)])]
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveInactivePeriodForm, self).to_python(kw, state)
+        d['startdate'] = V.convertDate(kw.get('startdate',''))
+        d['enddate'] = V.convertDate(kw.get('enddate',''))
+        return d
+
+class AddTimeSlotForm(ForgeForm):
+    class fields(ew_core.NameList):
+        weekday = ew.SingleSelectField(
+            label='Weekday', 
+            options=[ew.Option(py_value=wd, label=wd)
+                     for wd in weekdays],
+            validator=formencode.All(
+                V.OneOfValidator(weekdays),
+                fev.UnicodeString(not_empty=True)))
+        starttime = ew.TextField(
+            label='Start time',
+            validator=formencode.All(
+                V.TimeValidator(),
+                fev.UnicodeString(not_empty=True)))
+        endtime = ew.TextField(
+            label='End time',
+            validator=formencode.All(
+                V.TimeValidator(),
+                fev.UnicodeString(not_empty=True)))
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(AddTimeSlotForm, self).to_python(kw, state)
+        if (d['starttime']['h'], d['starttime']['m']) > \
+           (d['endtime']['h'], d['endtime']['m']):
+                raise formencode.Invalid(
+                   'Invalid period: start time greater than end time.', 
+                    kw, state)
+        return d
+
+class RemoveTimeSlotForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        weekday = kw.get('weekday','')
+        starttime = kw.get('starttime')
+        endtime = kw.get('endtime')
+
+        self.fields = [
+            ew.RowField(
+                show_errors=False,
+                show_label=False,
+                fields=[
+                    ew.HTMLField(text=weekday),
+                    ew.HTMLField(text=starttime.strftime('%H:%M')),
+                    ew.HTMLField(text=endtime.strftime('%H:%M')),
+                    ew.SubmitButton(
+                        show_errors=False,
+                        attrs={'value':'Remove'})],
+                hidden_fields=[
+                    ew.HiddenField(
+                        name='weekday', 
+                        attrs={'value':weekday}),
+                    ew.HiddenField(
+                        name='starttime',
+                        attrs={'value':starttime.strftime('%H:%M')}),
+                    ew.HiddenField(
+                        name='endtime',
+                        attrs={'value':endtime.strftime('%H:%M')})])]
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveTimeSlotForm, self).to_python(kw, state)
+        d["weekday"] = kw.get('weekday', None)
+        d['starttime'] = V.convertTime(kw.get('starttime',''))
+        d['endtime'] = V.convertTime(kw.get('endtime',''))
+        return d
+
+class RemoveTroveCategoryForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        cat = kw.get('category')
+        
+        self.fields = [
+            ew.RowField(
+                show_errors=False,
+                show_label=False,
+                fields=[
+                    ew.LinkField(
+                        text=cat.fullname,
+                        href="/categories/%s" % cat.shortname),
+                    ew.SubmitButton(
+                        show_errors=False,
+                        attrs={'value':'Remove'})],
+                hidden_fields=[
+                    ew.HiddenField(
+                        name='categoryid', 
+                        attrs={'value':cat.trove_cat_id})])]
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveTroveCategoryForm, self).to_python(kw, state)
+        d["categoryid"] = kw.get('categoryid')
+        if d["categoryid"]:
+            d["categoryid"] = int(d['categoryid'])
+        return d
+
+class AddTroveCategoryForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        uppercategory_id = ew.HiddenField(
+            attrs={'value':''},
+            show_errors=False)
+        categoryname = ew.TextField(
+            label="Category name",
+            validator=fev.UnicodeString(not_empty=True))
+
+    def display(self, **kw):
+        upper_category = kw.get('uppercategory_id',0)
+        
+        self.fields['uppercategory_id'].attrs['value'] = upper_category
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(AddTroveCategoryForm, self).to_python(kw, state)
+        d["uppercategory_id"] = kw.get('uppercategory_id', 0)
+        return d
+
+class AddUserSkillForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults)
+
+    class fields(ew_core.NameList):
+        selected_skill=ew.HiddenField(
+            attrs={'value':''},
+            show_errors=False,
+            validator=fev.UnicodeString(not_empty=True))
+        level=ew.SingleSelectField(
+            label="Level of knowledge",
+            options=[
+                ew.Option(py_value="low",label="Low level"),
+                ew.Option(py_value="medium",label="Medium level"),
+                ew.Option(py_value="high",label="Advanced level")],
+            validator=formencode.All(
+                V.OneOfValidator(['low','medium','high']),
+                fev.UnicodeString(not_empty=True)))
+        comment=ew.TextArea(
+            label="Additional comments",
+            validator=fev.UnicodeString(not_empty=False),
+            attrs={'rows':5,'cols':30})
+
+    def display(self, **kw):
+        category = kw.get('selected_skill')
+        
+        self.fields["selected_skill"].attrs['value']=category
+        return super(ForgeForm, self).display(**kw)
+
+class SelectSubCategoryForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text="Confirm")
+
+    class fields(ew_core.NameList):
+        selected_category=ew.SingleSelectField(
+            name="selected_category",
+            label="Available categories",
+            options=[])
+
+    def display(self, **kw):
+        categories = kw.get('categories')
+        
+        self.fields['selected_category'].options= \
+            [ew.Option(py_value=el.trove_cat_id,label=el.fullname)
+             for el in categories]
+        self.fields['selected_category'].validator= \
+            validator=formencode.All(
+                V.OneOfValidator(categories),
+                fev.UnicodeString(not_empty=True))
+        return super(ForgeForm, self).display(**kw)
+
+class RemoveSkillForm(ForgeForm):
+    defaults=dict(ForgeForm.defaults, submit_text=None, show_errors=False)
+
+    def display(self, **kw):
+        skill = kw.get('skill')
+        comment = skill['comment']
+        if not comment:
+            comment = "&nbsp;"
+
+        self.fields = [
+            ew.RowField(
+                show_errors=False,
+                hidden_fields=[
+                    ew.HiddenField(
+                        name="categoryid",
+                        attrs={'value':skill['skill'].trove_cat_id},
+                        show_errors=False)
+                ],
+                fields=[
+                    ew.HTMLField(
+                        text=skill['skill'].fullpath,
+                        show_errors=False),
+                    ew.HTMLField(
+                        text=skill['level'],
+                        show_errors=False),
+                    ew.HTMLField(
+                        text=comment,
+                        show_errors=False),
+                    ew.SubmitButton(
+                        show_label=False,
+                        attrs={'value':'Remove'},
+                        show_errors=False)])]
+        return super(ForgeForm, self).display(**kw)
+
+    @ew_core.core.validator
+    def to_python(self, kw, state):
+        d = super(RemoveSkillForm, self).to_python(kw, state)
+        d["categoryid"] = kw.get('categoryid', None)
+        return d
+
 class UploadKeyForm(ForgeForm):
     class fields(ew_core.NameList):
         key = ew.TextArea(label='SSH Public Key')
diff --git a/Allura/allura/model/auth.py b/Allura/allura/model/auth.py
index b5c8567..a6d651f 100644
--- a/Allura/allura/model/auth.py
+++ b/Allura/allura/model/auth.py
@@ -5,11 +5,13 @@
 import urllib
 import hmac
 import hashlib
+import pytz
 from urlparse import urlparse
 from email import header
-from datetime import timedelta, datetime
 from hashlib import sha256
 import uuid
+from pytz import timezone
+from datetime import timedelta, date, datetime, time
 
 import iso8601
 import pymongo
@@ -299,6 +301,35 @@
             email_address=str,
             email_format=str))
 
+    #Personal data
+    sex=FieldProperty(
+        S.OneOf('Male', 'Female', 'Other', 'Unknown', 
+        if_missing='Unknown'))
+    birthdate=FieldProperty(S.DateTime, if_missing=None)
+
+    #Availability information
+    availability=FieldProperty([dict(
+        week_day=str,
+        start_time=dict(h=int, m=int),
+        end_time=dict(h=int, m=int))])
+    localization=FieldProperty(dict(city=str,country=str))
+    timezone=FieldProperty(str)
+    inactiveperiod=FieldProperty([dict(
+        start_date=S.DateTime,
+        end_date=S.DateTime)])
+
+    #Additional contacts
+    socialnetworks=FieldProperty([dict(socialnetwork=str,accounturl=str)])
+    telnumbers=FieldProperty([str])
+    skypeaccount=FieldProperty(str)
+    webpages=FieldProperty([str])
+
+    #Skills list
+    skills = FieldProperty([dict(
+        category_id = S.ObjectId,
+        level = S.OneOf('low', 'high', 'medium'),
+        comment=str)])
+
     @property
     def activity_name(self):
         return self.display_name or self.username
@@ -309,6 +340,139 @@
     def set_pref(self, pref_name, pref_value):
         return plugin.UserPreferencesProvider.get().set_pref(self, pref_name, pref_value)
 
+    def add_socialnetwork(self, socialnetwork, accounturl):
+        self.socialnetworks.append(dict(
+            socialnetwork=socialnetwork,
+            accounturl=accounturl))
+
+    def remove_socialnetwork(self, socialnetwork, oldurl):
+        for el in self.socialnetworks:
+            if el.socialnetwork==socialnetwork and el.accounturl==oldurl:
+                del self.socialnetworks[self.socialnetworks.index(el)]
+                return
+
+    def add_telephonenumber(self, telnumber):
+        self.telnumbers.append(telnumber)
+
+    def remove_telephonenumber(self, oldvalue):
+        for el in self.telnumbers:
+            if el==oldvalue:
+                del self.telnumbers[self.telnumbers.index(el)]
+                return
+
+    def add_webpage(self, webpage):
+        self.webpages.append(webpage)
+
+    def remove_webpage(self, oldvalue):
+        for el in self.webpages:
+            if el==oldvalue:
+                del self.webpages[self.webpages.index(el)]
+                return
+
+    def add_timeslot(self, weekday, starttime, endtime):
+        self.availability.append(
+           dict(week_day=weekday, 
+                start_time=starttime, 
+                end_time=endtime))
+
+    def remove_timeslot(self, weekday, starttime, endtime):
+        oldel = dict(week_day=weekday, start_time=starttime, end_time=endtime)
+        for el in self.availability:
+            if el == oldel:
+                del self.availability[self.availability.index(el)]
+                return
+
+    def add_inactive_period(self, startdate, enddate):
+        self.inactiveperiod.append(
+           dict(start_date=startdate, 
+                end_date=enddate))
+
+    def remove_inactive_period(self, startdate, enddate):
+        oldel = dict(start_date=startdate, end_date=enddate)
+        for el in self.inactiveperiod:
+            if el == oldel:
+                del self.inactiveperiod[self.inactiveperiod.index(el)]
+                return
+
+    def get_localized_availability(self, tz_name):
+        week_day = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 
+                    'Friday', 'Saturday', 'Sunday']
+        avail = self.get_availability_timeslots()
+        usertimezone = timezone(self.get_pref('timezone'))
+        chosentimezone = timezone(tz_name)
+        retlist = []
+        for t in avail:
+            today = datetime.today()
+            start = datetime(
+                today.year, today.month, today.day, 
+                t['start_time'].hour, t['start_time'].minute, 0)
+            end = datetime(
+                today.year, today.month, today.day, 
+                t['end_time'].hour, t['end_time'].minute, 0)            
+
+            loctime1 = usertimezone.localize(start)
+            loctime2 = usertimezone.localize(end)
+            convtime1 = loctime1.astimezone(chosentimezone)           
+            convtime2 = loctime2.astimezone(chosentimezone)
+
+            dif_days_start = convtime1.weekday() - today.weekday()
+            dif_days_end = convtime2.weekday() - today.weekday()
+            index = (week_day.index(t['week_day'])+dif_days_start) % 7
+            week_day_start = week_day[index]
+            week_day_end = week_day[index]
+
+            if week_day_start == week_day_end:
+                retlist.append(dict(
+                    week_day = week_day_start,
+                    start_time = convtime1.time(),
+                    end_time = convtime2.time()))
+            else:
+                retlist.append(dict(
+                    week_day = week_day_start,
+                    start_time = convtime1.time(),
+                    end_time = time(23, 59)))
+                retlist.append(dict(
+                    week_day = week_day_end,
+                    start_time = time(0, 0),
+                    end_time = convtime2.time()))
+
+        return sorted(
+            retlist, 
+            key=lambda k:(week_day.index(k['week_day']), k['start_time']))
+
+    def get_skills(self):
+        from allura.model.project import TroveCategory
+        retval = []
+        for el in self.skills:
+            d = dict(
+                skill=TroveCategory.query.get(_id=el["category_id"]),
+                level=el.level,
+                comment=el.comment)
+            retval.append(d)
+        return retval
+
+    def get_availability_timeslots(self):
+        retval = []
+        for el in self.availability:
+            start, end = (el.get('start_time'), el.get('end_time'))
+            (starth, startm) = (start.get('h'), start.get('m'))
+            (endh, endm) = (end.get('h'), end.get('m')) 
+            newdict = dict(
+                week_day  = el.get('week_day'),
+                start_time= time(starth,startm,0),
+                end_time  = time(endh,endm,0))
+            retval.append(newdict) 
+        return retval
+
+    def get_inactive_periods(self, include_past_periods=False):
+        retval = []
+        for el in self.inactiveperiod:
+            d1, d2 = (el.get('start_date'), el.get('end_date'))
+            newdict = dict(start_date = d1, end_date = d2)
+            if include_past_periods or newdict['end_date'] > datetime.today():
+                retval.append(newdict) 
+        return retval
+
     def url(self):
         return plugin.AuthenticationProvider.get(request).project_url(self)
 
@@ -471,6 +635,10 @@
     def update_notifications(self):
         return plugin.AuthenticationProvider.get(request).update_notifications(self)
 
+    @classmethod
+    def withskill(cls, skill):
+        return cls.query.find({"skills.category_id" : skill._id})
+
 class OldProjectRole(MappedClass):
     class __mongometa__:
         session = project_orm_session
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index b5c1567..d4e53ac 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -69,6 +69,7 @@
     fullname = FieldProperty(str, if_missing='')
     fullpath = FieldProperty(str, if_missing='')
     parent_only = FieldProperty(bool, if_missing=False)
+    show_as_skill = FieldProperty(bool, if_missing=True)
 
     @property
     def parent_category(self):
diff --git a/Allura/allura/templates/trovecategories.html b/Allura/allura/templates/trovecategories.html
new file mode 100644
index 0000000..b97f20b
--- /dev/null
+++ b/Allura/allura/templates/trovecategories.html
@@ -0,0 +1,60 @@
+{% set hide_left_bar = True %}
+{% extends g.theme.master %}
+
+{% block title %}Trove categories{% endblock %}
+
+{% block header %}Managing trove categories{% endblock %}
+
+{% block content %}
+  <div class="grid-20">
+    {% if selected_cat %} 
+      <div class="grid-20">
+        <a href="/categories">Top-level categories</a>
+        {% for cat in hierarchy %}
+          &gt; <a href="/categories/{{cat.shortname}}">{{cat.fullname}}</a>
+        {% endfor %}
+        &gt; {{selected_cat.fullname}}
+      </div>
+      <h2>
+        Sub-categories of {{selected_cat.fullname}}
+      </h2>
+    {% else %} 
+      <h2>
+        List of all top-level categories
+      </h2>
+    {% endif %}
+   
+    {% if categories|length > 0 %}
+      <table>
+        <thead>
+          <tr>
+            <th>Name</th>
+            <th>Actions</th>
+          </tr>
+        </thead>
+        <tbody>
+          {% for cat in categories %}
+              {{g.theme.remove_trove_category.display(category=cat)}}
+          {% endfor %}
+        </tbody>
+      </table>
+    {% else %}
+      <div class="grid-20">
+        There are no categories in this list.
+      </div>
+    {% endif %}
+  </div>
+
+  <div class="grid-20">
+    <h2>Create a new item in this category</h2>
+    {% if selected_cat %}
+      {{g.theme.add_trove_category.display(uppercategory_id=selected_cat.trove_cat_id)}}
+    {% else %}
+      {{g.theme.add_trove_category.display(uppercategory_id=0)}}
+    {% endif %}
+    <div class="grid-20" style="margin-bottom:10px;">
+      Are you done creating new categories? <a href="/auth/prefs/user_skills/{{selected_cat.shortname}}">Click here</a> to configure your skills!
+    </div>
+
+  </div>
+{% endblock %}
diff --git a/Allura/allura/templates/user_preferences.html b/Allura/allura/templates/user_preferences.html
index 5d7ab23..be4dfe6 100644
--- a/Allura/allura/templates/user_preferences.html
+++ b/Allura/allura/templates/user_preferences.html
@@ -17,6 +17,118 @@
       {%- endfor %}
    </ul>
 
+  <div style="clear:both" class="grid-20">
+    <h2>Personal Settings</h2>
+    {{g.theme.personal_data_form.display(action="/auth/prefs/change_personal_data", user=c.user)}} 
+  </div>
+
+  <div style="clear:both" class="grid-20">
+    <a name="Contacts"></a>
+    <h2>Personal Contacts</h2>
+    <h3>Skype account</h3>
+
+    {{g.theme.skype_account_form.display(action="/auth/prefs/skype_account",
+          initial_value=c.user.get_pref('skypeaccount'))}}
+     
+    {%if c.user.get_pref('socialnetworks') or c.user.get_pref('telnumbers') or c.user.get_pref('webpages') %}
+      <h3>Other existing contacts</h3>
+        <table>
+          <tr>
+            <thead>
+              <th>Type</th>
+              <th>Contact</th>
+              <th>Actions</th>
+            </thead>
+          </tr>
+          {% for sn in c.user.get_pref('socialnetworks') %}
+             {{g.theme.remove_socialnetwork_form.display(account=sn.accounturl, socialnetwork=sn.socialnetwork)}} 
+          {% endfor %}
+
+          {% for tn in c.user.get_pref('telnumbers') %}
+              {{g.theme.remove_textvalue_form.display(action="/auth/prefs/remove_telnumber", value=tn, label="Telephone number")}} 
+          {%endfor%}
+
+          {% for ws in c.user.get_pref('webpages') %}
+              {{g.theme.remove_textvalue_form.display(action="/auth/prefs/remove_webpage", value=ws, label="Website url")}} 
+          {%endfor%}
+        </table>
+    {% endif %}
+
+    <h3>Add a social network account</h3>
+    {{g.theme.add_socialnetwork_form.display(action="/auth/prefs/add_social_network")}}
+    <h3>Add a telephone number</h3>
+    {{g.theme.add_telnumber_form.display(action="/auth/prefs/add_telnumber")}}
+    <h3>Add a personal website</h3>
+    {{g.theme.add_website_form.display(action="/auth/prefs/add_webpage")}}
+  </div>
+
+  <a name="Availability"></a>
+  <div style="clear:both" class="grid-20">
+    <h2>Availability</h2>
+    <div class="grid-18">
+      If you want, you can set the weekly timeslot during which you are usually available to support other users of the forge.
+      Please, set your time intervals choosing a weekday and entering the time interval according to the timezone specified in your 
+      personal data, using the format HH:MM. If you didn't set any timezone, your timeslots could be meaningless to other users, 
+      therefore they will be ignored.
+    </div>
+    <div class="grid-18">
+      You can also specify periods of time during which you won't be able to work on the forge, in orther to communicate other users
+      that they can't contact you during those days. Please, do it specifying date intervals in format DD/MM/YYYY.
+    </div> 
+  </div>
+  <div class="grid-20">
+    {%if c.user.get_availability_timeslots() %}
+      <h3>Existing availability timeslots</h3>
+      <table>
+        <tr>
+          <thead>
+            <th>Weekday</th>
+            <th>Start time</th>
+            <th>End time</th>
+            <th>Actions</th>
+          </thead>
+        </tr>
+        {% for ts in c.user.get_availability_timeslots() %}
+          {{g.theme.remove_timeslot_form.display(
+                action="/auth/prefs/remove_timeslot",
+                weekday=ts.week_day,
+                starttime=ts.start_time,
+                endtime=ts.end_time)}} 
+        {%endfor%}
+      </table>
+    {% endif %}
+    <h3>Add a new availability timeslot</h3>
+    {{g.theme.add_timeslot_form.display(action="/auth/prefs/add_timeslot")}}
+  </div>
+
+  <div class="grid-20">
+    {%if c.user.get_inactive_periods() %}
+      <h3>Existing periods of inactivity on the forge</h3>
+      <table>
+        <tr>
+          <thead>
+            <th>Start date</th>
+            <th>End date</th>
+            <th>Actions</th>
+          </thead>
+        </tr>
+        {% for ip in c.user.get_inactive_periods() %}
+          {{g.theme.remove_inactive_period_form.display(
+                action="/auth/prefs/remove_inactive_period",
+                startdate=ip.start_date,
+                enddate=ip.end_date)}} 
+        {%endfor%}
+      </table>
+    {% endif %}
+    <h3>Add a new period of inactivity on the forge</h3>
+    {{g.theme.add_inactive_period_form.display(action="/auth/prefs/add_inactive_period")}}
+  </div>
+
+  <div class="grid-20">
+    <h2>Skills list</h2>
+    <ul><li><a href="/auth/prefs/user_skills">Click here to check and change your skills list</a></li></ul>
+  </div>
+
   {% if g.theme.password_change_form %}
   <div class="grid-20">
     <h2>Change Password</h2>
diff --git a/Allura/allura/templates/user_skills.html b/Allura/allura/templates/user_skills.html
new file mode 100644
index 0000000..667ff70
--- /dev/null
+++ b/Allura/allura/templates/user_skills.html
@@ -0,0 +1,86 @@
+{% set hide_left_bar = True %}
+{% extends g.theme.master %}
+
+{% block title %}{{c.user.username}} / Skills{% endblock %}
+
+{% block header %}Skills manager for {{c.user.username}} {% endblock %}
+
+{% block content %}
+  <div class="grid-20">
+    {% if c.user.get_skills()|length > 0 %}
+      <h2>Your current skills list:</h2>
+      <table>
+        <thead>
+          <tr>
+            <th>Skill</th>
+            <th>Level</th>
+            <th>Comments</th>
+            <th>Actions</th>
+          </tr>
+        </thead>
+        <tbody>
+          {% for s in c.user.get_skills() %}
+              {{g.theme.remove_user_skill.display(skill=s)}}
+          {% endfor %}
+        </tbody>
+      </table>
+    {% else %}
+      <h2>At the moment, your skills list is empty!</h2>
+      <div class="grid-20">
+        You can set your skills so that other users will be able to know what you can do best. 
+        To do it, you just need to choose the options that best fit your skills in the section below. You 
+        can also specify your skill level and some additional free comments.
+      </div>
+    {% endif %}
+  </div>
+ 
+  <div class="grid-20">
+    <h2>Add a new skill</h2>
+
+    {% if selected_skill %}
+      <div class="grid-20" style="margin:0;">
+        <div class="grid-4">
+          You selected:
+        </div>
+        <div class="grid-12" style="margin-bottom:20px">      
+           <a href="user_skills">List of all skills</a>
+           {% for cat in parents %}
+             &gt; <a href="/auth/prefs/user_skills/{{cat.shortname}}">{{cat.fullname}}</a>
+           {% endfor %}
+           &gt; <b>{{selected_skill.fullname}}</b>
+           <input type="hidden" name="upper_category" value="{{selected_skill.trove_parent_id}}"/>
+        </div>
+      </div>
+    {% endif %}
+ 
+    {% if skills_list %}
+      {% if selected_skill %}
+        <h3>Select a subcategory of "{{selected_skill.fullname}}"</h3>
+      {% else %}
+        <h3>Select a category</h3>
+      {%endif%}
+      {{g.theme.select_subcategory_form.display(categories=skills_list)}}
+    {% endif %}
+    {% if selected_skill %}
+      <h3>Add "{{selected_skill.fullname}}" to you set of skills</h3>
+      {{g.theme.add_user_skill.display(selected_skill=selected_skill.trove_cat_id, 
+           action="/auth/prefs/user_skills/" + selected_skill.shortname + "/save_skill")}}
+    {% endif %}
+    <h3>Other possible actions</h3>
+    <div class="grid-20" style="margin-bottom:10px;"/>
+      <ul>
+        {%if tg.config.get('trovecategories.enableediting', 'false')=='true'%}
+          <li>
+            <a href="/categories/{{selected_skill.shortname}}">
+              Create a new category in this list
+            </a>
+            if you want to add a more specific kind of skill which is not included here.
+          </li>
+        {%endif%}
+        <li>
+          <a href="/auth/prefs">Go to you profile</a> to set the remaining personal preferences.
+        </li>
+      </ul>
+    </div>
+  </div>
+{% endblock %}
diff --git a/Allura/allura/templates/widgets/forge_form.html b/Allura/allura/templates/widgets/forge_form.html
index a997522..6be3d86 100644
--- a/Allura/allura/templates/widgets/forge_form.html
+++ b/Allura/allura/templates/widgets/forge_form.html
@@ -24,12 +24,14 @@
       {{field.display(**ctx)}}
     {% endif %}
   {% endfor %}
-  <label class="grid-4">&nbsp;</label>
-  <div class="grid-{{15 + extra_width}}">
-    {% for b in buttons %}
-      {{b.display()}}
-    {% endfor %}
-  </div>
+  {% if buttons %}
+    <label class="grid-4">&nbsp;</label>
+    <div class="grid-{{15 + extra_width}}">
+      {% for b in buttons %}
+        {{b.display()}}
+      {% endfor %}
+    </div>
+  {% endif %}
   {% if widget.antispam %}{% for fld in g.antispam.extra_fields() %}
   {{fld}}{% endfor %}{% endif %}
 </form>
diff --git a/Allura/allura/tests/functional/test_auth.py b/Allura/allura/tests/functional/test_auth.py
index 94d221e..1327fe6 100644
--- a/Allura/allura/tests/functional/test_auth.py
+++ b/Allura/allura/tests/functional/test_auth.py
@@ -374,3 +374,296 @@
         r = self.app.get('/p/test/admin/', extra_environ={'username':'test-admin'})
         assert_equal(r.status_int, 302)
         assert_equal(r.location, 'http://localhost/auth/?return_to=%2Fp%2Ftest%2Fadmin%2F')
+
+class TestPreferences(TestController):
+
+    @td.with_user_project('test-admin')
+    def test_personal_data(self):
+        from pytz import country_names
+        setsex, setbirthdate, setcountry, setcity, settimezone = \
+            ('Male', '19/08/1988', 'IT', 'Milan', 'Europe/Rome')
+        result = self.app.get('/auth/prefs')
+
+        #Check if personal data is properly set
+        r = self.app.post('/auth/prefs/change_personal_data', 
+             params=dict(
+                 sex=setsex,
+                 birthdate=setbirthdate,
+                 country=setcountry,
+                 city=setcity,
+                 timezone=settimezone))
+        user = M.User.query.get(username='test-admin')
+        sex = user.sex
+        assert sex == setsex
+        birthdate = user.birthdate.strftime('%d/%m/%Y')
+        assert birthdate == setbirthdate
+        country = user.localization.country
+        assert country_names.get(setcountry) == country
+        city = user.localization.city
+        assert city == setcity
+        timezone = user.timezone
+        assert timezone == settimezone
+        
+        #Check if setting a wrong date everything works correctly
+        r = self.app.post('/auth/prefs/change_personal_data', 
+             params=dict(birthdate='30/02/1998'))
+        assert 'Please enter a valid date' in str(r)
+        user = M.User.query.get(username='test-admin')
+        sex = user.sex
+        assert sex == setsex
+        birthdate = user.birthdate.strftime('%d/%m/%Y')
+        assert birthdate == setbirthdate
+        country = user.localization.country
+        assert country_names.get(setcountry) == country
+        city = user.localization.city
+        assert city == setcity
+        timezone = user.timezone
+        assert timezone == settimezone
+
+        #Check deleting birthdate
+        r = self.app.post('/auth/prefs/change_personal_data', 
+             params=dict(
+                 sex=setsex,
+                 birthdate='',
+                 country=setcountry,
+                 city=setcity,
+                 timezone=settimezone))
+        user = M.User.query.get(username='test-admin')
+        assert user.birthdate is None
+
+    @td.with_user_project('test-admin')
+    def test_contacts(self):
+        #Add skype account
+        testvalue = 'testaccount'
+        result = self.app.get('/auth/prefs')
+        r = self.app.post('/auth/prefs/skype_account', 
+             params=dict(skypeaccount=testvalue))
+        user = M.User.query.get(username='test-admin')
+        assert user.skypeaccount == testvalue
+
+        #Add social network account
+        socialnetwork = 'Facebook'
+        accounturl = 'http://www.facebook.com/test'
+        r = self.app.post('/auth/prefs/add_social_network', 
+             params=dict(socialnetwork=socialnetwork,
+                         accounturl = accounturl))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.socialnetworks) == 1 and \
+               user.socialnetworks[0].socialnetwork == socialnetwork and \
+               user.socialnetworks[0].accounturl == accounturl
+
+        #Add second social network account
+        socialnetwork2 = 'Twitter'
+        accounturl2 = 'http://www.twitter.com/test'
+        r = self.app.post('/auth/prefs/add_social_network', 
+             params=dict(socialnetwork=socialnetwork2,
+                         accounturl = accounturl2))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.socialnetworks) == 2 and \
+               ({'socialnetwork':socialnetwork, 'accounturl':accounturl} in user.socialnetworks and \
+                {'socialnetwork':socialnetwork2, 'accounturl':accounturl2} in user.socialnetworks)
+
+        #Remove first social network account
+        r = self.app.post('/auth/prefs/remove_social_network', 
+             params=dict(socialnetwork=socialnetwork,
+                         account = accounturl))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.socialnetworks) == 1 and \
+               {'socialnetwork':socialnetwork2, 'accounturl':accounturl2} in user.socialnetworks
+
+        #Add invalid social network account
+        r = self.app.post('/auth/prefs/add_social_network', 
+             params=dict(accounturl = accounturl, socialnetwork=''))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.socialnetworks) == 1 and \
+               {'socialnetwork':socialnetwork2, 'accounturl':accounturl2} in user.socialnetworks
+
+        #Add telephone number
+        telnumber = '+3902123456'
+        r = self.app.post('/auth/prefs/add_telnumber', 
+             params=dict(newnumber=telnumber))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.telnumbers) == 1 and (user.telnumbers[0] == telnumber))
+
+        #Add second telephone number
+        telnumber2 = '+3902654321'
+        r = self.app.post('/auth/prefs/add_telnumber', 
+             params=dict(newnumber=telnumber2))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.telnumbers) == 2 and telnumber in user.telnumbers and telnumber2 in user.telnumbers)
+
+        #Remove first telephone number
+        r = self.app.post('/auth/prefs/remove_telnumber', 
+             params=dict(oldvalue=telnumber))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.telnumbers) == 1 and telnumber2 in user.telnumbers)
+
+        #Add website
+        website = 'http://www.testurl.com'
+        r = self.app.post('/auth/prefs/add_webpage', 
+             params=dict(newwebsite=website))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.webpages) == 1 and (website in user.webpages))
+
+        #Add second website
+        website2 = 'http://www.testurl2.com'
+        r = self.app.post('/auth/prefs/add_webpage', 
+             params=dict(newwebsite=website2))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.webpages) == 2 and website in user.webpages and website2 in user.webpages)
+
+        #Remove first website
+        r = self.app.post('/auth/prefs/remove_webpage', 
+             params=dict(oldvalue=website))
+        user = M.User.query.get(username='test-admin')
+        assert (len(user.webpages) == 1 and website2 in user.webpages)
+
+    @td.with_user_project('test-admin')
+    def test_availability(self):
+        from datetime import time
+
+        #Add availability timeslot
+        weekday = 'Monday'
+        starttime = time(9,0,0)
+        endtime = time(12, 0, 0)
+
+        result = self.app.get('/auth/prefs')
+        r = self.app.post('/auth/prefs/add_timeslot', 
+             params=dict(
+                 weekday=weekday,
+                 starttime=starttime.strftime('%H:%M'),
+                 endtime=endtime.strftime('%H:%M')))
+        user = M.User.query.get(username='test-admin')
+        timeslot1dict = dict(week_day=weekday, start_time=starttime, end_time=endtime)
+        assert len(user.availability) == 1 and timeslot1dict in user.get_availability_timeslots()
+
+        weekday2 = 'Tuesday'
+        starttime2 = time(14,0,0)
+        endtime2 = time(16, 0, 0)
+
+        #Add second availability timeslot
+        r = self.app.post('/auth/prefs/add_timeslot', 
+             params=dict(
+                 weekday=weekday2,
+                 starttime=starttime2.strftime('%H:%M'),
+                 endtime=endtime2.strftime('%H:%M')))
+        user = M.User.query.get(username='test-admin')
+        timeslot2dict = dict(week_day=weekday2, start_time=starttime2, end_time=endtime2)
+        assert len(user.availability) == 2 and timeslot1dict in user.get_availability_timeslots() \
+               and timeslot2dict in user.get_availability_timeslots()
+
+        #Remove availability timeslot
+        r = self.app.post('/auth/prefs/remove_timeslot', 
+             params=dict(
+                 weekday=weekday,
+                 starttime=starttime.strftime('%H:%M'),
+                 endtime=endtime.strftime('%H:%M')))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.availability) == 1 and timeslot2dict in user.get_availability_timeslots()
+
+        #Add invalid availability timeslot
+        r = self.app.post('/auth/prefs/add_timeslot', 
+             params=dict(
+                 weekday=weekday2,
+                 starttime=endtime2.strftime('%H:%M'),
+                 endtime=starttime2.strftime('%H:%M')))
+        assert 'Invalid period:' in str(r)
+        user = M.User.query.get(username='test-admin')
+        timeslot2dict = dict(week_day=weekday2, start_time=starttime2, end_time=endtime2)
+        assert len(user.availability) == 1 and timeslot2dict in user.get_availability_timeslots()
+
+    @td.with_user_project('test-admin')
+    def test_inactivity(self):
+        from datetime import datetime
+
+        #Add inactivity period
+        startdate = datetime(2012, 12, 14)
+        enddate = datetime(2012, 12, 20)
+        result = self.app.get('/auth/prefs')
+        r = self.app.post('/auth/prefs/add_inactive_period', 
+             params=dict(
+                 startdate=startdate.strftime('%d/%m/%Y'),
+                 enddate=enddate.strftime('%d/%m/%Y')))
+        user = M.User.query.get(username='test-admin')
+        period1dict = dict(start_date=startdate, end_date=enddate)
+        assert len(user.inactiveperiod) == 1 and period1dict in user.get_inactive_periods()
+
+        #Add second inactivity period
+        startdate2 = datetime(2012, 12, 24)
+        enddate2 = datetime(2012, 12, 28)
+        r = self.app.post('/auth/prefs/add_inactive_period', 
+             params=dict(
+                 startdate=startdate2.strftime('%d/%m/%Y'),
+                 enddate=enddate2.strftime('%d/%m/%Y')))
+        user = M.User.query.get(username='test-admin')
+        period2dict = dict(start_date=startdate2, end_date=enddate2)
+        assert len(user.inactiveperiod) == 2 and period1dict in user.get_inactive_periods() \
+               and period2dict in user.get_inactive_periods()
+
+        #Remove first inactivity period
+        r = self.app.post('/auth/prefs/remove_inactive_period', 
+             params=dict(
+                 startdate=startdate.strftime('%d/%m/%Y'),
+                 enddate=enddate.strftime('%d/%m/%Y')))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.inactiveperiod) == 1 and period2dict in user.get_inactive_periods()
+
+        #Add invalid inactivity period
+        r = self.app.post('/auth/prefs/add_inactive_period', 
+             params=dict(
+                 startdate='NOT/A/DATE',
+                 enddate=enddate2.strftime('%d/%m/%Y')))
+        user = M.User.query.get(username='test-admin')
+        assert 'Please enter a valid date' in str(r)
+        assert len(user.inactiveperiod) == 1 and period2dict in user.get_inactive_periods()
+
+    @td.with_user_project('test-admin')
+    def test_skills(self):
+        from datetime import datetime
+
+        #Add a skill
+        skill_cat = M.TroveCategory.query.get(show_as_skill=True)
+        level = 'low'
+        comment = 'test comment'
+        result = self.app.get('/auth/prefs/user_skills')
+        r = self.app.post('/auth/prefs/user_skills/save_skill', 
+             params=dict(
+                 level=level,
+                 comment=comment,
+                 selected_skill=str(skill_cat.trove_cat_id)))
+        user = M.User.query.get(username='test-admin')
+        skilldict = dict(category_id=skill_cat._id, comment=comment, level=level)
+        assert len(user.skills) == 1 and skilldict in user.skills
+
+        #Add again the same skill
+        level = 'medium'
+        comment = 'test comment 2'
+        result = self.app.get('/auth/prefs/user_skills')
+        r = self.app.post('/auth/prefs/user_skills/save_skill', 
+             params=dict(
+                 level=level,
+                 comment=comment,
+                 selected_skill=str(skill_cat.trove_cat_id)))
+        user = M.User.query.get(username='test-admin')
+        skilldict = dict(category_id=skill_cat._id, comment=comment, level=level)
+        assert len(user.skills) == 1 and skilldict in user.skills
+
+        #Add an invalid skill
+        level2 = 'not a level'
+        comment2 = 'test comment 2'
+        r = self.app.post('/auth/prefs/user_skills/save_skill', 
+             params=dict(
+                 level=level2,
+                 comment=comment2,
+                 selected_skill=str(skill_cat.trove_cat_id)))
+        user = M.User.query.get(username='test-admin')
+        #Check that everything is as it was before
+        assert len(user.skills) == 1 and skilldict in user.skills
+
+        #Remove a skill
+        result = self.app.get('/auth/prefs/user_skills')
+        r = self.app.post('/auth/prefs/user_skills/remove_skill', 
+             params=dict(
+                 categoryid=str(skill_cat.trove_cat_id)))
+        user = M.User.query.get(username='test-admin')
+        assert len(user.skills) == 0
diff --git a/Allura/development.ini b/Allura/development.ini
index 4ba35d7..1a339e5 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -121,6 +121,8 @@
 
 scm.repos.root = /tmp
 
+trovecategories.enableediting = true
+
 # ActivityStream
 activitystream.master = mongodb://127.0.0.1:27017
 activitystream.database = activitystream
diff --git a/requirements-common.txt b/requirements-common.txt
index 1de1c26..3e846c5 100644
--- a/requirements-common.txt
+++ b/requirements-common.txt
@@ -1,5 +1,6 @@
 # requirements for all deployment environments
 
+pytz==2012d
 ActivityStream==0.1.4
 BeautifulSoup==3.2.0
 chardet==1.0.1