diff --git a/CHANGELOG b/CHANGELOG
index 393d69755e168535f43521950205c74c693fbf4f..52441aad2c2ac14f929e04ba900097de41fbc6c3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,8 @@ v 6.3.0
   - Fixed issue with 500 error when group did not exist
   - Ability to leave project
   - You can create file in repo using UI
+  - API: dropped default_branch attribute from project during creation
+  - Project default_branch is not stored in db any more. It takes from repo now.
 
 v 6.2.0
   - Public project pages are now visible to everyone (files, issues, wik, etc.)
diff --git a/app/contexts/projects/update_context.rb b/app/contexts/projects/update_context.rb
index 40385fa65b09caf3fde9a6a9b9080d5ce39526e7..9564dd94688bec9f44f273191071b7c394655e8e 100644
--- a/app/contexts/projects/update_context.rb
+++ b/app/contexts/projects/update_context.rb
@@ -3,6 +3,16 @@ module Projects
     def execute(role = :default)
       params[:project].delete(:namespace_id)
       params[:project].delete(:public) unless can?(current_user, :change_public_mode, project)
+      new_branch = params[:project].delete(:default_branch)
+
+      if project.repository.exists? && new_branch != project.repository.root_ref
+        GitlabShellWorker.perform_async(
+          :update_repository_head,
+          project.path_with_namespace,
+          new_branch
+        )
+      end
+
       project.update_attributes(params[:project], as: role)
     end
   end
diff --git a/app/models/project.rb b/app/models/project.rb
index 52682ac0a9e14e293522c6079a70722a17a109d2..65d42b6b870ed16631aec2cf2276f49db4995ae7 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -28,7 +28,7 @@ class Project < ActiveRecord::Base
   include Gitlab::ShellAdapter
   extend Enumerize
 
-  attr_accessible :name, :path, :description, :default_branch, :issues_tracker, :label_list,
+  attr_accessible :name, :path, :description, :issues_tracker, :label_list,
     :issues_enabled, :wall_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id,
     :wiki_enabled, :public, :import_url, :last_activity_at, as: [:default, :admin]
 
@@ -36,6 +36,8 @@ class Project < ActiveRecord::Base
 
   acts_as_taggable_on :labels, :issues_default_labels
 
+  attr_accessor :new_default_branch
+
   # Relations
   belongs_to :creator,      foreign_key: "creator_id", class_name: "User"
   belongs_to :group,        foreign_key: "namespace_id", conditions: "type = 'Group'"
@@ -143,7 +145,7 @@ class Project < ActiveRecord::Base
   end
 
   def repository
-    @repository ||= Repository.new(path_with_namespace, default_branch)
+    @repository ||= Repository.new(path_with_namespace)
   end
 
   def saved?
@@ -451,4 +453,8 @@ class Project < ActiveRecord::Base
   def project_member(user)
     users_projects.where(user_id: user).first
   end
+
+  def default_branch
+    @default_branch ||= repository.root_ref if repository.exists?
+  end
 end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 97b4330092a4cde7cbef289640c6682ccb97b569..80918d6de4b761710a36bf3b68b9249f86c14bbe 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -3,7 +3,7 @@ class Repository
 
   attr_accessor :raw_repository, :path_with_namespace
 
-  def initialize(path_with_namespace, default_branch)
+  def initialize(path_with_namespace, default_branch = nil)
     @path_with_namespace = path_with_namespace
     @raw_repository = Gitlab::Git::Repository.new(path_to_repo) if path_with_namespace
   rescue Gitlab::Git::Repository::NoRepository
diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb
index f301f30645858abde79b800c72c5cc66c44c5517..4e3deec01bf38943c33f45fd12e59734ed8381c7 100644
--- a/app/observers/project_observer.rb
+++ b/app/observers/project_observer.rb
@@ -30,12 +30,6 @@ class ProjectObserver < BaseObserver
   def after_update(project)
     project.send_move_instructions if project.namespace_id_changed?
     project.rename_repo if project.path_changed?
-
-    GitlabShellWorker.perform_async(
-      :update_repository_head,
-      project.path_with_namespace,
-      project.default_branch
-    ) if project.default_branch_changed?
   end
 
   def before_destroy(project)
diff --git a/db/migrate/20131106151520_remove_default_branch.rb b/db/migrate/20131106151520_remove_default_branch.rb
new file mode 100644
index 0000000000000000000000000000000000000000..88a890eb3eb7e759ced674d594f3218d57a91efe
--- /dev/null
+++ b/db/migrate/20131106151520_remove_default_branch.rb
@@ -0,0 +1,9 @@
+class RemoveDefaultBranch < ActiveRecord::Migration
+  def up
+    remove_column :projects, :default_branch
+  end
+
+  def down
+    add_column :projects, :default_branch, :string
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d6acb2f90e935c2e1eab4bb513294e848f19b7fb..88c6a545d9673b6e582084a7170b4f0105b9901e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20131009115346) do
+ActiveRecord::Schema.define(:version => 20131106151520) do
 
   create_table "deploy_keys_projects", :force => true do |t|
     t.integer  "deploy_key_id", :null => false
@@ -171,7 +171,6 @@ ActiveRecord::Schema.define(:version => 20131009115346) do
     t.datetime "created_at",                                   :null => false
     t.datetime "updated_at",                                   :null => false
     t.integer  "creator_id"
-    t.string   "default_branch"
     t.boolean  "issues_enabled",         :default => true,     :null => false
     t.boolean  "wall_enabled",           :default => true,     :null => false
     t.boolean  "merge_requests_enabled", :default => true,     :null => false
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 3ae9af59fc3ec089260e1c4f4ae70210d9648551..d4d883e54ec08d4e94747570377f1199bbf5690b 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -213,7 +213,6 @@ Parameters:
 
 + `name` (required) - new project name
 + `description` (optional) - short project description
-+ `default_branch` (optional) - 'master' by default
 + `issues_enabled` (optional)
 + `wall_enabled` (optional)
 + `merge_requests_enabled` (optional)
diff --git a/features/steps/public/projects_feature.rb b/features/steps/public/projects_feature.rb
index 8abc6ae9f236082dba504167b79cc61cc3b4c83e..e5292380c554e652321467b520853ae056de2644 100644
--- a/features/steps/public/projects_feature.rb
+++ b/features/steps/public/projects_feature.rb
@@ -23,7 +23,7 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
   end
 
   step 'public project "Community"' do
-    create :project_with_code, name: 'Community', public: true, default_branch: 'master'
+    create :project_with_code, name: 'Community', public: true
   end
 
   step 'public empty project "Empty Public Project"' do
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 221f1f1e23ccac9696ff842f50db97a94bafb9e6..425605720467d953b06aca2e417cf06ebf080ca5 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -60,7 +60,6 @@ module API
       # Parameters:
       #   name (required) - name for new project
       #   description (optional) - short project description
-      #   default_branch (optional) - 'master' by default
       #   issues_enabled (optional)
       #   wall_enabled (optional)
       #   merge_requests_enabled (optional)
@@ -75,7 +74,6 @@ module API
         attrs = attributes_for_keys [:name,
                                      :path,
                                      :description,
-                                     :default_branch,
                                      :issues_enabled,
                                      :wall_enabled,
                                      :merge_requests_enabled,
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index b17183a281c221e797a5146374eb341a06d9193a..fe65096fd1ec5888fb1887568d7cb57e39b1bdc1 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -116,13 +116,13 @@ describe MergeRequest do
     end
 
     it 'accesses the set of issues that will be closed on acceptance' do
-      subject.project.default_branch = subject.target_branch
+      subject.project.stub(default_branch: subject.target_branch)
 
       subject.closes_issues.should == [issue0, issue1].sort_by(&:id)
     end
 
     it 'only lists issues as to be closed if it targets the default branch' do
-      subject.project.default_branch = 'master'
+      subject.project.stub(default_branch: 'master')
       subject.target_branch = 'something-else'
 
       subject.closes_issues.should be_empty
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index bf4a1749418072a365d34143e690a4f67d700202..2ae186b967ab29d2c5f459ef516987d9fc1b46c0 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -91,7 +91,6 @@ describe API::API do
     it "should assign attributes to project" do
       project = attributes_for(:project, {
         description: Faker::Lorem.sentence,
-        default_branch: 'stable',
         issues_enabled: false,
         wall_enabled: false,
         merge_requests_enabled: false,
@@ -110,16 +109,13 @@ describe API::API do
       project = attributes_for(:project, { public: true })
       post api("/projects", user), project
       json_response['public'].should be_true
-
     end
 
     it "should set a project as private" do
       project = attributes_for(:project, { public: false })
       post api("/projects", user), project
       json_response['public'].should be_false
-
     end
-
   end
 
   describe "POST /projects/user/:id" do
@@ -146,7 +142,6 @@ describe API::API do
     it "should assign attributes to project" do
       project = attributes_for(:project, {
         description: Faker::Lorem.sentence,
-        default_branch: 'stable',
         issues_enabled: false,
         wall_enabled: false,
         merge_requests_enabled: false,