diff --git a/db/migrate/20161031174110_migrate_subscriptions_project_id.rb b/db/migrate/20161031174110_migrate_subscriptions_project_id.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b890a29443193693192f4cc46d5d388eb7412c7b
--- /dev/null
+++ b/db/migrate/20161031174110_migrate_subscriptions_project_id.rb
@@ -0,0 +1,59 @@
+class MigrateSubscriptionsProjectId < ActiveRecord::Migration
+  include Gitlab::Database::MigrationHelpers
+
+  DOWNTIME = true
+  DOWNTIME_REASON = 'Subscriptions will not work as expected until this migration is complete.'
+
+  def up
+    if Gitlab::Database.mysql?
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+          INNER JOIN issues ON issues.id = subscriptions.subscribable_id AND subscriptions.subscribable_type = 'Issue'
+        SET subscriptions.project_id = issues.project_id;
+      EOF
+
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+          INNER JOIN merge_requests ON merge_requests.id = subscriptions.subscribable_id AND subscriptions.subscribable_type = 'MergeRequest'
+        SET subscriptions.project_id = merge_requests.target_project_id;
+      EOF
+
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+          INNER JOIN labels ON labels.id = subscriptions.subscribable_id AND subscriptions.subscribable_type = 'Label'
+          INNER JOIN projects ON projects.id = labels.project_id
+        SET subscriptions.project_id = projects.id;
+      EOF
+    else
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+        SET project_id = issues.project_id
+        FROM issues
+        WHERE issues.id = subscriptions.subscribable_id
+          AND subscriptions.subscribable_type = 'Issue';
+      EOF
+
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+        SET project_id = merge_requests.target_project_id
+        FROM merge_requests
+        WHERE merge_requests.id = subscriptions.subscribable_id
+          AND subscriptions.subscribable_type = 'MergeRequest';
+      EOF
+
+      execute <<-EOF.strip_heredoc
+        UPDATE subscriptions
+        SET project_id = projects.id
+        FROM labels INNER JOIN projects ON projects.id = labels.project_id
+        WHERE labels.id = subscriptions.subscribable_id
+          AND subscriptions.subscribable_type = 'Label';
+      EOF
+    end
+  end
+
+  def down
+    execute <<-EOF.strip_heredoc
+      UPDATE subscriptions SET project_id = NULL;
+    EOF
+  end
+end