diff --git a/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py
new file mode 100644
index 000000000..08d952fb1
--- /dev/null
+++ b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/018_instance_groups.py
@@ -0,0 +1,71 @@
+#    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.
+"""API Database migrations for instance_groups"""
+
+from migrate import UniqueConstraint
+from sqlalchemy import Column
+from sqlalchemy import DateTime
+from sqlalchemy import ForeignKey
+from sqlalchemy import Index
+from sqlalchemy import Integer
+from sqlalchemy import MetaData
+from sqlalchemy import String
+from sqlalchemy import Table
+
+
+def upgrade(migrate_engine):
+    meta = MetaData()
+    meta.bind = migrate_engine
+
+    groups = Table('instance_groups', meta,
+        Column('created_at', DateTime),
+        Column('updated_at', DateTime),
+        Column('id', Integer, primary_key=True, nullable=False),
+        Column('user_id', String(length=255)),
+        Column('project_id', String(length=255)),
+        Column('uuid', String(length=36), nullable=False),
+        Column('name', String(length=255)),
+        UniqueConstraint('uuid',
+                         name='uniq_instance_groups0uuid'),
+        mysql_engine='InnoDB',
+        mysql_charset='utf8',
+    )
+
+    groups.create(checkfirst=True)
+
+    group_policy = Table('instance_group_policy', meta,
+        Column('created_at', DateTime),
+        Column('updated_at', DateTime),
+        Column('id', Integer, primary_key=True, nullable=False),
+        Column('policy', String(length=255)),
+        Column('group_id', Integer, ForeignKey('instance_groups.id'),
+               nullable=False),
+        Index('instance_group_policy_policy_idx', 'policy'),
+        mysql_engine='InnoDB',
+        mysql_charset='utf8',
+    )
+
+    group_policy.create(checkfirst=True)
+
+    group_member = Table('instance_group_member', meta,
+        Column('created_at', DateTime),
+        Column('updated_at', DateTime),
+        Column('id', Integer, primary_key=True, nullable=False),
+        Column('instance_uuid', String(length=255)),
+        Column('group_id', Integer, ForeignKey('instance_groups.id'),
+               nullable=False),
+        Index('instance_group_member_instance_idx', 'instance_uuid'),
+        mysql_engine='InnoDB',
+        mysql_charset='utf8',
+    )
+
+    group_member.create(checkfirst=True)
diff --git a/nova/db/sqlalchemy/api_models.py b/nova/db/sqlalchemy/api_models.py
index 953499394..af517d220 100644
--- a/nova/db/sqlalchemy/api_models.py
+++ b/nova/db/sqlalchemy/api_models.py
@@ -344,3 +344,58 @@ class ResourceProviderAggregate(API_BASE):
 
     resource_provider_id = Column(Integer, primary_key=True, nullable=False)
     aggregate_id = Column(Integer, primary_key=True, nullable=False)
+
+
+class InstanceGroupMember(API_BASE):
+    """Represents the members for an instance group."""
+    __tablename__ = 'instance_group_member'
+    __table_args__ = (
+        Index('instance_group_member_instance_idx', 'instance_uuid'),
+    )
+    id = Column(Integer, primary_key=True, nullable=False)
+    instance_uuid = Column(String(255))
+    group_id = Column(Integer, ForeignKey('instance_groups.id'),
+                      nullable=False)
+
+
+class InstanceGroupPolicy(API_BASE):
+    """Represents the policy type for an instance group."""
+    __tablename__ = 'instance_group_policy'
+    __table_args__ = (
+        Index('instance_group_policy_policy_idx', 'policy'),
+    )
+    id = Column(Integer, primary_key=True, nullable=False)
+    policy = Column(String(255))
+    group_id = Column(Integer, ForeignKey('instance_groups.id'),
+                      nullable=False)
+
+
+class InstanceGroup(API_BASE):
+    """Represents an instance group.
+
+    A group will maintain a collection of instances and the relationship
+    between them.
+    """
+
+    __tablename__ = 'instance_groups'
+    __table_args__ = (
+        schema.UniqueConstraint('uuid', name='uniq_instance_groups0uuid'),
+    )
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    user_id = Column(String(255))
+    project_id = Column(String(255))
+    uuid = Column(String(36), nullable=False)
+    name = Column(String(255))
+    _policies = orm.relationship(InstanceGroupPolicy,
+            primaryjoin='InstanceGroup.id == InstanceGroupPolicy.group_id')
+    _members = orm.relationship(InstanceGroupMember,
+            primaryjoin='InstanceGroup.id == InstanceGroupMember.group_id')
+
+    @property
+    def policies(self):
+        return [p.policy for p in self._policies]
+
+    @property
+    def members(self):
+        return [m.instance_uuid for m in self._members]