Index: setup.py
===================================================================
--- setup.py	(revision 2152)
+++ setup.py	(working copy)
@@ -38,10 +38,10 @@
         "TurboJson >= 0.9.9", 
         "TurboCheetah >= 0.9.5",
         "TurboKid >= 0.9.9",
-        "Genshi >= 0.3.3",
-        "CherryPy >= 2.2.1,<3.0.0alpha",
+        "Genshi >= 0.3.5",
+        "CherryPy >= 3.0.0rc1",
         "SQLObject >= 0.7.1,<=0.7.99",
-        "simplejson >= 1.3",
+        "simplejson >= 1.4",
         "elementtree >= 1.2.6", 
         "PasteScript >= 1.0",
         "cElementTree >= 1.0.5", 
@@ -49,7 +49,7 @@
         "setuptools >= 0.6c3",
         "RuleDispatch", 
         "ConfigObj >= 4.3.2", 
-        "nose >= 0.9"],
+        "nose >= 0.9.1"],
     packages=find_packages(),
     include_package_data=True,
     exclude_package_data={"thirdparty" : ["*"]},
Index: toolbox-start.py
===================================================================
--- toolbox-start.py	(revision 2152)
+++ toolbox-start.py	(working copy)
@@ -9,7 +9,8 @@
 from turbogears import toolbox
 
 root = toolbox.Toolbox()
-cherrypy.root = root
+#cherrypy.root = root
+cherrypy.tree.mount(root)
 print "Toolbox Development Mode"
 cherrypy.config.update({"global" : {
     "server.socketPort" : 7654,
@@ -20,4 +21,6 @@
     "logDebugInfoFilter.on" : False
     }})
 
-cherrypy.server.start()
+#cherrypy.server.start()
+cherrypy.server.quickstart()
+cherrypy.engine.start()
Index: turbogears/command/base.py
===================================================================
--- turbogears/command/base.py	(revision 2152)
+++ turbogears/command/base.py	(working copy)
@@ -112,9 +112,13 @@
             }})
 
         if not self.noopen:
-            cherrypy.server.start_with_callback(self.openbrowser)
+            #cherrypy.server.start_with_callback(self.openbrowser)
+            cherrypy.server.quickstart(server=None); 
+            cherrypy.engine.start_with_callback(self.openbrowser)
         else:
-            cherrypy.server.start()
+            #cherrypy.server.start()
+            cherrypy.server.quickstart()
+            cherrypy.engine.start()            
 
 
 commands = None
Index: turbogears/config.py
===================================================================
--- turbogears/config.py	(revision 2152)
+++ turbogears/config.py	(working copy)
@@ -150,8 +150,6 @@
 
 def config_defaults():    
     current_dir_uri = os.path.abspath(os.getcwd())
-    if not current_dir_uri.startswith("/"):
-        current_dir_uri = "/" + current_dir_uri
     defaults = {'current_dir_uri' : current_dir_uri}
     return defaults
 
@@ -207,9 +205,11 @@
     configure_loggers(configdict)
     config.update(configdict)
 
-def get(key, default_value=None, return_section=False, path = None):
+#def get(key, default_value=None, return_section=False, path = None):
+def get(key, default_value=None):
     """Retrieves a config value"""
-    value = config.get(key, default_value, return_section, path)
+    #value = config.get(key, default_value, return_section, path)
+    value = config.get(key, default_value)
     if value and key == 'sqlobject.dburi' and os.name == "nt":
         value = re.sub('///(\w):', '///\\1|', value)
     return value
Index: turbogears/controllers.py
===================================================================
--- turbogears/controllers.py	(revision 2152)
+++ turbogears/controllers.py	(working copy)
@@ -18,10 +18,10 @@
 
 unicodechars = re.compile(r"([^\x00-\x7F])")
 
-if config.get("session_filter.on",None) == True:
-    if config.get("session_filter.storage_type",None) == "PostgreSQL":
+if config.get("tools.sessions.on",None) == True:
+    if config.get("tools.sessions.storage_type",None) == "PostgreSQL":
         import psycopg2 
-        config.update({'session_filter.get_db':psycopg2.connect(psycopg2.get('sessions.postgres.dsn'))})
+        config.update({'tools.sessions.get_db':psycopg2.connect(psycopg2.get('sessions.postgres.dsn'))})
     # support for mysql/sqlite/etc here
 
 def _process_output(output, template, format, content_type, mapping, fragment=False):
@@ -342,13 +342,13 @@
 
 def flash(message):
     """Set a message to be displayed in the browser on next page display."""
-    cherrypy.response.simple_cookie['tg_flash'] = tg_util.to_utf8(message)
-    cherrypy.response.simple_cookie['tg_flash']['path'] = '/'
+    cherrypy.response.cookie['tg_flash'] = tg_util.to_utf8(message)
+    cherrypy.response.cookie['tg_flash']['path'] = '/'
 
 def _get_flash():
     """Retrieve the flash message (if one is set), clearing the message."""
-    request_cookie = cherrypy.request.simple_cookie
-    response_cookie = cherrypy.response.simple_cookie
+    request_cookie = cherrypy.request.cookie
+    response_cookie = cherrypy.response.cookie
 
     def clearcookie():
         response_cookie["tg_flash"] = ""
Index: turbogears/database.py
===================================================================
--- turbogears/database.py	(revision 2152)
+++ turbogears/database.py	(working copy)
@@ -7,7 +7,7 @@
 from sqlobject.dbconnection import ConnectionHub, Transaction, TheURIOpener
 
 import cherrypy
-from cherrypy.filters.basefilter import BaseFilter
+#from cherrypy.filters.basefilter import BaseFilter
 
 import dispatch
 from turbogears import config, errorhandling
@@ -329,7 +329,8 @@
         so_joins(sqlclass.__base__, joins)
     return joins
 
-class EndTransactionsFilter(BaseFilter):
+#class EndTransactionsFilter(BaseFilter):
+class EndTransactionsFilter(object):
     def on_end_resource(self):
         if _use_sa():
             session.clear()
Index: turbogears/startup.py
===================================================================
--- turbogears/startup.py	(revision 2152)
+++ turbogears/startup.py	(working copy)
@@ -10,12 +10,12 @@
 
 import pkg_resources
 import cherrypy
-from cherrypy import _cputil
+#from cherrypy import _cputil
 from formencode.variabledecode import NestedVariables
-from cherrypy._cpwsgi import wsgiApp, CPHTTPRequest
-from cherrypy._cpwsgiserver import CherryPyWSGIServer
+#from cherrypy._cpwsgi import wsgiApp, CPHTTPRequest
+#from cherrypy._cpwsgiserver import CherryPyWSGIServer
 
-from turbogears import config, scheduler
+from turbogears import config, scheduler, util
 from turbogears.view import loadBaseTemplates
 from turbogears.database import hub_registry, EndTransactionsFilter
 
@@ -72,7 +72,7 @@
                 sys.exit(3) # force reload
         time.sleep(freq)
 
-cherrypy.lib.autoreload.reloader_thread = reloader_thread
+#cherrypy.lib.autoreload.reloader_thread = reloader_thread
 
 webpath = ""
 
@@ -147,30 +147,48 @@
     This adds the "tg_js" configuration to make MochiKit accessible.
     It also turns on stdlib logging when in development mode.
     """
-    config.update({"/tg_static" :
+    """config.update({"/tg_static" :
             {
             "static_filter.on" : True,
             "static_filter.dir" :
                 os.path.abspath(pkg_resources.resource_filename(__name__, "static")),
             'log_debug_info_filter.on' : False,
+            }"""
+    config.update({"/tg_static" :
+            {
+            "tools.staticdir.on" : True,
+            "tools.staticdir" :
+                os.path.abspath(pkg_resources.resource_filename(__name__, "static")),
             }
         })
-    config.update({"/tg_js" :
+    """config.update({"/tg_js" :
             {
             "static_filter.on" : True,
             "static_filter.dir" :
                 os.path.abspath(pkg_resources.resource_filename(__name__, "static/js")),
             'log_debug_info_filter.on' : False,
-            }
+            }"""
+    config.update({"/tg_js" :
+            {
+            "tools.staticdir.on" : True,
+            "tools.staticdir" :
+                os.path.abspath(pkg_resources.resource_filename(__name__, "static")),
+            }    
         })
-    cherrypy.config.environments['development']['log_debug_info_filter.on'] = False
+    #cherrypy.config.environments['development']['log_debug_info_filter.on'] = False
     
-    if config.get("decoding_filter.on", path="/") is None:
+    """if config.get("decoding_filter.on", path="/") is None:
         config.update({"/": {
             "decoding_filter.on" : True,
             "decoding_filter.encoding" : config.get(
                                         "kid.encoding", "utf8")
-        }})
+        }})"""
+    if config.get("tools.decode.on") is None:
+            config.update({"/": {
+                "tools.decode.on" : True,
+                "tools.decode.encoding" : config.get(
+                                            "kid.encoding", "utf8")
+            }})
 
     loadBaseTemplates()
     global webpath
@@ -221,6 +239,7 @@
         ext= entrypoint.load()
         if hasattr(ext, "start_extension"):
             ext.start_extension()
+            #pass
     
     for item in call_on_startup:
         item()
@@ -253,7 +272,7 @@
         scheduler._stop_scheduler()
         log.info("Scheduler stopped")
         
-old_object_trail = _cputil.get_object_trail
+"""old_object_trail = _cputil.get_object_trail
 
 # hang on to object trail to use it to find an app root if need be
 def get_object_trail(object_path=None):
@@ -264,10 +283,10 @@
         pass
     return trail
 
-_cputil.get_object_trail = get_object_trail
+_cputil.get_object_trail = get_object_trail"""
 
-class SimpleWSGIServer(CherryPyWSGIServer):
-    """A WSGI server that accepts a WSGI application as a parameter."""
+"""class SimpleWSGIServer(CherryPyWSGIServer):
+    ""A WSGI server that accepts a WSGI application as a parameter.""
     RequestHandlerClass = CPHTTPRequest
     
     def __init__(self):
@@ -288,19 +307,25 @@
                                     request_queue_size = conf(
                                         "server.socket_queue_size"),
                                     )
-
+"""
 def start_server(root):
-    cherrypy.root = root
+    """cherrypy.root = root
     if config.get("tg.fancy_exception", False):
         cherrypy.server.start(server=SimpleWSGIServer())
     else:
-        cherrypy.server.start()
+        cherrypy.server.start()"""
+    cfg = util.load_project_config()
+    cherrypy.tree.mount(root, config=cfg)
+    #cherrypy.tree.mount(root)
+    cherrypy.server.quickstart()
+    cherrypy.engine.start()
+    
 
-if startTurboGears not in cherrypy.server.on_start_server_list:
-    cherrypy.server.on_start_server_list.append(startTurboGears)
+if startTurboGears not in cherrypy.engine.on_start_engine_list:
+    cherrypy.engine.on_start_engine_list.append(startTurboGears)
 
-if stopTurboGears not in cherrypy.server.on_stop_server_list:
-    cherrypy.server.on_stop_server_list.append(stopTurboGears)
+if stopTurboGears not in cherrypy.engine.on_stop_engine_list:
+    cherrypy.engine.on_stop_engine_list.append(stopTurboGears)
 
 call_on_startup = []
 call_on_shutdown = []
Index: turbogears/toolbox/admi18n/__init__.py
===================================================================
--- turbogears/toolbox/admi18n/__init__.py	(revision 2152)
+++ turbogears/toolbox/admi18n/__init__.py	(working copy)
@@ -8,7 +8,8 @@
 from turbogears import controllers
 
 import cherrypy
-from cherrypy.lib.cptools import serveFile
+#from cherrypy.lib.cptools import serveFile
+from cherrypy.lib.static import serve_file
 
 import pygettext
 import msgfmt
@@ -283,7 +284,8 @@
 
         if 'If-Modified-Since' in cherrypy.request.headers:
             del cherrypy.request.headers['If-Modified-Since'] # see ticket #879
-        return serveFile(path,"application/x-download","attachment")
+        #return serveFile(path,"application/x-download","attachment")
+        return serve_file(path,"application/x-download","attachment")
     lang_file = turbogears.expose()(lang_file)
 
     def string_collection(self,files=[]):
Index: turbogears/toolbox/base.py
===================================================================
--- turbogears/toolbox/base.py	(revision 2152)
+++ turbogears/toolbox/base.py	(working copy)
@@ -74,5 +74,5 @@
                     <pre>
                         tg-admin toolbox -c %s
                     </pre>
-             """% (cherrypy.request.remoteAddr,cherrypy.request.remoteAddr)
+             """% (cherrypy.request.remote.ip,cherrypy.request.remote.ip)
     noaccess = turbogears.expose()(noaccess)
Index: turbogears/visit/api.py
===================================================================
--- turbogears/visit/api.py	(revision 2152)
+++ turbogears/visit/api.py	(working copy)
@@ -6,7 +6,7 @@
 
 import cherrypy
 import pkg_resources
-from cherrypy.filters.basefilter import BaseFilter
+#from cherrypy.filters.basefilter import BaseFilter
 
 import turbogears
 
@@ -67,9 +67,9 @@
     # Temporary until tg-admin can call create_extension_model
     create_extension_model()
     # Install Filter into the root filter chain
-    if not hasattr(cherrypy.root, "_cp_filters"):
+    """if not hasattr(cherrypy.root, "_cp_filters"):
         cherrypy.root._cp_filters= []
-    cherrypy.root._cp_filters.append( filter )
+    cherrypy.root._cp_filters.append( filter )"""
 
 
 def shutdown_extension():
@@ -104,7 +104,8 @@
         self.is_new= is_new
 
 
-class VisitFilter(BaseFilter):
+#class VisitFilter(BaseFilter):
+class VisitFilter(object):
     '''
     A filter that automatically tracks visitors.
     '''

