diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index ca2a5623f4242797edd055dc52b770bbc0f61b06..1f211bac9c220d34de02aa23901a23fa024fc89f 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -10,11 +10,6 @@ class ApplicationController < ActionController::Base
 
   helper_method :abilities, :can?
 
-  rescue_from Gitlab::Gitolite::AccessDenied do |exception|
-    log_exception(exception)
-    render "errors/gitolite", layout: "errors", status: 500
-  end
-
   rescue_from Encoding::CompatibilityError do |exception|
     log_exception(exception)
     render "errors/encoding", layout: "errors", status: 500
diff --git a/app/models/key.rb b/app/models/key.rb
index 2bf50f5656572122bb8bf0e47ac8d31efc7e9f34..f1c9e42f04f04d0188e95a952cf754fae3544492 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -80,4 +80,8 @@ class Key < ActiveRecord::Base
   def last_deploy?
     Key.where(identifier: identifier).count == 0
   end
+
+  def owner_name
+    user.username
+  end
 end
diff --git a/app/models/project.rb b/app/models/project.rb
index 6a3d7ab15d264b8f83aec0d579e63a784bf03aac..e774949ed12a97967955bd652861f8ce0f39e5e6 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -459,20 +459,6 @@ class Project < ActiveRecord::Base
     namespace.try(:path) || ''
   end
 
-  def update_repository
-    GitoliteWorker.perform_async(
-      :update_repository,
-      self.id
-    )
-  end
-
-  def destroy_repository
-    GitoliteWorker.perform_async(
-      :remove_repository,
-      self.path_with_namespace
-    )
-  end
-
   def repo_exists?
     @repo_exists ||= (repository && repository.branches.present?)
   rescue
diff --git a/app/models/users_project.rb b/app/models/users_project.rb
index 94edfd9eddfbd4f1a3c91a6bf69907664c26df61..359db20000b562d8f53ea14a182c5339b4b7955c 100644
--- a/app/models/users_project.rb
+++ b/app/models/users_project.rb
@@ -25,9 +25,6 @@ class UsersProject < ActiveRecord::Base
 
   attr_accessor :skip_git
 
-  after_save :update_repository, unless: :skip_git?
-  after_destroy :update_repository, unless: :skip_git?
-
   validates :user, presence: true
   validates :user_id, uniqueness: { scope: [:project_id], message: "already exists in project" }
   validates :project_access, inclusion: { in: [GUEST, REPORTER, DEVELOPER, MASTER] }, presence: true
@@ -136,10 +133,6 @@ class UsersProject < ActiveRecord::Base
     end
   end
 
-  def update_repository
-    project.update_repository
-  end
-
   def project_access_human
     Project.access_options.key(self.project_access)
   end
diff --git a/app/observers/key_observer.rb b/app/observers/key_observer.rb
index 44e78643d830b073fce56643706122f994a5675b..261e2245b979fa5abfd0d982702f868ad2468e32 100644
--- a/app/observers/key_observer.rb
+++ b/app/observers/key_observer.rb
@@ -3,20 +3,16 @@ class KeyObserver < ActiveRecord::Observer
 
   def after_save(key)
     GitoliteWorker.perform_async(
-      :set_key,
-      key.identifier,
-      key.key,
-      key.projects.map(&:id)
+      :add_key,
+      key.owner_name,
+      key.key
     )
   end
 
   def after_destroy(key)
-    return if key.is_deploy_key && !key.last_deploy?
-
     GitoliteWorker.perform_async(
       :remove_key,
-      key.identifier,
-      key.projects.map(&:id)
+      key.key,
     )
   end
 end
diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb
index ccdb146140b426eea186d4cf5e6f20d3c1c92d7f..32004503fbfa2e8ff36320f13c6e43d0fa1092f5 100644
--- a/app/observers/project_observer.rb
+++ b/app/observers/project_observer.rb
@@ -1,6 +1,11 @@
 class ProjectObserver < ActiveRecord::Observer
   def after_create(project)
-    project.update_repository
+    GitoliteWorker.perform_async(
+      :add_repository,
+      project.path_with_namespace
+    )
+
+    log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
   end
 
   def after_update(project)
@@ -8,14 +13,15 @@ class ProjectObserver < ActiveRecord::Observer
   end
 
   def after_destroy(project)
-    log_info("Project \"#{project.name}\" was removed")
+    GitoliteWorker.perform_async(
+      :remove_repository,
+      self.path_with_namespace
+    )
 
     project.satellite.destroy
     project.destroy_repository
-  end
 
-  def after_create project
-    log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
+    log_info("Project \"#{project.name}\" was removed")
   end
 
   protected
diff --git a/config/initializers/5_backend.rb b/config/initializers/5_backend.rb
index 85f747ac334033ad1dd464dfc2cfbb60e3da1739..73436608c933aa0b82558f4d2c69d01513571740 100644
--- a/config/initializers/5_backend.rb
+++ b/config/initializers/5_backend.rb
@@ -1,5 +1,5 @@
 # GIT over HTTP
 require Rails.root.join("lib", "gitlab", "backend", "grack_auth")
 
-# GITOLITE backend
-require Rails.root.join("lib", "gitlab", "backend", "gitolite")
+# GIT over SSH
+require Rails.root.join("lib", "gitlab", "backend", "shell")
diff --git a/lib/gitlab/backend/gitolite.rb b/lib/gitlab/backend/shell.rb
similarity index 69%
rename from lib/gitlab/backend/gitolite.rb
rename to lib/gitlab/backend/shell.rb
index 62eb500bcd62db843fd4463c9c69bc9fb4e0fbd9..7423b106a45ade0d23616987e2e06fea97ffef3b 100644
--- a/lib/gitlab/backend/gitolite.rb
+++ b/lib/gitlab/backend/shell.rb
@@ -1,27 +1,16 @@
 module Gitlab
-  class Gitolite
+  class Shell
     class AccessDenied < StandardError; end
 
-    def config
-      Gitlab::GitoliteConfig.new
-    end
-
-    # Add new key to gitlab-shell
-    #
-    # Ex.
-    #   add_key("randx", "sha-rsa ...")
+    # Init new repository
     #
-    def add_key(username, key_content)
-      # TODO: implement
-    end
-
-    # Remove ssh key from gitlab shell
+    # name - project path with namespace
     #
     # Ex.
-    #   remove_key("sha-rsa")
+    #   add_repository("gitlab/gitlab-ci")
     #
-    def remove_key(key_content)
-      # TODO: implement
+    def add_repository(name)
+      system("/home/git/gitlab-shell/bin/gitlab-projects add-project #{name}.git")
     end
 
     # Remove repository from file system
@@ -32,26 +21,30 @@ module Gitlab
     #   remove_repository("gitlab/gitlab-ci")
     #
     def remove_repository(name)
-      # TODO: implement
+      system("/home/git/gitlab-shell/bin/gitlab-projects rm-project #{name}.git")
     end
 
-    # Init new repository
+    # Add new key to gitlab-shell
     #
-    # name - project path with namespace
+    # Ex.
+    #   add_key("randx", "sha-rsa ...")
+    #
+    def add_key(username, key_content)
+      system("/home/git/gitlab-shell/bin/gitlab-keys add-key #{username} \"#{key_content}\"")
+    end
+
+    # Remove ssh key from gitlab shell
     #
     # Ex.
-    #   add_repository("gitlab/gitlab-ci")
+    #   remove_key("sha-rsa")
     #
-    def add_repository(name)
-      # TODO: implement
+    def remove_key(key_content)
+      system("/home/git/gitlab-shell/bin/gitlab-keys rm-key \"#{key_content}\"")
     end
 
+
     def url_to_repo path
       Gitlab.config.gitolite.ssh_path_prefix + "#{path}.git"
     end
-
-    def enable_automerge
-      config.admin_all_repo!
-    end
   end
 end
diff --git a/lib/gitolited.rb b/lib/gitolited.rb
index 68b9b6255253b0e4faeeac16045ee3d8235061b9..4911a473f05e1d42b0127cd1d98372775897df1c 100644
--- a/lib/gitolited.rb
+++ b/lib/gitolited.rb
@@ -6,6 +6,6 @@
 #
 module Gitolited
   def gitolite
-    Gitlab::Gitolite.new
+    Gitlab::Shell.new
   end
 end