diff --git a/lib/api/api.rb b/lib/api/api.rb
index 7c4cdad7f0d0deaf8f681d61ec499c565cad5718..ce4cc8b34f7e22cc7fdf7ed2942befab4b71edf7 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -45,5 +45,6 @@ module API
     mount Files
     mount Commits
     mount Namespaces
+    mount Branches
   end
 end
diff --git a/lib/api/branches.rb b/lib/api/branches.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6339094bd992bbf940dd25b56d5d030823ad1b0f
--- /dev/null
+++ b/lib/api/branches.rb
@@ -0,0 +1,70 @@
+require 'mime/types'
+
+module API
+  # Projects API
+  class Branches < Grape::API
+    before { authenticate! }
+    before { authorize! :download_code, user_project }
+
+    resource :projects do
+      # Get a project repository branches
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      # Example Request:
+      #   GET /projects/:id/repository/branches
+      get ":id/repository/branches" do
+        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project
+      end
+
+      # Get a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   GET /projects/:id/repository/branches/:branch
+      get ":id/repository/branches/:branch" do
+        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
+        not_found!("Branch does not exist") if @branch.nil?
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+
+      # Protect a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   PUT /projects/:id/repository/branches/:branch/protect
+      put ":id/repository/branches/:branch/protect" do
+        authorize_admin_project
+
+        @branch = user_project.repository.find_branch(params[:branch])
+        not_found! unless @branch
+        protected_branch = user_project.protected_branches.find_by(name: @branch.name)
+        user_project.protected_branches.create(name: @branch.name) unless protected_branch
+
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+
+      # Unprotect a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   PUT /projects/:id/repository/branches/:branch/unprotect
+      put ":id/repository/branches/:branch/unprotect" do
+        authorize_admin_project
+
+        @branch = user_project.repository.find_branch(params[:branch])
+        not_found! unless @branch
+        protected_branch = user_project.protected_branches.find_by(name: @branch.name)
+        protected_branch.destroy if protected_branch
+
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+    end
+  end
+end
diff --git a/lib/api/commits.rb b/lib/api/commits.rb
index 33b8b3d22446f315713c2f5c153edc405a9d6a27..4a67313430a07965998c79bdb2c4b39cd95ef706 100644
--- a/lib/api/commits.rb
+++ b/lib/api/commits.rb
@@ -1,21 +1,12 @@
 require 'mime/types'
 
 module API
-  # Projects API
+  # Projects commits API
   class Commits < Grape::API
     before { authenticate! }
     before { authorize! :download_code, user_project }
 
     resource :projects do
-      helpers do
-        def handle_project_member_errors(errors)
-          if errors[:project_access].any?
-            error!(errors[:project_access], 422)
-          end
-          not_found!
-        end
-      end
-
       # Get a project repository commits
       #
       # Parameters:
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 53482c3b7f281a84368d1019114298e2f86cc8c9..076a9ceeb744e9f0bb158d366e40408b57c1ca6c 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -15,66 +15,6 @@ module API
           not_found!
         end
       end
-
-      # Get a project repository branches
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      # Example Request:
-      #   GET /projects/:id/repository/branches
-      get ":id/repository/branches" do
-        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project
-      end
-
-      # Get a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   GET /projects/:id/repository/branches/:branch
-      get ":id/repository/branches/:branch" do
-        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
-        not_found!("Branch does not exist") if @branch.nil?
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
-      # Protect a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   PUT /projects/:id/repository/branches/:branch/protect
-      put ":id/repository/branches/:branch/protect" do
-        authorize_admin_project
-
-        @branch = user_project.repository.find_branch(params[:branch])
-        not_found! unless @branch
-        protected_branch = user_project.protected_branches.find_by(name: @branch.name)
-        user_project.protected_branches.create(name: @branch.name) unless protected_branch
-
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
-      # Unprotect a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   PUT /projects/:id/repository/branches/:branch/unprotect
-      put ":id/repository/branches/:branch/unprotect" do
-        authorize_admin_project
-
-        @branch = user_project.repository.find_branch(params[:branch])
-        not_found! unless @branch
-        protected_branch = user_project.protected_branches.find_by(name: @branch.name)
-        protected_branch.destroy if protected_branch
-
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
       # Get a project repository tags
       #
       # Parameters:
diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..47c0ba94a4a9d2a82808ccb72b5916b1a53f229a
--- /dev/null
+++ b/spec/requests/api/branches_spec.rb
@@ -0,0 +1,95 @@
+require 'spec_helper'
+require 'mime/types'
+
+describe API::API do
+  include ApiHelpers
+  before(:each) { enable_observers }
+  after(:each) {disable_observers}
+
+  let(:user) { create(:user) }
+  let(:user2) { create(:user) }
+  let!(:project) { create(:project, creator_id: user.id) }
+  let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
+  let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) }
+
+  describe "GET /projects/:id/repository/branches" do
+    it "should return an array of project branches" do
+      get api("/projects/#{project.id}/repository/branches", user)
+      response.status.should == 200
+      json_response.should be_an Array
+      json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name
+    end
+  end
+
+  describe "GET /projects/:id/repository/branches/:branch" do
+    it "should return the branch information for a single branch" do
+      get api("/projects/#{project.id}/repository/branches/new_design", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == false
+    end
+
+    it "should return a 403 error if guest" do
+      get api("/projects/#{project.id}/repository/branches", user2)
+      response.status.should == 403
+    end
+
+    it "should return a 404 error if branch is not available" do
+      get api("/projects/#{project.id}/repository/branches/unknown", user)
+      response.status.should == 404
+    end
+  end
+
+  describe "PUT /projects/:id/repository/branches/:branch/protect" do
+    it "should protect a single branch" do
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == true
+    end
+
+    it "should return a 404 error if branch not found" do
+      put api("/projects/#{project.id}/repository/branches/unknown/protect", user)
+      response.status.should == 404
+    end
+
+    it "should return a 403 error if guest" do
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user2)
+      response.status.should == 403
+    end
+
+    it "should return success when protect branch again" do
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      response.status.should == 200
+    end
+  end
+
+  describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
+    it "should unprotect a single branch" do
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == false
+    end
+
+    it "should return success when unprotect branch" do
+      put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
+      response.status.should == 404
+    end
+
+    it "should return success when unprotect branch again" do
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      response.status.should == 200
+    end
+  end
+
+
+end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 99d966edc381f281277aee91a81714e322ef4af5..44c561eab58ba264e9c0b8a3b6fe64cbd9f83f05 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -14,86 +14,6 @@ describe API::API do
 
   before { project.team << [user, :reporter] }
 
-
-  describe "GET /projects/:id/repository/branches" do
-    it "should return an array of project branches" do
-      get api("/projects/#{project.id}/repository/branches", user)
-      response.status.should == 200
-      json_response.should be_an Array
-      json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name
-    end
-  end
-
-  describe "GET /projects/:id/repository/branches/:branch" do
-    it "should return the branch information for a single branch" do
-      get api("/projects/#{project.id}/repository/branches/new_design", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == false
-    end
-
-    it "should return a 403 error if guest" do
-      get api("/projects/#{project.id}/repository/branches", user2)
-      response.status.should == 403
-    end
-
-    it "should return a 404 error if branch is not available" do
-      get api("/projects/#{project.id}/repository/branches/unknown", user)
-      response.status.should == 404
-    end
-  end
-
-  describe "PUT /projects/:id/repository/branches/:branch/protect" do
-    it "should protect a single branch" do
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == true
-    end
-
-    it "should return a 404 error if branch not found" do
-      put api("/projects/#{project.id}/repository/branches/unknown/protect", user)
-      response.status.should == 404
-    end
-
-    it "should return a 403 error if guest" do
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user2)
-      response.status.should == 403
-    end
-
-    it "should return success when protect branch again" do
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      response.status.should == 200
-    end
-  end
-
-  describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
-    it "should unprotect a single branch" do
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == false
-    end
-
-    it "should return success when unprotect branch" do
-      put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
-      response.status.should == 404
-    end
-
-    it "should return success when unprotect branch again" do
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      response.status.should == 200
-    end
-  end
-
   describe "GET /projects/:id/repository/tags" do
     it "should return an array of project tags" do
       get api("/projects/#{project.id}/repository/tags", user)