diff --git a/app/models/diff_note.rb b/app/models/diff_note.rb
index 9671955db360c77283082556fc3ba9314b1dc3be..d76ac51af0fe7c28efc93ac7e855fe632892db7e 100644
--- a/app/models/diff_note.rb
+++ b/app/models/diff_note.rb
@@ -4,11 +4,14 @@ class DiffNote < Note
   serialize :original_position, Gitlab::Diff::Position
   serialize :position, Gitlab::Diff::Position
 
+  belongs_to :resolved_by, class_name: "User"
+
   validates :original_position, presence: true
   validates :position, presence: true
   validates :diff_line, presence: true
   validates :line_code, presence: true, line_code: true
   validates :noteable_type, inclusion: { in: ['Commit', 'MergeRequest'] }
+  validates :resolved_by, presence: true, if: :resolved?
   validate :positions_complete
   validate :verify_supported
 
@@ -72,6 +75,16 @@ class DiffNote < Note
     self.position.diff_refs == diff_refs
   end
 
+  def resolvable?
+    !system? && !for_commit?
+  end
+
+  def resolved?
+    return false unless resolvable?
+
+    self.resolved_at.present?
+  end
+
   private
 
   def supported?
diff --git a/app/models/note.rb b/app/models/note.rb
index b6b2ac6aa42f8a1db950833ab5be79ba28cf018e..2aff2b40a48777155c3278a1df79a4eb0754e41f 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -128,6 +128,18 @@ class Note < ActiveRecord::Base
     true
   end
 
+  def resolvable?
+    false
+  end
+
+  def resolved?
+    false
+  end
+
+  def to_be_resolved?
+    resolvable? && !resolved?
+  end
+
   def discussion_id
     @discussion_id ||=
       if for_merge_request?
diff --git a/db/migrate/20160724205507_add_resolved_to_notes.rb b/db/migrate/20160724205507_add_resolved_to_notes.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b8ebcdbd156019255d771a1097601d8b90a8698f
--- /dev/null
+++ b/db/migrate/20160724205507_add_resolved_to_notes.rb
@@ -0,0 +1,10 @@
+class AddResolvedToNotes < ActiveRecord::Migration
+  include Gitlab::Database::MigrationHelpers
+
+  DOWNTIME = false
+
+  def change
+    add_column :notes, :resolved_at, :datetime
+    add_column :notes, :resolved_by_id, :integer
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d541e1cccb710c3c67b416dce51bf9fd6696b8a9..9e031680c3066677373b6d1d6b539b4c0e7a8694 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: 20160721081015) do
+ActiveRecord::Schema.define(version: 20160724205507) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -705,6 +705,8 @@ ActiveRecord::Schema.define(version: 20160721081015) do
     t.string   "type"
     t.text     "position"
     t.text     "original_position"
+    t.datetime "resolved_at"
+    t.integer  "resolved_by_id"
   end
 
   add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree