diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb
index 7b527041d7ec87552c580f24a897eab3f5bed16a..725f48fa014ee2d9775c0dd6603cce85bd88972e 100644
--- a/app/controllers/tree_controller.rb
+++ b/app/controllers/tree_controller.rb
@@ -26,14 +26,14 @@ class TreeController < ProjectResourceController
   end
 
   def update
-    file_editor = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path)
-    update_status = file_editor.update(
+    edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, @project, @ref, @path)
+    updated_successfully = edit_file_action.commit!(
       params[:content],
       params[:commit_message],
       params[:last_commit]
     )
 
-    if update_status
+    if updated_successfully
       redirect_to project_tree_path(@project, @id), notice: "Your changes have been successfully commited"
     else
       flash[:notice] = "Your changes could not be commited, because the file has been changed"
diff --git a/lib/gitlab/satellite/edit_file_action.rb b/lib/gitlab/satellite/edit_file_action.rb
index 0a5e753b8d730184e472be2513a9edadd6d05c20..1e2a21633bbd6478f68147ef5e47565f627ea952 100644
--- a/lib/gitlab/satellite/edit_file_action.rb
+++ b/lib/gitlab/satellite/edit_file_action.rb
@@ -5,25 +5,35 @@ module Gitlab
     # It gives you ability to make changes to files
     # & commit this changes from GitLab UI.
     class EditFileAction < Action
-      attr_accessor :path, :ref
+      attr_accessor :file_path, :ref
 
-      def initialize(user, project, ref, path)
-        super user, project
-        @path = path
+      def initialize(user, project, ref, file_path)
+        super user, project, git_timeout: 10.seconds
+        @file_path = file_path
         @ref = ref
       end
 
-      def update(content, commit_message, last_commit)
+      def commit!(content, commit_message, last_commit)
         return false unless can_edit?(last_commit)
 
         in_locked_and_timed_satellite do |repo|
           prepare_satellite!(repo)
 
-          repo.git.sh "git checkout -b #{ref} origin/#{ref}"
-          File.open(path, 'w'){|f| f.write(content)}
-          repo.git.sh "git add ."
-          repo.git.sh "git commit -am '#{commit_message}'"
-          output = repo.git.sh "git push origin #{ref}"
+          # create target branch in satellite at the corresponding commit from Gitolite
+          repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}")
+
+          # update the file in the satellite's working dir
+          file_path_in_satellite = File.join(repo.working_dir, file_path)
+          File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
+
+          # commit the changes
+          # will raise CommandFailed when commit fails
+          repo.git.commit(raise: true, timeout: true, a: true, m: commit_message)
+
+
+          # push commit back to Gitolite
+          # will raise CommandFailed when push fails
+          repo.git.push({raise: true, timeout: true}, :origin, ref)
 
           # everything worked
           true
@@ -36,7 +46,7 @@ module Gitlab
       protected
 
       def can_edit?(last_commit)
-        current_last_commit = @project.last_commit_for(ref, path).sha
+        current_last_commit = @project.last_commit_for(ref, file_path).sha
         last_commit == current_last_commit
       end
     end