diff --git a/tempest/api/identity/admin/v3/test_groups.py b/tempest/api/identity/admin/v3/test_groups.py
new file mode 100644
index 0000000..ca8ca54
--- /dev/null
+++ b/tempest/api/identity/admin/v3/test_groups.py
@@ -0,0 +1,84 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# 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.
+
+from tempest.api.identity import base
+from tempest.common.utils import data_utils
+from tempest import test
+
+
+class GroupsV3TestJSON(base.BaseIdentityAdminTest):
+    _interface = 'json'
+
+    @classmethod
+    def setUpClass(cls):
+        super(GroupsV3TestJSON, cls).setUpClass()
+
+    @test.attr(type='smoke')
+    def test_group_create_update_get(self):
+        name = data_utils.rand_name('Group')
+        description = data_utils.rand_name('Description')
+        resp, group = self.v3_client.create_group(name,
+                                                  description=description)
+        self.addCleanup(self.v3_client.delete_group, group['id'])
+        self.assertEqual(resp['status'], '201')
+        self.assertEqual(group['name'], name)
+        self.assertEqual(group['description'], description)
+
+        new_name = data_utils.rand_name('UpdateGroup')
+        new_desc = data_utils.rand_name('UpdateDescription')
+        resp, updated_group = self.v3_client.update_group(group['id'],
+                                                          name=new_name,
+                                                          description=new_desc)
+        self.assertEqual(resp['status'], '200')
+        self.assertEqual(updated_group['name'], new_name)
+        self.assertEqual(updated_group['description'], new_desc)
+
+        resp, new_group = self.v3_client.get_group(group['id'])
+        self.assertEqual(resp['status'], '200')
+        self.assertEqual(group['id'], new_group['id'])
+        self.assertEqual(new_name, new_group['name'])
+        self.assertEqual(new_desc, new_group['description'])
+
+    @test.attr(type='smoke')
+    def test_group_users_add_list_delete(self):
+        name = data_utils.rand_name('Group')
+        resp, group = self.v3_client.create_group(name)
+        self.addCleanup(self.v3_client.delete_group, group['id'])
+        # add user into group
+        users = []
+        for i in range(3):
+            name = data_utils.rand_name('User')
+            resp, user = self.v3_client.create_user(name)
+            users.append(user)
+            self.addCleanup(self.v3_client.delete_user, user['id'])
+            self.v3_client.add_group_user(group['id'], user['id'])
+
+        # list users in group
+        resp, group_users = self.v3_client.list_group_users(group['id'])
+        self.assertEqual(resp['status'], '200')
+        self.assertEqual(users.sort(), group_users.sort())
+        # delete user in group
+        for user in users:
+            resp, body = self.v3_client.delete_group_user(group['id'],
+                                                          user['id'])
+            self.assertEqual(resp['status'], '204')
+        resp, group_users = self.v3_client.list_group_users(group['id'])
+        self.assertEqual(len(group_users), 0)
+
+
+class GroupsV3TestXML(GroupsV3TestJSON):
+    _interface = 'xml'
diff --git a/tempest/services/identity/v3/json/identity_client.py b/tempest/services/identity/v3/json/identity_client.py
index e457c1f..f980faa 100644
--- a/tempest/services/identity/v3/json/identity_client.py
+++ b/tempest/services/identity/v3/json/identity_client.py
@@ -274,11 +274,50 @@
         body = json.loads(body)
         return resp, body['group']
 
+    def get_group(self, group_id):
+        """Get group details."""
+        resp, body = self.get('groups/%s' % group_id, self.headers)
+        body = json.loads(body)
+        return resp, body['group']
+
+    def update_group(self, group_id, **kwargs):
+        """Updates a group."""
+        resp, body = self.get_group(group_id)
+        name = kwargs.get('name', body['name'])
+        description = kwargs.get('description', body['description'])
+        post_body = {
+            'name': name,
+            'description': description
+        }
+        post_body = json.dumps({'group': post_body})
+        resp, body = self.patch('groups/%s' % group_id, post_body,
+                                self.headers)
+        body = json.loads(body)
+        return resp, body['group']
+
     def delete_group(self, group_id):
         """Delete a group."""
         resp, body = self.delete('groups/%s' % str(group_id))
         return resp, body
 
+    def add_group_user(self, group_id, user_id):
+        """Add user into group."""
+        resp, body = self.put('groups/%s/users/%s' % (group_id, user_id),
+                              None, self.headers)
+        return resp, body
+
+    def list_group_users(self, group_id):
+        """List users in group."""
+        resp, body = self.get('groups/%s/users' % group_id, self.headers)
+        body = json.loads(body)
+        return resp, body['users']
+
+    def delete_group_user(self, group_id, user_id):
+        """Delete user in group."""
+        resp, body = self.delete('groups/%s/users/%s' % (group_id, user_id),
+                                 self.headers)
+        return resp, body
+
     def assign_user_role_on_project(self, project_id, user_id, role_id):
         """Add roles to a user on a project."""
         resp, body = self.put('projects/%s/users/%s/roles/%s' %
diff --git a/tempest/services/identity/v3/xml/identity_client.py b/tempest/services/identity/v3/xml/identity_client.py
index 3fffc1f..59c5cf5 100644
--- a/tempest/services/identity/v3/xml/identity_client.py
+++ b/tempest/services/identity/v3/xml/identity_client.py
@@ -52,6 +52,14 @@
                 array.append(xml_to_json(child))
         return array
 
+    def _parse_group_users(self, node):
+        array = []
+        for child in node.getchildren():
+            tag_list = child.tag.split('}', 1)
+            if tag_list[1] == "user":
+                array.append(xml_to_json(child))
+        return array
+
     def _parse_roles(self, node):
         array = []
         for child in node.getchildren():
@@ -318,11 +326,50 @@
         body = self._parse_body(etree.fromstring(body))
         return resp, body
 
+    def get_group(self, group_id):
+        """Get group details."""
+        resp, body = self.get('groups/%s' % group_id, self.headers)
+        body = self._parse_body(etree.fromstring(body))
+        return resp, body
+
+    def update_group(self, group_id, **kwargs):
+        """Updates a group."""
+        resp, body = self.get_group(group_id)
+        name = kwargs.get('name', body['name'])
+        description = kwargs.get('description', body['description'])
+        post_body = Element("group",
+                            xmlns=XMLNS,
+                            name=name,
+                            description=description)
+        resp, body = self.patch('groups/%s' % group_id,
+                                str(Document(post_body)),
+                                self.headers)
+        body = self._parse_body(etree.fromstring(body))
+        return resp, body
+
     def delete_group(self, group_id):
         """Delete a group."""
         resp, body = self.delete('groups/%s' % group_id, self.headers)
         return resp, body
 
+    def add_group_user(self, group_id, user_id):
+        """Add user into group."""
+        resp, body = self.put('groups/%s/users/%s' % (group_id, user_id),
+                              '', self.headers)
+        return resp, body
+
+    def list_group_users(self, group_id):
+        """List users in group."""
+        resp, body = self.get('groups/%s/users' % group_id, self.headers)
+        body = self._parse_group_users(etree.fromstring(body))
+        return resp, body
+
+    def delete_group_user(self, group_id, user_id):
+        """Delete user in group."""
+        resp, body = self.delete('groups/%s/users/%s' % (group_id, user_id),
+                                 self.headers)
+        return resp, body
+
     def assign_user_role_on_project(self, project_id, user_id, role_id):
         """Add roles to a user on a project."""
         resp, body = self.put('projects/%s/users/%s/roles/%s' %
