diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee
index 090af9bb3760c1662239e79e268093ff620f1da8..3ab3ba66754a9d3cb4400cbb68998c316145f190 100644
--- a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee
+++ b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee
@@ -20,26 +20,41 @@ class @BlobFileDropzone
       headers:
         "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
 
-      success: (header, response) ->
-        window.location.href = response.filePath
-        return
+      init: ->
+        this.on 'addedfile', (file) ->
+          $('.dropzone-alerts').html('').hide()
+          commit_message = form.find('#commit_message')[0]
 
-      error: (temp, errorMessage) ->
-        stripped = $("<div/>").html(errorMessage).text();
-        $('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show()
-        return
+          if /^Upload/.test(commit_message.placeholder)
+            commit_message.placeholder = 'Upload ' + file.name
 
-      maxfilesexceeded: (file) ->
-        @removeFile file
-        return
+          return
+
+        this.on 'removedfile', (file) ->
+          commit_message = form.find('#commit_message')[0]
 
-      removedfile: (file) ->
-        $('.dropzone-previews')[0].removeChild(file.previewTemplate)
-        $('.dropzone-alerts').html('').hide()
-        return true
+          if /^Upload/.test(commit_message.placeholder)
+            commit_message.placeholder = 'Upload new file'
 
-      sending: (file, xhr, formData) ->
-        formData.append('commit_message', form.find('#commit_message').val())
+          return
+
+        this.on 'success', (header, response) ->
+          window.location.href = response.filePath
+          return
+
+        this.on 'maxfilesexceeded', (file) ->
+          @removeFile file
+          return
+
+        this.on 'sending', (file, xhr, formData) ->
+          formData.append('commit_message', form.find('#commit_message').val())
+          return
+
+      # Override behavior of adding error underneath preview
+      error: (file, errorMessage) ->
+        stripped = $("<div/>").html(errorMessage).text();
+        $('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show()
+        @removeFile file
         return
     )
 
diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss
index 3a237bf32283a130fb33b7050ce56e1424ac6249..48fad7701efbf70f8db37052d068ca5610c1d3a8 100644
--- a/app/assets/stylesheets/generic/common.scss
+++ b/app/assets/stylesheets/generic/common.scss
@@ -382,3 +382,11 @@ table {
     margin-bottom: 0;
   }
 }
+
+.dropzone .dz-preview .dz-progress {
+  border-color: $border-color !important;
+}
+
+.dropzone .dz-preview .dz-progress .dz-upload {
+  background: $gl-success !important;
+}
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index df7fab07a578c7037b7f188828f60d865fb2b065..271cc547e2b31faa7c101b4b5c9242d29d9bc529 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -121,10 +121,11 @@
   text-align: center;
   border: 2px;
   border-style: dashed;
+  border-color: $border-color;
   min-height: 200px;
 }
 
 .upload-link {
   font-weight: normal;
-  color: #0000EE;
+  color: $md-link-color;
 }
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 8776721d243d7283b26b26728b23c7dd4e78077f..d7be212c33a8d6b71d43b095663f2aa0e0b23399 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -18,6 +18,12 @@ class Projects::BlobController < Projects::ApplicationController
   before_action :after_edit_path, only: [:edit, :update]
 
   def new
+    @title = 'Upload'
+    @placeholder = 'Upload new file'
+    @button_title = 'Upload file'
+    @form_path = namespace_project_create_blob_path(@project.namespace, @project, @id)
+    @method = :post
+
     commit unless @repository.empty?
   end
 
@@ -40,6 +46,11 @@ class Projects::BlobController < Projects::ApplicationController
   end
 
   def show
+    @title = "Replace #{@blob.name}"
+    @placeholder = @title
+    @button_title = 'Replace file'
+    @form_path = namespace_project_update_blob_path(@project.namespace, @project, @id)
+    @method = :put
   end
 
   def edit
diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml
index 5b61846fe6dd854bd4916ab71e6b86b62acdd6f4..373b3a0c5b0afe674cd720fb8bf68c0d8fa6aca0 100644
--- a/app/views/projects/blob/_actions.html.haml
+++ b/app/views/projects/blob/_actions.html.haml
@@ -17,6 +17,6 @@
         tree_join(@commit.sha, @path)), class: 'btn btn-sm'
 
 - if allowed_tree_edit?
-  .btn-group{:role => "group"}
-    %button.btn.btn-default{class: 'btn-primary', href: '#modal-replace-blob', 'data-target' => '#modal-replace-blob', 'data-toggle' => 'modal'} Replace
-    %button.btn.btn-default{class: 'btn-remove', href: '#modal-remove-blob', 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal'} Remove
+  .btn-group{ role: "group" }
+    %button.btn.btn-default{ 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } Replace
+    %button.btn.btn-remove{ 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal' } Remove
diff --git a/app/views/projects/blob/_replace.html.haml b/app/views/projects/blob/_replace.html.haml
deleted file mode 100644
index 84abf0303d0a86b705a36c0d8a3922db3ae95829..0000000000000000000000000000000000000000
--- a/app/views/projects/blob/_replace.html.haml
+++ /dev/null
@@ -1,28 +0,0 @@
-#modal-replace-blob.modal
-  .modal-dialog
-    .modal-content
-      .modal-header
-        %a.close{href: "#", "data-dismiss" => "modal"} ×
-        %h3.page-title Replace #{@blob.name}
-        %p.light
-          From branch
-          %strong= @ref
-      .modal-body
-        = form_tag namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: 'blob-file-upload-form-js form-horizontal' do
-          .dropzone
-            .dropzone-previews{class: "blob-upload-dropzone-previews"}
-              %p.dz-message{class: "hint"}<
-                Attach files by dragging & dropping or&nbsp;
-                %a{href: '#', class: "markdown-selector"}>click to upload
-          %br
-          .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"}
-          = render 'shared/commit_message_container', params: params,
-            placeholder: 'Replace this file because...'
-          .form-group
-            .col-sm-offset-2.col-sm-10
-              = button_tag 'Replace file', class: 'btn btn-small btn-primary btn-replace-file', id: 'submit-all'
-              = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal"
-
-:coffeescript
-  disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-replace-file'
-  new BlobFileDropzone($('.blob-file-upload-form-js'), 'put')
diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml
index 5a6a3358a174016815ec706d84ef6f488d9663da..2cfb79486dc9a986c87db3b6f0e560e23ae95927 100644
--- a/app/views/projects/blob/_upload.html.haml
+++ b/app/views/projects/blob/_upload.html.haml
@@ -3,26 +3,26 @@
     .modal-content
       .modal-header
         %a.close{href: "#", "data-dismiss" => "modal"} ×
-        %h3.page-title Upload
+        %h3.page-title #{@title}
         %p.light
           From branch
           %strong= @ref
       .modal-body
-        = form_tag namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'blob-file-upload-form-js form-horizontal' do
+        = form_tag @form_path, method: @method, class: 'blob-file-upload-form-js form-horizontal' do
           .dropzone
-            .dropzone-previews{class: "blob-upload-dropzone-previews"}
-              %p.dz-message{class: "hint"}<
-                Attach files by dragging & dropping or&nbsp;
-                %a{href: '#', class: "markdown-selector"}>click to upload
+            .dropzone-previews.blob-upload-dropzone-previews
+              %p.dz-message.light
+                Attach a file by drag &amp; drop or
+                = link_to 'click to upload', '#', class: "markdown-selector"
           %br
-          .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"}
+          .dropzone-alerts{class: "alert alert-danger data", style: "display:none"}
           = render 'shared/commit_message_container', params: params,
-            placeholder: 'Upload this file because...'
+            placeholder: @placeholder
           .form-group
             .col-sm-offset-2.col-sm-10
-              = button_tag 'Upload file', class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all'
+              = button_tag @button_title, class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all'
               = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal"
 
 :coffeescript
   disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-upload-file'
-  new BlobFileDropzone($('.blob-file-upload-form-js'), 'post')
+  new BlobFileDropzone($('.blob-file-upload-form-js'), '#{@method}')
diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml
index 6fb46ea20405cd90b542d2c1936a49696e81ce9e..68c9ec7f8024c6e8f4578b89bebcc8da07372a67 100644
--- a/app/views/projects/blob/new.html.haml
+++ b/app/views/projects/blob/new.html.haml
@@ -1,10 +1,10 @@
-%h3.page-title<
-  Create new file or&nbsp;
-  %a.upload-link{href: '#modal-upload-blob', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'}>upload existing one
+.gray-content-block.top-block
+  Create a new file or
+  = link_to 'upload', '#modal-upload-blob',
+    { class: 'upload-link', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'}
+  an existing one
 
-.file-title
-  = render 'projects/blob/upload'
-  %br
+= render 'projects/blob/upload'
 
 .file-editor
   = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file js-requires-input') do
diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml
index 19e876ec34c6ec97b9da9bdb7adc09c89b2f876e..4e66a43bbd5ca09900b5b11f0736d4214683be06 100644
--- a/app/views/projects/blob/show.html.haml
+++ b/app/views/projects/blob/show.html.haml
@@ -10,4 +10,4 @@
 
 - if allowed_tree_edit?
   = render 'projects/blob/remove'
-  = render 'projects/blob/replace'
+  = render 'projects/blob/upload'
diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature
index b5b6abe6aff1273a558e2f925f6d2f3380ce144f..58574166ef3e90a5ab6857970aa31d70215c7613 100644
--- a/features/project/source/browse_files.feature
+++ b/features/project/source/browse_files.feature
@@ -33,13 +33,13 @@ Feature: Project Source Browse Files
     And I click on "Commit Changes"
     Then I am redirected to the new file
     And I should see its new content
-    
+
   @javascript
   Scenario: I can upload file and commit
     Given I click on "new file" link in repo
     Then I can see new file page
-    And I can see "upload existing one"
-    And I click on "upload existing one"
+    And I can see "upload an existing one"
+    And I click on "upload"
     And I upload a new text file
     And I fill the upload file commit message
     And I click on "Upload file"
diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb
index 7a0ee4df45e93dfa087d6ce3aefb801123235159..a1a49dd58a60c3a780ed612dafce054172b6ae48 100644
--- a/features/steps/project/source/browse_files.rb
+++ b/features/steps/project/source/browse_files.rb
@@ -119,12 +119,12 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
     expect(page).to have_content "Commit message"
   end
 
-  step 'I can see "upload existing one"' do
-    expect(page).to have_content "upload existing one"
+  step 'I can see "upload an existing one"' do
+    expect(page).to have_content "upload an existing one"
   end
 
-  step 'I click on "upload existing one"' do
-    click_link 'upload existing one'
+  step 'I click on "upload"' do
+    click_link 'upload'
   end
 
   step 'I click on "Upload file"' do
@@ -150,7 +150,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps
   end
 
   step 'I fill the replace file commit message' do
-    page.within('#modal-replace-blob') do
+    page.within('#modal-upload-blob') do
       fill_in :commit_message, with: 'Replacement file commit message'
     end
   end