diff --git a/openstackclient/api/object_store_v1.py b/openstackclient/api/object_store_v1.py
index ae03ab7dd2..b1c78d990a 100644
--- a/openstackclient/api/object_store_v1.py
+++ b/openstackclient/api/object_store_v1.py
@@ -15,6 +15,7 @@
 
 import io
 import os
+
 import six
 from six.moves import urllib
 
@@ -176,13 +177,24 @@ class APIv1(api.BaseAPI):
                 'x-container-object-count',
                 None,
             ),
-            'meta-owner': response.headers.get('x-container-meta-owner', None),
-            'bytes_used': response.headers.get('x-container-bytes-used', None),
-            'read_acl': response.headers.get('x-container-read', None),
-            'write_acl': response.headers.get('x-container-write', None),
-            'sync_to': response.headers.get('x-container-sync-to', None),
-            'sync_key': response.headers.get('x-container-sync-key', None),
+            'bytes_used': response.headers.get('x-container-bytes-used', None)
         }
+
+        if 'x-container-read' in response.headers:
+            data['read_acl'] = response.headers.get('x-container-read', None)
+        if 'x-container-write' in response.headers:
+            data['write_acl'] = response.headers.get('x-container-write', None)
+        if 'x-container-sync-to' in response.headers:
+            data['sync_to'] = response.headers.get('x-container-sync-to', None)
+        if 'x-container-sync-key' in response.headers:
+            data['sync_key'] = response.headers.get('x-container-sync-key',
+                                                    None)
+
+        properties = self._get_properties(response.headers,
+                                          'x-container-meta-')
+        if properties:
+            data['properties'] = properties
+
         return data
 
     def container_unset(
@@ -434,12 +446,12 @@ class APIv1(api.BaseAPI):
         response = self._request('HEAD', "%s/%s" %
                                  (urllib.parse.quote(container),
                                   urllib.parse.quote(object)))
+
         data = {
             'account': self._find_account_id(),
             'container': container,
             'object': object,
             'content-type': response.headers.get('content-type', None),
-            'meta-owner': response.headers.get('x-container-meta-owner', None),
         }
         if 'content-length' in response.headers:
             data['content-length'] = response.headers.get(
@@ -455,19 +467,10 @@ class APIv1(api.BaseAPI):
                 'x-object-manifest',
                 None,
             )
-        for key, value in six.iteritems(response.headers):
-            if key.startswith('x-object-meta-'):
-                data[key[len('x-object-meta-'):].lower()] = value
-            elif key not in (
-                    'content-type',
-                    'content-length',
-                    'last-modified',
-                    'etag',
-                    'date',
-                    'x-object-manifest',
-                    'x-container-meta-owner',
-            ):
-                data[key.lower()] = value
+
+        properties = self._get_properties(response.headers, 'x-object-meta-')
+        if properties:
+            data['properties'] = properties
 
         return data
 
@@ -495,12 +498,16 @@ class APIv1(api.BaseAPI):
         # catalog should be enough.
         response = self._request("HEAD", "")
         data = {}
-        for k, v in response.headers.iteritems():
-            data[k] = v
+
+        properties = self._get_properties(response.headers, 'x-account-meta-')
+        if properties:
+            data['properties'] = properties
+
         # Map containers, bytes and objects a bit nicer
-        data['Containers'] = data.pop('x-account-container-count', None)
-        data['Objects'] = data.pop('x-account-object-count', None)
-        data['Bytes'] = data.pop('x-account-bytes-used', None)
+        data['Containers'] = response.headers.get('x-account-container-count',
+                                                  None)
+        data['Objects'] = response.headers.get('x-account-object-count', None)
+        data['Bytes'] = response.headers.get('x-account-bytes-used', None)
         # Add in Account info too
         data['Account'] = self._find_account_id()
         return data
@@ -549,3 +556,12 @@ class APIv1(api.BaseAPI):
             header_name = header_tag % k
             headers[header_name] = v
         return headers
+
+    def _get_properties(self, headers, header_tag):
+        # Add in properties as a top level key, this is consistent with other
+        # OSC commands
+        properties = {}
+        for k, v in six.iteritems(headers):
+            if k.startswith(header_tag):
+                properties[k[len(header_tag):]] = v
+        return properties
diff --git a/openstackclient/object/v1/account.py b/openstackclient/object/v1/account.py
index 4ff890ce10..aa94ff5c2c 100644
--- a/openstackclient/object/v1/account.py
+++ b/openstackclient/object/v1/account.py
@@ -55,6 +55,8 @@ class ShowAccount(show.ShowOne):
     @utils.log_method(log)
     def take_action(self, parsed_args):
         data = self.app.client_manager.object_store.account_show()
+        if 'properties' in data:
+            data['properties'] = utils.format_dict(data.pop('properties'))
         return zip(*sorted(six.iteritems(data)))
 
 
diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py
index b8eb4c254e..8c8844e2b9 100644
--- a/openstackclient/object/v1/container.py
+++ b/openstackclient/object/v1/container.py
@@ -229,6 +229,8 @@ class ShowContainer(show.ShowOne):
         data = self.app.client_manager.object_store.container_show(
             container=parsed_args.container,
         )
+        if 'properties' in data:
+            data['properties'] = utils.format_dict(data.pop('properties'))
 
         return zip(*sorted(six.iteritems(data)))
 
diff --git a/openstackclient/object/v1/object.py b/openstackclient/object/v1/object.py
index a023e3a00c..4bd06124d6 100644
--- a/openstackclient/object/v1/object.py
+++ b/openstackclient/object/v1/object.py
@@ -284,6 +284,8 @@ class ShowObject(show.ShowOne):
             container=parsed_args.container,
             object=parsed_args.object,
         )
+        if 'properties' in data:
+            data['properties'] = utils.format_dict(data.pop('properties'))
 
         return zip(*sorted(six.iteritems(data)))
 
diff --git a/openstackclient/tests/api/test_object_store_v1.py b/openstackclient/tests/api/test_object_store_v1.py
index 323bb8e0b5..0f7c45599f 100644
--- a/openstackclient/tests/api/test_object_store_v1.py
+++ b/openstackclient/tests/api/test_object_store_v1.py
@@ -157,11 +157,6 @@ class TestContainer(TestObjectAPIv1):
             'container': 'qaz',
             'object_count': '1',
             'bytes_used': '577',
-            'meta-owner': FAKE_ACCOUNT,
-            'read_acl': None,
-            'write_acl': None,
-            'sync_to': None,
-            'sync_key': None,
         }
         self.requests_mock.register_uri(
             'HEAD',
@@ -323,10 +318,8 @@ class TestObject(TestObjectAPIv1):
             'content-type': 'text/alpha',
             'content-length': '577',
             'last-modified': '20130101',
-            'meta-owner': FAKE_ACCOUNT,
             'etag': 'qaz',
-            'wife': 'Wilma',
-            'x-tra-header': 'yabba-dabba-do',
+            'properties': {'wife': 'Wilma'},
         }
         self.requests_mock.register_uri(
             'HEAD',
diff --git a/openstackclient/tests/object/v1/test_container_all.py b/openstackclient/tests/object/v1/test_container_all.py
index 4477f2e03b..69fc0f3962 100644
--- a/openstackclient/tests/object/v1/test_container_all.py
+++ b/openstackclient/tests/object/v1/test_container_all.py
@@ -286,7 +286,6 @@ class TestContainerShow(TestContainerAll):
 
     def test_object_show_container(self):
         headers = {
-            'x-container-meta-owner': object_fakes.ACCOUNT_ID,
             'x-container-object-count': '42',
             'x-container-bytes-used': '123',
             'x-container-read': 'qaz',
@@ -316,7 +315,6 @@ class TestContainerShow(TestContainerAll):
             'account',
             'bytes_used',
             'container',
-            'meta-owner',
             'object_count',
             'read_acl',
             'sync_key',
@@ -328,7 +326,6 @@ class TestContainerShow(TestContainerAll):
             object_fakes.ACCOUNT_ID,
             '123',
             'ernie',
-            object_fakes.ACCOUNT_ID,
             '42',
             'qaz',
             'rfv',
diff --git a/openstackclient/tests/object/v1/test_object_all.py b/openstackclient/tests/object/v1/test_object_all.py
index 41fe6324cd..7a76ab76ad 100644
--- a/openstackclient/tests/object/v1/test_object_all.py
+++ b/openstackclient/tests/object/v1/test_object_all.py
@@ -160,7 +160,6 @@ class TestObjectShow(TestObjectAll):
             'content-type',
             'etag',
             'last-modified',
-            'meta-owner',
             'object',
             'x-object-manifest',
         )
@@ -172,7 +171,6 @@ class TestObjectShow(TestObjectAll):
             'text/plain',
             '4c4e39a763d58392724bccf76a58783a',
             'yesterday',
-            object_fakes.ACCOUNT_ID,
             object_fakes.object_name_1,
             'manifest',
         )