diff --git a/app/controllers/graph_controller.rb b/app/controllers/graph_controller.rb
index 30ec5e89db2e99bee4695b546a4b4bd946f6667a..c370433e500a4c8cd6d050d952d4efb7fba503c0 100644
--- a/app/controllers/graph_controller.rb
+++ b/app/controllers/graph_controller.rb
@@ -7,10 +7,20 @@ class GraphController < ProjectResourceController
   before_filter :require_non_empty_project
 
   def show
+    if params.has_key?(:q) && params[:q].blank?
+      redirect_to project_graph_path(@project, params[:id])
+      return
+    end
+
+    if params.has_key?(:q)
+      @q = params[:q]
+      @commit = @project.repository.commit(@q) || @commit
+    end
+
     respond_to do |format|
       format.html
       format.json do
-        graph = Gitlab::Graph::JsonBuilder.new(project, @ref)
+        graph = Gitlab::Graph::JsonBuilder.new(project, @ref, @commit)
         render :json => graph.to_json
       end
     end
diff --git a/app/views/graph/_head.html.haml b/app/views/graph/_head.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..7e1b46446af0b8fc590c30f7726e1349fe559f32
--- /dev/null
+++ b/app/views/graph/_head.html.haml
@@ -0,0 +1,9 @@
+%ul.nav.nav-tabs
+  %li
+    = render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
+  %li.pull-right.search
+    = form_tag project_graph_path(@project, params[:id]), method: :get, class: 'navbar-form' do |f|
+      = label_tag :search , "Looking for commit:"
+      = text_field_tag :q, @q, placeholder: "Input SHA", class: "search-input"
+
+%h3.page_title Project Network Graph
diff --git a/app/views/graph/show.html.haml b/app/views/graph/show.html.haml
index ca3a8706313ee75af30ccab845ae850aac356760..e45aca1ddcba18918dbc31878a038ffd451ab33b 100644
--- a/app/views/graph/show.html.haml
+++ b/app/views/graph/show.html.haml
@@ -1,7 +1,4 @@
-%h3.page_title Project Network Graph
-%br
-= render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path}
-%br
+= render "head"
 .graph_holder
   %h4
     %small You can move around the graph by using the arrow keys.
@@ -12,8 +9,9 @@
   var branch_graph;
   $(function(){
     branch_graph = new BranchGraph($("#holder"), {
-      url: '#{project_graph_path(@project, @ref, format: :json)}',
+      url: '#{project_graph_path(@project, @ref, q: @q, format: :json)}',
       commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}',
-      ref: '#{@ref}'
+      ref: '#{@ref}',
+      commit_id: '#{@commit.id}'
     });
   });
diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb
index 976ac01820429b285a215200e42e7e7641bfeae7..fb595e18b2401123d9b47d4ff2a29c1c9136ca6d 100644
--- a/lib/extracts_path.rb
+++ b/lib/extracts_path.rb
@@ -117,7 +117,10 @@ module ExtractsPath
 
     @id = File.join(@ref, @path)
 
-    @commit = CommitDecorator.decorate(@project.repository.commit(@ref))
+    # It is used "@project.repository.commits(@ref, @path, 1, 0)",
+    # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name.
+    commits = @project.repository.commits(@ref, @path, 1, 0)
+    @commit = CommitDecorator.decorate(commits.first)
 
     @tree = Tree.new(@commit.tree, @ref, @path)
     @tree = TreeDecorator.new(@tree)
diff --git a/lib/gitlab/graph/json_builder.rb b/lib/gitlab/graph/json_builder.rb
index 4b3687e06c36f48abe9718c6daab736629544865..cc971a245a7044a36ced79bea36d52fc2b6a75ab 100644
--- a/lib/gitlab/graph/json_builder.rb
+++ b/lib/gitlab/graph/json_builder.rb
@@ -9,9 +9,10 @@ module Gitlab
         @max_count ||= 650
       end
 
-      def initialize project, ref
+      def initialize project, ref, commit
         @project = project
         @ref = ref
+        @commit = commit
         @repo = project.repo
         @ref_cache = {}
 
@@ -31,7 +32,8 @@ module Gitlab
       # Get commits from repository
       #
       def collect_commits
-        @commits = Grit::Commit.find_all(repo, nil, {max_count: self.class.max_count}).dup
+
+        @commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup
 
         # Decorate with app/models/commit.rb
         @commits.map! { |commit| ::Commit.new(commit) }
@@ -49,41 +51,28 @@ module Gitlab
       # list of commits. As well as returns date list
       # corelated with time set on commits.
       #
-      # @param [Array<Graph::Commit>] comits to index
+      # @param [Array<Graph::Commit>] commits to index
       #
       # @return [Array<TimeDate>] list of commit dates corelated with time on commits
       def index_commits
-        days, heads, times = [], [], []
+        days, times = [], []
         map = {}
 
         commits.reverse.each_with_index do |c,i|
           c.time = i
           days[i] = c.committed_date
           map[c.id] = c
-          heads += c.refs unless c.refs.nil?
           times[i] = c
         end
 
-        heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote}
-        # sort heads so the master is top and current branches are closer
-        heads.sort! do |a,b|
-          if a.name == @ref
-            -1
-          elsif b.name == @ref
-            1
-          else
-            b.commit.committed_date <=> a.commit.committed_date
-          end
-        end
-
         @_reserved = {}
         days.each_index do |i|
           @_reserved[i] = []
         end
 
-        heads.each do |h|
-          if map.include? h.commit.id then
-            place_chain(map[h.commit.id], map)
+        commits_sort_by_ref.each do |commit|
+          if map.include? commit.id then
+            place_chain(map[commit.id], map)
           end
         end
 
@@ -95,6 +84,45 @@ module Gitlab
         days
       end
 
+      # Skip count that the target commit is displayed in center.
+      def to_commit
+        commits = Grit::Commit.find_all(repo, nil, {topo_order: true})
+        commit_index = commits.index do |c|
+          c.id == @commit.id
+        end
+
+        if commit_index && (self.class.max_count / 2 < commit_index) then
+          # get max index that commit is displayed in the center.
+          commit_index - self.class.max_count / 2
+        else
+          0
+        end
+      end
+
+      def commits_sort_by_ref
+        commits.sort do |a,b|
+          if include_ref?(a)
+            -1
+          elsif include_ref?(b)
+            1
+          else
+            b.committed_date <=> a.committed_date
+          end
+        end
+      end
+
+      def include_ref?(commit)
+        heads = commit.refs.select do |ref|
+          ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag)
+        end
+
+        heads.map! do |head|
+          head.name
+        end
+
+        heads.include?(@ref)
+      end
+
       def find_free_parent_spaces(commit, map, times)
         spaces = []
 
diff --git a/vendor/assets/javascripts/branch-graph.js b/vendor/assets/javascripts/branch-graph.js
index 7929d3b2a14c867e607d71547883a25dfb452004..fb22953acd284aa51761b0fc80bac6957824dca8 100644
--- a/vendor/assets/javascripts/branch-graph.js
+++ b/vendor/assets/javascripts/branch-graph.js
@@ -161,14 +161,23 @@
       
       if (this.commits[i].refs) {
         this.appendLabel(x, y, this.commits[i].refs);
-
-        // The main branch is displayed in the center.
-        re = new RegExp('(^| )' + this.options.ref + '( |$)');
-        if (this.commits[i].refs.match(re)) {
-          scrollLeft = x - graphWidth / 2;
-        }
       }
       
+      // mark commit and displayed in the center
+      if (this.commits[i].id == this.options.commit_id) {
+        r.path([
+            'M', x, y - 5,
+            'L', x + 4, y - 15,
+            'L', x - 4, y - 15,
+            'Z'
+            ]).attr({
+              "fill": "#000",
+              "fill-opacity": .7,
+              "stroke": "none"
+              });
+        scrollLeft = x - graphWidth / 2;
+      }
+
       this.appendAnchor(top, this.commits[i], x, y);
     }
     top.toFront();