diff --git a/app/controllers/blame_controller.rb b/app/controllers/blame_controller.rb
index d159a83c8cb4fe0d4f9cfae713393c58d1cbd2f0..dd5be6dcd58e6cf63b17c9ef3bddd8c9a7283213 100644
--- a/app/controllers/blame_controller.rb
+++ b/app/controllers/blame_controller.rb
@@ -1,7 +1,5 @@
 # Controller for viewing a file's blame
 class BlameController < ApplicationController
-  # Thrown when given an invalid path
-  class InvalidPathError < StandardError; end
 
   include RefExtractor
 
@@ -15,31 +13,10 @@ class BlameController < ApplicationController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :define_tree_vars
+  before_filter :assign_ref_vars
 
   def show
+    @repo = @project.repo
     @blame = Grit::Blob.blame(@repo, @commit.id, @path)
   end
-
-  private
-
-  def define_tree_vars
-    @ref, @path = extract_ref(params[:id])
-
-    @id     = File.join(@ref, @path)
-    @repo   = @project.repo
-    @commit = CommitDecorator.decorate(@project.commit(@ref))
-
-    @tree = Tree.new(@commit.tree, @project, @ref, @path)
-    @tree = TreeDecorator.new(@tree)
-
-    raise InvalidPathError if @tree.invalid?
-
-    @hex_path = Digest::SHA1.hexdigest(@path)
-
-    @history_path = project_tree_path(@project, @id)
-    @logs_path    = logs_file_project_ref_path(@project, @ref, @path)
-  rescue NoMethodError, InvalidPathError
-    not_found!
-  end
 end
diff --git a/app/controllers/blob_controller.rb b/app/controllers/blob_controller.rb
index bb051281013f66424610d1dae65f686c00ad1123..58e70bc9d04325bdfd65a43e2a31e703b4efdd1e 100644
--- a/app/controllers/blob_controller.rb
+++ b/app/controllers/blob_controller.rb
@@ -16,7 +16,7 @@ class BlobController < ApplicationController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :define_tree_vars
+  before_filter :assign_ref_vars
 
   def show
     if @tree.is_blob?
@@ -37,26 +37,4 @@ class BlobController < ApplicationController
       not_found!
     end
   end
-
-  private
-
-  def define_tree_vars
-    @ref, @path = extract_ref(params[:id])
-
-    @id     = File.join(@ref, @path)
-    @repo   = @project.repo
-    @commit = CommitDecorator.decorate(@project.commit(@ref))
-
-    @tree = Tree.new(@commit.tree, @project, @ref, @path)
-    @tree = TreeDecorator.new(@tree)
-
-    raise InvalidPathError if @tree.invalid?
-
-    @hex_path = Digest::SHA1.hexdigest(@path)
-
-    @history_path = project_tree_path(@project, @id)
-    @logs_path    = logs_file_project_ref_path(@project, @ref, @path)
-  rescue NoMethodError, InvalidPathError
-    not_found!
-  end
 end
diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb
index 15bbb1a3c77c2d302c97c4bc743a0fa86e8805ba..e0dd8f8beaf646d990769640839288b410a706ac 100644
--- a/app/controllers/tree_controller.rb
+++ b/app/controllers/tree_controller.rb
@@ -15,35 +15,18 @@ class TreeController < ApplicationController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :define_tree_vars
+  before_filter :assign_ref_vars
 
   def show
+    @hex_path = Digest::SHA1.hexdigest(@path)
+
+    @history_path = project_tree_path(@project, @id)
+    @logs_path    = logs_file_project_ref_path(@project, @ref, @path)
+
     respond_to do |format|
       format.html
       # Disable cache so browser history works
       format.js { no_cache_headers }
     end
   end
-
-  private
-
-  def define_tree_vars
-    @ref, @path = extract_ref(params[:id])
-
-    @id     = File.join(@ref, @path)
-    @repo   = @project.repo
-    @commit = CommitDecorator.decorate(@project.commit(@ref))
-
-    @tree = Tree.new(@commit.tree, @project, @ref, @path.gsub(/^\//, ''))
-    @tree = TreeDecorator.new(@tree)
-
-    raise InvalidPathError if @tree.invalid?
-
-    @hex_path = Digest::SHA1.hexdigest(@path)
-
-    @history_path = project_tree_path(@project, @id)
-    @logs_path    = logs_file_project_ref_path(@project, @ref, @path)
-  rescue NoMethodError, InvalidPathError
-    not_found!
-  end
 end
diff --git a/app/views/tree/show.html.haml b/app/views/tree/show.html.haml
index 181be6426d440073e30c41a5781494bb7751d512..d95f90e0b54804deeb64fad6ed36ae8a7071ccbe 100644
--- a/app/views/tree/show.html.haml
+++ b/app/views/tree/show.html.haml
@@ -1,5 +1,5 @@
 = render "head"
-#tree-holder= render partial: "tree", locals: {repo: @repo, commit: @commit, tree: @tree}
+#tree-holder= render partial: "tree", locals: {commit: @commit, tree: @tree}
 
 :javascript
   $(function() {
diff --git a/app/views/tree/show.js.haml b/app/views/tree/show.js.haml
index 3d0215ff51fc91c4a53f43daa8583b37168ef40e..174e3e03a527cb76b71af7a8457b06c52524e46a 100644
--- a/app/views/tree/show.js.haml
+++ b/app/views/tree/show.js.haml
@@ -1,6 +1,6 @@
 :plain
   // Load Files list
-  $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {repo: @repo, commit: @commit, tree: @tree}))}");
+  $("#tree-holder").html("#{escape_javascript(render(partial: "tree", locals: {commit: @commit, tree: @tree}))}");
   $("#tree-content-holder").show("slide", { direction: "right" }, 150);
   $('.project-refs-form #path').val("#{@path}");
 
diff --git a/lib/ref_extractor.rb b/lib/ref_extractor.rb
index d7d446b1e62be10284bb67439999330ddd066f42..b9c0291761d543b55a09b886f4ec07cd5dbc150d 100644
--- a/lib/ref_extractor.rb
+++ b/lib/ref_extractor.rb
@@ -67,4 +67,31 @@ module RefExtractor
 
     pair
   end
+
+  # Assigns common instance variables for views working with Git tree-ish objects
+  #
+  # Assignments are:
+  #
+  # - @id     - A string representing the joined ref and path
+  # - @ref    - A string representing the ref (e.g., the branch, tag, or commit SHA)
+  # - @path   - A string representing the filesystem path
+  # - @commit - A CommitDecorator representing the commit from the given ref
+  # - @tree   - A TreeDecorator representing the tree at the given ref/path
+  #
+  # Automatically renders `not_found!` if a valid tree could not be resolved
+  # (e.g., when a user inserts an invalid path or ref).
+  def assign_ref_vars
+    @ref, @path = extract_ref(params[:id])
+
+    @id = File.join(@ref, @path)
+
+    @commit = CommitDecorator.decorate(@project.commit(@ref))
+
+    @tree = Tree.new(@commit.tree, @project, @ref, @path)
+    @tree = TreeDecorator.new(@tree)
+
+    raise InvalidPathError if @tree.invalid?
+  rescue NoMethodError, InvalidPathError
+    not_found!
+  end
 end