diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py
index 5a2629f..ca940a7 100644
--- a/releasenotes/source/conf.py
+++ b/releasenotes/source/conf.py
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import pbr.version
+
 # Senlin Release Notes documentation build configuration file, created by
 # sphinx-quickstart on Tue Nov  3 17:40:50 2015.
 #
@@ -63,7 +65,7 @@ copyright = u'2015, Senlin Developers'
 # built documents.
 #
 # The short X.Y version.
-import pbr.version
+
 senlin_version = pbr.version.VersionInfo('python-muranoclient')
 # The full version, including alpha/beta/rc tags.
 release = senlin_version.version_string_with_vcs()
diff --git a/senlinclient/common/utils.py b/senlinclient/common/utils.py
index bbdd52e..d30890b 100644
--- a/senlinclient/common/utils.py
+++ b/senlinclient/common/utils.py
@@ -240,7 +240,7 @@ def process_stack_spec(spec):
     new_spec = {
         # TODO(Qiming): add context support
         'disable_rollback': spec.get('disable_rollback', True),
-        'context':  spec.get('context', {}),
+        'context': spec.get('context', {}),
         'parameters': spec.get('parameters', {}),
         'timeout': spec.get('timeout', 60),
         'template': template,
diff --git a/senlinclient/shell.py b/senlinclient/shell.py
index 5954982..64969c9 100644
--- a/senlinclient/shell.py
+++ b/senlinclient/shell.py
@@ -181,8 +181,8 @@ class SenlinShell(object):
             raise exc.CommandError(msg)
 
         # project name or ID is needed, or else sdk may find the wrong project
-        if (not (args.project_id or args.project_name or args.tenant_id
-                 or args.tenant_name)):
+        if (not (args.project_id or args.project_name or args.tenant_id or
+                 args.tenant_name)):
             if not (args.user_id):
                 msg = _('Either project/tenant ID or project/tenant name '
                         'must be specified, or else Senlin cannot know '
diff --git a/senlinclient/tests/unit/v1/test_action.py b/senlinclient/tests/unit/v1/test_action.py
index 21927dc..a419c25 100644
--- a/senlinclient/tests/unit/v1/test_action.py
+++ b/senlinclient/tests/unit/v1/test_action.py
@@ -159,7 +159,7 @@ class TestActionList(TestAction):
 
 
 class TestActionShow(TestAction):
-    get_response = {
+    response = {
         "action": "CLUSTER_DELETE",
         "cause": "RPC Request",
         "context": {},
@@ -184,7 +184,7 @@ class TestActionShow(TestAction):
         super(TestActionShow, self).setUp()
         self.cmd = osc_action.ShowAction(self.app, None)
         self.mock_client.get_action = mock.Mock(
-            return_value=sdk_action.Action(attrs=self.get_response))
+            return_value=sdk_action.Action(**self.response))
 
     def test_action_show(self):
         arglist = ['my_action']
diff --git a/senlinclient/tests/unit/v1/test_build_info.py b/senlinclient/tests/unit/v1/test_build_info.py
index ba78774..d49344c 100644
--- a/senlinclient/tests/unit/v1/test_build_info.py
+++ b/senlinclient/tests/unit/v1/test_build_info.py
@@ -12,7 +12,7 @@
 
 import mock
 
-from openstack.cluster.v1 import build_info as sdk_build_info
+from openstack.cluster.v1 import build_info as sbi
 
 from senlinclient.tests.unit.v1 import fakes
 from senlinclient.v1 import build_info as osc_build_info
@@ -33,7 +33,7 @@ class TestBuildInfo(fakes.TestClusteringv1):
         self.cmd = osc_build_info.BuildInfo(self.app, None)
         self.mock_client = self.app.client_manager.clustering
         self.mock_client.get_build_info = mock.Mock(
-            return_value=sdk_build_info.BuildInfo(None, self.response))
+            return_value=sbi.BuildInfo(**self.response['build_info']))
 
     def test_build_info(self):
         arglist = []
diff --git a/senlinclient/tests/unit/v1/test_cluster.py b/senlinclient/tests/unit/v1/test_cluster.py
index 6495ea0..c0e6875 100644
--- a/senlinclient/tests/unit/v1/test_cluster.py
+++ b/senlinclient/tests/unit/v1/test_cluster.py
@@ -147,7 +147,7 @@ class TestClusterList(TestCluster):
 
 
 class TestClusterShow(TestCluster):
-    get_response = {"cluster": {
+    response = {"cluster": {
         "created_at": "2015-02-11T15:13:20",
         "data": {},
         "desired_capacity": 0,
@@ -174,8 +174,7 @@ class TestClusterShow(TestCluster):
         super(TestClusterShow, self).setUp()
         self.cmd = osc_cluster.ShowCluster(self.app, None)
         self.mock_client.get_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(
-                attrs=self.get_response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
 
     def test_cluster_show(self):
         arglist = ['my_cluster']
@@ -231,9 +230,9 @@ class TestClusterCreate(TestCluster):
         super(TestClusterCreate, self).setUp()
         self.cmd = osc_cluster.CreateCluster(self.app, None)
         self.mock_client.create_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(attrs=self.response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
         self.mock_client.get_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(attrs=self.response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
 
     def test_cluster_create_defaults(self):
         arglist = ['test_cluster', '--profile', 'mystack']
@@ -301,11 +300,11 @@ class TestClusterUpdate(TestCluster):
         super(TestClusterUpdate, self).setUp()
         self.cmd = osc_cluster.UpdateCluster(self.app, None)
         self.mock_client.update_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(attrs=self.response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
         self.mock_client.get_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(attrs=self.response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
         self.mock_client.find_cluster = mock.Mock(
-            return_value=sdk_cluster.Cluster(attrs=self.response['cluster']))
+            return_value=sdk_cluster.Cluster(**self.response['cluster']))
 
     def test_cluster_update_defaults(self):
         arglist = ['--name', 'new_cluster', '--metadata', 'nk1=nv1;nk2=nv2',
diff --git a/senlinclient/tests/unit/v1/test_cluster_policy.py b/senlinclient/tests/unit/v1/test_cluster_policy.py
index c034552..568617f 100644
--- a/senlinclient/tests/unit/v1/test_cluster_policy.py
+++ b/senlinclient/tests/unit/v1/test_cluster_policy.py
@@ -12,7 +12,7 @@
 
 import mock
 
-from openstack.cluster.v1 import cluster_policy as sdk_cluster_policy
+from openstack.cluster.v1 import cluster_policy as scp
 
 from senlinclient.tests.unit.v1 import fakes
 from senlinclient.v1 import cluster_policy as osc_cluster_policy
@@ -76,7 +76,7 @@ class TestClusterPolicyList(TestClusterPolicy):
 
 
 class TestClusterPolicyShow(TestClusterPolicy):
-    get_response = {"cluster_policy": {
+    response = {"cluster_policy": {
         "cluster_id": "7d85f602-a948-4a30-afd4-e84f47471c15",
         "cluster_name": "my_cluster",
         "enabled": True,
@@ -90,8 +90,7 @@ class TestClusterPolicyShow(TestClusterPolicy):
         super(TestClusterPolicyShow, self).setUp()
         self.cmd = osc_cluster_policy.ClusterPolicyShow(self.app, None)
         self.mock_client.get_cluster_policy = mock.Mock(
-            return_value=sdk_cluster_policy.ClusterPolicy(None,
-                                                          self.get_response))
+            return_value=scp.ClusterPolicy(**self.response['cluster_policy']))
 
     def test_cluster_policy_show(self):
         arglist = ['--policy', 'my_policy', 'my_cluster']
diff --git a/senlinclient/tests/unit/v1/test_event.py b/senlinclient/tests/unit/v1/test_event.py
index 7cd2f6a..0014107 100644
--- a/senlinclient/tests/unit/v1/test_event.py
+++ b/senlinclient/tests/unit/v1/test_event.py
@@ -60,7 +60,7 @@ class TestEventList(TestEvent):
         super(TestEventList, self).setUp()
         self.cmd = osc_event.ListEvent(self.app, None)
         self.mock_client.events = mock.Mock(
-            return_value=sdk_event.Event(None, {}))
+            return_value=[sdk_event.Event(**self.response['events'][0])])
 
     def test_event_list_defaults(self):
         arglist = []
@@ -95,8 +95,7 @@ class TestEventList(TestEvent):
         self.assertEqual(self.columns, columns)
 
     def test_event_list_sort_invalid_key(self):
-        self.mock_client.events = mock.Mock(
-            return_value=self.response)
+        self.mock_client.events = mock.Mock(return_value=self.response)
         kwargs = copy.deepcopy(self.defaults)
         kwargs['sort'] = 'bad_key'
         arglist = ['--sort', 'bad_key']
@@ -106,8 +105,7 @@ class TestEventList(TestEvent):
                           self.cmd.take_action, parsed_args)
 
     def test_event_list_sort_invalid_direction(self):
-        self.mock_client.events = mock.Mock(
-            return_value=self.response)
+        self.mock_client.events = mock.Mock(return_value=self.response)
         kwargs = copy.deepcopy(self.defaults)
         kwargs['sort'] = 'name:bad_direction'
         arglist = ['--sort', 'name:bad_direction']
@@ -136,7 +134,7 @@ class TestEventList(TestEvent):
 
 
 class TestEventShow(TestEvent):
-    get_response = {"event": {
+    response = {"event": {
         "action": "create",
         "cluster_id": 'null',
         "id": "2d255b9c-8f36-41a2-a137-c0175ccc29c3",
@@ -155,7 +153,7 @@ class TestEventShow(TestEvent):
         super(TestEventShow, self).setUp()
         self.cmd = osc_event.ShowEvent(self.app, None)
         self.mock_client.get_event = mock.Mock(
-            return_value=sdk_event.Event(None, self.get_response))
+            return_value=sdk_event.Event(**self.response['event']))
 
     def test_event_show(self):
         arglist = ['my_event']
diff --git a/senlinclient/tests/unit/v1/test_node.py b/senlinclient/tests/unit/v1/test_node.py
index 6bfdada..a412fd3 100644
--- a/senlinclient/tests/unit/v1/test_node.py
+++ b/senlinclient/tests/unit/v1/test_node.py
@@ -144,7 +144,7 @@ class TestNodeList(TestNode):
 
 
 class TestNodeShow(TestNode):
-    get_response = {"node": {
+    response = {"node": {
         "cluster_id": None,
         "created_at": "2015-02-10T12:03:16",
         "data": {},
@@ -171,7 +171,7 @@ class TestNodeShow(TestNode):
         super(TestNodeShow, self).setUp()
         self.cmd = osc_node.ShowNode(self.app, None)
         self.mock_client.get_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.get_response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
 
     def test_node_show(self):
         arglist = ['my_node']
@@ -230,9 +230,9 @@ class TestNodeCreate(TestNode):
         super(TestNodeCreate, self).setUp()
         self.cmd = osc_node.CreateNode(self.app, None)
         self.mock_client.create_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
         self.mock_client.get_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
 
     def test_node_create_defaults(self):
         arglist = ['my_node', '--profile', 'mystack']
@@ -305,11 +305,11 @@ class TestNodeUpdate(TestNode):
         super(TestNodeUpdate, self).setUp()
         self.cmd = osc_node.UpdateNode(self.app, None)
         self.mock_client.update_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
         self.mock_client.get_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
         self.mock_client.find_node = mock.Mock(
-            return_value=sdk_node.Node(attrs=self.response['node']))
+            return_value=sdk_node.Node(**self.response['node']))
 
     def test_node_update_defaults(self):
         arglist = ['--name', 'new_node', '--metadata', 'nk1=nv1;nk2=nv2',
diff --git a/senlinclient/tests/unit/v1/test_policy.py b/senlinclient/tests/unit/v1/test_policy.py
index 350a7d9..079a74b 100644
--- a/senlinclient/tests/unit/v1/test_policy.py
+++ b/senlinclient/tests/unit/v1/test_policy.py
@@ -141,7 +141,7 @@ class TestPolicyList(TestPolicy):
 
 
 class TestPolicyShow(TestPolicy):
-    get_response = {"policy": {
+    response = {"policy": {
         "created_at": "2015-03-02T07:40:31",
         "data": {},
         "domain": 'null',
@@ -170,7 +170,7 @@ class TestPolicyShow(TestPolicy):
         super(TestPolicyShow, self).setUp()
         self.cmd = osc_policy.ShowPolicy(self.app, None)
         self.mock_client.get_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.get_response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
 
     def test_policy_show(self):
         arglist = ['sp001']
@@ -230,9 +230,9 @@ class TestPolicyCreate(TestPolicy):
         super(TestPolicyCreate, self).setUp()
         self.cmd = osc_policy.CreatePolicy(self.app, None)
         self.mock_client.create_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
         self.mock_client.get_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
 
     def test_policy_create_defaults(self):
         arglist = ['my_policy', '--spec-file', self.spec_path]
@@ -274,11 +274,11 @@ class TestPolicyUpdate(TestPolicy):
         super(TestPolicyUpdate, self).setUp()
         self.cmd = osc_policy.UpdatePolicy(self.app, None)
         self.mock_client.update_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
         self.mock_client.get_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
         self.mock_client.find_policy = mock.Mock(
-            return_value=sdk_policy.Policy(attrs=self.response['policy']))
+            return_value=sdk_policy.Policy(**self.response['policy']))
 
     def test_policy_update_defaults(self):
         arglist = ['--name', 'new_policy', '9f779ddf']
diff --git a/senlinclient/tests/unit/v1/test_policy_type.py b/senlinclient/tests/unit/v1/test_policy_type.py
index 956dc16..aac5c6f 100644
--- a/senlinclient/tests/unit/v1/test_policy_type.py
+++ b/senlinclient/tests/unit/v1/test_policy_type.py
@@ -29,15 +29,9 @@ class TestPolicyType(fakes.TestClusteringv1):
 class TestPolicyTypeList(TestPolicyType):
     expected_columns = ['name']
     list_response = [
-        sdk_policy_type.PolicyType({'name': 'BBB',
-                                    'schema': {
-                                        'foo': 'bar'}}),
-        sdk_policy_type.PolicyType({'name': 'AAA',
-                                    'schema': {
-                                        'foo': 'bar'}}),
-        sdk_policy_type.PolicyType({'name': 'CCC',
-                                    'schema': {
-                                        'foo': 'bar'}}),
+        sdk_policy_type.PolicyType(name='BBB', schema={'foo': 'bar'}),
+        sdk_policy_type.PolicyType(name='AAA', schema={'foo': 'bar'}),
+        sdk_policy_type.PolicyType(name='CCC', schema={'foo': 'bar'}),
     ]
     expected_rows = [
         ['AAA'],
@@ -71,7 +65,7 @@ class TestPolicyTypeShow(TestPolicyType):
         super(TestPolicyTypeShow, self).setUp()
         self.cmd = osc_policy_type.PolicyTypeShow(self.app, None)
         self.mock_client.get_policy_type = mock.Mock(
-            return_value=sdk_policy_type.PolicyType(self.response)
+            return_value=sdk_policy_type.PolicyType(**self.response)
         )
 
     def test_policy_type_show(self):
diff --git a/senlinclient/tests/unit/v1/test_profile.py b/senlinclient/tests/unit/v1/test_profile.py
index d84e0d0..5b4d0a4 100644
--- a/senlinclient/tests/unit/v1/test_profile.py
+++ b/senlinclient/tests/unit/v1/test_profile.py
@@ -30,7 +30,7 @@ class TestProfile(fakes.TestClusteringv1):
 
 
 class TestProfileShow(TestProfile):
-    get_response = {"profile": {
+    response = {"profile": {
         "created_at": "2015-03-01T14:28:25",
         "domain": 'false',
         "id": "7fa885cd-fa39-4531-a42d-780af95c84a4",
@@ -92,8 +92,7 @@ class TestProfileShow(TestProfile):
         super(TestProfileShow, self).setUp()
         self.cmd = osc_profile.ShowProfile(self.app, None)
         self.mock_client.get_profile = mock.Mock(
-            return_value=sdk_profile.Profile(
-                attrs=self.get_response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         utils.get_dict_properties = mock.Mock(return_value='')
 
     def test_profile_show(self):
@@ -305,13 +304,15 @@ class TestProfileCreate(TestProfile):
         "updated_at": None,
         "user": "2d7aca950f3e465d8ef0c81720faf6ff"}}
 
-    defaults = {"spec": {
-        "version": 1.0,
-        "type": "os.nova.server",
-        "properties": {
-            "flavor": 1,
-            "name": "cirros_server",
-            "image": "cirros-0.3.4-x86_64-uec"}
+    defaults = {
+        "spec": {
+            "version": 1.0,
+            "type": "os.nova.server",
+            "properties": {
+                "flavor": 1,
+                "name": "cirros_server",
+                "image": "cirros-0.3.4-x86_64-uec"
+            },
         },
         "name": "my_profile",
         "metadata": {}
@@ -321,9 +322,9 @@ class TestProfileCreate(TestProfile):
         super(TestProfileCreate, self).setUp()
         self.cmd = osc_profile.CreateProfile(self.app, None)
         self.mock_client.create_profile = mock.Mock(
-            return_value=sdk_profile.Profile(attrs=self.response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         self.mock_client.get_profile = mock.Mock(
-            return_value=sdk_profile.Profile(attrs=self.response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         utils.get_dict_properties = mock.Mock(return_value='')
 
     def test_profile_create_defaults(self):
@@ -376,11 +377,11 @@ class TestProfileUpdate(TestProfile):
         super(TestProfileUpdate, self).setUp()
         self.cmd = osc_profile.UpdateProfile(self.app, None)
         self.mock_client.update_profile = mock.Mock(
-            return_value=sdk_profile.Profile(attrs=self.response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         self.mock_client.get_profile = mock.Mock(
-            return_value=sdk_profile.Profile(attrs=self.response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         self.mock_client.find_profile = mock.Mock(
-            return_value=sdk_profile.Profile(attrs=self.response['profile']))
+            return_value=sdk_profile.Profile(**self.response['profile']))
         utils.get_dict_properties = mock.Mock(return_value='')
 
     def test_profile_update_defaults(self):
diff --git a/senlinclient/tests/unit/v1/test_profile_type.py b/senlinclient/tests/unit/v1/test_profile_type.py
index 5a1fa0f..9a5aa39 100644
--- a/senlinclient/tests/unit/v1/test_profile_type.py
+++ b/senlinclient/tests/unit/v1/test_profile_type.py
@@ -29,18 +29,9 @@ class TestProfileType(fakes.TestClusteringv1):
 class TestProfileTypeList(TestProfileType):
     expected_columns = ['name']
     list_response = [
-        sdk_profile_type.ProfileType({'name': 'BBB',
-                                      'schema': {
-                                          'foo': 'bar'}}
-                                     ),
-        sdk_profile_type.ProfileType({'name': 'AAA',
-                                      'schema': {
-                                          'foo': 'bar'}}
-                                     ),
-        sdk_profile_type.ProfileType({'name': 'CCC',
-                                      'schema': {
-                                          'foo': 'bar'}}
-                                     ),
+        sdk_profile_type.ProfileType(name='BBB', schema={'foo': 'bar'}),
+        sdk_profile_type.ProfileType(name='AAA', schema={'foo': 'bar'}),
+        sdk_profile_type.ProfileType(name='CCC', schema={'foo': 'bar'}),
     ]
     expected_rows = [
         ['AAA'],
@@ -74,7 +65,7 @@ class TestProfileTypeShow(TestProfileType):
         super(TestProfileTypeShow, self).setUp()
         self.cmd = osc_profile_type.ProfileTypeShow(self.app, None)
         self.mock_client.get_profile_type = mock.Mock(
-            return_value=sdk_profile_type.ProfileType(self.response)
+            return_value=sdk_profile_type.ProfileType(**self.response)
         )
 
     def test_profile_type_show(self):
diff --git a/senlinclient/tests/unit/v1/test_receiver.py b/senlinclient/tests/unit/v1/test_receiver.py
index 053bdc7..6c14175 100644
--- a/senlinclient/tests/unit/v1/test_receiver.py
+++ b/senlinclient/tests/unit/v1/test_receiver.py
@@ -67,8 +67,7 @@ class TestReceiverList(TestReceiver):
     def setUp(self):
         super(TestReceiverList, self).setUp()
         self.cmd = osc_receiver.ListReceiver(self.app, None)
-        self.mock_client.receivers = mock.Mock(
-            return_value=self.response)
+        self.mock_client.receivers = mock.Mock(return_value=self.response)
 
     def test_receiver_list_defaults(self):
         arglist = []
@@ -172,9 +171,8 @@ class TestReceiverShow(TestReceiver):
     def setUp(self):
         super(TestReceiverShow, self).setUp()
         self.cmd = osc_receiver.ShowReceiver(self.app, None)
-        self.mock_client.get_receiver = mock.Mock(
-            return_value=sdk_receiver.Receiver(
-                attrs=self.get_response['receiver']))
+        x_receiver = sdk_receiver.Receiver(**self.get_response['receiver'])
+        self.mock_client.get_receiver = mock.Mock(return_value=x_receiver)
 
     def test_receiver_show(self):
         arglist = ['my_receiver']
@@ -231,11 +229,9 @@ class TestReceiverCreate(TestReceiver):
         super(TestReceiverCreate, self).setUp()
         self.cmd = osc_receiver.CreateReceiver(self.app, None)
         self.mock_client.create_receiver = mock.Mock(
-            return_value=sdk_receiver.Receiver(
-                attrs=self.response['receiver']))
+            return_value=sdk_receiver.Receiver(**self.response['receiver']))
         self.mock_client.get_receiver = mock.Mock(
-            return_value=sdk_receiver.Receiver(
-                attrs=self.response['receiver']))
+            return_value=sdk_receiver.Receiver(**self.response['receiver']))
 
     def test_receiver_create(self):
         arglist = ['my_receiver', '--action', 'CLUSTER_SCALE_OUT',
diff --git a/senlinclient/tests/unit/v1/test_shell.py b/senlinclient/tests/unit/v1/test_shell.py
index e2d1ef2..28596a4 100644
--- a/senlinclient/tests/unit/v1/test_shell.py
+++ b/senlinclient/tests/unit/v1/test_shell.py
@@ -66,8 +66,9 @@ class ShellTest(testtools.TestCase):
             'api': utils.json_formatter,
             'engine': utils.json_formatter,
         }
-        mock_print.assert_called_once_with(result, formatters=formatters)
-        self.assertTrue(service.get_build_info.called)
+        mock_print.assert_called_once_with(result.to_dict(),
+                                           formatters=formatters)
+        service.get_build_info.assert_called_once_with()
 
     @mock.patch.object(utils, 'print_list')
     def test_do_profile_type_list(self, mock_print):
@@ -1104,7 +1105,7 @@ class ShellTest(testtools.TestCase):
 
         sh._show_node(service, node_id, show_details=False)
 
-        service.get_node.assert_called_once_with(node_id, args=None)
+        service.get_node.assert_called_once_with(node_id, details=False)
         mock_print.assert_called_once_with(data, formatters=formatters)
 
     @mock.patch.object(sh, '_show_node')
@@ -1232,7 +1233,7 @@ class ShellTest(testtools.TestCase):
     def test_do_event_list(self, mock_print):
         service = mock.Mock()
         fields = ['id', 'timestamp', 'obj_type', 'obj_id', 'obj_name',
-                  'action', 'status', 'status_reason', 'level']
+                  'action', 'status', 'level', 'cluster_id']
         args = {
             'sort': 'timestamp:asc',
             'limit': 20,
diff --git a/senlinclient/v1/action.py b/senlinclient/v1/action.py
index 2ab4a3a..5f176ee 100644
--- a/senlinclient/v1/action.py
+++ b/senlinclient/v1/action.py
@@ -104,7 +104,8 @@ class ListAction(lister.Lister):
 
         return (
             columns,
-            (utils.get_item_properties(a, columns, formatters=formatters)
+            (utils.get_item_properties(a.to_dict(), columns,
+                                       formatters=formatters)
              for a in actions)
         )
 
@@ -141,6 +142,7 @@ class ShowAction(show.ShowOne):
             'depends_on': senlin_utils.list_formatter,
             'depended_by': senlin_utils.list_formatter,
         }
-        columns = sorted(list(six.iterkeys(action)))
-        return columns, utils.get_dict_properties(action.to_dict(), columns,
+        data = action.to_dict()
+        columns = sorted(list(six.iterkeys(data)))
+        return columns, utils.get_dict_properties(data, columns,
                                                   formatters=formatters)
diff --git a/senlinclient/v1/build_info.py b/senlinclient/v1/build_info.py
index 9de5dca..af0100d 100644
--- a/senlinclient/v1/build_info.py
+++ b/senlinclient/v1/build_info.py
@@ -13,7 +13,6 @@
 """Clustering v1 build_info action implementations"""
 
 import logging
-import six
 
 from cliff import show
 from openstackclient.common import utils
@@ -40,6 +39,10 @@ class BuildInfo(show.ShowOne):
             'api': senlin_utils.json_formatter,
             'engine': senlin_utils.json_formatter,
         }
-        columns = sorted(list(six.iterkeys(result)))
-        return columns, utils.get_dict_properties(result.to_dict(), columns,
+        data = {
+            'api': result.api,
+            'engine': result.engine,
+        }
+        columns = ['api', 'engine']
+        return columns, utils.get_dict_properties(data, columns,
                                                   formatters=formatters)
diff --git a/senlinclient/v1/client.py b/senlinclient/v1/client.py
index 4667fa9..444dfe7 100644
--- a/senlinclient/v1/client.py
+++ b/senlinclient/v1/client.py
@@ -263,6 +263,14 @@ class Client(object):
         """
         return self.service.cluster_update_policy(cluster, policy, **attrs)
 
+    def cluster_collect(self, cluster, path):
+        """Resize cluster
+
+        Doc link:
+        http://developer.openstack.org/api-ref-clustering-v1.html#clusterAction
+        """
+        return self.service.cluster_collect(cluster, path)
+
     def check_cluster(self, cluster, **params):
         """Check cluster's health status
 
diff --git a/senlinclient/v1/cluster.py b/senlinclient/v1/cluster.py
index ebb0a6d..dca6842 100644
--- a/senlinclient/v1/cluster.py
+++ b/senlinclient/v1/cluster.py
@@ -137,8 +137,9 @@ def _show_cluster(senlin_client, cluster_id):
         'metadata': senlin_utils.json_formatter,
         'nodes': senlin_utils.list_formatter
     }
-    columns = sorted(list(six.iterkeys(cluster)))
-    return columns, utils.get_dict_properties(cluster.to_dict(), columns,
+    data = cluster.to_dict()
+    columns = sorted(list(six.iterkeys(data)))
+    return columns, utils.get_dict_properties(data, columns,
                                               formatters=formatters)
 
 
diff --git a/senlinclient/v1/cluster_policy.py b/senlinclient/v1/cluster_policy.py
index e7462f2..9abf20f 100644
--- a/senlinclient/v1/cluster_policy.py
+++ b/senlinclient/v1/cluster_policy.py
@@ -83,7 +83,8 @@ class ClusterPolicyList(lister.Lister):
             }
         return (
             columns,
-            (utils.get_item_properties(p, columns, formatters=formatters)
+            (utils.get_item_properties(p.to_dict(), columns,
+                                       formatters=formatters)
              for p in policies)
         )
 
@@ -113,8 +114,9 @@ class ClusterPolicyShow(show.ShowOne):
         senlin_client = self.app.client_manager.clustering
         policy = senlin_client.get_cluster_policy(parsed_args.policy,
                                                   parsed_args.cluster)
-        columns = sorted(list(six.iterkeys(policy)))
-        return columns, utils.get_dict_properties(policy.to_dict(), columns)
+        data = policy.to_dict()
+        columns = sorted(list(six.iterkeys(data)))
+        return columns, utils.get_dict_properties(data, columns)
 
 
 class ClusterPolicyUpdate(command.Command):
diff --git a/senlinclient/v1/event.py b/senlinclient/v1/event.py
index cc2ee8b..68ade48 100644
--- a/senlinclient/v1/event.py
+++ b/senlinclient/v1/event.py
@@ -99,11 +99,10 @@ class ListEvent(lister.Lister):
             formatters['obj_id'] = lambda x: x[:8] if x else ''
 
         events = senlin_client.events(**queries)
-        return (
-            columns,
-            (utils.get_item_properties(e, columns, formatters=formatters)
-             for e in events)
-        )
+        return (columns,
+                (utils.get_item_properties(e.to_dict(), columns,
+                                           formatters=formatters)
+                 for e in events))
 
 
 class ShowEvent(show.ShowOne):
@@ -129,5 +128,6 @@ class ShowEvent(show.ShowOne):
         except sdk_exc.ResourceNotFound:
             raise exc.CommandError(_("Event not found: %s")
                                    % parsed_args.event)
-        columns = sorted(list(six.iterkeys(event)))
-        return columns, utils.get_dict_properties(event.to_dict(), columns)
+        data = event.to_dict()
+        columns = sorted(list(six.iterkeys(data)))
+        return columns, utils.get_dict_properties(data, columns)
diff --git a/senlinclient/v1/node.py b/senlinclient/v1/node.py
index 9e2ac63..2627763 100644
--- a/senlinclient/v1/node.py
+++ b/senlinclient/v1/node.py
@@ -158,12 +158,12 @@ def _show_node(senlin_client, node_id, show_details=False):
         'metadata': senlin_utils.json_formatter,
         'data': senlin_utils.json_formatter,
     }
-    if show_details and node:
+    data = node.to_dict()
+    if show_details:
         formatters['details'] = senlin_utils.nested_dict_formatter(
-            list(node['details'].keys()), ['property', 'value'])
-
-    columns = sorted(list(six.iterkeys(node)))
-    return columns, utils.get_dict_properties(node.to_dict(), columns,
+            list(data['details'].keys()), ['property', 'value'])
+    columns = sorted(list(six.iterkeys(data)))
+    return columns, utils.get_dict_properties(data, columns,
                                               formatters=formatters)
 
 
diff --git a/senlinclient/v1/policy_type.py b/senlinclient/v1/policy_type.py
index 5df67d4..534ac13 100644
--- a/senlinclient/v1/policy_type.py
+++ b/senlinclient/v1/policy_type.py
@@ -63,6 +63,7 @@ class PolicyTypeShow(format_utils.YamlFormat):
         except sdk_exc.ResourceNotFound:
             raise exc.CommandError(_('Policy Type not found: %s')
                                    % parsed_args.type_name)
-        rows = list(six.itervalues(res))
-        columns = list(six.iterkeys(res))
+        data = res.to_dict()
+        rows = list(six.itervalues(data))
+        columns = list(six.iterkeys(data))
         return columns, rows
diff --git a/senlinclient/v1/profile_type.py b/senlinclient/v1/profile_type.py
index 563dbd8..7dfbf3b 100644
--- a/senlinclient/v1/profile_type.py
+++ b/senlinclient/v1/profile_type.py
@@ -63,6 +63,7 @@ class ProfileTypeShow(format_utils.YamlFormat):
         except sdk_exc.ResourceNotFound:
             raise exc.CommandError(_('Profile Type not found: %s')
                                    % parsed_args.type_name)
-        rows = list(six.itervalues(res))
-        columns = list(six.iterkeys(res))
+        data = res.to_dict()
+        rows = list(six.itervalues(data))
+        columns = list(six.iterkeys(data))
         return columns, rows
diff --git a/senlinclient/v1/receiver.py b/senlinclient/v1/receiver.py
index d8215bc..98b1b9a 100644
--- a/senlinclient/v1/receiver.py
+++ b/senlinclient/v1/receiver.py
@@ -142,8 +142,9 @@ def _show_receiver(senlin_client, receiver_id):
         'params': senlin_utils.json_formatter,
         'channel': senlin_utils.json_formatter,
     }
-    columns = sorted(list(six.iterkeys(receiver)))
-    return columns, utils.get_dict_properties(receiver.to_dict(), columns,
+    data = receiver.to_dict()
+    columns = sorted(list(six.iterkeys(data)))
+    return columns, utils.get_dict_properties(data, columns,
                                               formatters=formatters)
 
 
diff --git a/senlinclient/v1/shell.py b/senlinclient/v1/shell.py
index 6ef78e3..ce5ca7f 100644
--- a/senlinclient/v1/shell.py
+++ b/senlinclient/v1/shell.py
@@ -36,7 +36,7 @@ def do_build_info(service, args=None):
     :param args: Additional command line arguments, if any.
     """
     show_deprecated('senlin build-info', 'openstack cluster build info')
-    result = service.get_build_info()
+    result = service.get_build_info().to_dict()
 
     formatters = {
         'api': utils.json_formatter,
@@ -491,6 +491,33 @@ def do_cluster_create(service, args):
     _show_cluster(service, cluster.id)
 
 
+@utils.arg('-p', '--path', metavar='<PATH>',
+           help=_('A Json path string specifying the attribute to collect.'))
+@utils.arg('-L', '--list', default=False, action="store_true",
+           help=_('Print a full list that contains both node ids and '
+                  'attribute values instead of values only. Default is True.'))
+@utils.arg('-F', '--full-id', default=False, action="store_true",
+           help=_('Print full IDs in list.'))
+@utils.arg('id', metavar='<CLUSTER>',
+           help=_('Name or ID of cluster(s) to operate on.'))
+def do_cluster_collect(service, args):
+    """Collect attributes across a cluster."""
+    show_deprecated('senlin cluster-collect', 'openstack cluster collect')
+
+    attrs = service.cluster_collect(args.id, args.path)
+    if args.list:
+        fields = ['node_id', 'value']
+        formatters = {
+            'value': utils.json_formatter
+        }
+        if not args.full_id:
+            formatters['node_id'] = lambda x: x.node_id[:8]
+        utils.print_list(attrs, fields, formatters=formatters)
+    else:
+        for attr in attrs:
+            print(attr.value)
+
+
 @utils.arg('id', metavar='<CLUSTER>', nargs='+',
            help=_('Name or ID of cluster(s) to delete.'))
 def do_cluster_delete(service, args):
@@ -624,7 +651,7 @@ def do_cluster_node_del(service, args):
 @utils.arg('-t', '--min-step', metavar='<MIN_STEP>', type=int,
            help=_('An integer specifying the number of nodes for adjustment '
                   'when <PERCENTAGE> is specified.'))
-@utils.arg('-s', '--strict',  action='store_true', default=False,
+@utils.arg('-s', '--strict', action='store_true', default=False,
            help=_('A boolean specifying whether the resize should be '
                   'performed on a best-effort basis when the new capacity '
                   'may go beyond size constraints.'))
@@ -910,9 +937,8 @@ def do_node_list(service, args):
 
 def _show_node(service, node_id, show_details=False):
     """Show detailed info about the specified node."""
-    args = {'show_details': True} if show_details else None
     try:
-        node = service.get_node(node_id, args=args)
+        node = service.get_node(node_id, details=show_details)
     except sdk_exc.ResourceNotFound:
         raise exc.CommandError(_('Node not found: %s') % node_id)
 
@@ -923,7 +949,7 @@ def _show_node(service, node_id, show_details=False):
     data = node.to_dict()
     if show_details:
         formatters['details'] = utils.nested_dict_formatter(
-            list(node['details'].keys()), ['property', 'value'])
+            list(data['details'].keys()), ['property', 'value'])
 
     utils.print_dict(data, formatters=formatters)
 
@@ -1203,7 +1229,7 @@ def do_event_list(service, args):
     """List events."""
     show_deprecated('senlin event-list', 'openstack cluster event list')
     fields = ['id', 'timestamp', 'obj_type', 'obj_id', 'obj_name', 'action',
-              'status', 'status_reason', 'level']
+              'status', 'level', 'cluster_id']
     queries = {
         'sort': args.sort,
         'limit': args.limit,
@@ -1218,6 +1244,8 @@ def do_event_list(service, args):
     if not args.full_id:
         formatters['id'] = lambda x: x.id[:8]
         formatters['obj_id'] = lambda x: x.obj_id[:8] if x.obj_id else ''
+        formatters['cluster_id'] = (lambda x: x.cluster_id[:8]
+                                    if x.cluster_id else '')
 
     events = service.events(**queries)
     utils.print_list(events, fields, formatters=formatters)
@@ -1282,7 +1310,7 @@ def do_action_list(service, args):
         formatters['depended_by'] = f_depby
     else:
         formatters['id'] = lambda x: x.id[:8]
-        formatters['target'] = lambda x: x.target[:8]
+        formatters['target'] = lambda x: x.target_id[:8]
         f_depon = lambda x: '\n'.join(a[:8] for a in x.depends_on)
         f_depby = lambda x: '\n'.join(a[:8] for a in x.depended_by)
         formatters['depends_on'] = f_depon
diff --git a/tox.ini b/tox.ini
index 23c94bb..54674bf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -35,6 +35,7 @@ commands=
 commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
 
 [flake8]
+ignore = D100,D101,D102,D103,D104,D105,D200,D201,D202,D204,D205,D300,D301,D400,D401
 show-source = True
 exclude=.venv,.git,.tox,dist,*openstack/common*,*lib/python*,*egg,build
 max-complexity=20