Index: package_branches/invirt-web/cherrypy/code/main.py
===================================================================
--- package_branches/invirt-web/cherrypy/code/main.py	(revision 2412)
+++ package_branches/invirt-web/cherrypy/code/main.py	(revision 2413)
@@ -66,13 +66,4 @@
         return d
     index=list
-
-    @cherrypy.expose
-    @cherrypy.tools.mako(filename="/info.mako")
-    def info(self, machine_id):
-        """Handler for info on a single VM."""
-        machine = validation.Validate(cherrypy.request.login, cherrypy.request.state, machine_id=machine_id).machine
-        d = infoDict(cherrypy.request.login, cherrypy.request.state, machine)
-        checkpoint.checkpoint('Got infodict')
-        return d
 
     @cherrypy.expose
@@ -159,4 +150,29 @@
         return {'request': cherrypy.request, 'kwargs': kwargs}
     helloworld._cp_config['tools.require_login.on'] = False
+
+    class MachineView(View):
+        # This is hairy. Fix when CherryPy 3.2 is out. (rename to
+        # _cp_dispatch, and parse the argument as a list instead of
+        # string
+
+        def __getattr__(self, name):
+            try:
+                machine_id = int(name)
+                cherrypy.request.params['machine_id'] = machine_id
+                return self
+            except ValueError:
+                return None
+
+        @cherrypy.expose
+        @cherrypy.tools.mako(filename="/info.mako")
+        def info(self, machine_id):
+            """Handler for info on a single VM."""
+            machine = validation.Validate(cherrypy.request.login, cherrypy.request.state, machine_id=machine_id).machine
+            d = infoDict(cherrypy.request.login, cherrypy.request.state, machine)
+            checkpoint.checkpoint('Got infodict')
+            return d
+        index = info
+
+    machine = MachineView()
 
 def pathSplit(path):
Index: package_branches/invirt-web/cherrypy/code/templates/info.mako
===================================================================
--- package_branches/invirt-web/cherrypy/code/templates/info.mako	(revision 2412)
+++ package_branches/invirt-web/cherrypy/code/templates/info.mako	(revision 2413)
@@ -22,5 +22,5 @@
   on Athena. <a href="https://xvm.scripts.mit.edu/wiki/SerialConsole">(more info)</a>
  % elif has_vnc:
-  <strong><a href="vnc?machine_id=${machine.machine_id}">Get Console</a></strong>
+  <strong><a href="machine/${machine.machine_id}/vnc">Get Console</a></strong>
  % else:
   VNC console not enabled; still booting?
Index: package_branches/invirt-web/cherrypy/code/templates/list.mako
===================================================================
--- package_branches/invirt-web/cherrypy/code/templates/list.mako	(revision 2412)
+++ package_branches/invirt-web/cherrypy/code/templates/list.mako	(revision 2413)
@@ -96,5 +96,5 @@
 	  </form>
 	</td>
-	<td><a href="info?machine_id=${machine.machine_id}">${machine.name}</a></td>
+	<td><a href="machine/${machine.machine_id}">${machine.name}</a></td>
 	<td>${machine.memory}M</td>
 	<td>${machine.owner}</td>
@@ -112,5 +112,5 @@
 	<td>\
 % if has_vnc[machine] == True:
-<a href="vnc?machine_id=${machine.machine_id}">Console</a>\
+<a href="machine/${machine.machine_id}/vnc">Console</a>\
 % elif has_vnc[machine] == 'ParaVM':
 ParaVM${self.fn.helppopup("ParaVM Console")}
Index: package_branches/invirt-web/cherrypy/code/templates/skeleton.mako
===================================================================
--- package_branches/invirt-web/cherrypy/code/templates/skeleton.mako	(revision 2412)
+++ package_branches/invirt-web/cherrypy/code/templates/skeleton.mako	(revision 2413)
@@ -6,4 +6,5 @@
 <html>
 <head><title>${self.title()} &mdash; XVM</title>
+  <base href="${cherrypy.request.base}" />
   <link href="static/favicon.ico" type="image/x-icon" rel="shortcut icon">
   <link rel="stylesheet" href="static/style.css" type="text/css" />
@@ -54,6 +55,6 @@
 <li><a href="list">List</a></li>
 % if machine:
-<li><a href="info?machine_id=${machine.machine_id}">Info</a></li>
-<li><a href="vnc?machine_id=${machine.machine_id}">Console</a></li>
+<li><a href="machine/${machine.machine_id}">Info</a></li>
+<li><a href="machine/${machine.machine_id}/vnc">Console</a></li>
 % endif
 <li><a href="help">Help</a></li>
