diff --git a/novatools/shell.py b/novatools/shell.py
index 3da4f1fd7..c7231a610 100644
--- a/novatools/shell.py
+++ b/novatools/shell.py
@@ -483,40 +483,47 @@ class OpenStackShell(object):
         """Immediately shut down and delete a server."""
         self._find_server(args.server).delete()
 
-    @arg('zone', metavar='<zone name>', help='Name of the parent zone')
-    @arg('--name', dest='name', default=None, help='New name.')
-    @arg('--auth_url', dest='auth_url', help='New Auth URL.')
+    # --zone_username is required since --username is already used.
+    @arg('zone', metavar='<zone>', help='Name or ID of the zone')
+    @arg('--api_url', dest='api_url', default=None, help='New URL.')
+    @arg('--zone_username', dest='zone_username', default=None,
+                            help='New zone username.')
+    @arg('--password', dest='password', default=None, help='New password.')
     def do_zone(self, args):
         """Show or edit a zone."""
         zone = self.cs.zones.get(args.zone)
  
         # If we have some flags, update the zone
         zone_delta = {}
-        if args.name:
-            zone_delta['name'] = args.name
-        if args.auth_url:
-            zone_delta['auth_url'] = args.auth_url
-
+        if args.api_url:
+            zone_delta['api_url'] = args.api_url
+        if args.zone_username:
+            zone_delta['username'] = args.zone_username
+        if args.password:
+            zone_delta['password'] = args.password
         if zone_delta:
             zone.update(**zone_delta)
         else:
             print_dict(zone._info)
 
-    @arg('name', metavar='<name>', help='Name for the new child zone')
-    @arg('auth_url', metavar='<auth_url>', help="URL for the Zone's Auth API")
+    @arg('api_url', metavar='<api_url>', help="URL for the Zone's API")
+    @arg('zone_username', metavar='<zone_username>', 
+                          help='Authentication username.')
+    @arg('password', metavar='<password>', help='Authentication password.')
     def do_zone_add(self, args):
         """Add a new child zone."""
-        zone = self.cs.zones.create(args.name, args.auth_url)
+        zone = self.cs.zones.create(args.api_url, args.zone_username, 
+                                                  args.password)
         print_dict(zone._info)
 
-    @arg('zone', metavar='<zone name>', help='Name of the parent zone')
+    @arg('zone', metavar='<zone name>', help='Name or ID of the zone')
     def do_zone_delete(self, args):
         """Delete a zone."""
         self.cs.zones.delete(args.zone)
 
     def do_zone_list(self, args):
         """List the children of a zone."""
-        print_list(self.cs.zones.list(), ['ID', 'Name', 'Auth URL'])
+        print_list(self.cs.zones.list(), ['ID', 'API URL', 'Username'])
 
     def _find_server(self, server):
         """Get a server by name or ID."""
diff --git a/novatools/zones.py b/novatools/zones.py
index 1e0be0aa3..1a348dcbe 100644
--- a/novatools/zones.py
+++ b/novatools/zones.py
@@ -3,7 +3,7 @@ from novatools import base
 
 class Zone(base.Resource):
     def __repr__(self):
-        return "<Zone: %s>" % self.name
+        return "<Zone: %s>" % self.api_url
 
     def delete(self):
         """
@@ -11,14 +11,15 @@ class Zone(base.Resource):
         """
         self.manager.delete(self)
 
-    def update(self, name=None, auth_url=None):
+    def update(self, api_url=None, username=None, password=None):
         """
         Update the name for this child zone.
 
-        :param name: Update the child zone's name.
-        :param auth_url: Update the child zone's Auth URL.
+        :param api_url: Update the child zone's API URL.
+        :param username: Update the child zone's username.
+        :param password: Update the child zone's password.
         """
-        self.manager.update(self, name, auth_url)
+        self.manager.update(self, api_url, username, password)
 
 
 class ZoneManager(base.ManagerWithFind):
@@ -40,15 +41,18 @@ class ZoneManager(base.ManagerWithFind):
         """
         return self._list("/zones/detail", "zones")
 
-    def create(self, name, auth_url):
+    def create(self, api_url, username, password):
         """
         Create a new child zone.
 
-        :param name: Something to name the zone.
+        :param api_url: The child zone's API URL.
+        :param username: The child zone's username.
+        :param password: The child zone's password.
         """
         body = {"zone": {
-            "name": name,
-            "auth_url": auth_url,
+            "api_url": api_url,
+            "username": username,
+            "password": password,
         }}
 
         return self._create("/zones", body, "zone")
@@ -59,22 +63,24 @@ class ZoneManager(base.ManagerWithFind):
         """
         self._delete("/zones/%s" % base.getid(zone))
 
-    def update(self, zone, name=None, auth_url=None):
+    def update(self, zone, api_url=None, username=None, password=None):
         """
-        Update the name or the auth_url for a zone.
+        Update the name or the api_url for a zone.
 
         :param zone: The :class:`Zone` (or its ID) to update.
-        :param name: Update the zone's name.
-        :param auth_url: Update the Auth URL.
+        :param api_url: Update the API URL.
+        :param username: Update the username.
+        :param password: Update the password.
         """
 
-        if name is None and auth_url is None:
-            return
         body = {"zone": {}}
-        if name:
-            body["zone"]["name"] = name
-        if auth_url:
-            body["zone"]["auth_url"] = auth_url
+        if api_url:
+            body["zone"]["api_url"] = api_url
+        if username:
+            body["zone"]["username"] = username
+        if password:
+            body["zone"]["password"] = password
+
+        if not len(body["zone"]):
+            return
         self._update("/zones/%s" % base.getid(zone), body)
-
-
diff --git a/tests/fakeserver.py b/tests/fakeserver.py
index d364a605a..a61614796 100644
--- a/tests/fakeserver.py
+++ b/tests/fakeserver.py
@@ -374,15 +374,17 @@ class FakeClient(OpenStackClient):
     #
     def get_zones(self, **kw):
         return (200, {'zones': [
-            {'id': 1, 'name': 'zone1'},
-            {'id': 2, 'name': 'zone2'},
+            {'id': 1, 'api_url': 'http://foo.com', 'username': 'bob'},
+            {'id': 2, 'api_url': 'http://foo.com', 'username': 'alice'},
         ]})
 
 
     def get_zones_detail(self, **kw):
         return (200, {'zones': [
-            {'id': 1, 'name': 'zone1', 'auth_url': 'http://foo.com'},
-            {'id': 2, 'name': 'zone2', 'auth_url': 'http://foo.com'},
+            {'id': 1, 'api_url': 'http://foo.com', 'username': 'bob', 
+                                                   'password': 'qwerty'},
+            {'id': 2, 'api_url': 'http://foo.com', 'username': 'alice',
+                                                   'password': 'password'}
         ]})
 
     def get_zones_1(self, **kw):
@@ -396,17 +398,16 @@ class FakeClient(OpenStackClient):
     def post_zones(self, body, **kw):
         assert_equal(body.keys(), ['zone'])
         assert_has_keys(body['zone'],
-                        required=['name', 'auth_url'],
+                        required=['api_url', 'username', 'password'],
                         optional=[])
 
         return (202, self.get_zones_1()[1])
 
     def put_zones_1(self, body, **kw):
         assert_equal(body.keys(), ['zone'])
-        assert_has_keys(body['zone'], optional=['name', 'auth_url'])
+        assert_has_keys(body['zone'], optional=['api_url', 'username',
+                                                'password'])
         return (204, None)
 
     def delete_zones_1(self, **kw):
         return (202, None)
-
-
diff --git a/tests/test_shell.py b/tests/test_shell.py
index 07e16bf3a..4cf1274c8 100644
--- a/tests/test_shell.py
+++ b/tests/test_shell.py
@@ -303,17 +303,19 @@ def test_zone():
     shell('zone 1')
     assert_called('GET', '/zones/1')
 
-    shell('zone 1 --name zoneA --auth_url http://zzz')
+    shell('zone 1 --api_url=http://zzz --zone_username=frank --password=xxx')
     assert_called(
         'PUT', '/zones/1',
-        {'zone': {'name': 'zoneA', 'auth_url': 'http://zzz'}}
+        {'zone': {'api_url': 'http://zzz', 'username': 'frank',
+                  'password': 'xxx'}}
     )
 
 def test_zone_add():
-    shell('zone-add zone3 http://zzz')
+    shell('zone-add http://zzz frank xxx')
     assert_called(
         'POST', '/zones',
-        {'zone': {'name': 'zone3', 'auth_url': 'http://zzz'}}
+        {'zone': {'api_url': 'http://zzz', 'username': 'frank', 
+                  'password': 'xxx'}}
     )
 
 def test_zone_delete():
diff --git a/tests/test_zones.py b/tests/test_zones.py
index 7f3655761..753667ffd 100644
--- a/tests/test_zones.py
+++ b/tests/test_zones.py
@@ -18,14 +18,12 @@ def test_get_zone_details():
     os.assert_called('GET', '/zones/1')
     assert_isinstance(s, Zone)
     assert_equal(s.id, 1)
-    assert_equal(s.auth_url, 'http://foo.com')
+    assert_equal(s.api_url, 'http://foo.com')
 
 
 def test_create_zone():
-    s = os.zones.create(
-        name="My zone",
-        auth_url="http://foo.com"
-    )
+    s = os.zones.create(api_url="http://foo.com", username='bob',
+                        password='xxx')
     os.assert_called('POST', '/zones')
     assert_isinstance(s, Zone)
 
@@ -34,20 +32,21 @@ def test_update_zone():
     s = os.zones.get(1)
 
     # Update via instance
-    s.update(name='hi')
+    s.update(api_url='http://blah.com')
     os.assert_called('PUT', '/zones/1')
-    s.update(name='hi', auth_url='there')
+    s.update(api_url='http://blah.com', username='alice', password='xxx')
     os.assert_called('PUT', '/zones/1')
 
     # Silly, but not an error
     s.update()
 
     # Update via manager
-    os.zones.update(s, name='hi')
+    os.zones.update(s, api_url='http://blah.com')
     os.assert_called('PUT', '/zones/1')
-    os.zones.update(1, auth_url='there')
+    os.zones.update(1, api_url= 'http://blah.com')
     os.assert_called('PUT', '/zones/1')
-    os.zones.update(s, name='hi', auth_url='there')
+    os.zones.update(s, api_url='http://blah.com', username='fred',
+                       password='zip')
     os.assert_called('PUT', '/zones/1')
 
 
@@ -61,13 +60,13 @@ def test_delete_zone():
     os.assert_called('DELETE', '/zones/1')
 
 
-def test_find():
-    s = os.zones.find(name='zone2')
+def test_find_zone():
+    s = os.zones.find(password='qwerty')
     os.assert_called('GET', '/zones/detail')
-    assert_equal(s.name, 'zone2')
+    assert_equal(s.username, 'bob')
 
-    # Find with multiple results arbitraility returns the first item
-    s = os.zones.find(auth_url='http://foo.com')
-    sl = os.zones.findall(auth_url='http://foo.com')
+    # Find with multiple results returns the first item
+    s = os.zones.find(api_url='http://foo.com')
+    sl = os.zones.findall(api_url='http://foo.com')
     assert_equal(sl[0], s)
     assert_equal([s.id for s in sl], [1, 2])