diff --git a/CHANGELOG b/CHANGELOG
index 3e0bf6e700ae51b72ce0c52a14bfe9f13ec5d993..97376c85ece16a1aa58b35a54f7c9b12cf7317d3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -59,6 +59,7 @@ v 7.9.0 (unreleased)
   - Added blue thmeme
   - Remove annoying notice messages when create/update merge request
   - Allow smb:// links in Markdown text.
+  - Filter merge request by title or description at Merge Requests page
   - Block user if he/she was blocked in Active Directory
 
 v 7.8.4
diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index 928232e95bdde6730279088390ae0446e0822a10..e1015a63d52deb0f8a95cb853e7ebc929e450f37 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -52,6 +52,7 @@ class Dispatcher
         new ZenMode()
       when 'projects:merge_requests:index'
         shortcut_handler = new ShortcutsNavigation()
+        MergeRequests.init()
       when 'dashboard:show'
         new Dashboard()
         new Activities()
diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee
index 6513f4bcefc3e89549966b035ff2ef54253d9a8a..40bb9e9cb0cc45f1d79d96959b0635ba91379986 100644
--- a/app/assets/javascripts/issues.js.coffee
+++ b/app/assets/javascripts/issues.js.coffee
@@ -47,7 +47,7 @@
   initSearch: ->
     @timer = null
     $("#issue_search").keyup ->
-      clearTimeout(@timer);
+      clearTimeout(@timer)
       @timer = setTimeout(Issues.filterResults, 500)
 
   filterResults: =>
diff --git a/app/assets/javascripts/merge_requests.js.coffee b/app/assets/javascripts/merge_requests.js.coffee
index 9201c84c5edcf851d696993dda8fa7dac6aa7846..83434c1b9ba0e7b7702c63ae01f95506c400159a 100644
--- a/app/assets/javascripts/merge_requests.js.coffee
+++ b/app/assets/javascripts/merge_requests.js.coffee
@@ -1,8 +1,35 @@
 #
 # * Filter merge requests
 #
-@merge_requestsPage = ->
-  $('#assignee_id').select2()
-  $('#milestone_id').select2()
-  $('#milestone_id, #assignee_id').on 'change', ->
-    $(this).closest('form').submit()
+@MergeRequests =
+  init: ->
+    MergeRequests.initSearch()
+
+  # Make sure we trigger ajax request only after user stop typing
+  initSearch: ->
+    @timer = null
+    $("#issue_search").keyup ->
+      clearTimeout(@timer)
+      @timer = setTimeout(MergeRequests.filterResults, 500)
+
+  filterResults: =>
+    form = $("#issue_search_form")
+    search = $("#issue_search").val()
+    $('.merge-requests-holder').css("opacity", '0.5')
+    issues_url = form.attr('action') + '? '+ form.serialize()
+
+    $.ajax
+      type: "GET"
+      url: form.attr('action')
+      data: form.serialize()
+      complete: ->
+        $('.merge-requests-holder').css("opacity", '1.0')
+      success: (data) ->
+        $('.merge-requests-holder').html(data.html)
+        # Change url so if user reload a page - search results are saved
+        History.replaceState {page: issues_url}, document.title, issues_url
+        MergeRequests.reload()
+      dataType: "json"
+
+  reload: ->
+    $('#filter_issue_search').val($('#issue_search').val())
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 10c34584c8a1892b663dad742db88863ae9e9fda..93d79d81661ae9b5c951d86faae8e3642ffa410a 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -17,8 +17,19 @@ class Projects::MergeRequestsController < Projects::ApplicationController
   before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort]
 
   def index
+    terms = params['issue_search']
     @merge_requests = get_merge_requests_collection
+    @merge_requests = @merge_requests.full_search(terms) if terms.present?
     @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
+
+    respond_to do |format|
+      format.html
+      format.json do
+        render json: {
+          html: view_to_html_string("projects/merge_requests/_merge_requests")
+        }
+      end
+    end
   end
 
   def show
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index cbbcb1d06c0483aac0d4ef2f2be8903badc3adbb..2cb94d10b6fa4c1b3a1bc68e3d2c8d5b733045a9 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -6,14 +6,7 @@
           = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do
             %i.fa.fa-rss
 
-      = form_tag namespace_project_issues_path(@project.namespace, @project), method: :get, id: "issue_search_form", class: 'pull-left issue-search-form'  do
-        .append-right-10.hidden-xs.hidden-sm
-          = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
-          = hidden_field_tag :state, params['state']
-          = hidden_field_tag :scope, params['scope']
-          = hidden_field_tag :assignee_id, params['assignee_id']
-          = hidden_field_tag :milestone_id, params['milestone_id']
-          = hidden_field_tag :label_id, params['label_id']
+      = render 'shared/issuable_search_form', path: namespace_project_issues_path(@project.namespace, @project)
 
     - if can? current_user, :write_issue, @project
       = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do
diff --git a/app/views/projects/merge_requests/_merge_requests.html.haml b/app/views/projects/merge_requests/_merge_requests.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..b8a0ca9a42f31cf6aaa35adaa798e209fd2fdd34
--- /dev/null
+++ b/app/views/projects/merge_requests/_merge_requests.html.haml
@@ -0,0 +1,13 @@
+.panel.panel-default
+  %ul.well-list.mr-list
+    = render @merge_requests
+    - if @merge_requests.blank?
+      %li
+        .nothing-here-block No merge requests to show
+
+- if @merge_requests.present?
+  .pull-right
+    %span.cgray.pull-right #{@merge_requests.total_count} merge requests for this filter
+
+  = paginate @merge_requests, theme: "gitlab"
+
diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml
index e3b9a28033b7b677e5c47da00cc8b30f3bad69f6..d7992bdd19ea8a0412d94cebcaa28598514c83ff 100644
--- a/app/views/projects/merge_requests/index.html.haml
+++ b/app/views/projects/merge_requests/index.html.haml
@@ -1,22 +1,11 @@
-.merge-requests-holder
-  .append-bottom-10
-    .pull-right
-      - if can? current_user, :write_merge_request, @project
-        = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do
-          %i.fa.fa-plus
-          New Merge Request
-    = render 'shared/issuable_filter'
-  .panel.panel-default
-    %ul.well-list.mr-list
-      = render @merge_requests
-      - if @merge_requests.blank?
-        %li
-          .nothing-here-block No merge requests to show
-  - if @merge_requests.present?
-    .pull-right
-      %span.cgray.pull-right #{@merge_requests.total_count} merge requests for this filter
-
-    = paginate @merge_requests, theme: "gitlab"
+.append-bottom-10
+  .pull-right
+    = render 'shared/issuable_search_form', path: namespace_project_merge_requests_path(@project.namespace, @project)
 
-:javascript
-  $(merge_requestsPage);
+    - if can? current_user, :write_merge_request, @project
+      = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do
+        %i.fa.fa-plus
+        New Merge Request
+  = render 'shared/issuable_filter'
+.merge-requests-holder
+  = render 'merge_requests'
diff --git a/app/views/shared/_issuable_search_form.html.haml b/app/views/shared/_issuable_search_form.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..639d203dcd69007e543e4d433301685a1796dd0c
--- /dev/null
+++ b/app/views/shared/_issuable_search_form.html.haml
@@ -0,0 +1,9 @@
+= form_tag(path, method: :get, id: "issue_search_form", class: 'pull-left issue-search-form') do
+  .append-right-10.hidden-xs.hidden-sm
+    = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
+    = hidden_field_tag :state, params['state']
+    = hidden_field_tag :scope, params['scope']
+    = hidden_field_tag :assignee_id, params['assignee_id']
+    = hidden_field_tag :author_id, params['author_id']
+    = hidden_field_tag :milestone_id, params['milestone_id']
+    = hidden_field_tag :label_id, params['label_id']
diff --git a/features/project/merge_requests.feature b/features/project/merge_requests.feature
index 7c029f05d7502cb010b3a014060aa82be6464d07..adad100e56c03c88114b6e658151b95185d4f7a1 100644
--- a/features/project/merge_requests.feature
+++ b/features/project/merge_requests.feature
@@ -218,3 +218,10 @@ Feature: Project Merge Requests
     And I click link "Edit" for the merge request
     And I preview a description text like "Bug fixed :smile:"
     Then I should see the Markdown write tab
+
+  @javascript
+  Scenario: I search merge request
+    Given I click link "All"
+    When I fill in merge request search with "Fe"
+    Then I should see "Feature NS-03" in merge requests
+    And I should not see "Bug NS-04" in merge requests
diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb
index 263f2ef243824348d02d43a835a758dbffeffc32..b67b2e58cafa8f9fa0e619ef4d6faf6c5687552a 100644
--- a/features/steps/project/merge_requests.rb
+++ b/features/steps/project/merge_requests.rb
@@ -276,6 +276,10 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps
     end
   end
 
+  step 'I fill in merge request search with "Fe"' do
+    fill_in 'issue_search', with: "Fe"
+  end
+
   def merge_request
     @merge_request ||= MergeRequest.find_by!(title: "Bug NS-05")
   end