diff --git a/CHANGELOG b/CHANGELOG
index 49b93b977bbe2110e3427a5c760bdbc44c4337f5..6f607e2da06264cfcc137acdce0dd55f73b0b990 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -20,6 +20,7 @@ v 7.13.0 (unreleased)
   - Update maintenance documentation to explain no need to recompile asssets for omnibus installations (Stan Hu)
   - Support commenting on diffs in side-by-side mode (Stan Hu)
   - Fix JavaScript error when clicking on the comment button on a diff line that has a comment already (Stan Hu)
+  - Return 40x error codes if branch could not be deleted in UI (Stan Hu)
   - Remove project visibility icons from dashboard projects list
   - Rename "Design" profile settings page to "Preferences".
   - Allow users to customize their default Dashboard page.
diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb
index 696011b94b9bb23d7d563ac85736f20d15f62480..117ae3aaa3d469e1260f5f6f9dd3639d4b9ab21c 100644
--- a/app/controllers/projects/branches_controller.rb
+++ b/app/controllers/projects/branches_controller.rb
@@ -32,7 +32,7 @@ class Projects::BranchesController < Projects::ApplicationController
   end
 
   def destroy
-    DeleteBranchService.new(project, current_user).execute(params[:id])
+    status = DeleteBranchService.new(project, current_user).execute(params[:id])
     @branch_name = params[:id]
 
     respond_to do |format|
@@ -40,7 +40,7 @@ class Projects::BranchesController < Projects::ApplicationController
         redirect_to namespace_project_branches_path(@project.namespace,
                                                     @project)
       end
-      format.js
+      format.js { render status: status[:return_code] }
     end
   end
 end
diff --git a/spec/controllers/branches_controller_spec.rb b/spec/controllers/branches_controller_spec.rb
index db3b64babcd26fc409b1b93ac483bfa3a81dcd52..bd4c946b64b8700bf82d83849adf9eefb09bcd42 100644
--- a/spec/controllers/branches_controller_spec.rb
+++ b/spec/controllers/branches_controller_spec.rb
@@ -55,4 +55,30 @@ describe Projects::BranchesController do
       it { is_expected.to render_template('new') }
     end
   end
+
+  describe "POST destroy" do
+    render_views
+
+    before do
+      post :destroy,
+           format: :js,
+           id: branch,
+           namespace_id: project.namespace.to_param,
+           project_id: project.to_param
+    end
+
+    context "valid branch name, valid source" do
+      let(:branch) { "feature" }
+
+      it { expect(response.status).to eq(200) }
+      it { expect(subject).to render_template('destroy') }
+    end
+
+    context "invalid branch name, valid ref" do
+      let(:branch) { "no-branch" }
+
+      it { expect(response.status).to eq(404) }
+      it { expect(subject).to render_template('destroy') }
+    end
+  end
 end