diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee
index 54de93a4e0416c308f4cddb0d4ed86c560a2ea5a..2499ad5ad80b7e0c363e1ff4cb4b7b6f891e486d 100644
--- a/app/assets/javascripts/issues.js.coffee
+++ b/app/assets/javascripts/issues.js.coffee
@@ -43,25 +43,31 @@
 
     $(".selected_issue").bind "change", Issues.checkChanged
 
-
+  # Make sure we trigger ajax request only after user stop typing
   initSearch: ->
-    form = $("#issue_search_form")
-    last_terms = ""
+    @timer = null
     $("#issue_search").keyup ->
-      terms = $(this).val()
-      unless terms is last_terms
-        last_terms = terms
-        if terms.length >= 2 or terms.length is 0
-          $.ajax
-            type: "GET"
-            url: location.href
-            data: "issue_search=" + terms
-            complete: ->
-              $(".loading").hide()
-            success: (data) ->
-              $('.issues-holder').html(data.html)
-              Issues.reload()
-            dataType: "json"
+      clearTimeout(@timer);
+      @timer = setTimeout(Issues.filterResults, 500)
+
+  filterResults: =>
+    form = $("#issue_search_form")
+    search = $("#issue_search").val()
+    $('.issues-holder').css("opacity", '0.5')
+    issues_url = form.attr('action') + '? '+ form.serialize()
+
+    $.ajax
+      type: "GET"
+      url: form.attr('action')
+      data: form.serialize()
+      complete: ->
+        $('.issues-holder').css("opacity", '1.0')
+      success: (data) ->
+        $('.issues-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
+        Issues.reload()
+      dataType: "json"
 
   checkChanged: ->
     checked_issues = $(".selected_issue:checked")
diff --git a/app/views/projects/issues/_head.html.haml b/app/views/projects/issues/_head.html.haml
index dad547d4ebc0627782732a2219ed0158a7160da0..82cde14e05dad016f75e378a422c9be4c964549b 100644
--- a/app/views/projects/issues/_head.html.haml
+++ b/app/views/projects/issues/_head.html.haml
@@ -24,7 +24,7 @@
           %i.icon.icon-list
         = form_tag project_issues_path(@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, nil, { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' }
+            = 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']
diff --git a/features/steps/project/issues.rb b/features/steps/project/issues.rb
index ab2d7cee2e3830ab41b7674ef6416c21f1f80c20..32a3a0d3f565577d79220faba6294234f3c6516e 100644
--- a/features/steps/project/issues.rb
+++ b/features/steps/project/issues.rb
@@ -74,34 +74,34 @@ class ProjectIssues < Spinach::FeatureSteps
   end
 
   Given 'I fill in issue search with "Re"' do
-    fill_in 'issue_search', with: "Re"
+    filter_issue "Re"
   end
 
   Given 'I fill in issue search with "Bu"' do
-    fill_in 'issue_search', with: "Bu"
+    filter_issue "Bu"
   end
 
   And 'I fill in issue search with ".3"' do
-    fill_in 'issue_search', with: ".3"
+    filter_issue ".3"
   end
 
   And 'I fill in issue search with "Something"' do
-    fill_in 'issue_search', with: "Something"
+    filter_issue "Something"
   end
 
   And 'I fill in issue search with ""' do
-    fill_in 'issue_search', with: ""
+    filter_issue ""
   end
 
   Given 'project "Shop" has milestone "v2.2"' do
-    project = Project.find_by(name: "Shop")
+
     milestone = create(:milestone, title: "v2.2", project: project)
 
     3.times { create(:issue, project: project, milestone: milestone) }
   end
 
   And 'project "Shop" has milestone "v3.0"' do
-    project = Project.find_by(name: "Shop")
+
     milestone = create(:milestone, title: "v3.0", project: project)
 
     3.times { create(:issue, project: project, milestone: milestone) }
@@ -117,20 +117,20 @@ class ProjectIssues < Spinach::FeatureSteps
   end
 
   When 'I select first assignee from "Shop" project' do
-    project = Project.find_by(name: "Shop")
+
     first_assignee = project.users.first
     select first_assignee.name, from: "assignee_id"
   end
 
   Then 'I should see first assignee from "Shop" as selected assignee' do
     issues_assignee_selector = "#issue_assignee_id_chzn > a"
-    project = Project.find_by(name: "Shop")
+
     assignee_name = project.users.first.name
     page.find(issues_assignee_selector).should have_content(assignee_name)
   end
 
   And 'project "Shop" have "Release 0.4" open issue' do
-    project = Project.find_by(name: "Shop")
+
     create(:issue,
            title: "Release 0.4",
            project: project,
@@ -140,7 +140,6 @@ class ProjectIssues < Spinach::FeatureSteps
   end
 
   And 'project "Shop" have "Tweet control" open issue' do
-    project = Project.find_by(name: "Shop")
     create(:issue,
            title: "Tweet control",
            project: project,
@@ -148,7 +147,6 @@ class ProjectIssues < Spinach::FeatureSteps
   end
 
   And 'project "Shop" have "Release 0.3" closed issue' do
-    project = Project.find_by(name: "Shop")
     create(:closed_issue,
            title: "Release 0.3",
            project: project,
@@ -189,25 +187,23 @@ class ProjectIssues < Spinach::FeatureSteps
   end
 
   step 'project \'Shop\' has issue \'Bugfix1\' with description: \'Description for issue1\'' do
-    project = Project.find_by(name: 'Shop')
     issue = create(:issue, title: 'Bugfix1', description: 'Description for issue1', project: project)
   end
 
   step 'project \'Shop\' has issue \'Feature1\' with description: \'Feature submitted for issue1\'' do
-    project = Project.find_by(name: 'Shop')
     issue = create(:issue, title: 'Feature1', description: 'Feature submitted for issue1', project: project)
   end
 
   step 'I fill in issue search with \'Description for issue1\'' do
-    fill_in 'issue_search', with: 'Description for issue'
+    filter_issue 'Description for issue'
   end
 
   step 'I fill in issue search with \'issue1\'' do
-    fill_in 'issue_search', with: 'issue1'
+    filter_issue 'issue1'
   end
 
   step 'I fill in issue search with \'Rock and roll\'' do
-    fill_in 'issue_search', with: 'Description for issue'
+    filter_issue 'Description for issue'
   end
 
   step 'I should see \'Bugfix1\' in issues' do
@@ -221,4 +217,15 @@ class ProjectIssues < Spinach::FeatureSteps
   step 'I should not see \'Bugfix1\' in issues' do
     page.should_not have_content 'Bugfix1'
   end
+
+  def filter_issue(text)
+    fill_in 'issue_search', with: text
+
+    # make sure AJAX request finished
+    URI.parse(current_url).request_uri == project_issues_path(project, issue_search: text)
+  end
+
+  def project
+    @project ||= Project.find_by(name: 'Shop')
+  end
 end