diff --git a/doc/source/api/autoindex.rst b/doc/source/api/autoindex.rst
new file mode 100644
index 0000000..ecc5e8d
--- /dev/null
+++ b/doc/source/api/autoindex.rst
@@ -0,0 +1,48 @@
+.. toctree::
+   :maxdepth: 1
+
+   watcherclient.client.rst
+   watcherclient.common.apiclient.base.rst
+   watcherclient.common.apiclient.exceptions.rst
+   watcherclient.common.base.rst
+   watcherclient.common.cliutils.rst
+   watcherclient.common.http.rst
+   watcherclient.common.i18n.rst
+   watcherclient.common.utils.rst
+   watcherclient.exceptions.rst
+   watcherclient.shell.rst
+   watcherclient.tests.keystone_client_fixtures.rst
+   watcherclient.tests.test_client.rst
+   watcherclient.tests.test_http.rst
+   watcherclient.tests.test_import.rst
+   watcherclient.tests.test_shell.rst
+   watcherclient.tests.test_utils.rst
+   watcherclient.tests.utils.rst
+   watcherclient.tests.v1.test_action.rst
+   watcherclient.tests.v1.test_action_plan.rst
+   watcherclient.tests.v1.test_action_plan_shell.rst
+   watcherclient.tests.v1.test_action_shell.rst
+   watcherclient.tests.v1.test_audit.rst
+   watcherclient.tests.v1.test_audit_shell.rst
+   watcherclient.tests.v1.test_audit_template.rst
+   watcherclient.tests.v1.test_audit_template_shell.rst
+   watcherclient.tests.v1.test_goal.rst
+   watcherclient.tests.v1.test_goal_shell.rst
+   watcherclient.tests.v1.test_metric_collector.rst
+   watcherclient.tests.v1.test_metric_collector_shell.rst
+   watcherclient.v1.action.rst
+   watcherclient.v1.action_plan.rst
+   watcherclient.v1.action_plan_shell.rst
+   watcherclient.v1.action_shell.rst
+   watcherclient.v1.audit.rst
+   watcherclient.v1.audit_shell.rst
+   watcherclient.v1.audit_template.rst
+   watcherclient.v1.audit_template_shell.rst
+   watcherclient.v1.client.rst
+   watcherclient.v1.goal.rst
+   watcherclient.v1.goal_shell.rst
+   watcherclient.v1.metric_collector.rst
+   watcherclient.v1.metric_collector_shell.rst
+   watcherclient.v1.resource_fields.rst
+   watcherclient.v1.shell.rst
+   watcherclient.version.rst
diff --git a/doc/source/api/watcherclient.client.rst b/doc/source/api/watcherclient.client.rst
new file mode 100644
index 0000000..9e2dfca
--- /dev/null
+++ b/doc/source/api/watcherclient.client.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.client` Module
+======================================
+
+.. automodule:: watcherclient.client
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.apiclient.auth.rst b/doc/source/api/watcherclient.common.apiclient.auth.rst
new file mode 100644
index 0000000..b9b5255
--- /dev/null
+++ b/doc/source/api/watcherclient.common.apiclient.auth.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.apiclient.auth` Module
+=====================================================
+
+.. automodule:: watcherclient.common.apiclient.auth
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.apiclient.base.rst b/doc/source/api/watcherclient.common.apiclient.base.rst
new file mode 100644
index 0000000..78bd7ef
--- /dev/null
+++ b/doc/source/api/watcherclient.common.apiclient.base.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.apiclient.base` Module
+=====================================================
+
+.. automodule:: watcherclient.common.apiclient.base
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.apiclient.client.rst b/doc/source/api/watcherclient.common.apiclient.client.rst
new file mode 100644
index 0000000..021e198
--- /dev/null
+++ b/doc/source/api/watcherclient.common.apiclient.client.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.apiclient.client` Module
+=======================================================
+
+.. automodule:: watcherclient.common.apiclient.client
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.apiclient.exceptions.rst b/doc/source/api/watcherclient.common.apiclient.exceptions.rst
new file mode 100644
index 0000000..b8118e7
--- /dev/null
+++ b/doc/source/api/watcherclient.common.apiclient.exceptions.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.apiclient.exceptions` Module
+===========================================================
+
+.. automodule:: watcherclient.common.apiclient.exceptions
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.apiclient.utils.rst b/doc/source/api/watcherclient.common.apiclient.utils.rst
new file mode 100644
index 0000000..1c2be79
--- /dev/null
+++ b/doc/source/api/watcherclient.common.apiclient.utils.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.apiclient.utils` Module
+======================================================
+
+.. automodule:: watcherclient.common.apiclient.utils
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.base.rst b/doc/source/api/watcherclient.common.base.rst
new file mode 100644
index 0000000..65b2520
--- /dev/null
+++ b/doc/source/api/watcherclient.common.base.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.base` Module
+===========================================
+
+.. automodule:: watcherclient.common.base
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.cliutils.rst b/doc/source/api/watcherclient.common.cliutils.rst
new file mode 100644
index 0000000..0fc9362
--- /dev/null
+++ b/doc/source/api/watcherclient.common.cliutils.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.cliutils` Module
+===============================================
+
+.. automodule:: watcherclient.common.cliutils
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.http.rst b/doc/source/api/watcherclient.common.http.rst
new file mode 100644
index 0000000..42a010f
--- /dev/null
+++ b/doc/source/api/watcherclient.common.http.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.http` Module
+===========================================
+
+.. automodule:: watcherclient.common.http
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.i18n.rst b/doc/source/api/watcherclient.common.i18n.rst
new file mode 100644
index 0000000..2aa1054
--- /dev/null
+++ b/doc/source/api/watcherclient.common.i18n.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.i18n` Module
+===========================================
+
+.. automodule:: watcherclient.common.i18n
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.common.utils.rst b/doc/source/api/watcherclient.common.utils.rst
new file mode 100644
index 0000000..94550c9
--- /dev/null
+++ b/doc/source/api/watcherclient.common.utils.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.common.utils` Module
+============================================
+
+.. automodule:: watcherclient.common.utils
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.exceptions.rst b/doc/source/api/watcherclient.exceptions.rst
new file mode 100644
index 0000000..024f942
--- /dev/null
+++ b/doc/source/api/watcherclient.exceptions.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.exceptions` Module
+==========================================
+
+.. automodule:: watcherclient.exceptions
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.shell.rst b/doc/source/api/watcherclient.shell.rst
new file mode 100644
index 0000000..ef9d8c6
--- /dev/null
+++ b/doc/source/api/watcherclient.shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.shell` Module
+=====================================
+
+.. automodule:: watcherclient.shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst b/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst
new file mode 100644
index 0000000..1462ffd
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.keystone_client_fixtures` Module
+==============================================================
+
+.. automodule:: watcherclient.tests.keystone_client_fixtures
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.test_client.rst b/doc/source/api/watcherclient.tests.test_client.rst
new file mode 100644
index 0000000..571967b
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.test_client.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.test_client` Module
+=================================================
+
+.. automodule:: watcherclient.tests.test_client
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.test_http.rst b/doc/source/api/watcherclient.tests.test_http.rst
new file mode 100644
index 0000000..1afd0d4
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.test_http.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.test_http` Module
+===============================================
+
+.. automodule:: watcherclient.tests.test_http
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.test_import.rst b/doc/source/api/watcherclient.tests.test_import.rst
new file mode 100644
index 0000000..52e901c
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.test_import.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.test_import` Module
+=================================================
+
+.. automodule:: watcherclient.tests.test_import
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.test_shell.rst b/doc/source/api/watcherclient.tests.test_shell.rst
new file mode 100644
index 0000000..fbb5caa
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.test_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.test_shell` Module
+================================================
+
+.. automodule:: watcherclient.tests.test_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.test_utils.rst b/doc/source/api/watcherclient.tests.test_utils.rst
new file mode 100644
index 0000000..9126aa1
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.test_utils.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.test_utils` Module
+================================================
+
+.. automodule:: watcherclient.tests.test_utils
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.utils.rst b/doc/source/api/watcherclient.tests.utils.rst
new file mode 100644
index 0000000..6fcb3d8
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.utils.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.utils` Module
+===========================================
+
+.. automodule:: watcherclient.tests.utils
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_action.rst b/doc/source/api/watcherclient.tests.v1.test_action.rst
new file mode 100644
index 0000000..c8a6fca
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_action.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_action` Module
+====================================================
+
+.. automodule:: watcherclient.tests.v1.test_action
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_action_plan.rst b/doc/source/api/watcherclient.tests.v1.test_action_plan.rst
new file mode 100644
index 0000000..530c3ee
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_action_plan.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_action_plan` Module
+=========================================================
+
+.. automodule:: watcherclient.tests.v1.test_action_plan
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst b/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst
new file mode 100644
index 0000000..c443c5b
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_action_plan_shell` Module
+===============================================================
+
+.. automodule:: watcherclient.tests.v1.test_action_plan_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_action_shell.rst b/doc/source/api/watcherclient.tests.v1.test_action_shell.rst
new file mode 100644
index 0000000..b17fa43
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_action_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_action_shell` Module
+==========================================================
+
+.. automodule:: watcherclient.tests.v1.test_action_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_audit.rst b/doc/source/api/watcherclient.tests.v1.test_audit.rst
new file mode 100644
index 0000000..bf95718
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_audit.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_audit` Module
+===================================================
+
+.. automodule:: watcherclient.tests.v1.test_audit
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst b/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst
new file mode 100644
index 0000000..76ec7c1
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_audit_shell` Module
+=========================================================
+
+.. automodule:: watcherclient.tests.v1.test_audit_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_template.rst b/doc/source/api/watcherclient.tests.v1.test_audit_template.rst
new file mode 100644
index 0000000..72e4e79
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_audit_template.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_audit_template` Module
+============================================================
+
+.. automodule:: watcherclient.tests.v1.test_audit_template
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst b/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst
new file mode 100644
index 0000000..b69051a
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_audit_template_shell` Module
+==================================================================
+
+.. automodule:: watcherclient.tests.v1.test_audit_template_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_goal.rst b/doc/source/api/watcherclient.tests.v1.test_goal.rst
new file mode 100644
index 0000000..1cc12d8
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_goal.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_goal` Module
+==================================================
+
+.. automodule:: watcherclient.tests.v1.test_goal
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst b/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst
new file mode 100644
index 0000000..8cdc8d8
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_goal_shell` Module
+========================================================
+
+.. automodule:: watcherclient.tests.v1.test_goal_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst b/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst
new file mode 100644
index 0000000..01e5ab2
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_metric_collector` Module
+==============================================================
+
+.. automodule:: watcherclient.tests.v1.test_metric_collector
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst b/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst
new file mode 100644
index 0000000..113fa8c
--- /dev/null
+++ b/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.tests.v1.test_metric_collector_shell` Module
+====================================================================
+
+.. automodule:: watcherclient.tests.v1.test_metric_collector_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.action.rst b/doc/source/api/watcherclient.v1.action.rst
new file mode 100644
index 0000000..fbae324
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.action.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.action` Module
+=========================================
+
+.. automodule:: watcherclient.v1.action
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.action_plan.rst b/doc/source/api/watcherclient.v1.action_plan.rst
new file mode 100644
index 0000000..928d0e3
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.action_plan.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.action_plan` Module
+==============================================
+
+.. automodule:: watcherclient.v1.action_plan
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.action_plan_shell.rst b/doc/source/api/watcherclient.v1.action_plan_shell.rst
new file mode 100644
index 0000000..194ca8b
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.action_plan_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.action_plan_shell` Module
+====================================================
+
+.. automodule:: watcherclient.v1.action_plan_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.action_shell.rst b/doc/source/api/watcherclient.v1.action_shell.rst
new file mode 100644
index 0000000..7d8e005
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.action_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.action_shell` Module
+===============================================
+
+.. automodule:: watcherclient.v1.action_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.audit.rst b/doc/source/api/watcherclient.v1.audit.rst
new file mode 100644
index 0000000..8cff998
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.audit.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.audit` Module
+========================================
+
+.. automodule:: watcherclient.v1.audit
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.audit_shell.rst b/doc/source/api/watcherclient.v1.audit_shell.rst
new file mode 100644
index 0000000..a2e6bf0
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.audit_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.audit_shell` Module
+==============================================
+
+.. automodule:: watcherclient.v1.audit_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.audit_template.rst b/doc/source/api/watcherclient.v1.audit_template.rst
new file mode 100644
index 0000000..5069267
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.audit_template.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.audit_template` Module
+=================================================
+
+.. automodule:: watcherclient.v1.audit_template
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.audit_template_shell.rst b/doc/source/api/watcherclient.v1.audit_template_shell.rst
new file mode 100644
index 0000000..df75aca
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.audit_template_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.audit_template_shell` Module
+=======================================================
+
+.. automodule:: watcherclient.v1.audit_template_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.client.rst b/doc/source/api/watcherclient.v1.client.rst
new file mode 100644
index 0000000..e72a79b
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.client.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.client` Module
+=========================================
+
+.. automodule:: watcherclient.v1.client
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.goal.rst b/doc/source/api/watcherclient.v1.goal.rst
new file mode 100644
index 0000000..f5856e2
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.goal.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.goal` Module
+=======================================
+
+.. automodule:: watcherclient.v1.goal
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.goal_shell.rst b/doc/source/api/watcherclient.v1.goal_shell.rst
new file mode 100644
index 0000000..f6bfe11
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.goal_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.goal_shell` Module
+=============================================
+
+.. automodule:: watcherclient.v1.goal_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.metric_collector.rst b/doc/source/api/watcherclient.v1.metric_collector.rst
new file mode 100644
index 0000000..e8028df
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.metric_collector.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.metric_collector` Module
+===================================================
+
+.. automodule:: watcherclient.v1.metric_collector
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.metric_collector_shell.rst b/doc/source/api/watcherclient.v1.metric_collector_shell.rst
new file mode 100644
index 0000000..50e64aa
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.metric_collector_shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.metric_collector_shell` Module
+=========================================================
+
+.. automodule:: watcherclient.v1.metric_collector_shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.resource_fields.rst b/doc/source/api/watcherclient.v1.resource_fields.rst
new file mode 100644
index 0000000..ddc846e
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.resource_fields.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.resource_fields` Module
+==================================================
+
+.. automodule:: watcherclient.v1.resource_fields
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.v1.shell.rst b/doc/source/api/watcherclient.v1.shell.rst
new file mode 100644
index 0000000..3462b48
--- /dev/null
+++ b/doc/source/api/watcherclient.v1.shell.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.v1.shell` Module
+========================================
+
+.. automodule:: watcherclient.v1.shell
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/doc/source/api/watcherclient.version.rst b/doc/source/api/watcherclient.version.rst
new file mode 100644
index 0000000..f7f64e8
--- /dev/null
+++ b/doc/source/api/watcherclient.version.rst
@@ -0,0 +1,7 @@
+The :mod:`watcherclient.version` Module
+=======================================
+
+.. automodule:: watcherclient.version
+  :members:
+  :undoc-members:
+  :show-inheritance:
diff --git a/requirements.txt b/requirements.txt
index f7eeb59..b902fce 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,7 +4,8 @@
 
 argparse
 Babel>=1.3
-oslo.i18n>=1.5.0    # Apache-2.0
+oslo.i18n>=1.5.0          # Apache-2.0
+oslo.utils>=2.0.0,!=2.6.0 # Apache-2.0
 pbr>=1.6
 python-keystoneclient>=1.6.0,!=1.8.0
 six>=1.9.0
diff --git a/tox.ini b/tox.ini
index b99de9a..f97fbed 100644
--- a/tox.ini
+++ b/tox.ini
@@ -32,7 +32,7 @@ commands = oslo_debug_helper {posargs}
 show-source = True
 ignore = E123,E125
 builtins = _
-exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
+exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
 
 [testenv:pypi]
 commands =
diff --git a/watcherclient/client.py b/watcherclient/client.py
index 240ab23..b96fc69 100644
--- a/watcherclient/client.py
+++ b/watcherclient/client.py
@@ -13,13 +13,13 @@
 #    under the License.
 
 from keystoneclient.v2_0 import client as ksclient
+import oslo_i18n
 
+from watcherclient.common.i18n import _
 from watcherclient.common import utils
 from watcherclient import exceptions as exc
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common import gettextutils
 
-gettextutils.install('watcherclient')
+oslo_i18n.install('watcherclient')
 
 
 def _get_ksclient(**kwargs):
diff --git a/watcherclient/openstack/__init__.py b/watcherclient/common/apiclient/__init__.py
similarity index 100%
rename from watcherclient/openstack/__init__.py
rename to watcherclient/common/apiclient/__init__.py
diff --git a/watcherclient/openstack/common/apiclient/base.py b/watcherclient/common/apiclient/base.py
similarity index 99%
rename from watcherclient/openstack/common/apiclient/base.py
rename to watcherclient/common/apiclient/base.py
index 6d26695..056b43c 100644
--- a/watcherclient/openstack/common/apiclient/base.py
+++ b/watcherclient/common/apiclient/base.py
@@ -44,8 +44,8 @@ from oslo_utils import strutils
 import six
 from six.moves.urllib import parse
 
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common.apiclient import exceptions
+from watcherclient.common.apiclient import exceptions
+from watcherclient.common.i18n import _
 
 
 def getid(obj):
@@ -467,8 +467,7 @@ class Resource(object):
 
     @property
     def human_id(self):
-        """Human-readable ID which can be used for bash completion.
-        """
+        """Human-readable ID which can be used for bash completion."""
         if self.HUMAN_ID:
             name = getattr(self, self.NAME_ATTR, None)
             if name is not None:
diff --git a/watcherclient/openstack/common/apiclient/exceptions.py b/watcherclient/common/apiclient/exceptions.py
similarity index 98%
rename from watcherclient/openstack/common/apiclient/exceptions.py
rename to watcherclient/common/apiclient/exceptions.py
index e5d9721..911ed58 100644
--- a/watcherclient/openstack/common/apiclient/exceptions.py
+++ b/watcherclient/common/apiclient/exceptions.py
@@ -38,12 +38,11 @@ import sys
 
 import six
 
-from watcherclient.openstack.common._i18n import _
+from watcherclient.common.i18n import _
 
 
 class ClientException(Exception):
-    """The base exception class for all exceptions this library raises.
-    """
+    """The base exception class for all exceptions this library raises."""
     pass
 
 
@@ -118,8 +117,7 @@ class AmbiguousEndpoints(EndpointException):
 
 
 class HttpError(ClientException):
-    """The base exception class for all HTTP exceptions.
-    """
+    """The base exception class for all HTTP exceptions."""
     http_status = 0
     message = _("HTTP Error")
 
diff --git a/watcherclient/common/base.py b/watcherclient/common/base.py
index 76aa143..2d23021 100644
--- a/watcherclient/common/base.py
+++ b/watcherclient/common/base.py
@@ -23,7 +23,7 @@ import copy
 
 import six.moves.urllib.parse as urlparse
 
-from watcherclient.openstack.common.apiclient import base
+from watcherclient.common.apiclient import base
 
 
 def getid(obj):
diff --git a/watcherclient/openstack/common/cliutils.py b/watcherclient/common/cliutils.py
similarity index 99%
rename from watcherclient/openstack/common/cliutils.py
rename to watcherclient/common/cliutils.py
index 49b06bc..fd2100d 100644
--- a/watcherclient/openstack/common/cliutils.py
+++ b/watcherclient/common/cliutils.py
@@ -30,7 +30,7 @@ import prettytable
 import six
 from six import moves
 
-from watcherclient.openstack.common._i18n import _
+from watcherclient.common.i18n import _
 
 
 class MissingArgs(Exception):
diff --git a/watcherclient/common/i18n.py b/watcherclient/common/i18n.py
new file mode 100644
index 0000000..01d8620
--- /dev/null
+++ b/watcherclient/common/i18n.py
@@ -0,0 +1,31 @@
+# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+# All Rights Reserved.
+#
+# 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 oslo_i18n
+
+_translators = oslo_i18n.TranslatorFactory(domain='watcherclient')
+
+# The primary translation function using the well-known name "_"
+_ = _translators.primary
+
+# Translators for log levels.
+#
+# The abbreviated names are meant to reflect the usual use of a short
+# name like '_'. The "L" is for "log" and the other letter comes from
+# the level.
+_LI = _translators.log_info
+_LW = _translators.log_warning
+_LE = _translators.log_error
+_LC = _translators.log_critical
diff --git a/watcherclient/common/utils.py b/watcherclient/common/utils.py
index f16c909..d48f6bd 100644
--- a/watcherclient/common/utils.py
+++ b/watcherclient/common/utils.py
@@ -20,9 +20,10 @@ from __future__ import print_function
 import argparse
 import json
 
+from oslo_utils import importutils
+
+from watcherclient.common.i18n import _
 from watcherclient import exceptions as exc
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common import importutils
 
 
 class HelpFormatter(argparse.HelpFormatter):
diff --git a/watcherclient/exceptions.py b/watcherclient/exceptions.py
index 232f957..241e857 100644
--- a/watcherclient/exceptions.py
+++ b/watcherclient/exceptions.py
@@ -12,21 +12,49 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from watcherclient.openstack.common.apiclient import exceptions
-from watcherclient.openstack.common.apiclient.exceptions import *  # noqa
+from watcherclient.common.apiclient import exceptions
 
 
 # NOTE(akurilin): This alias is left here since v.0.1.3 to support backwards
 # compatibility.
-InvalidEndpoint = EndpointException
-CommunicationError = ConnectionRefused
-HTTPBadRequest = BadRequest
-HTTPInternalServerError = InternalServerError
-HTTPNotFound = NotFound
-HTTPServiceUnavailable = ServiceUnavailable
+InvalidEndpoint = exceptions.EndpointException
+CommunicationError = exceptions.ConnectionRefused
+HTTPBadRequest = exceptions.BadRequest
+HTTPInternalServerError = exceptions.InternalServerError
+HTTPNotFound = exceptions.NotFound
+HTTPServiceUnavailable = exceptions.ServiceUnavailable
 
 
-class AmbiguousAuthSystem(ClientException):
+CommandError = exceptions.CommandError
+"""Error in CLI tool.
+
+An alias of :py:exc:`watcherclient.common.apiclient.CommandError`
+"""
+
+Unauthorized = exceptions.Unauthorized
+"""HTTP 401 - Unauthorized.
+
+Similar to 403 Forbidden, but specifically for use when authentication
+is required and has failed or has not yet been provided.
+An alias of :py:exc:`watcherclient.common.apiclient.Unauthorized`
+"""
+
+InternalServerError = exceptions.InternalServerError
+"""HTTP 500 - Internal Server Error.
+
+A generic error message, given when no more specific message is suitable.
+An alias of :py:exc:`watcherclient.common.apiclient.InternalServerError`
+"""
+
+ValidationError = exceptions.ValidationError
+"""Error in validation on API client side.
+
+A generic error message, given when no more specific message is suitable.
+An alias of :py:exc:`watcherclient.common.apiclient.ValidationError`
+"""
+
+
+class AmbiguousAuthSystem(exceptions.ClientException):
     """Could not obtain token and endpoint using provided credentials."""
     pass
 
@@ -34,7 +62,7 @@ class AmbiguousAuthSystem(ClientException):
 AmbigiousAuthSystem = AmbiguousAuthSystem
 
 
-class InvalidAttribute(ClientException):
+class InvalidAttribute(exceptions.ClientException):
     pass
 
 
@@ -65,7 +93,7 @@ def from_response(response, message=None, traceback=None, method=None,
     if (response.headers['Content-Type'].startswith('text/') and
             not hasattr(response, 'text')):
         # NOTE(clif_h): There seems to be a case in the
-        # openstack.common.apiclient.exceptions module where if the
+        # common.apiclient.exceptions module where if the
         # content-type of the response is text/* then it expects
         # the response to have a 'text' attribute, but that
         # doesn't always seem to necessarily be the case.
diff --git a/watcherclient/openstack/common/__init__.py b/watcherclient/openstack/common/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/watcherclient/openstack/common/_i18n.py b/watcherclient/openstack/common/_i18n.py
deleted file mode 100644
index b7c2946..0000000
--- a/watcherclient/openstack/common/_i18n.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#    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.
-
-"""oslo.i18n integration module.
-
-See http://docs.openstack.org/developer/oslo.i18n/usage.html
-
-"""
-
-try:
-    import oslo_i18n
-
-    # NOTE(dhellmann): This reference to o-s-l-o will be replaced by the
-    # application name when this module is synced into the separate
-    # repository. It is OK to have more than one translation function
-    # using the same domain, since there will still only be one message
-    # catalog.
-    _translators = oslo_i18n.TranslatorFactory(domain='watcherclient')
-
-    # The primary translation function using the well-known name "_"
-    _ = _translators.primary
-
-    # Translators for log levels.
-    #
-    # The abbreviated names are meant to reflect the usual use of a short
-    # name like '_'. The "L" is for "log" and the other letter comes from
-    # the level.
-    _LI = _translators.log_info
-    _LW = _translators.log_warning
-    _LE = _translators.log_error
-    _LC = _translators.log_critical
-except ImportError:
-    # NOTE(dims): Support for cases where a project wants to use
-    # code from oslo-incubator, but is not ready to be internationalized
-    # (like tempest)
-    _ = _LI = _LW = _LE = _LC = lambda x: x
diff --git a/watcherclient/openstack/common/apiclient/__init__.py b/watcherclient/openstack/common/apiclient/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/watcherclient/openstack/common/apiclient/auth.py b/watcherclient/openstack/common/apiclient/auth.py
deleted file mode 100644
index e6ecbe0..0000000
--- a/watcherclient/openstack/common/apiclient/auth.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-# Copyright 2013 Spanish National Research Council.
-# All Rights Reserved.
-#
-#    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.
-
-# E0202: An attribute inherited from %s hide this method
-# pylint: disable=E0202
-
-########################################################################
-#
-# THIS MODULE IS DEPRECATED
-#
-# Please refer to
-# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for
-# the discussion leading to this deprecation.
-#
-# We recommend checking out the python-openstacksdk project
-# (https://launchpad.net/python-openstacksdk) instead.
-#
-########################################################################
-
-import abc
-import argparse
-import os
-
-import six
-from stevedore import extension
-
-from watcherclient.openstack.common.apiclient import exceptions
-
-
-_discovered_plugins = {}
-
-
-def discover_auth_systems():
-    """Discover the available auth-systems.
-
-    This won't take into account the old style auth-systems.
-    """
-    global _discovered_plugins
-    _discovered_plugins = {}
-
-    def add_plugin(ext):
-        _discovered_plugins[ext.name] = ext.plugin
-
-    ep_namespace = "watcherclient.openstack.common.apiclient.auth"
-    mgr = extension.ExtensionManager(ep_namespace)
-    mgr.map(add_plugin)
-
-
-def load_auth_system_opts(parser):
-    """Load options needed by the available auth-systems into a parser.
-
-    This function will try to populate the parser with options from the
-    available plugins.
-    """
-    group = parser.add_argument_group("Common auth options")
-    BaseAuthPlugin.add_common_opts(group)
-    for name, auth_plugin in six.iteritems(_discovered_plugins):
-        group = parser.add_argument_group(
-            "Auth-system '%s' options" % name,
-            conflict_handler="resolve")
-        auth_plugin.add_opts(group)
-
-
-def load_plugin(auth_system):
-    try:
-        plugin_class = _discovered_plugins[auth_system]
-    except KeyError:
-        raise exceptions.AuthSystemNotFound(auth_system)
-    return plugin_class(auth_system=auth_system)
-
-
-def load_plugin_from_args(args):
-    """Load required plugin and populate it with options.
-
-    Try to guess auth system if it is not specified. Systems are tried in
-    alphabetical order.
-
-    :type args: argparse.Namespace
-    :raises: AuthPluginOptionsMissing
-    """
-    auth_system = args.os_auth_system
-    if auth_system:
-        plugin = load_plugin(auth_system)
-        plugin.parse_opts(args)
-        plugin.sufficient_options()
-        return plugin
-
-    for plugin_auth_system in sorted(six.iterkeys(_discovered_plugins)):
-        plugin_class = _discovered_plugins[plugin_auth_system]
-        plugin = plugin_class()
-        plugin.parse_opts(args)
-        try:
-            plugin.sufficient_options()
-        except exceptions.AuthPluginOptionsMissing:
-            continue
-        return plugin
-    raise exceptions.AuthPluginOptionsMissing(["auth_system"])
-
-
-@six.add_metaclass(abc.ABCMeta)
-class BaseAuthPlugin(object):
-    """Base class for authentication plugins.
-
-    An authentication plugin needs to override at least the authenticate
-    method to be a valid plugin.
-    """
-
-    auth_system = None
-    opt_names = []
-    common_opt_names = [
-        "auth_system",
-        "username",
-        "password",
-        "tenant_name",
-        "token",
-        "auth_url",
-    ]
-
-    def __init__(self, auth_system=None, **kwargs):
-        self.auth_system = auth_system or self.auth_system
-        self.opts = dict((name, kwargs.get(name))
-                         for name in self.opt_names)
-
-    @staticmethod
-    def _parser_add_opt(parser, opt):
-        """Add an option to parser in two variants.
-
-        :param opt: option name (with underscores)
-        """
-        dashed_opt = opt.replace("_", "-")
-        env_var = "OS_%s" % opt.upper()
-        arg_default = os.environ.get(env_var, "")
-        arg_help = "Defaults to env[%s]." % env_var
-        parser.add_argument(
-            "--os-%s" % dashed_opt,
-            metavar="<%s>" % dashed_opt,
-            default=arg_default,
-            help=arg_help)
-        parser.add_argument(
-            "--os_%s" % opt,
-            metavar="<%s>" % dashed_opt,
-            help=argparse.SUPPRESS)
-
-    @classmethod
-    def add_opts(cls, parser):
-        """Populate the parser with the options for this plugin.
-        """
-        for opt in cls.opt_names:
-            # use `BaseAuthPlugin.common_opt_names` since it is never
-            # changed in child classes
-            if opt not in BaseAuthPlugin.common_opt_names:
-                cls._parser_add_opt(parser, opt)
-
-    @classmethod
-    def add_common_opts(cls, parser):
-        """Add options that are common for several plugins.
-        """
-        for opt in cls.common_opt_names:
-            cls._parser_add_opt(parser, opt)
-
-    @staticmethod
-    def get_opt(opt_name, args):
-        """Return option name and value.
-
-        :param opt_name: name of the option, e.g., "username"
-        :param args: parsed arguments
-        """
-        return (opt_name, getattr(args, "os_%s" % opt_name, None))
-
-    def parse_opts(self, args):
-        """Parse the actual auth-system options if any.
-
-        This method is expected to populate the attribute `self.opts` with a
-        dict containing the options and values needed to make authentication.
-        """
-        self.opts.update(dict(self.get_opt(opt_name, args)
-                              for opt_name in self.opt_names))
-
-    def authenticate(self, http_client):
-        """Authenticate using plugin defined method.
-
-        The method usually analyses `self.opts` and performs
-        a request to authentication server.
-
-        :param http_client: client object that needs authentication
-        :type http_client: HTTPClient
-        :raises: AuthorizationFailure
-        """
-        self.sufficient_options()
-        self._do_authenticate(http_client)
-
-    @abc.abstractmethod
-    def _do_authenticate(self, http_client):
-        """Protected method for authentication.
-        """
-
-    def sufficient_options(self):
-        """Check if all required options are present.
-
-        :raises: AuthPluginOptionsMissing
-        """
-        missing = [opt
-                   for opt in self.opt_names
-                   if not self.opts.get(opt)]
-        if missing:
-            raise exceptions.AuthPluginOptionsMissing(missing)
-
-    @abc.abstractmethod
-    def token_and_endpoint(self, endpoint_type, service_type):
-        """Return token and endpoint.
-
-        :param service_type: Service type of the endpoint
-        :type service_type: string
-        :param endpoint_type: Type of endpoint.
-                              Possible values: public or publicURL,
-                              internal or internalURL,
-                              admin or adminURL
-        :type endpoint_type: string
-        :returns: tuple of token and endpoint strings
-        :raises: EndpointException
-        """
diff --git a/watcherclient/openstack/common/apiclient/client.py b/watcherclient/openstack/common/apiclient/client.py
deleted file mode 100644
index f32f2e2..0000000
--- a/watcherclient/openstack/common/apiclient/client.py
+++ /dev/null
@@ -1,388 +0,0 @@
-# Copyright 2010 Jacob Kaplan-Moss
-# Copyright 2011 OpenStack Foundation
-# Copyright 2011 Piston Cloud Computing, Inc.
-# Copyright 2013 Alessio Ababilov
-# Copyright 2013 Grid Dynamics
-# Copyright 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-#    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.
-
-"""
-OpenStack Client interface. Handles the REST calls and responses.
-"""
-
-# E0202: An attribute inherited from %s hide this method
-# pylint: disable=E0202
-
-import hashlib
-import logging
-import time
-
-try:
-    import simplejson as json
-except ImportError:
-    import json
-
-from oslo_utils import encodeutils
-from oslo_utils import importutils
-import requests
-
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common.apiclient import exceptions
-
-_logger = logging.getLogger(__name__)
-SENSITIVE_HEADERS = ('X-Auth-Token', 'X-Subject-Token',)
-
-
-class HTTPClient(object):
-    """This client handles sending HTTP requests to OpenStack servers.
-
-    Features:
-
-    - share authentication information between several clients to different
-      services (e.g., for compute and image clients);
-    - reissue authentication request for expired tokens;
-    - encode/decode JSON bodies;
-    - raise exceptions on HTTP errors;
-    - pluggable authentication;
-    - store authentication information in a keyring;
-    - store time spent for requests;
-    - register clients for particular services, so one can use
-      `http_client.identity` or `http_client.compute`;
-    - log requests and responses in a format that is easy to copy-and-paste
-      into terminal and send the same request with curl.
-    """
-
-    user_agent = "watcherclient.openstack.common.apiclient"
-
-    def __init__(self,
-                 auth_plugin,
-                 region_name=None,
-                 endpoint_type="publicURL",
-                 original_ip=None,
-                 verify=True,
-                 cert=None,
-                 timeout=None,
-                 timings=False,
-                 keyring_saver=None,
-                 debug=False,
-                 user_agent=None,
-                 http=None):
-        self.auth_plugin = auth_plugin
-
-        self.endpoint_type = endpoint_type
-        self.region_name = region_name
-
-        self.original_ip = original_ip
-        self.timeout = timeout
-        self.verify = verify
-        self.cert = cert
-
-        self.keyring_saver = keyring_saver
-        self.debug = debug
-        self.user_agent = user_agent or self.user_agent
-
-        self.times = []  # [("item", starttime, endtime), ...]
-        self.timings = timings
-
-        # requests within the same session can reuse TCP connections from pool
-        self.http = http or requests.Session()
-
-        self.cached_token = None
-        self.last_request_id = None
-
-    def _safe_header(self, name, value):
-        if name in SENSITIVE_HEADERS:
-            # because in python3 byte string handling is ... ug
-            v = value.encode('utf-8')
-            h = hashlib.sha1(v)
-            d = h.hexdigest()
-            return encodeutils.safe_decode(name), "{SHA1}%s" % d
-        else:
-            return (encodeutils.safe_decode(name),
-                    encodeutils.safe_decode(value))
-
-    def _http_log_req(self, method, url, kwargs):
-        if not self.debug:
-            return
-
-        string_parts = [
-            "curl -g -i",
-            "-X '%s'" % method,
-            "'%s'" % url,
-        ]
-
-        for element in kwargs['headers']:
-            header = ("-H '%s: %s'" %
-                      self._safe_header(element, kwargs['headers'][element]))
-            string_parts.append(header)
-
-        _logger.debug("REQ: %s" % " ".join(string_parts))
-        if 'data' in kwargs:
-            _logger.debug("REQ BODY: %s\n" % (kwargs['data']))
-
-    def _http_log_resp(self, resp):
-        if not self.debug:
-            return
-        _logger.debug(
-            "RESP: [%s] %s\n",
-            resp.status_code,
-            resp.headers)
-        if resp._content_consumed:
-            _logger.debug(
-                "RESP BODY: %s\n",
-                resp.text)
-
-    def serialize(self, kwargs):
-        if kwargs.get('json') is not None:
-            kwargs['headers']['Content-Type'] = 'application/json'
-            kwargs['data'] = json.dumps(kwargs['json'])
-        try:
-            del kwargs['json']
-        except KeyError:
-            pass
-
-    def get_timings(self):
-        return self.times
-
-    def reset_timings(self):
-        self.times = []
-
-    def request(self, method, url, **kwargs):
-        """Send an http request with the specified characteristics.
-
-        Wrapper around `requests.Session.request` to handle tasks such as
-        setting headers, JSON encoding/decoding, and error handling.
-
-        :param method: method of HTTP request
-        :param url: URL of HTTP request
-        :param kwargs: any other parameter that can be passed to
-             requests.Session.request (such as `headers`) or `json`
-             that will be encoded as JSON and used as `data` argument
-        """
-        kwargs.setdefault("headers", {})
-        kwargs["headers"]["User-Agent"] = self.user_agent
-        if self.original_ip:
-            kwargs["headers"]["Forwarded"] = "for=%s;by=%s" % (
-                self.original_ip, self.user_agent)
-        if self.timeout is not None:
-            kwargs.setdefault("timeout", self.timeout)
-        kwargs.setdefault("verify", self.verify)
-        if self.cert is not None:
-            kwargs.setdefault("cert", self.cert)
-        self.serialize(kwargs)
-
-        self._http_log_req(method, url, kwargs)
-        if self.timings:
-            start_time = time.time()
-        resp = self.http.request(method, url, **kwargs)
-        if self.timings:
-            self.times.append(("%s %s" % (method, url),
-                               start_time, time.time()))
-        self._http_log_resp(resp)
-
-        self.last_request_id = resp.headers.get('x-openstack-request-id')
-
-        if resp.status_code >= 400:
-            _logger.debug(
-                "Request returned failure status: %s",
-                resp.status_code)
-            raise exceptions.from_response(resp, method, url)
-
-        return resp
-
-    @staticmethod
-    def concat_url(endpoint, url):
-        """Concatenate endpoint and final URL.
-
-        E.g., "http://keystone/v2.0/" and "/tokens" are concatenated to
-        "http://keystone/v2.0/tokens".
-
-        :param endpoint: the base URL
-        :param url: the final URL
-        """
-        return "%s/%s" % (endpoint.rstrip("/"), url.strip("/"))
-
-    def client_request(self, client, method, url, **kwargs):
-        """Send an http request using `client`'s endpoint and specified `url`.
-
-        If request was rejected as unauthorized (possibly because the token is
-        expired), issue one authorization attempt and send the request once
-        again.
-
-        :param client: instance of BaseClient descendant
-        :param method: method of HTTP request
-        :param url: URL of HTTP request
-        :param kwargs: any other parameter that can be passed to
-            `HTTPClient.request`
-        """
-
-        filter_args = {
-            "endpoint_type": client.endpoint_type or self.endpoint_type,
-            "service_type": client.service_type,
-        }
-        token, endpoint = (self.cached_token, client.cached_endpoint)
-        just_authenticated = False
-        if not (token and endpoint):
-            try:
-                token, endpoint = self.auth_plugin.token_and_endpoint(
-                    **filter_args)
-            except exceptions.EndpointException:
-                pass
-            if not (token and endpoint):
-                self.authenticate()
-                just_authenticated = True
-                token, endpoint = self.auth_plugin.token_and_endpoint(
-                    **filter_args)
-                if not (token and endpoint):
-                    raise exceptions.AuthorizationFailure(
-                        _("Cannot find endpoint or token for request"))
-
-        old_token_endpoint = (token, endpoint)
-        kwargs.setdefault("headers", {})["X-Auth-Token"] = token
-        self.cached_token = token
-        client.cached_endpoint = endpoint
-        # Perform the request once. If we get Unauthorized, then it
-        # might be because the auth token expired, so try to
-        # re-authenticate and try again. If it still fails, bail.
-        try:
-            return self.request(
-                method, self.concat_url(endpoint, url), **kwargs)
-        except exceptions.Unauthorized as unauth_ex:
-            if just_authenticated:
-                raise
-            self.cached_token = None
-            client.cached_endpoint = None
-            if self.auth_plugin.opts.get('token'):
-                self.auth_plugin.opts['token'] = None
-            if self.auth_plugin.opts.get('endpoint'):
-                self.auth_plugin.opts['endpoint'] = None
-            self.authenticate()
-            try:
-                token, endpoint = self.auth_plugin.token_and_endpoint(
-                    **filter_args)
-            except exceptions.EndpointException:
-                raise unauth_ex
-            if (not (token and endpoint) or
-                    old_token_endpoint == (token, endpoint)):
-                raise unauth_ex
-            self.cached_token = token
-            client.cached_endpoint = endpoint
-            kwargs["headers"]["X-Auth-Token"] = token
-            return self.request(
-                method, self.concat_url(endpoint, url), **kwargs)
-
-    def add_client(self, base_client_instance):
-        """Add a new instance of :class:`BaseClient` descendant.
-
-        `self` will store a reference to `base_client_instance`.
-
-        Example:
-
-        >>> def test_clients():
-        ...     from keystoneclient.auth import keystone
-        ...     from openstack.common.apiclient import client
-        ...     auth = keystone.KeystoneAuthPlugin(
-        ...         username="user", password="pass", tenant_name="tenant",
-        ...         auth_url="http://auth:5000/v2.0")
-        ...     openstack_client = client.HTTPClient(auth)
-        ...     # create nova client
-        ...     from novaclient.v1_1 import client
-        ...     client.Client(openstack_client)
-        ...     # create keystone client
-        ...     from keystoneclient.v2_0 import client
-        ...     client.Client(openstack_client)
-        ...     # use them
-        ...     openstack_client.identity.tenants.list()
-        ...     openstack_client.compute.servers.list()
-        """
-        service_type = base_client_instance.service_type
-        if service_type and not hasattr(self, service_type):
-            setattr(self, service_type, base_client_instance)
-
-    def authenticate(self):
-        self.auth_plugin.authenticate(self)
-        # Store the authentication results in the keyring for later requests
-        if self.keyring_saver:
-            self.keyring_saver.save(self)
-
-
-class BaseClient(object):
-    """Top-level object to access the OpenStack API.
-
-    This client uses :class:`HTTPClient` to send requests. :class:`HTTPClient`
-    will handle a bunch of issues such as authentication.
-    """
-
-    service_type = None
-    endpoint_type = None  # "publicURL" will be used
-    cached_endpoint = None
-
-    def __init__(self, http_client, extensions=None):
-        self.http_client = http_client
-        http_client.add_client(self)
-
-        # Add in any extensions...
-        if extensions:
-            for extension in extensions:
-                if extension.manager_class:
-                    setattr(self, extension.name,
-                            extension.manager_class(self))
-
-    def client_request(self, method, url, **kwargs):
-        return self.http_client.client_request(
-            self, method, url, **kwargs)
-
-    @property
-    def last_request_id(self):
-        return self.http_client.last_request_id
-
-    def head(self, url, **kwargs):
-        return self.client_request("HEAD", url, **kwargs)
-
-    def get(self, url, **kwargs):
-        return self.client_request("GET", url, **kwargs)
-
-    def post(self, url, **kwargs):
-        return self.client_request("POST", url, **kwargs)
-
-    def put(self, url, **kwargs):
-        return self.client_request("PUT", url, **kwargs)
-
-    def delete(self, url, **kwargs):
-        return self.client_request("DELETE", url, **kwargs)
-
-    def patch(self, url, **kwargs):
-        return self.client_request("PATCH", url, **kwargs)
-
-    @staticmethod
-    def get_class(api_name, version, version_map):
-        """Returns the client class for the requested API version
-
-        :param api_name: the name of the API, e.g. 'compute', 'image', etc
-        :param version: the requested API version
-        :param version_map: a dict of client classes keyed by version
-        :rtype: a client class for the requested API version
-        """
-        try:
-            client_path = version_map[str(version)]
-        except (KeyError, ValueError):
-            msg = _("Invalid %(api_name)s client version '%(version)s'. "
-                    "Must be one of: %(version_map)s") % {
-                        'api_name': api_name,
-                        'version': version,
-                        'version_map': ', '.join(version_map.keys())}
-            raise exceptions.UnsupportedVersion(msg)
-
-        return importutils.import_class(client_path)
diff --git a/watcherclient/openstack/common/apiclient/fake_client.py b/watcherclient/openstack/common/apiclient/fake_client.py
deleted file mode 100644
index 1bd23ba..0000000
--- a/watcherclient/openstack/common/apiclient/fake_client.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-#    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.
-
-"""
-A fake server that "responds" to API methods with pre-canned responses.
-
-All of these responses come from the spec, so if for some reason the spec's
-wrong the tests might raise AssertionError. I've indicated in comments the
-places where actual behavior differs from the spec.
-"""
-
-########################################################################
-#
-# THIS MODULE IS DEPRECATED
-#
-# Please refer to
-# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for
-# the discussion leading to this deprecation.
-#
-# We recommend checking out the python-openstacksdk project
-# (https://launchpad.net/python-openstacksdk) instead.
-#
-########################################################################
-
-# W0102: Dangerous default value %s as argument
-# pylint: disable=W0102
-
-import json
-
-import requests
-import six
-from six.moves.urllib import parse
-
-from watcherclient.openstack.common.apiclient import client
-
-
-def assert_has_keys(dct, required=None, optional=None):
-    required = required or []
-    optional = optional or []
-    for k in required:
-        try:
-            assert k in dct
-        except AssertionError:
-            extra_keys = set(dct.keys()).difference(set(required + optional))
-            raise AssertionError("found unexpected keys: %s" %
-                                 list(extra_keys))
-
-
-class TestResponse(requests.Response):
-    """Wrap requests.Response and provide a convenient initialization.
-    """
-
-    def __init__(self, data):
-        super(TestResponse, self).__init__()
-        self._content_consumed = True
-        if isinstance(data, dict):
-            self.status_code = data.get('status_code', 200)
-            # Fake the text attribute to streamline Response creation
-            text = data.get('text', "")
-            if isinstance(text, (dict, list)):
-                self._content = json.dumps(text)
-                default_headers = {
-                    "Content-Type": "application/json",
-                }
-            else:
-                self._content = text
-                default_headers = {}
-            if six.PY3 and isinstance(self._content, six.string_types):
-                self._content = self._content.encode('utf-8', 'strict')
-            self.headers = data.get('headers') or default_headers
-        else:
-            self.status_code = data
-
-    def __eq__(self, other):
-        return (self.status_code == other.status_code and
-                self.headers == other.headers and
-                self._content == other._content)
-
-
-class FakeHTTPClient(client.HTTPClient):
-
-    def __init__(self, *args, **kwargs):
-        self.callstack = []
-        self.fixtures = kwargs.pop("fixtures", None) or {}
-        if not args and "auth_plugin" not in kwargs:
-            args = (None, )
-        super(FakeHTTPClient, self).__init__(*args, **kwargs)
-
-    def assert_called(self, method, url, body=None, pos=-1):
-        """Assert than an API method was just called.
-        """
-        expected = (method, url)
-        called = self.callstack[pos][0:2]
-        assert self.callstack, \
-            "Expected %s %s but no calls were made." % expected
-
-        assert expected == called, 'Expected %s %s; got %s %s' % \
-            (expected + called)
-
-        if body is not None:
-            if self.callstack[pos][3] != body:
-                raise AssertionError('%r != %r' %
-                                     (self.callstack[pos][3], body))
-
-    def assert_called_anytime(self, method, url, body=None):
-        """Assert than an API method was called anytime in the test.
-        """
-        expected = (method, url)
-
-        assert self.callstack, \
-            "Expected %s %s but no calls were made." % expected
-
-        found = False
-        entry = None
-        for entry in self.callstack:
-            if expected == entry[0:2]:
-                found = True
-                break
-
-        assert found, 'Expected %s %s; got %s' % \
-            (method, url, self.callstack)
-        if body is not None:
-            assert entry[3] == body, "%s != %s" % (entry[3], body)
-
-        self.callstack = []
-
-    def clear_callstack(self):
-        self.callstack = []
-
-    def authenticate(self):
-        pass
-
-    def client_request(self, client, method, url, **kwargs):
-        # Check that certain things are called correctly
-        if method in ["GET", "DELETE"]:
-            assert "json" not in kwargs
-
-        # Note the call
-        self.callstack.append(
-            (method,
-             url,
-             kwargs.get("headers") or {},
-             kwargs.get("json") or kwargs.get("data")))
-        try:
-            fixture = self.fixtures[url][method]
-        except KeyError:
-            pass
-        else:
-            return TestResponse({"headers": fixture[0],
-                                 "text": fixture[1]})
-
-        # Call the method
-        args = parse.parse_qsl(parse.urlparse(url)[4])
-        kwargs.update(args)
-        munged_url = url.rsplit('?', 1)[0]
-        munged_url = munged_url.strip('/').replace('/', '_').replace('.', '_')
-        munged_url = munged_url.replace('-', '_')
-
-        callback = "%s_%s" % (method.lower(), munged_url)
-
-        if not hasattr(self, callback):
-            raise AssertionError('Called unknown API method: %s %s, '
-                                 'expected fakes method name: %s' %
-                                 (method, url, callback))
-
-        resp = getattr(self, callback)(**kwargs)
-        if len(resp) == 3:
-            status, headers, body = resp
-        else:
-            status, body = resp
-            headers = {}
-        self.last_request_id = headers.get('x-openstack-request-id',
-                                           'req-test')
-        return TestResponse({
-            "status_code": status,
-            "text": body,
-            "headers": headers,
-        })
diff --git a/watcherclient/openstack/common/apiclient/utils.py b/watcherclient/openstack/common/apiclient/utils.py
deleted file mode 100644
index 397042a..0000000
--- a/watcherclient/openstack/common/apiclient/utils.py
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-#    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.
-
-########################################################################
-#
-# THIS MODULE IS DEPRECATED
-#
-# Please refer to
-# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for
-# the discussion leading to this deprecation.
-#
-# We recommend checking out the python-openstacksdk project
-# (https://launchpad.net/python-openstacksdk) instead.
-#
-########################################################################
-
-from oslo_utils import encodeutils
-from oslo_utils import uuidutils
-import six
-
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common.apiclient import exceptions
-
-
-def find_resource(manager, name_or_id, **find_args):
-    """Look for resource in a given manager.
-
-    Used as a helper for the _find_* methods.
-    Example:
-
-    .. code-block:: python
-
-        def _find_hypervisor(cs, hypervisor):
-            #Get a hypervisor by name or ID.
-            return cliutils.find_resource(cs.hypervisors, hypervisor)
-    """
-    # first try to get entity as integer id
-    try:
-        return manager.get(int(name_or_id))
-    except (TypeError, ValueError, exceptions.NotFound):
-        pass
-
-    # now try to get entity as uuid
-    try:
-        if six.PY2:
-            tmp_id = encodeutils.safe_encode(name_or_id)
-        else:
-            tmp_id = encodeutils.safe_decode(name_or_id)
-
-        if uuidutils.is_uuid_like(tmp_id):
-            return manager.get(tmp_id)
-    except (TypeError, ValueError, exceptions.NotFound):
-        pass
-
-    # for str id which is not uuid
-    if getattr(manager, 'is_alphanum_id_allowed', False):
-        try:
-            return manager.get(name_or_id)
-        except exceptions.NotFound:
-            pass
-
-    try:
-        try:
-            return manager.find(human_id=name_or_id, **find_args)
-        except exceptions.NotFound:
-            pass
-
-        # finally try to find entity by name
-        try:
-            resource = getattr(manager, 'resource_class', None)
-            name_attr = resource.NAME_ATTR if resource else 'name'
-            kwargs = {name_attr: name_or_id}
-            kwargs.update(find_args)
-            return manager.find(**kwargs)
-        except exceptions.NotFound:
-            msg = _("No %(name)s with a name or "
-                    "ID of '%(name_or_id)s' exists.") % \
-                {
-                    "name": manager.resource_class.__name__.lower(),
-                    "name_or_id": name_or_id
-                }
-            raise exceptions.CommandError(msg)
-    except exceptions.NoUniqueMatch:
-        msg = _("Multiple %(name)s matches found for "
-                "'%(name_or_id)s', use an ID to be more specific.") % \
-            {
-                "name": manager.resource_class.__name__.lower(),
-                "name_or_id": name_or_id
-            }
-        raise exceptions.CommandError(msg)
diff --git a/watcherclient/openstack/common/gettextutils.py b/watcherclient/openstack/common/gettextutils.py
deleted file mode 100644
index f38d4b0..0000000
--- a/watcherclient/openstack/common/gettextutils.py
+++ /dev/null
@@ -1,479 +0,0 @@
-# Copyright 2012 Red Hat, Inc.
-# Copyright 2013 IBM Corp.
-# All Rights Reserved.
-#
-#    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.
-
-"""
-gettext for openstack-common modules.
-
-Usual usage in an openstack.common module:
-
-    from watcherclient.openstack.common.gettextutils import _
-"""
-
-import copy
-import gettext
-import locale
-from logging import handlers
-import os
-
-from babel import localedata
-import six
-
-_AVAILABLE_LANGUAGES = {}
-
-# FIXME(dhellmann): Remove this when moving to oslo.i18n.
-USE_LAZY = False
-
-
-class TranslatorFactory(object):
-    """Create translator functions
-    """
-
-    def __init__(self, domain, localedir=None):
-        """Establish a set of translation functions for the domain.
-
-        :param domain: Name of translation domain,
-                       specifying a message catalog.
-        :type domain: str
-        :param lazy: Delays translation until a message is emitted.
-                     Defaults to False.
-        :type lazy: Boolean
-        :param localedir: Directory with translation catalogs.
-        :type localedir: str
-        """
-        self.domain = domain
-        if localedir is None:
-            localedir = os.environ.get(domain.upper() + '_LOCALEDIR')
-        self.localedir = localedir
-
-    def _make_translation_func(self, domain=None):
-        """Return a new translation function ready for use.
-
-        Takes into account whether or not lazy translation is being
-        done.
-
-        The domain can be specified to override the default from the
-        factory, but the localedir from the factory is always used
-        because we assume the log-level translation catalogs are
-        installed in the same directory as the main application
-        catalog.
-
-        """
-        if domain is None:
-            domain = self.domain
-        t = gettext.translation(domain,
-                                localedir=self.localedir,
-                                fallback=True)
-        # Use the appropriate method of the translation object based
-        # on the python version.
-        m = t.gettext if six.PY3 else t.ugettext
-
-        def f(msg):
-            """oslo.i18n.gettextutils translation function."""
-            if USE_LAZY:
-                return Message(msg, domain=domain)
-            return m(msg)
-        return f
-
-    @property
-    def primary(self):
-        "The default translation function."
-        return self._make_translation_func()
-
-    def _make_log_translation_func(self, level):
-        return self._make_translation_func(self.domain + '-log-' + level)
-
-    @property
-    def log_info(self):
-        "Translate info-level log messages."
-        return self._make_log_translation_func('info')
-
-    @property
-    def log_warning(self):
-        "Translate warning-level log messages."
-        return self._make_log_translation_func('warning')
-
-    @property
-    def log_error(self):
-        "Translate error-level log messages."
-        return self._make_log_translation_func('error')
-
-    @property
-    def log_critical(self):
-        "Translate critical-level log messages."
-        return self._make_log_translation_func('critical')
-
-
-# NOTE(dhellmann): When this module moves out of the incubator into
-# oslo.i18n, these global variables can be moved to an integration
-# module within each application.
-
-# Create the global translation functions.
-_translators = TranslatorFactory('watcherclient')
-
-# The primary translation function using the well-known name "_"
-_ = _translators.primary
-
-# Translators for log levels.
-#
-# The abbreviated names are meant to reflect the usual use of a short
-# name like '_'. The "L" is for "log" and the other letter comes from
-# the level.
-_LI = _translators.log_info
-_LW = _translators.log_warning
-_LE = _translators.log_error
-_LC = _translators.log_critical
-
-# NOTE(dhellmann): End of globals that will move to the application's
-# integration module.
-
-
-def enable_lazy():
-    """Convenience function for configuring _() to use lazy gettext
-
-    Call this at the start of execution to enable the gettextutils._
-    function to use lazy gettext functionality. This is useful if
-    your project is importing _ directly instead of using the
-    gettextutils.install() way of importing the _ function.
-    """
-    global USE_LAZY
-    USE_LAZY = True
-
-
-def install(domain):
-    """Install a _() function using the given translation domain.
-
-    Given a translation domain, install a _() function using gettext's
-    install() function.
-
-    The main difference from gettext.install() is that we allow
-    overriding the default localedir (e.g. /usr/share/locale) using
-    a translation-domain-specific environment variable (e.g.
-    NOVA_LOCALEDIR).
-
-    Note that to enable lazy translation, enable_lazy must be
-    called.
-
-    :param domain: the translation domain
-    """
-    from six import moves
-    tf = TranslatorFactory(domain)
-    moves.builtins.__dict__['_'] = tf.primary
-
-
-class Message(six.text_type):
-    """A Message object is a unicode object that can be translated.
-
-    Translation of Message is done explicitly using the translate() method.
-    For all non-translation intents and purposes, a Message is simply unicode,
-    and can be treated as such.
-    """
-
-    def __new__(cls, msgid, msgtext=None, params=None,
-                domain='watcherclient', *args):
-        """Create a new Message object.
-
-        In order for translation to work gettext requires a message ID, this
-        msgid will be used as the base unicode text. It is also possible
-        for the msgid and the base unicode text to be different by passing
-        the msgtext parameter.
-        """
-        # If the base msgtext is not given, we use the default translation
-        # of the msgid (which is in English) just in case the system locale is
-        # not English, so that the base text will be in that locale by default.
-        if not msgtext:
-            msgtext = Message._translate_msgid(msgid, domain)
-        # We want to initialize the parent unicode with the actual object that
-        # would have been plain unicode if 'Message' was not enabled.
-        msg = super(Message, cls).__new__(cls, msgtext)
-        msg.msgid = msgid
-        msg.domain = domain
-        msg.params = params
-        return msg
-
-    def translate(self, desired_locale=None):
-        """Translate this message to the desired locale.
-
-        :param desired_locale: The desired locale to translate the message to,
-                               if no locale is provided the message will be
-                               translated to the system's default locale.
-
-        :returns: the translated message in unicode
-        """
-
-        translated_message = Message._translate_msgid(self.msgid,
-                                                      self.domain,
-                                                      desired_locale)
-        if self.params is None:
-            # No need for more translation
-            return translated_message
-
-        # This Message object may have been formatted with one or more
-        # Message objects as substitution arguments, given either as a single
-        # argument, part of a tuple, or as one or more values in a dictionary.
-        # When translating this Message we need to translate those Messages too
-        translated_params = _translate_args(self.params, desired_locale)
-
-        translated_message = translated_message % translated_params
-
-        return translated_message
-
-    @staticmethod
-    def _translate_msgid(msgid, domain, desired_locale=None):
-        if not desired_locale:
-            system_locale = locale.getdefaultlocale()
-            # If the system locale is not available to the runtime use English
-            if not system_locale[0]:
-                desired_locale = 'en_US'
-            else:
-                desired_locale = system_locale[0]
-
-        locale_dir = os.environ.get(domain.upper() + '_LOCALEDIR')
-        lang = gettext.translation(domain,
-                                   localedir=locale_dir,
-                                   languages=[desired_locale],
-                                   fallback=True)
-        if six.PY3:
-            translator = lang.gettext
-        else:
-            translator = lang.ugettext
-
-        translated_message = translator(msgid)
-        return translated_message
-
-    def __mod__(self, other):
-        # When we mod a Message we want the actual operation to be performed
-        # by the parent class (i.e. unicode()), the only thing  we do here is
-        # save the original msgid and the parameters in case of a translation
-        params = self._sanitize_mod_params(other)
-        unicode_mod = super(Message, self).__mod__(params)
-        modded = Message(self.msgid,
-                         msgtext=unicode_mod,
-                         params=params,
-                         domain=self.domain)
-        return modded
-
-    def _sanitize_mod_params(self, other):
-        """Sanitize the object being modded with this Message.
-
-        - Add support for modding 'None' so translation supports it
-        - Trim the modded object, which can be a large dictionary, to only
-        those keys that would actually be used in a translation
-        - Snapshot the object being modded, in case the message is
-        translated, it will be used as it was when the Message was created
-        """
-        if other is None:
-            params = (other,)
-        elif isinstance(other, dict):
-            # Merge the dictionaries
-            # Copy each item in case one does not support deep copy.
-            params = {}
-            if isinstance(self.params, dict):
-                for key, val in self.params.items():
-                    params[key] = self._copy_param(val)
-            for key, val in other.items():
-                params[key] = self._copy_param(val)
-        else:
-            params = self._copy_param(other)
-        return params
-
-    def _copy_param(self, param):
-        try:
-            return copy.deepcopy(param)
-        except Exception:
-            # Fallback to casting to unicode this will handle the
-            # python code-like objects that can't be deep-copied
-            return six.text_type(param)
-
-    def __add__(self, other):
-        msg = _('Message objects do not support addition.')
-        raise TypeError(msg)
-
-    def __radd__(self, other):
-        return self.__add__(other)
-
-    if six.PY2:
-        def __str__(self):
-            # NOTE(luisg): Logging in python 2.6 tries to str() log records,
-            # and it expects specifically a UnicodeError in order to proceed.
-            msg = _('Message objects do not support str() because they may '
-                    'contain non-ascii characters. '
-                    'Please use unicode() or translate() instead.')
-            raise UnicodeError(msg)
-
-
-def get_available_languages(domain):
-    """Lists the available languages for the given translation domain.
-
-    :param domain: the domain to get languages for
-    """
-    if domain in _AVAILABLE_LANGUAGES:
-        return copy.copy(_AVAILABLE_LANGUAGES[domain])
-
-    localedir = '%s_LOCALEDIR' % domain.upper()
-    find = lambda x: gettext.find(domain,
-                                  localedir=os.environ.get(localedir),
-                                  languages=[x])
-
-    # NOTE(mrodden): en_US should always be available (and first in case
-    # order matters) since our in-line message strings are en_US
-    language_list = ['en_US']
-    # NOTE(luisg): Babel <1.0 used a function called list(), which was
-    # renamed to locale_identifiers() in >=1.0, the requirements master list
-    # requires >=0.9.6, uncapped, so defensively work with both. We can remove
-    # this check when the master list updates to >=1.0, and update all projects
-    list_identifiers = (getattr(localedata, 'list', None) or
-                        getattr(localedata, 'locale_identifiers'))
-    locale_identifiers = list_identifiers()
-
-    for i in locale_identifiers:
-        if find(i) is not None:
-            language_list.append(i)
-
-    # NOTE(luisg): Babel>=1.0,<1.3 has a bug where some OpenStack supported
-    # locales (e.g. 'zh_CN', and 'zh_TW') aren't supported even though they
-    # are perfectly legitimate locales:
-    #     https://github.com/mitsuhiko/babel/issues/37
-    # In Babel 1.3 they fixed the bug and they support these locales, but
-    # they are still not explicitly "listed" by locale_identifiers().
-    # That is  why we add the locales here explicitly if necessary so that
-    # they are listed as supported.
-    aliases = {'zh': 'zh_CN',
-               'zh_Hant_HK': 'zh_HK',
-               'zh_Hant': 'zh_TW',
-               'fil': 'tl_PH'}
-    for (locale_, alias) in six.iteritems(aliases):
-        if locale_ in language_list and alias not in language_list:
-            language_list.append(alias)
-
-    _AVAILABLE_LANGUAGES[domain] = language_list
-    return copy.copy(language_list)
-
-
-def translate(obj, desired_locale=None):
-    """Gets the translated unicode representation of the given object.
-
-    If the object is not translatable it is returned as-is.
-    If the locale is None the object is translated to the system locale.
-
-    :param obj: the object to translate
-    :param desired_locale: the locale to translate the message to, if None the
-                           default system locale will be used
-    :returns: the translated object in unicode, or the original object if
-              it could not be translated
-    """
-    message = obj
-    if not isinstance(message, Message):
-        # If the object to translate is not already translatable,
-        # let's first get its unicode representation
-        message = six.text_type(obj)
-    if isinstance(message, Message):
-        # Even after unicoding() we still need to check if we are
-        # running with translatable unicode before translating
-        return message.translate(desired_locale)
-    return obj
-
-
-def _translate_args(args, desired_locale=None):
-    """Translates all the translatable elements of the given arguments object.
-
-    This method is used for translating the translatable values in method
-    arguments which include values of tuples or dictionaries.
-    If the object is not a tuple or a dictionary the object itself is
-    translated if it is translatable.
-
-    If the locale is None the object is translated to the system locale.
-
-    :param args: the args to translate
-    :param desired_locale: the locale to translate the args to, if None the
-                           default system locale will be used
-    :returns: a new args object with the translated contents of the original
-    """
-    if isinstance(args, tuple):
-        return tuple(translate(v, desired_locale) for v in args)
-    if isinstance(args, dict):
-        translated_dict = {}
-        for (k, v) in six.iteritems(args):
-            translated_v = translate(v, desired_locale)
-            translated_dict[k] = translated_v
-        return translated_dict
-    return translate(args, desired_locale)
-
-
-class TranslationHandler(handlers.MemoryHandler):
-    """Handler that translates records before logging them.
-
-    The TranslationHandler takes a locale and a target logging.Handler object
-    to forward LogRecord objects to after translating them. This handler
-    depends on Message objects being logged, instead of regular strings.
-
-    The handler can be configured declaratively in the logging.conf as follows:
-
-        [handlers]
-        keys = translatedlog, translator
-
-        [handler_translatedlog]
-        class = handlers.WatchedFileHandler
-        args = ('/var/log/api-localized.log',)
-        formatter = context
-
-        [handler_translator]
-        class = openstack.common.log.TranslationHandler
-        target = translatedlog
-        args = ('zh_CN',)
-
-    If the specified locale is not available in the system, the handler will
-    log in the default locale.
-    """
-
-    def __init__(self, locale=None, target=None):
-        """Initialize a TranslationHandler
-
-        :param locale: locale to use for translating messages
-        :param target: logging.Handler object to forward
-                       LogRecord objects to after translation
-        """
-        # NOTE(luisg): In order to allow this handler to be a wrapper for
-        # other handlers, such as a FileHandler, and still be able to
-        # configure it using logging.conf, this handler has to extend
-        # MemoryHandler because only the MemoryHandlers' logging.conf
-        # parsing is implemented such that it accepts a target handler.
-        handlers.MemoryHandler.__init__(self, capacity=0, target=target)
-        self.locale = locale
-
-    def setFormatter(self, fmt):
-        self.target.setFormatter(fmt)
-
-    def emit(self, record):
-        # We save the message from the original record to restore it
-        # after translation, so other handlers are not affected by this
-        original_msg = record.msg
-        original_args = record.args
-
-        try:
-            self._translate_and_log_record(record)
-        finally:
-            record.msg = original_msg
-            record.args = original_args
-
-    def _translate_and_log_record(self, record):
-        record.msg = translate(record.msg, self.locale)
-
-        # In addition to translating the message, we also need to translate
-        # arguments that were passed to the log method that were not part
-        # of the main message e.g., log.info(_('Some message %s'), this_one))
-        record.args = _translate_args(record.args, self.locale)
-
-        self.target.emit(record)
diff --git a/watcherclient/openstack/common/importutils.py b/watcherclient/openstack/common/importutils.py
deleted file mode 100644
index ebbcff8..0000000
--- a/watcherclient/openstack/common/importutils.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright 2011 OpenStack Foundation.
-# All Rights Reserved.
-#
-#    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 related utilities and helper functions.
-"""
-
-import sys
-import traceback
-
-
-def import_class(import_str):
-    """Returns a class from a string including module and class."""
-    mod_str, _sep, class_str = import_str.rpartition('.')
-    __import__(mod_str)
-    try:
-        return getattr(sys.modules[mod_str], class_str)
-    except AttributeError:
-        raise ImportError('Class %s cannot be found (%s)' %
-                          (class_str,
-                           traceback.format_exception(*sys.exc_info())))
-
-
-def import_object(import_str, *args, **kwargs):
-    """Import a class and return an instance of it."""
-    return import_class(import_str)(*args, **kwargs)
-
-
-def import_object_ns(name_space, import_str, *args, **kwargs):
-    """Tries to import object from default namespace.
-
-    Imports a class and return an instance of it, first by trying
-    to find the class in a default namespace, then failing back to
-    a full path if not found in the default namespace.
-    """
-    import_value = "%s.%s" % (name_space, import_str)
-    try:
-        return import_class(import_value)(*args, **kwargs)
-    except ImportError:
-        return import_class(import_str)(*args, **kwargs)
-
-
-def import_module(import_str):
-    """Import a module."""
-    __import__(import_str)
-    return sys.modules[import_str]
-
-
-def import_versioned_module(version, submodule=None):
-    module = 'watcherclient.v%s' % version
-    if submodule:
-        module = '.'.join((module, submodule))
-    return import_module(module)
-
-
-def try_import(import_str, default=None):
-    """Try to import a module and if it fails return default."""
-    try:
-        return import_module(import_str)
-    except ImportError:
-        return default
diff --git a/watcherclient/openstack/common/strutils.py b/watcherclient/openstack/common/strutils.py
deleted file mode 100644
index 9642edb..0000000
--- a/watcherclient/openstack/common/strutils.py
+++ /dev/null
@@ -1,316 +0,0 @@
-# Copyright 2011 OpenStack Foundation.
-# All Rights Reserved.
-#
-#    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.
-
-"""
-System-level utilities and helper functions.
-"""
-
-import math
-import re
-import sys
-import unicodedata
-
-import six
-
-from watcherclient.openstack.common.gettextutils import _
-
-
-UNIT_PREFIX_EXPONENT = {
-    'k': 1,
-    'K': 1,
-    'Ki': 1,
-    'M': 2,
-    'Mi': 2,
-    'G': 3,
-    'Gi': 3,
-    'T': 4,
-    'Ti': 4,
-}
-UNIT_SYSTEM_INFO = {
-    'IEC': (1024, re.compile(r'(^[-+]?\d*\.?\d+)([KMGT]i?)?(b|bit|B)$')),
-    'SI': (1000, re.compile(r'(^[-+]?\d*\.?\d+)([kMGT])?(b|bit|B)$')),
-}
-
-TRUE_STRINGS = ('1', 't', 'true', 'on', 'y', 'yes')
-FALSE_STRINGS = ('0', 'f', 'false', 'off', 'n', 'no')
-
-SLUGIFY_STRIP_RE = re.compile(r"[^\w\s-]")
-SLUGIFY_HYPHENATE_RE = re.compile(r"[-\s]+")
-
-
-# NOTE(flaper87): The following globals are used by `mask_password`
-_SANITIZE_KEYS = ['adminPass', 'admin_pass', 'password', 'admin_password']
-
-# NOTE(ldbragst): Let's build a list of regex objects using the list of
-# _SANITIZE_KEYS we already have. This way, we only have to add the new key
-# to the list of _SANITIZE_KEYS and we can generate regular expressions
-# for XML and JSON automatically.
-_SANITIZE_PATTERNS_2 = []
-_SANITIZE_PATTERNS_1 = []
-
-# NOTE(amrith): Some regular expressions have only one parameter, some
-# have two parameters. Use different lists of patterns here.
-_FORMAT_PATTERNS_1 = [r'(%(key)s\s*[=]\s*)[^\s^\'^\"]+']
-_FORMAT_PATTERNS_2 = [r'(%(key)s\s*[=]\s*[\"\']).*?([\"\'])',
-                      r'(%(key)s\s+[\"\']).*?([\"\'])',
-                      r'([-]{2}%(key)s\s+)[^\'^\"^=^\s]+([\s]*)',
-                      r'(<%(key)s>).*?(</%(key)s>)',
-                      r'([\"\']%(key)s[\"\']\s*:\s*[\"\']).*?([\"\'])',
-                      r'([\'"].*?%(key)s[\'"]\s*:\s*u?[\'"]).*?([\'"])',
-                      r'([\'"].*?%(key)s[\'"]\s*,\s*\'--?[A-z]+\'\s*,\s*u?'
-                      '[\'"]).*?([\'"])',
-                      r'(%(key)s\s*--?[A-z]+\s*)\S+(\s*)']
-
-for key in _SANITIZE_KEYS:
-    for pattern in _FORMAT_PATTERNS_2:
-        reg_ex = re.compile(pattern % {'key': key}, re.DOTALL)
-        _SANITIZE_PATTERNS_2.append(reg_ex)
-
-    for pattern in _FORMAT_PATTERNS_1:
-        reg_ex = re.compile(pattern % {'key': key}, re.DOTALL)
-        _SANITIZE_PATTERNS_1.append(reg_ex)
-
-
-def int_from_bool_as_string(subject):
-    """Interpret a string as a boolean and return either 1 or 0.
-
-    Any string value in:
-
-        ('True', 'true', 'On', 'on', '1')
-
-    is interpreted as a boolean True.
-
-    Useful for JSON-decoded stuff and config file parsing
-    """
-    return bool_from_string(subject) and 1 or 0
-
-
-def bool_from_string(subject, strict=False, default=False):
-    """Interpret a string as a boolean.
-
-    A case-insensitive match is performed such that strings matching 't',
-    'true', 'on', 'y', 'yes', or '1' are considered True and, when
-    `strict=False`, anything else returns the value specified by 'default'.
-
-    Useful for JSON-decoded stuff and config file parsing.
-
-    If `strict=True`, unrecognized values, including None, will raise a
-    ValueError which is useful when parsing values passed in from an API call.
-    Strings yielding False are 'f', 'false', 'off', 'n', 'no', or '0'.
-    """
-    if not isinstance(subject, six.string_types):
-        subject = six.text_type(subject)
-
-    lowered = subject.strip().lower()
-
-    if lowered in TRUE_STRINGS:
-        return True
-    elif lowered in FALSE_STRINGS:
-        return False
-    elif strict:
-        acceptable = ', '.join(
-            "'%s'" % s for s in sorted(TRUE_STRINGS + FALSE_STRINGS))
-        msg = _("Unrecognized value '%(val)s', acceptable values are:"
-                " %(acceptable)s") % {'val': subject,
-                                      'acceptable': acceptable}
-        raise ValueError(msg)
-    else:
-        return default
-
-
-def safe_decode(text, incoming=None, errors='strict'):
-    """Decodes incoming text/bytes string using `incoming` if they're not
-       already unicode.
-
-    :param incoming: Text's current encoding
-    :param errors: Errors handling policy. See here for valid
-        values http://docs.python.org/2/library/codecs.html
-    :returns: text or a unicode `incoming` encoded
-                representation of it.
-    :raises TypeError: If text is not an instance of str
-    """
-    if not isinstance(text, (six.string_types, six.binary_type)):
-        raise TypeError("%s can't be decoded" % type(text))
-
-    if isinstance(text, six.text_type):
-        return text
-
-    if not incoming:
-        incoming = (sys.stdin.encoding or
-                    sys.getdefaultencoding())
-
-    try:
-        return text.decode(incoming, errors)
-    except UnicodeDecodeError:
-        # Note(flaper87) If we get here, it means that
-        # sys.stdin.encoding / sys.getdefaultencoding
-        # didn't return a suitable encoding to decode
-        # text. This happens mostly when global LANG
-        # var is not set correctly and there's no
-        # default encoding. In this case, most likely
-        # python will use ASCII or ANSI encoders as
-        # default encodings but they won't be capable
-        # of decoding non-ASCII characters.
-        #
-        # Also, UTF-8 is being used since it's an ASCII
-        # extension.
-        return text.decode('utf-8', errors)
-
-
-def safe_encode(text, incoming=None,
-                encoding='utf-8', errors='strict'):
-    """Encodes incoming text/bytes string using `encoding`.
-
-    If incoming is not specified, text is expected to be encoded with
-    current python's default encoding. (`sys.getdefaultencoding`)
-
-    :param incoming: Text's current encoding
-    :param encoding: Expected encoding for text (Default UTF-8)
-    :param errors: Errors handling policy. See here for valid
-        values http://docs.python.org/2/library/codecs.html
-    :returns: text or a bytestring `encoding` encoded
-                representation of it.
-    :raises TypeError: If text is not an instance of str
-    """
-    if not isinstance(text, (six.string_types, six.binary_type)):
-        raise TypeError("%s can't be encoded" % type(text))
-
-    if not incoming:
-        incoming = (sys.stdin.encoding or
-                    sys.getdefaultencoding())
-
-    if isinstance(text, six.text_type):
-        return text.encode(encoding, errors)
-    elif text and encoding != incoming:
-        # Decode text before encoding it with `encoding`
-        text = safe_decode(text, incoming, errors)
-        return text.encode(encoding, errors)
-    else:
-        return text
-
-
-def string_to_bytes(text, unit_system='IEC', return_int=False):
-    """Converts a string into an float representation of bytes.
-
-    The units supported for IEC ::
-
-        Kb(it), Kib(it), Mb(it), Mib(it), Gb(it), Gib(it), Tb(it), Tib(it)
-        KB, KiB, MB, MiB, GB, GiB, TB, TiB
-
-    The units supported for SI ::
-
-        kb(it), Mb(it), Gb(it), Tb(it)
-        kB, MB, GB, TB
-
-    Note that the SI unit system does not support capital letter 'K'
-
-    :param text: String input for bytes size conversion.
-    :param unit_system: Unit system for byte size conversion.
-    :param return_int: If True, returns integer representation of text
-                       in bytes. (default: decimal)
-    :returns: Numerical representation of text in bytes.
-    :raises ValueError: If text has an invalid value.
-
-    """
-    try:
-        base, reg_ex = UNIT_SYSTEM_INFO[unit_system]
-    except KeyError:
-        msg = _('Invalid unit system: "%s"') % unit_system
-        raise ValueError(msg)
-    match = reg_ex.match(text)
-    if match:
-        magnitude = float(match.group(1))
-        unit_prefix = match.group(2)
-        if match.group(3) in ['b', 'bit']:
-            magnitude /= 8
-    else:
-        msg = _('Invalid string format: %s') % text
-        raise ValueError(msg)
-    if not unit_prefix:
-        res = magnitude
-    else:
-        res = magnitude * pow(base, UNIT_PREFIX_EXPONENT[unit_prefix])
-    if return_int:
-        return int(math.ceil(res))
-    return res
-
-
-def to_slug(value, incoming=None, errors="strict"):
-    """Normalize string.
-
-    Convert to lowercase, remove non-word characters, and convert spaces
-    to hyphens.
-
-    Inspired by Django's `slugify` filter.
-
-    :param value: Text to slugify
-    :param incoming: Text's current encoding
-    :param errors: Errors handling policy. See here for valid
-        values http://docs.python.org/2/library/codecs.html
-    :returns: slugified unicode representation of `value`
-    :raises TypeError: If text is not an instance of str
-    """
-    value = safe_decode(value, incoming, errors)
-    # NOTE(aababilov): no need to use safe_(encode|decode) here:
-    # encodings are always "ascii", error handling is always "ignore"
-    # and types are always known (first: unicode; second: str)
-    value = unicodedata.normalize("NFKD", value).encode(
-        "ascii", "ignore").decode("ascii")
-    value = SLUGIFY_STRIP_RE.sub("", value).strip().lower()
-    return SLUGIFY_HYPHENATE_RE.sub("-", value)
-
-
-def mask_password(message, secret="***"):
-    """Replace password with 'secret' in message.
-
-    :param message: The string which includes security information.
-    :param secret: value with which to replace passwords.
-    :returns: The unicode value of message with the password fields masked.
-
-    For example:
-
-    >>> mask_password("'adminPass' : 'aaaaa'")
-    "'adminPass' : '***'"
-    >>> mask_password("'admin_pass' : 'aaaaa'")
-    "'admin_pass' : '***'"
-    >>> mask_password('"password" : "aaaaa"')
-    '"password" : "***"'
-    >>> mask_password("'original_password' : 'aaaaa'")
-    "'original_password' : '***'"
-    >>> mask_password("u'original_password' :   u'aaaaa'")
-    "u'original_password' :   u'***'"
-    """
-    try:
-        message = six.text_type(message)
-    except UnicodeDecodeError:
-        # NOTE(jecarey): Temporary fix to handle cases where message is a
-        # byte string.   A better solution will be provided in Kilo.
-        pass
-
-    # NOTE(ldbragst): Check to see if anything in message contains any key
-    # specified in _SANITIZE_KEYS, if not then just return the message since
-    # we don't have to mask any passwords.
-    if not any(key in message for key in _SANITIZE_KEYS):
-        return message
-
-    substitute = r'\g<1>' + secret + r'\g<2>'
-    for pattern in _SANITIZE_PATTERNS_2:
-        message = re.sub(pattern, substitute, message)
-
-    substitute = r'\g<1>' + secret
-    for pattern in _SANITIZE_PATTERNS_1:
-        message = re.sub(pattern, substitute, message)
-
-    return message
diff --git a/watcherclient/shell.py b/watcherclient/shell.py
index 72ea50c..e51cba6 100644
--- a/watcherclient/shell.py
+++ b/watcherclient/shell.py
@@ -30,16 +30,12 @@ from keystoneclient import exceptions as ks_exc
 from keystoneclient import session as kssession
 import six.moves.urllib.parse as urlparse
 
-
 import watcherclient
 from watcherclient import client as watcher_client
+from watcherclient.common import cliutils
+from watcherclient.common.i18n import _
 from watcherclient.common import utils
 from watcherclient import exceptions as exc
-from watcherclient.openstack.common._i18n import _
-from watcherclient.openstack.common import cliutils
-from watcherclient.openstack.common import gettextutils
-
-gettextutils.install('watcherclient')
 
 
 class WatcherShell(object):
diff --git a/watcherclient/tests/test_utils.py b/watcherclient/tests/test_utils.py
index d8fb170..fe7f55c 100644
--- a/watcherclient/tests/test_utils.py
+++ b/watcherclient/tests/test_utils.py
@@ -17,8 +17,8 @@
 
 import mock
 
+from watcherclient.common.apiclient import exceptions as exc
 from watcherclient.common import utils
-from watcherclient import exceptions as exc
 from watcherclient.tests import utils as test_utils
 
 
diff --git a/watcherclient/tests/v1/test_action_plan_shell.py b/watcherclient/tests/v1/test_action_plan_shell.py
index f16b618..f667f91 100644
--- a/watcherclient/tests/v1/test_action_plan_shell.py
+++ b/watcherclient/tests/v1/test_action_plan_shell.py
@@ -16,9 +16,9 @@
 
 import mock
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils as commonutils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.tests import utils
 import watcherclient.v1.action_plan_shell as ap_shell
 
@@ -52,8 +52,9 @@ class ActionPlanShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         setattr(args, 'action-plan', 'not_uuid')
 
-        self.assertRaises(ValidationError, ap_shell.do_action_plan_show,
-                          client_mock, args)
+        self.assertRaises(
+            exceptions.ValidationError,
+            ap_shell.do_action_plan_show, client_mock, args)
 
     def test_do_action_plan_delete(self):
         client_mock = mock.MagicMock()
@@ -70,8 +71,9 @@ class ActionPlanShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         setattr(args, 'action-plan', ['not_uuid'])
 
-        self.assertRaises(ValidationError, ap_shell.do_action_plan_delete,
-                          client_mock, args)
+        self.assertRaises(
+            exceptions.ValidationError,
+            ap_shell.do_action_plan_delete, client_mock, args)
 
     def test_do_action_plan_delete_multiple(self):
         client_mock = mock.MagicMock()
@@ -93,8 +95,9 @@ class ActionPlanShellTest(utils.BaseTestCase):
                  "not_uuid",
                  "a5199d0e-0702-4613-9234-5ae2af8dafeb"])
 
-        self.assertRaises(ValidationError, ap_shell.do_action_plan_delete,
-                          client_mock, args)
+        self.assertRaises(
+            exceptions.ValidationError,
+            ap_shell.do_action_plan_delete, client_mock, args)
         client_mock.action_plan.delete.assert_has_calls(
             [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')])
 
@@ -121,8 +124,9 @@ class ActionPlanShellTest(utils.BaseTestCase):
         args.op = 'add'
         args.attributes = [['arg1=val1', 'arg2=val2']]
 
-        self.assertRaises(ValidationError, ap_shell.do_action_plan_update,
-                          client_mock, args)
+        self.assertRaises(
+            exceptions.ValidationError,
+            ap_shell.do_action_plan_update, client_mock, args)
 
     def test_do_action_plan_start(self):
         client_mock = mock.MagicMock()
@@ -144,5 +148,6 @@ class ActionPlanShellTest(utils.BaseTestCase):
         action_plan = 'not_uuid'
         setattr(args, 'action-plan', action_plan)
 
-        self.assertRaises(ValidationError, ap_shell.do_action_plan_start,
-                          client_mock, args)
+        self.assertRaises(
+            exceptions.ValidationError,
+            ap_shell.do_action_plan_start, client_mock, args)
diff --git a/watcherclient/tests/v1/test_action_shell.py b/watcherclient/tests/v1/test_action_shell.py
index 4af8b02..13a15d6 100644
--- a/watcherclient/tests/v1/test_action_shell.py
+++ b/watcherclient/tests/v1/test_action_shell.py
@@ -16,9 +16,9 @@
 
 import mock
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils as commonutils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.tests import utils
 import watcherclient.v1.action_shell as a_shell
 
@@ -64,7 +64,7 @@ class ActionShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         args.action = 'not_uuid'
 
-        self.assertRaises(ValidationError, a_shell.do_action_show,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_action_show,
                           client_mock, args)
 
     def test_do_action_delete(self):
@@ -81,7 +81,7 @@ class ActionShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         args.action = ['not_uuid']
 
-        self.assertRaises(ValidationError, a_shell.do_action_delete,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_action_delete,
                           client_mock, args)
 
     def test_do_action_delete_multiple(self):
@@ -102,7 +102,7 @@ class ActionShellTest(utils.BaseTestCase):
                        'not_uuid'
                        'a5199d0e-0702-4613-9234-5ae2af8dafeb']
 
-        self.assertRaises(ValidationError, a_shell.do_action_delete,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_action_delete,
                           client_mock, args)
         client_mock.action.delete.assert_has_calls(
             [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')])
@@ -128,5 +128,5 @@ class ActionShellTest(utils.BaseTestCase):
         args.op = 'add'
         args.attributes = [['arg1=val1', 'arg2=val2']]
 
-        self.assertRaises(ValidationError, a_shell.do_action_update,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_action_update,
                           client_mock, args)
diff --git a/watcherclient/tests/v1/test_audit_shell.py b/watcherclient/tests/v1/test_audit_shell.py
index bc014d4..ba4fa81 100644
--- a/watcherclient/tests/v1/test_audit_shell.py
+++ b/watcherclient/tests/v1/test_audit_shell.py
@@ -16,9 +16,9 @@
 
 import mock
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils as commonutils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.tests import utils
 import watcherclient.v1.audit_shell as a_shell
 
@@ -53,7 +53,7 @@ class AuditShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         args.audit = 'not_uuid'
 
-        self.assertRaises(ValidationError, a_shell.do_audit_show,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_audit_show,
                           client_mock, args)
 
     def test_do_audit_delete(self):
@@ -70,7 +70,7 @@ class AuditShellTest(utils.BaseTestCase):
         args = mock.MagicMock()
         args.audit = ['not_uuid']
 
-        self.assertRaises(ValidationError, a_shell.do_audit_delete,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_audit_delete,
                           client_mock, args)
 
     def test_do_audit_delete_multiple(self):
@@ -91,7 +91,7 @@ class AuditShellTest(utils.BaseTestCase):
                       'not_uuid',
                       'a5199d0e-0702-4613-9234-5ae2af8dafeb']
 
-        self.assertRaises(ValidationError, a_shell.do_audit_delete,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_audit_delete,
                           client_mock, args)
         client_mock.audit.delete.assert_has_calls(
             [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')])
@@ -117,7 +117,7 @@ class AuditShellTest(utils.BaseTestCase):
         args.op = 'add'
         args.attributes = [['arg1=val1', 'arg2=val2']]
 
-        self.assertRaises(ValidationError, a_shell.do_audit_update,
+        self.assertRaises(exceptions.ValidationError, a_shell.do_audit_update,
                           client_mock, args)
 
     def test_do_audit_create(self):
diff --git a/watcherclient/tests/v1/test_audit_template_shell.py b/watcherclient/tests/v1/test_audit_template_shell.py
index f78ec0a..7b842d4 100644
--- a/watcherclient/tests/v1/test_audit_template_shell.py
+++ b/watcherclient/tests/v1/test_audit_template_shell.py
@@ -16,8 +16,8 @@
 
 import mock
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils as commonutils
-from watcherclient.openstack.common import cliutils
 from watcherclient.tests import utils
 import watcherclient.v1.audit_template_shell as at_shell
 
diff --git a/watcherclient/tests/v1/test_goal_shell.py b/watcherclient/tests/v1/test_goal_shell.py
index 8452057..2296369 100644
--- a/watcherclient/tests/v1/test_goal_shell.py
+++ b/watcherclient/tests/v1/test_goal_shell.py
@@ -15,7 +15,8 @@
 #   under the License.
 
 import mock
-from watcherclient.openstack.common import cliutils
+
+from watcherclient.common import cliutils
 from watcherclient.tests import utils
 import watcherclient.v1.goal_shell as a_shell
 
diff --git a/watcherclient/tests/v1/test_metric_collector_shell.py b/watcherclient/tests/v1/test_metric_collector_shell.py
index cb75ff8..320aa59 100644
--- a/watcherclient/tests/v1/test_metric_collector_shell.py
+++ b/watcherclient/tests/v1/test_metric_collector_shell.py
@@ -16,8 +16,8 @@
 
 import mock
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils as commonutils
-from watcherclient.openstack.common import cliutils
 from watcherclient.tests import utils
 import watcherclient.v1.metric_collector_shell as mc_shell
 
diff --git a/watcherclient/v1/action_plan_shell.py b/watcherclient/v1/action_plan_shell.py
index 3371fe5..878a225 100644
--- a/watcherclient/v1/action_plan_shell.py
+++ b/watcherclient/v1/action_plan_shell.py
@@ -18,9 +18,10 @@
 # import argparse
 
 from oslo_utils import uuidutils
+
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.v1 import resource_fields as res_fields
 
 
@@ -41,7 +42,7 @@ def do_action_plan_show(cc, args):
         action_plan = cc.action_plan.get(action_plan_uuid)
         _print_action_plan_show(action_plan)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
 
 
 @cliutils.arg(
@@ -105,7 +106,7 @@ def do_action_plan_delete(cc, args):
             cc.action_plan.delete(p)
             print ('Deleted action plan %s' % p)
         else:
-            raise ValidationError()
+            raise exceptions.ValidationError()
 
 
 @cliutils.arg(
@@ -133,7 +134,7 @@ def do_action_plan_update(cc, args):
         action_plan = cc.action_plan.update(action_plan_uuid, patch)
         _print_action_plan_show(action_plan)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
 
 
 @cliutils.arg('action-plan',
@@ -153,4 +154,4 @@ def do_action_plan_start(cc, args):
         action_plan = cc.action_plan.update(action_plan_uuid, patch)
         _print_action_plan_show(action_plan)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
diff --git a/watcherclient/v1/action_shell.py b/watcherclient/v1/action_shell.py
index 379efe9..4049b0c 100644
--- a/watcherclient/v1/action_shell.py
+++ b/watcherclient/v1/action_shell.py
@@ -18,9 +18,10 @@
 # import argparse
 
 from oslo_utils import uuidutils
+
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.v1 import resource_fields as res_fields
 
 
@@ -40,7 +41,7 @@ def do_action_show(cc, args):
         action = cc.action.get(args.action)
         _print_action_show(action)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
 
 
 @cliutils.arg(
@@ -110,7 +111,7 @@ def do_action_delete(cc, args):
             cc.action.delete(p)
             print ('Deleted action %s' % p)
         else:
-            raise ValidationError()
+            raise exceptions.ValidationError()
 
 
 @cliutils.arg('action', metavar='<action>', help="UUID of the action.")
@@ -134,4 +135,4 @@ def do_action_update(cc, args):
         action = cc.action.update(args.action, patch)
         _print_action_show(action)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
diff --git a/watcherclient/v1/audit_shell.py b/watcherclient/v1/audit_shell.py
index 482eeda..a882a1b 100644
--- a/watcherclient/v1/audit_shell.py
+++ b/watcherclient/v1/audit_shell.py
@@ -18,9 +18,10 @@
 # import argparse
 
 from oslo_utils import uuidutils
+
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common.apiclient.exceptions import ValidationError
-from watcherclient.openstack.common import cliutils
+from watcherclient import exceptions
 from watcherclient.v1 import resource_fields as res_fields
 
 
@@ -41,7 +42,7 @@ def do_audit_show(cc, args):
         audit = cc.audit.get(args.audit)
         _print_audit_show(audit)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
 
 
 @cliutils.arg(
@@ -132,7 +133,7 @@ def do_audit_delete(cc, args):
             cc.audit.delete(p)
             print ('Deleted audit %s' % p)
         else:
-            raise ValidationError()
+            raise exceptions.ValidationError()
 
 
 @cliutils.arg(
@@ -159,4 +160,4 @@ def do_audit_update(cc, args):
         audit = cc.audit.update(args.audit, patch)
         _print_audit_show(audit)
     else:
-        raise ValidationError()
+        raise exceptions.ValidationError()
diff --git a/watcherclient/v1/audit_template_shell.py b/watcherclient/v1/audit_template_shell.py
index b336ba0..e460a14 100644
--- a/watcherclient/v1/audit_template_shell.py
+++ b/watcherclient/v1/audit_template_shell.py
@@ -17,8 +17,8 @@
 
 # import argparse
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common import cliutils
 from watcherclient.v1 import resource_fields as res_fields
 
 
diff --git a/watcherclient/v1/goal_shell.py b/watcherclient/v1/goal_shell.py
index 985d704..a2eae88 100644
--- a/watcherclient/v1/goal_shell.py
+++ b/watcherclient/v1/goal_shell.py
@@ -15,8 +15,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common import cliutils
 from watcherclient.v1 import resource_fields as res_fields
 
 
diff --git a/watcherclient/v1/metric_collector_shell.py b/watcherclient/v1/metric_collector_shell.py
index 8006a1a..6d0061a 100644
--- a/watcherclient/v1/metric_collector_shell.py
+++ b/watcherclient/v1/metric_collector_shell.py
@@ -17,8 +17,8 @@
 
 # import argparse
 
+from watcherclient.common import cliutils
 from watcherclient.common import utils
-from watcherclient.openstack.common import cliutils
 from watcherclient.v1 import resource_fields as res_fields