diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb
index 7f68662de701c4f2552a9de6d09a8b645776f50b..e7eb4a18e34647668f816687e6836b7871b1938b 100644
--- a/app/models/members/group_member.rb
+++ b/app/models/members/group_member.rb
@@ -1,6 +1,8 @@
 class GroupMember < Member
   SOURCE_TYPE = 'Group'
 
+  belongs_to :group, class_name: 'Group', foreign_key: 'source_id'
+
   # Make sure group member points only to group as it source
   default_value_for :source_type, SOURCE_TYPE
   validates_format_of :source_type, with: /\AGroup\z/
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 403b87b7e36874e7639eb4faa279dbe45951e1ec..3f8137ed06ea67145841f1b674743afce4d189bb 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -3,6 +3,8 @@ class ProjectMember < Member
 
   include Gitlab::ShellAdapter
 
+  belongs_to :project, class_name: 'Project', foreign_key: 'source_id'
+
   # Make sure project member points only to project as it source
   default_value_for :source_type, SOURCE_TYPE
   validates_format_of :source_type, with: /\AProject\z/
diff --git a/app/models/user.rb b/app/models/user.rb
index ef006e07b6414234e67b9ba5e612bd40adaaad3b..d5a6b468fcd6efb79c158f42cf42add21ba6f2ec 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -85,8 +85,8 @@ class User < ActiveRecord::Base
   has_many :project_members, source: 'ProjectMember'
   has_many :group_members, source: 'GroupMember'
   has_many :groups, through: :group_members
-  has_many :owned_groups, -> { where group_members: { access_level: Gitlab::Access::OWNER } }, through: :group_members, source: :group
-  has_many :masters_groups, -> { where group_members: { access_level: Gitlab::Access::MASTER } }, through: :group_members, source: :group
+  has_many :owned_groups, -> { where members: { access_level: Gitlab::Access::OWNER } }, through: :group_members, source: :group
+  has_many :masters_groups, -> { where members: { access_level: Gitlab::Access::MASTER } }, through: :group_members, source: :group
 
   # Projects
   has_many :groups_projects,          through: :groups, source: :projects
@@ -97,7 +97,7 @@ class User < ActiveRecord::Base
   has_many :starred_projects, through: :users_star_projects, source: :project
 
   has_many :snippets,                 dependent: :destroy, foreign_key: :author_id, class_name: "Snippet"
-  has_many :project_members,           dependent: :destroy
+  has_many :project_members,          dependent: :destroy, class_name: 'ProjectMember'
   has_many :issues,                   dependent: :destroy, foreign_key: :author_id
   has_many :notes,                    dependent: :destroy, foreign_key: :author_id
   has_many :merge_requests,           dependent: :destroy, foreign_key: :author_id
diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb
index 7de85c51805f23a184031a860c08102ab4a1dfce..a6b68749a711328cb4bb12e8e9e87fec028959ff 100644
--- a/app/services/system_hooks_service.rb
+++ b/app/services/system_hooks_service.rb
@@ -54,7 +54,7 @@ class SystemHooksService
       data.merge!({
         project_name: model.project.name,
         project_path: model.project.path,
-        project_id: model.project_id,
+        project_id: model.project.id,
         user_name: model.user.name,
         user_email: model.user.email,
         access_level: model.human_access,
diff --git a/db/migrate/20140914113604_add_members_table.rb b/db/migrate/20140914113604_add_members_table.rb
index 1738c8dc655fe463eb94290cdc5331af0fd87024..d311f3033ee65d75156391b27cfecffb6a02785e 100644
--- a/db/migrate/20140914113604_add_members_table.rb
+++ b/db/migrate/20140914113604_add_members_table.rb
@@ -10,5 +10,10 @@ class AddMembersTable < ActiveRecord::Migration
 
       t.timestamps
     end
+
+    add_index :members, :type
+    add_index :members, :user_id
+    add_index :members, :access_level
+    add_index :members, [:source_id, :source_type]
   end
 end
diff --git a/db/migrate/20140914145549_migrate_to_new_members_model.rb b/db/migrate/20140914145549_migrate_to_new_members_model.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b4f7718f26df066a4bef7efe734dc257cccdecc6
--- /dev/null
+++ b/db/migrate/20140914145549_migrate_to_new_members_model.rb
@@ -0,0 +1,11 @@
+class MigrateToNewMembersModel < ActiveRecord::Migration
+  def up
+    execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, group_id, 'Group', group_access, notification_level, 'GroupMember' FROM users_groups"
+    execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, project_id, 'Project', project_access, notification_level, 'ProjectMember' FROM users_projects"
+  end
+
+  def down
+    Member.delete_all
+  end
+end
+
diff --git a/db/migrate/20140914145549_migrate_to_newmembers_model.rb b/db/migrate/20140914145549_migrate_to_newmembers_model.rb
deleted file mode 100644
index 9c4517f95e500df5173d294ea6613aad85388ae5..0000000000000000000000000000000000000000
--- a/db/migrate/20140914145549_migrate_to_newmembers_model.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-class MigrateToNewmembersModel < ActiveRecord::Migration
-  def up
-    UsersGroup.find_each(batch_size: 500) do |user_group|
-      GroupMember.create(
-        user_id: user_group.user_id,
-        source_type: 'Group',
-        source_id: user_group.group_id,
-        access_level: user_group.group_access,
-        notification_level: user_group.notification_level,
-      )
-
-      print '.'
-    end
-
-    UsersProject.find_each(batch_size: 500) do |user_project|
-      ProjectMember.create(
-        user_id: user_project.user_id,
-        source_type: 'Project',
-        source_id: user_project.project_id,
-        access_level: user_project.project_access,
-        notification_level: user_project.notification_level,
-      )
-
-      print '.'
-    end
-  end
-
-  def down
-    Member.destroy_all
-  end
-end
diff --git a/db/migrate/20140914173417_remove_old_member_tables.rb b/db/migrate/20140914173417_remove_old_member_tables.rb
new file mode 100644
index 0000000000000000000000000000000000000000..408b9551dbb466bdbf30284b741b8dfe2ed805c2
--- /dev/null
+++ b/db/migrate/20140914173417_remove_old_member_tables.rb
@@ -0,0 +1,26 @@
+class RemoveOldMemberTables < ActiveRecord::Migration
+  def up
+    drop_table :users_groups
+    drop_table :users_projects
+  end
+
+  def down
+    create_table :users_groups do |t|
+      t.integer :group_access, null: false
+      t.integer :group_id, null: false
+      t.integer :user_id, null: false
+      t.integer :notification_level, null: false, default: 3
+
+      t.timestamps
+    end
+
+    create_table :users_projects do |t|
+      t.integer :project_access, null: false
+      t.integer :project_id, null: false
+      t.integer :user_id, null: false
+      t.integer :notification_level, null: false, default: 3
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 41ae717c6707aed4685dcbdad2ebe0112184b180..4e249caa022c25e89b0572e7169ec6892630fe87 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20140914145549) do
+ActiveRecord::Schema.define(version: 20140914173417) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -141,6 +141,11 @@ ActiveRecord::Schema.define(version: 20140914145549) do
     t.datetime "updated_at"
   end
 
+  add_index "members", ["access_level"], name: "index_members_on_access_level", using: :btree
+  add_index "members", ["source_id", "source_type"], name: "index_members_on_source_id_and_source_type", using: :btree
+  add_index "members", ["type"], name: "index_members_on_type", using: :btree
+  add_index "members", ["user_id"], name: "index_members_on_user_id", using: :btree
+
   create_table "merge_request_diffs", force: true do |t|
     t.string   "state"
     t.text     "st_commits"
@@ -374,30 +379,6 @@ ActiveRecord::Schema.define(version: 20140914145549) do
   add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
   add_index "users", ["username"], name: "index_users_on_username", using: :btree
 
-  create_table "users_groups", force: true do |t|
-    t.integer  "group_access",                   null: false
-    t.integer  "group_id",                       null: false
-    t.integer  "user_id",                        null: false
-    t.datetime "created_at"
-    t.datetime "updated_at"
-    t.integer  "notification_level", default: 3, null: false
-  end
-
-  add_index "users_groups", ["user_id"], name: "index_users_groups_on_user_id", using: :btree
-
-  create_table "users_projects", force: true do |t|
-    t.integer  "user_id",                        null: false
-    t.integer  "project_id",                     null: false
-    t.datetime "created_at"
-    t.datetime "updated_at"
-    t.integer  "project_access",     default: 0, null: false
-    t.integer  "notification_level", default: 3, null: false
-  end
-
-  add_index "users_projects", ["project_access"], name: "index_users_projects_on_project_access", using: :btree
-  add_index "users_projects", ["project_id"], name: "index_users_projects_on_project_id", using: :btree
-  add_index "users_projects", ["user_id"], name: "index_users_projects_on_user_id", using: :btree
-
   create_table "users_star_projects", force: true do |t|
     t.integer  "project_id", null: false
     t.integer  "user_id",    null: false