diff --git a/features/projects/issues/issues.feature b/features/projects/issues/issues.feature
index 180710cf6bce8f108854d3e9cc768e97bfb63ff6..42a3d8736e02e6d6d1a9be5403728b340a913ce9 100644
--- a/features/projects/issues/issues.feature
+++ b/features/projects/issues/issues.feature
@@ -4,7 +4,7 @@ Feature: Issues
     And I own project "Shop"
     And project "Shop" have "Release 0.4" open issue
     And project "Shop" have "Release 0.3" closed issue
-    And I visit project "Shop" issues page 
+    And I visit project "Shop" issues page
 
   Scenario: I should see open issues
     Given I should see "Release 0.4" in issues
@@ -36,3 +36,31 @@ Feature: Issues
     Given I visit issue page "Release 0.4"
     And I leave a comment like "XML attached"
     Then I should see comment "XML attached"
+
+  @javascript
+  Scenario: I search issue
+    Given I fill in issue search with "Release"
+    Then I should see "Release 0.4" in issues
+    And I should not see "Release 0.3" in issues
+
+  @javascript
+  Scenario: I search issue that not exist
+    Given I fill in issue search with "Bug"
+    Then I should not see "Release 0.4" in issues
+    And I should not see "Release 0.3" in issues
+
+
+  @javascript
+  Scenario: I search all issues
+    Given I click link "All"
+    And I fill in issue search with "0.3"
+    Then I should see "Release 0.3" in issues
+    And I should not see "Release 0.4" in issues
+
+  @javascript
+  Scenario: I clear search
+    Given I click link "All"
+    And I fill in issue search with "Something"
+    And I fill in issue search with ""
+    Then I should see "Release 0.4" in issues
+    And I should see "Release 0.3" in issues
diff --git a/features/step_definitions/common_steps.rb b/features/step_definitions/common_steps.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e9023f9278fb543b9773562242c9f23b7723b9dd
--- /dev/null
+++ b/features/step_definitions/common_steps.rb
@@ -0,0 +1,21 @@
+include LoginHelpers
+
+Given /^I signin as a user$/ do
+  login_as :user
+end
+
+When /^I click link "(.*?)"$/ do |link|
+  click_link link
+end
+
+When /^I click button "(.*?)"$/ do |button|
+  click_button button
+end
+
+When /^I fill in "(.*?)" with "(.*?)"$/ do |field, value|
+  fill_in field, :with => value
+end
+
+Given /^show me page$/ do
+  save_and_open_page
+end
diff --git a/features/step_definitions/dashboard_steps.rb b/features/step_definitions/dashboard_steps.rb
index a4edd224dc035908bfcecffbd9b6eceaf5127c5e..867233c82cbd0368c121408a8e4786cc03d325e5 100644
--- a/features/step_definitions/dashboard_steps.rb
+++ b/features/step_definitions/dashboard_steps.rb
@@ -1,7 +1,3 @@
-Given /^I visit dashboard page$/ do
-  visit dashboard_path
-end
-
 Then /^I should see "(.*?)" link$/ do |arg1|
   page.should have_link(arg1)
 end
@@ -51,10 +47,10 @@ Then /^I click "(.*?)" link$/ do |arg1|
 end
 
 Then /^I see prefilled new Merge Request page$/ do
-  current_path.should == new_project_merge_request_path(@project) 
-  find("#merge_request_source_branch").value.should == "new_design" 
-  find("#merge_request_target_branch").value.should == "master" 
-  find("#merge_request_title").value.should == "New Design" 
+  current_path.should == new_project_merge_request_path(@project)
+  find("#merge_request_source_branch").value.should == "new_design"
+  find("#merge_request_target_branch").value.should == "master"
+  find("#merge_request_title").value.should == "New Design"
 end
 
 Given /^I visit dashboard search page$/ do
@@ -66,10 +62,6 @@ Given /^I search for "(.*?)"$/ do |arg1|
   click_button "Search"
 end
 
-Given /^I visit dashboard issues page$/ do
-  visit dashboard_issues_path
-end
-
 Then /^I should see issues assigned to me$/ do
   issues = @user.issues
   issues.each do |issue|
@@ -78,10 +70,6 @@ Then /^I should see issues assigned to me$/ do
   end
 end
 
-Given /^I visit dashboard merge requests page$/ do
-  visit dashboard_merge_requests_path
-end
-
 Then /^I should see my merge requests$/ do
   merge_requests = @user.merge_requests
   merge_requests.each do |mr|
diff --git a/features/step_definitions/profile/profile_steps.rb b/features/step_definitions/profile/profile_steps.rb
index 4661139c1808e209994c26bfb0ad2a81aaf5a830..525d43f5fdabc357253012f6c7f5faf108864bf9 100644
--- a/features/step_definitions/profile/profile_steps.rb
+++ b/features/step_definitions/profile/profile_steps.rb
@@ -1,17 +1,9 @@
-Given /^I visit profile page$/ do
-  visit profile_path
-end
-
 Then /^I should see my profile info$/ do
   page.should have_content "Profile"
   page.should have_content @user.name
   page.should have_content @user.email
 end
 
-Given /^I visit profile password page$/ do
-  visit profile_password_path
-end
-
 Then /^I change my password$/ do
   fill_in "user_password", :with => "222333"
   fill_in "user_password_confirmation", :with => "222333"
@@ -22,10 +14,6 @@ Then /^I should be redirected to sign in page$/ do
   current_path.should == new_user_session_path
 end
 
-Given /^I visit profile token page$/ do
-  visit profile_token_path
-end
-
 Then /^I reset my token$/ do
   @old_token = @user.private_token
   click_button "Reset"
diff --git a/features/step_definitions/project/browse_code_steps.rb b/features/step_definitions/project/browse_code_steps.rb
index 7f9001bb989a66e55bc190133e79b91710f42c41..d2ed9a0af28b56dce236ca409800cd63c12c8dea 100644
--- a/features/step_definitions/project/browse_code_steps.rb
+++ b/features/step_definitions/project/browse_code_steps.rb
@@ -1,17 +1,9 @@
-Given /^I visit project source page$/ do
-  visit tree_project_ref_path(@project, @project.root_ref)
-end
-
 Then /^I should see files from repository$/ do
   page.should have_content("app")
   page.should have_content("History")
   page.should have_content("Gemfile")
 end
 
-Given /^I visit project source page for "(.*?)"$/ do |arg1|
-  visit tree_project_ref_path(@project, arg1)
-end
-
 Then /^I should see files from repository for "(.*?)"$/ do |arg1|
   current_path.should == tree_project_ref_path(@project, arg1)
   page.should have_content("app")
@@ -31,10 +23,6 @@ Given /^I click on raw button$/ do
   click_link "raw"
 end
 
-Given /^I visit blob file from repo$/ do
-  visit tree_project_ref_path(@project, ValidCommit::ID, :path => ValidCommit::BLOB_FILE_PATH)
-end
-
 Then /^I should see raw file content$/ do
   page.source.should == ValidCommit::BLOB_FILE
 end
diff --git a/features/step_definitions/project/project_commits_steps.rb b/features/step_definitions/project/project_commits_steps.rb
index 35fcb4d11ab09ba47c75d3d28a3d154ccff58ce3..7f20ade41d1f9ccf508ca71e72b4c650cf0e2608 100644
--- a/features/step_definitions/project/project_commits_steps.rb
+++ b/features/step_definitions/project/project_commits_steps.rb
@@ -1,7 +1,3 @@
-Given /^I visit project commits page$/ do
-  visit project_commits_path(@project)
-end
-
 Then /^I see project commits$/ do
   current_path.should == project_commits_path(@project)
 
@@ -23,19 +19,11 @@ Then /^I see commits atom feed$/ do
   page.body.should have_selector("entry summary", :text => commit.description)
 end
 
-Given /^I click on commit link$/ do
-  visit project_commit_path(@project, ValidCommit::ID)
-end
-
 Then /^I see commit info$/ do
   page.should have_content ValidCommit::MESSAGE
   page.should have_content "Showing 1 changed file"
 end
 
-Given /^I visit compare refs page$/ do
-  visit compare_project_commits_path(@project)
-end
-
 Given /^I fill compare fields with refs$/ do
   fill_in "from", :with => "master"
   fill_in "to", :with => "stable"
@@ -48,18 +36,6 @@ Given /^I see compared refs$/ do
   page.should have_content "Showing 73 changed files"
 end
 
-Given /^I visit project branches page$/ do
-  visit branches_project_repository_path(@project)
-end
-
-Given /^I visit project commit page$/ do
-  visit project_commit_path(@project, ValidCommit::ID)
-end
-
-Given /^I visit project tags page$/ do
-  visit tags_project_repository_path(@project)
-end
-
 Then /^I should see "(.*?)" recent branches list$/ do |arg1|
   page.should have_content("Branches")
   page.should have_content("master")
@@ -76,7 +52,7 @@ Then /^I should see "(.*?)" all tags list$/ do |arg1|
 end
 
 Then /^I should see "(.*?)" protected branches list$/ do |arg1|
-  within "table" do 
+  within "table" do
     page.should have_content "stable"
     page.should_not have_content "master"
   end
diff --git a/features/step_definitions/project/project_issues_steps.rb b/features/step_definitions/project/project_issues_steps.rb
index 27de03d5489bf10c553a6c60eaaa69f649b00e55..e46c1f42f757c8a9ef91dcde2f1374f81c2878f3 100644
--- a/features/step_definitions/project/project_issues_steps.rb
+++ b/features/step_definitions/project/project_issues_steps.rb
@@ -8,16 +8,12 @@ Given /^project "(.*?)" have "(.*?)" closed issue$/ do |arg1, arg2|
   Factory.create(:issue, :title => arg2, :project => project, :author => project.users.first, :closed => true)
 end
 
-Given /^I visit project "(.*?)" issues page$/ do |arg1|
-  visit project_issues_path(Project.find_by_name(arg1))
-end
-
 Given /^I should see "(.*?)" in issues$/ do |arg1|
-  page.should have_content arg1 
+  page.should have_content arg1
 end
 
 Given /^I should not see "(.*?)" in issues$/ do |arg1|
-  page.should_not have_content arg1 
+  page.should_not have_content arg1
 end
 
 Then /^I should see issue "(.*?)"$/ do |arg1|
@@ -27,11 +23,6 @@ Then /^I should see issue "(.*?)"$/ do |arg1|
   page.should have_content issue.project.name
 end
 
-Given /^I visit issue page "(.*?)"$/ do |arg1|
-  issue = Issue.find_by_title(arg1)
-  visit project_issue_path(issue.project, issue)
-end
-
 Given /^I submit new issue "(.*?)"$/ do |arg1|
   fill_in "issue_title", with: arg1
   click_button "Submit new issue"
@@ -51,7 +42,16 @@ Given /^I visit project "(.*?)" labels page$/ do |arg1|
 end
 
 Then /^I should see label "(.*?)"$/ do |arg1|
-  within ".labels-table" do 
+  within ".labels-table" do
     page.should have_content arg1
   end
 end
+
+Given /^I fill in issue search with "(.*?)"$/ do |arg1|
+  # Because fill_in, with: "" triggers nothing
+  # we need to trigger a keyup event
+  if arg1 == ''
+    page.execute_script("$('.issue_search').val('').keyup();");
+  end
+  fill_in 'issue_search', with: arg1
+end
diff --git a/features/step_definitions/project/project_merge_requests_steps.rb b/features/step_definitions/project/project_merge_requests_steps.rb
index 2bdb967d3c5c3db607128c6cb74a652deeb0b2ea..fddb18add087374e80b2e09e23dadee8d41f999f 100644
--- a/features/step_definitions/project/project_merge_requests_steps.rb
+++ b/features/step_definitions/project/project_merge_requests_steps.rb
@@ -8,21 +8,17 @@ Given /^project "(.*?)" have "(.*?)" closed merge request$/ do |arg1, arg2|
   Factory.create(:merge_request, :title => arg2, :project => project, :author => project.users.first, :closed => true)
 end
 
-Given /^I visit project "(.*?)" merge requests page$/ do |arg1|
-  visit project_merge_requests_path(Project.find_by_name(arg1))
-end
-
 Then /^I should see "(.*?)" in merge requests$/ do |arg1|
-  page.should have_content arg1 
+  page.should have_content arg1
 end
 
 Then /^I should not see "(.*?)" in merge requests$/ do |arg1|
-  page.should_not have_content arg1 
+  page.should_not have_content arg1
 end
 
 Then /^I should see merge request "(.*?)"$/ do |arg1|
   merge_request = MergeRequest.find_by_title(arg1)
-  page.should have_content(merge_request.title[0..10]) 
+  page.should have_content(merge_request.title[0..10])
   page.should have_content(merge_request.target_branch)
   page.should have_content(merge_request.source_branch)
 end
@@ -34,11 +30,6 @@ Given /^I submit new merge request "(.*?)"$/ do |arg1|
   click_button "Save"
 end
 
-Given /^I visit merge request page "(.*?)"$/ do |arg1|
-  mr = MergeRequest.find_by_title(arg1)
-  visit project_merge_request_path(mr.project, mr)
-end
-
 Then /^I should see closed merge request "(.*?)"$/ do |arg1|
   mr = MergeRequest.find_by_title(arg1)
   mr.closed.should be_true
diff --git a/features/step_definitions/project/project_milestones_steps.rb b/features/step_definitions/project/project_milestones_steps.rb
index 6749773e2b5b46e1dbe8644893cae26518f5fcd1..936c52df8d78e2a39238c0583d7afd2907e5a6dd 100644
--- a/features/step_definitions/project/project_milestones_steps.rb
+++ b/features/step_definitions/project/project_milestones_steps.rb
@@ -12,11 +12,6 @@ Given /^project "(.*?)" has milestone "(.*?)"$/ do |arg1, arg2|
   end
 end
 
-Given /^I visit project "(.*?)" milestones page$/ do |arg1|
-  @project = Project.find_by_name(arg1)
-  visit project_milestones_path(@project)
-end
-
 Then /^I should see active milestones$/ do
   milestone = @project.milestones.first
   page.should have_content(milestone.title[0..10])
diff --git a/features/step_definitions/project/project_team_steps.rb b/features/step_definitions/project/project_team_steps.rb
index f0bab29a6f8380427912b4176e338ccfdfcb5006..0979a6ea8c35bba894f1fe4f5aa33d6fac5abebc 100644
--- a/features/step_definitions/project/project_team_steps.rb
+++ b/features/step_definitions/project/project_team_steps.rb
@@ -8,10 +8,6 @@ Given /^"(.*?)" is "(.*?)" developer$/ do |arg1, arg2|
   project.add_access(user, :write)
 end
 
-Given /^I visit project "(.*?)" team page$/ do |arg1|
-  visit team_project_path(Project.find_by_name(arg1))
-end
-
 Then /^I should be able to see myself in team$/ do
   page.should have_content(@user.name)
   page.should have_content(@user.email)
@@ -23,13 +19,9 @@ Then /^I should see "(.*?)" in team list$/ do |arg1|
   page.should have_content(user.email)
 end
 
-Given /^I click link "(.*?)"$/ do |arg1|
-  click_link arg1
-end
-
 Given /^I select "(.*?)" as "(.*?)"$/ do |arg1, arg2|
   user = User.find_by_name(arg1)
-  within "#new_team_member" do 
+  within "#new_team_member" do
     select user.name, :from => "team_member_user_id"
     select arg2, :from => "team_member_project_access"
   end
@@ -44,7 +36,7 @@ end
 
 Given /^I change "(.*?)" role to "(.*?)"$/ do |arg1, arg2|
   user = User.find_by_name(arg1)
-  within ".user_#{user.id}" do 
+  within ".user_#{user.id}" do
     select arg2, :from => "team_member_project_access"
   end
 end
diff --git a/features/step_definitions/project/project_wiki_steps.rb b/features/step_definitions/project/project_wiki_steps.rb
index 10de38d9ae3df74e1876e501514c9075f500c643..31fc050aa4c3c744ce5fafe6a5b13cdc138ebdb5 100644
--- a/features/step_definitions/project/project_wiki_steps.rb
+++ b/features/step_definitions/project/project_wiki_steps.rb
@@ -1,7 +1,3 @@
-Given /^I visit project wiki page$/ do
-  visit project_wiki_path(@project, :index)
-end
-
 Given /^I create Wiki page$/ do
   fill_in "Title", :with => 'Test title'
   fill_in "Content", :with => '[link test](test)'
diff --git a/features/step_definitions/project/projects_steps.rb b/features/step_definitions/project/projects_steps.rb
index d981e1f380290601f301b86698e4ac61fecab54f..d22b805f1dfc35d4e89b1bdeff94ac1b555faf21 100644
--- a/features/step_definitions/project/projects_steps.rb
+++ b/features/step_definitions/project/projects_steps.rb
@@ -1,9 +1,3 @@
-include LoginHelpers
-
-Given /^I signin as a user$/ do
-  login_as :user
-end
-
 When /^I visit new project page$/ do
   visit new_project_path
 end
@@ -65,10 +59,6 @@ Given /^I visit project "(.*?)" network page$/ do |arg1|
   visit graph_project_path(project)
 end
 
-Given /^show me page$/ do
-  save_and_open_page
-end
-
 Given /^page should have network graph$/ do
   page.should have_content "Project Network Graph"
   within ".graph" do
diff --git a/features/step_definitions/visit_steps.rb b/features/step_definitions/visit_steps.rb
new file mode 100644
index 0000000000000000000000000000000000000000..35fc6d44a159a28afc6a1a4f4ea9206b2b43b108
--- /dev/null
+++ b/features/step_definitions/visit_steps.rb
@@ -0,0 +1,91 @@
+Given /^I visit project "(.*?)" issues page$/ do |arg1|
+  visit project_issues_path(Project.find_by_name(arg1))
+end
+
+Given /^I visit issue page "(.*?)"$/ do |arg1|
+  issue = Issue.find_by_title(arg1)
+  visit project_issue_path(issue.project, issue)
+end
+
+Given /^I visit project "(.*?)" merge requests page$/ do |arg1|
+  visit project_merge_requests_path(Project.find_by_name(arg1))
+end
+
+Given /^I visit merge request page "(.*?)"$/ do |arg1|
+  mr = MergeRequest.find_by_title(arg1)
+  visit project_merge_request_path(mr.project, mr)
+end
+
+Given /^I visit project "(.*?)" milestones page$/ do |arg1|
+  @project = Project.find_by_name(arg1)
+  visit project_milestones_path(@project)
+end
+
+Given /^I visit project commits page$/ do
+  visit project_commits_path(@project)
+end
+
+Given /^I visit compare refs page$/ do
+  visit compare_project_commits_path(@project)
+end
+
+Given /^I visit project branches page$/ do
+  visit branches_project_repository_path(@project)
+end
+
+Given /^I visit project commit page$/ do
+  visit project_commit_path(@project, ValidCommit::ID)
+end
+
+Given /^I visit project tags page$/ do
+  visit tags_project_repository_path(@project)
+end
+
+Given /^I click on commit link$/ do
+  visit project_commit_path(@project, ValidCommit::ID)
+end
+
+Given /^I visit project source page$/ do
+  visit tree_project_ref_path(@project, @project.root_ref)
+end
+
+Given /^I visit project source page for "(.*?)"$/ do |arg1|
+  visit tree_project_ref_path(@project, arg1)
+end
+
+Given /^I visit blob file from repo$/ do
+  visit tree_project_ref_path(@project, ValidCommit::ID, :path => ValidCommit::BLOB_FILE_PATH)
+end
+
+Given /^I visit project "(.*?)" team page$/ do |arg1|
+  visit team_project_path(Project.find_by_name(arg1))
+end
+
+Given /^I visit project wiki page$/ do
+  visit project_wiki_path(@project, :index)
+end
+
+Given /^I visit profile page$/ do
+  visit profile_path
+end
+
+Given /^I visit profile token page$/ do
+  visit profile_token_path
+end
+
+Given /^I visit profile password page$/ do
+  visit profile_password_path
+end
+
+Given /^I visit dashboard page$/ do
+  visit dashboard_path
+end
+
+Given /^I visit dashboard issues page$/ do
+  visit dashboard_issues_path
+end
+
+Given /^I visit dashboard merge requests page$/ do
+  visit dashboard_merge_requests_path
+end
+