diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb
index 84b4a30c6d5e8f7eb9489ff7f46130de2fc0c3f6..036805306f25b444e7db4ecf1daf67ad1e890fa6 100644
--- a/app/controllers/concerns/creates_commit.rb
+++ b/app/controllers/concerns/creates_commit.rb
@@ -8,7 +8,8 @@ module CreatesCommit
       source_project: @project,
       source_branch: @ref,
       target_branch: @target_branch,
-      file_path: @path
+      file_path: @path,
+      previous_path: @previous_path
     )
 
     result = service.new(@tree_edit_project, current_user, commit_params).execute
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 2b8e76d4638fdc1e755b78a925d957e6bf4af97a..fc608399fcb20cb99e68dcaf8c972153e9c90419 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -44,7 +44,7 @@ class Projects::BlobController < Projects::ApplicationController
           "#file-path-#{hexdigest(@path)}"
       else
         unless params[:file_name] == @path
-          previous_path = @path
+          @previous_path = @path
           @path = params[:file_name]
         end
         namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @path))
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 5b670cb4b8fa6c8a3dc504affbc886cad045afc2..709b5edd31e8068a7dec0265dc21a7e079c42bb4 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -731,6 +731,36 @@ class Repository
     end
   end
 
+  def update_file(user, path, previous_path, content, message, branch, update)
+    commit_with_hooks(user, branch) do |ref|
+      committer = user_to_committer(user)
+      options = {}
+      options[:committer] = committer
+      options[:author] = committer
+      options[:commit] = {
+        message: message,
+        branch: ref,
+      }
+
+      if previous_path
+        options[:file] = {
+          path: previous_path
+        }
+
+
+        Gitlab::Git::Blob.remove(raw_repository, options)
+      end
+
+      options[:file] = {
+        content: content,
+        path: path,
+        update: update
+      }
+
+      Gitlab::Git::Blob.commit(raw_repository, options)
+    end
+  end
+
   def remove_file(user, path, message, branch)
     commit_with_hooks(user, branch) do |ref|
       committer = user_to_committer(user)
diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb
index ac5d7ddde02258df9fae9350521aae43ded88f13..c8e66555c820481a348cb6dfed152654a903971c 100644
--- a/app/services/files/base_service.rb
+++ b/app/services/files/base_service.rb
@@ -9,6 +9,7 @@ module Files
 
       @commit_message = params[:commit_message]
       @file_path      = params[:file_path]
+      @previous_path  = params[:previous_path]
       @file_content   = if params[:file_content_encoding] == 'base64'
                           Base64.decode64(params[:file_content])
                         else
diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb
index 52451d72b571ee2a53117c4452acc916157b10bd..6d015642b910dc7eaf2541bee4bc9e60cf1d37be 100644
--- a/app/services/files/update_service.rb
+++ b/app/services/files/update_service.rb
@@ -4,7 +4,7 @@ module Files
   class UpdateService < Files::BaseService
     def commit
       # Need to update file_path with the new filename
-      repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch, true)
+      repository.update_file(current_user, @file_path, @previous_path, @file_content, @commit_message, @target_branch, true)
     end
   end
 end