diff --git a/designateclient/v2/cli/quotas.py b/designateclient/v2/cli/quotas.py
new file mode 100644
index 0000000..a9e1e32
--- /dev/null
+++ b/designateclient/v2/cli/quotas.py
@@ -0,0 +1,133 @@
+# Copyright 2014 Hewlett-Packard Development Company, L.P.
+#
+# Author: Endre Karlson <endre.karlson@hp.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+import itertools
+import logging
+
+from cliff import command
+from cliff import show
+import six
+
+from designateclient.v2.cli import common
+
+LOG = logging.getLogger(__name__)
+
+
+DNS_QUOTAS = {
+    "api_export_size": "api-export-size",
+    "recordset_records": "recordset-records",
+    "zone_records": "zone-records",
+    "zone_recordsets": "zone-recordsets",
+    "zones": "zones"
+}
+
+
+class ListQuotasCommand(show.ShowOne):
+    """List quotas"""
+
+    # columns = ['resource', 'hard_limit']
+
+    def get_parser(self, prog_name):
+        parser = super(ListQuotasCommand, self).get_parser(prog_name)
+
+        common.add_all_common_options(parser)
+
+        parser.add_argument(
+            '--project-id',
+            help="Project ID Default: current project")
+
+        return parser
+
+    def take_action(self, parsed_args):
+        client = self.app.client_manager.dns
+        common.set_all_common_headers(client, parsed_args)
+
+        proj_id = parsed_args.project_id or client.session.get_project_id()
+
+        if parsed_args.project_id != client.session.get_project_id():
+            common.set_all_projects(client, True)
+
+        data = client.quotas.list(proj_id)
+        return six.moves.zip(*sorted(six.iteritems(data)))
+
+
+class SetQuotasCommand(show.ShowOne):
+    """Set blacklist properties"""
+
+    def _build_options_list(self):
+            return itertools.chain(DNS_QUOTAS.items())
+
+    def get_parser(self, prog_name):
+        parser = super(SetQuotasCommand, self).get_parser(prog_name)
+
+        common.add_all_common_options(parser)
+
+        parser.add_argument('--project-id', help="Project ID")
+        for k, v in self._build_options_list():
+            parser.add_argument(
+                '--%s' % v,
+                metavar='<%s>' % v,
+                dest=k,
+                type=int,
+                help='New value for the %s quota' % v,
+            )
+
+        return parser
+
+    def take_action(self, parsed_args):
+
+        client = self.app.client_manager.dns
+        common.set_all_common_headers(client, parsed_args)
+
+        quotas = {}
+        for k, v in DNS_QUOTAS.items():
+            value = getattr(parsed_args, k, None)
+            if value is not None:
+                quotas[k] = value
+
+        proj_id = parsed_args.project_id or client.session.get_project_id()
+
+        if parsed_args.project_id != client.session.get_project_id():
+            common.set_all_projects(client, True)
+
+        updated = client.quotas.update(proj_id, quotas)
+
+        return six.moves.zip(*sorted(six.iteritems(updated)))
+
+
+class ResetQuotasCommand(command.Command):
+    """Delete blacklist"""
+
+    def get_parser(self, prog_name):
+        parser = super(ResetQuotasCommand, self).get_parser(prog_name)
+
+        common.add_all_common_options(parser)
+
+        parser.add_argument('--project-id', help="Project ID")
+
+        return parser
+
+    def take_action(self, parsed_args):
+        client = self.app.client_manager.dns
+        common.set_all_common_headers(client, parsed_args)
+
+        proj_id = parsed_args.project_id or client.session.get_project_id()
+
+        if parsed_args.project_id != client.session.get_project_id():
+            common.set_all_projects(client, True)
+
+        client.quotas.reset(proj_id)
+
+        LOG.info('Quota for project %s was reset', parsed_args.project_id)
diff --git a/designateclient/v2/client.py b/designateclient/v2/client.py
index e7eba3b..4e9abbc 100644
--- a/designateclient/v2/client.py
+++ b/designateclient/v2/client.py
@@ -20,6 +20,7 @@ from designateclient.v2.blacklists import BlacklistController
 from designateclient.v2.limits import LimitController
 from designateclient.v2.nameservers import NameServerController
 from designateclient.v2.pools import PoolController
+from designateclient.v2.quotas import QuotasController
 from designateclient.v2.recordsets import RecordSetController
 from designateclient.v2.reverse import FloatingIPController
 from designateclient.v2.service_statuses import ServiceStatusesController
@@ -133,3 +134,4 @@ class Client(object):
         self.zone_exports = ZoneExportsController(self)
         self.zone_imports = ZoneImportsController(self)
         self.pools = PoolController(self)
+        self.quotas = QuotasController(self)
diff --git a/designateclient/v2/quotas.py b/designateclient/v2/quotas.py
new file mode 100644
index 0000000..6377a41
--- /dev/null
+++ b/designateclient/v2/quotas.py
@@ -0,0 +1,27 @@
+# Copyright 2015 Hewlett-Packard Development Company, L.P.
+#
+# Author: Endre Karlson <endre.karlson@hp.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from designateclient.v2.base import V2Controller
+
+
+class QuotasController(V2Controller):
+    def list(self, project_id):
+        return self._get('/quotas/%s' % project_id)
+
+    def update(self, project_id, values):
+        return self._patch('/quotas/%s' % project_id, data=values)
+
+    def reset(self, project_id):
+        return self._delete('/quotas/%s' % project_id)
diff --git a/releasenotes/notes/quota-commands-7ff037bddae95771.yaml b/releasenotes/notes/quota-commands-7ff037bddae95771.yaml
new file mode 100644
index 0000000..d640000
--- /dev/null
+++ b/releasenotes/notes/quota-commands-7ff037bddae95771.yaml
@@ -0,0 +1,8 @@
+---
+features:
+  - added openstack dns quota command +
+    list + set + reset sub commands
+
+    All sub commands can be scoped to a project using --project-id
+    If the --project-id does not match the current project id
+    it will set X-Auth-All-Projects:True
diff --git a/setup.cfg b/setup.cfg
index a81689a..64f097b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -143,6 +143,10 @@ openstack.dns.v2 =
     dns_service_list = designateclient.v2.cli.service_statuses:ListServiceStatusesCommand
     dns_service_show = designateclient.v2.cli.service_statuses:ShowServiceStatusCommand
 
+    dns_quota_list = designateclient.v2.cli.quotas:ListQuotasCommand
+    dns_quota_set = designateclient.v2.cli.quotas:SetQuotasCommand
+    dns_quota_reset = designateclient.v2.cli.quotas:ResetQuotasCommand
+
 [build_sphinx]
 all_files = 1
 build-dir = doc/build