diff --git a/app/assets/javascripts/merge_conflict_data_provider.js.es6 b/app/assets/javascripts/merge_conflict_data_provider.js.es6
index f0f51a65b94024459d43bbcf1408c3df46c461f2..7e20eb1ce6628779d48d779d70c4539227370b7d 100644
--- a/app/assets/javascripts/merge_conflict_data_provider.js.es6
+++ b/app/assets/javascripts/merge_conflict_data_provider.js.es6
@@ -11,6 +11,7 @@ window.MergeConflictDataProvider = class MergeConflictDataProvider {
       hasError       : false,
       isParallel     : diffViewType === 'parallel',
       diffViewType   : diffViewType,
+      isSubmitting   : false,
       conflictsData  : {},
       resolutionData : {}
     }
@@ -18,7 +19,7 @@ window.MergeConflictDataProvider = class MergeConflictDataProvider {
 
 
   decorateData(vueInstance, data) {
-    this.vueInstance    = vueInstance;
+    this.vueInstance = vueInstance;
 
     if (data.type === 'error') {
       vueInstance.hasError = true;
@@ -34,6 +35,7 @@ window.MergeConflictDataProvider = class MergeConflictDataProvider {
     }
 
     vueInstance.conflictsData = data;
+    vueInstance.isSubmitting = false;
   }
 
 
@@ -233,7 +235,7 @@ window.MergeConflictDataProvider = class MergeConflictDataProvider {
 
 
   isAllResolved() {
-    return this.getConflictsCount() === this.getResolvedCount();
+    return !this.vueInstance.isSubmitting && this.getConflictsCount() === this.getResolvedCount();
   }
 
 
diff --git a/app/assets/javascripts/merge_conflict_resolver.js.es6 b/app/assets/javascripts/merge_conflict_resolver.js.es6
index cff43a3b40f7595618f889d828f6593b4a6508c1..59e26f1405a041e786c7d1f25bb0a0978621a429 100644
--- a/app/assets/javascripts/merge_conflict_resolver.js.es6
+++ b/app/assets/javascripts/merge_conflict_resolver.js.es6
@@ -31,6 +31,17 @@ window.MergeConflictResolver = class MergeConflictResolver {
   }
 
 
+  setComputedProperties() {
+    const dp = this.dataProvider;
+
+    return {
+      conflictsCount() { return dp.getConflictsCount() },
+      resolvedCount()  { return dp.getResolvedCount() },
+      allResolved()    { return dp.isAllResolved() }
+    }
+  }
+
+
   fetchData() {
     const dp = this.dataProvider;
 
@@ -47,21 +58,19 @@ window.MergeConflictResolver = class MergeConflictResolver {
   }
 
 
-  setComputedProperties() {
-    const dp = this.dataProvider;
-
-    return {
-      conflictsCount() { return dp.getConflictsCount() },
-      resolvedCount()  { return dp.getResolvedCount() },
-      allResolved()    { return dp.isAllResolved() }
-    }
-  }
-
   commit() {
+    this.vue.isSubmitting = true;
+
     $.post('./resolve_conflicts', this.dataProvider.getCommitData())
-      .then( (data) => {
-        window.location.href = data.redirect_to
+      .done( (data) => {
+        window.location.href = data.redirect_to;
+      })
+      .error(() => {
+        new Flash('Something went wrong!');
       })
+      .always(() => {
+        this.vue.isSubmitting = false;
+      });
   }
 
 }
diff --git a/app/assets/stylesheets/pages/merge_conflicts.scss b/app/assets/stylesheets/pages/merge_conflicts.scss
index 965348b3b88a8d91c9ca53d0020f64fa956e0f1b..ab5a2570827b92d4efb26427c7aaf3e9d8344bfc 100644
--- a/app/assets/stylesheets/pages/merge_conflicts.scss
+++ b/app/assets/stylesheets/pages/merge_conflicts.scss
@@ -137,4 +137,8 @@ $unselected_line:         #f8f8f8;
       outline: none;
     }
   }
+
+  .btn-success .fa-spinner {
+    color: #FFF;
+  }
 }
diff --git a/app/views/projects/merge_requests/conflicts.html.haml b/app/views/projects/merge_requests/conflicts.html.haml
index 14252fd32568b1b39f526eff24257ade8f68d919..46e85187a428eca2bd964d164bb849718063e78d 100644
--- a/app/views/projects/merge_requests/conflicts.html.haml
+++ b/app/views/projects/merge_requests/conflicts.html.haml
@@ -126,8 +126,10 @@
         %textarea.form-control.js-commit-message{":disabled" => "!allResolved", "v-model" => "conflictsData.commitMessage"}
           {{{conflictsData.commitMessage}}}
 
-      %button{type: 'button', class: 'btn btn-success js-submit-button', ":disabled" => "!allResolved", "@click" => "commit()"}
-        Commit conflict resolution
+      %button{type: "button", class: "btn btn-success js-submit-button", ":disabled" => "!allResolved", "@click" => "commit()"}
+        %span Commit conflict resolution
+        %a.fa.fa-spin.fa-spinner{":class" => "{'hidden': !isSubmitting}"}
 
-      / %button{type: 'button', class: 'btn btn-cancel'}
-      /   Cancel
+      / FIXME: Hardcoded path
+      %a.btn.btn-cancel{"href" => "diffs"}
+        Cancel