Index: trunk/web/templates/controls.py
===================================================================
--- trunk/web/templates/controls.py	(revision 227)
+++ trunk/web/templates/controls.py	(revision 228)
@@ -88,12 +88,12 @@
     remctl('web', 'unregister', machine.name)
 
-def createVm(user, name, memory, disk, is_hvm, cdrom):
+def createVm(owner, contact, name, memory, disk, is_hvm, cdrom):
     """Create a VM and put it in the database"""
     # put stuff in the table
     transaction = ctx.current.create_transaction()
     try:
-        validation.validMemory(user, memory)
-        validation.validDisk(user, disk  * 1. / 1024)
-        validation.validAddVm(user)
+        validation.validMemory(owner, memory)
+        validation.validDisk(owner, disk  * 1. / 1024)
+        validation.validAddVm(owner)
         res = meta.engine.execute('select nextval('
                                   '\'"machines_machine_id_seq"\')')
@@ -103,7 +103,7 @@
         machine.name = name
         machine.memory = memory
-        machine.owner = user.username
-        machine.administrator = user.username
-        machine.contact = user.email
+        machine.owner = owner
+        machine.administrator = owner
+        machine.contact = contact
         machine.uuid = uuidToString(randomUUID())
         machine.boot_off_cd = True
Index: trunk/web/templates/list.tmpl
===================================================================
--- trunk/web/templates/list.tmpl	(revision 227)
+++ trunk/web/templates/list.tmpl	(revision 228)
@@ -52,4 +52,9 @@
 	</tr>
 $errorRow('cdrom', $err)
+	<tr>
+	  <td>Owner</td>
+	  <td><input type="text" name="owner" value="$defaults.owner"/></td>
+	</tr>
+	$errorRow('owner', $err)
       </table>
       <input type="submit" class="button" value="Create it!"/>
@@ -89,5 +94,5 @@
 		   value="$machine.machine_id"/>
 <input type="submit" class="button" name="action" value="#slurp
-#if $machine.uptime then 'Shutdown' else 'Power on'
+#if $machine.uptime then 'Power off' else 'Power on'
 "/>
 	  </form>
@@ -101,5 +106,5 @@
 	<td>Name</td>
 	<td>Memory</td>
-	<td>owner</td>
+	<td>Owner</td>
 	<td>IP</td>
 	<td>Uptime</td>
Index: trunk/web/templates/main.py
===================================================================
--- trunk/web/templates/main.py	(revision 227)
+++ trunk/web/templates/main.py	(revision 228)
@@ -47,10 +47,4 @@
             '&amp;simple=true" target="_blank" ' + 
             'onclick="return helppopup(\'' + subj + '\')">(?)</a></span>')
-
-class User:
-    """User class (sort of useless, I admit)"""
-    def __init__(self, username, email):
-        self.username = username
-        self.email = email
 
 def makeErrorPre(old, addition):
@@ -134,4 +128,6 @@
                            "Name already exists.")
     
+    owner = validation.testOwner(user, fields.getfirst('owner'))
+
     memory = fields.getfirst('memory')
     memory = validation.validMemory(user, memory, on=True)
@@ -148,6 +144,6 @@
     if cdrom is not None and not CDROM.get(cdrom):
         raise CodeError("Invalid cdrom type '%s'" % cdrom)
-    return dict(user=user, name=name, memory=memory, disk=disk,
-                is_hvm=is_hvm, cdrom=cdrom)
+    return dict(contact=user, name=name, memory=memory, disk=disk,
+                owner=owner, is_hvm=is_hvm, cdrom=cdrom)
 
 def create(user, fields):
@@ -189,4 +185,5 @@
     defaults = Defaults(max_memory=max_memory,
                         max_disk=max_disk,
+                        owner=user,
                         cdrom='gutsy-i386')
     d = dict(user=user,
@@ -231,5 +228,5 @@
 
     data = {}
-    data["user"] = user.username
+    data["user"] = user
     data["machine"] = machine.name
     data["expires"] = time.time()+(5*60)
@@ -545,7 +542,7 @@
     if 'SSL_CLIENT_S_DN_Email' in os.environ:
         username = os.environ['SSL_CLIENT_S_DN_Email'].split("@")[0]
-        return User(username, os.environ['SSL_CLIENT_S_DN_Email'])
-    else:
-        return User('moo', 'nobody')
+        return username
+    else:
+        return 'moo'
 
 def main(operation, user, fields):    
Index: trunk/web/templates/skeleton.tmpl
===================================================================
--- trunk/web/templates/skeleton.tmpl	(revision 227)
+++ trunk/web/templates/skeleton.tmpl	(revision 228)
@@ -39,5 +39,5 @@
 
 #if not $varExists('simple') or not $simple
-<p>[You are logged in as $user.username.]</p>
+<p>[You are logged in as $user.]</p>
 
 <div class="navigation">
Index: trunk/web/templates/validation.py
===================================================================
--- trunk/web/templates/validation.py	(revision 227)
+++ trunk/web/templates/validation.py	(revision 228)
@@ -25,5 +25,5 @@
         owner = machine.owner
     else:
-        owner = user.username
+        owner = user
     return Machine.select_by(owner=owner)
 
@@ -69,12 +69,12 @@
 def haveAccess(user, machine):
     """Return whether a user has adminstrative access to a machine"""
-    if user.username == 'moo':
-        return True
-    if user.username in (machine.administrator, machine.owner):
-        return True
-    if getafsgroups.checkAfsGroup(user.username, machine.administrator, 
+    if user == 'moo':
+        return True
+    if user in (machine.administrator, machine.owner):
+        return True
+    if getafsgroups.checkAfsGroup(user, machine.administrator, 
                                   'athena.mit.edu'): #XXX Cell?
         return True
-    if getafsgroups.checkLockerOwner(user.username, machine.owner):
+    if getafsgroups.checkLockerOwner(user, machine.owner):
         return True
     return owns(user, machine)
@@ -82,7 +82,7 @@
 def owns(user, machine):
     """Return whether a user owns a machine"""
-    if user.username == 'moo':
-        return True
-    return getafsgroups.checkLockerOwner(user.username, machine.owner)
+    if user == 'moo':
+        return True
+    return getafsgroups.checkLockerOwner(user, machine.owner)
 
 def validMachineName(name):
@@ -154,17 +154,19 @@
     if admin in (None, machine.administrator):
         return None
-    if admin == user.username:
+    if admin == user:
         return admin
-    if getafsgroups.checkAfsGroup(user.username, admin, 'athena.mit.edu'):
+    if getafsgroups.checkAfsGroup(user, admin, 'athena.mit.edu'):
         return admin
-    if getafsgroups.checkAfsGroup(user.username, 'system:'+admin,
+    if getafsgroups.checkAfsGroup(user, 'system:'+admin,
                                   'athena.mit.edu'):
         return 'system:'+admin
     return admin
     
-def testOwner(user, owner, machine):
-    if owner in (None, machine.owner):
-        return None
-    value = getafsgroups.checkLockerOwner(user.username, owner, verbose=True)
+def testOwner(user, owner, machine=None):
+    if owner == user or machine is not None and owner == machine.owner:
+        return owner
+    if owner is None:
+        raise InvalidInput('owner', owner, "Owner must be specified")
+    value = getafsgroups.checkLockerOwner(user, owner, verbose=True)
     if not value:
         return owner
