diff --git a/reviewboard/static/rb/css/common.less b/reviewboard/static/rb/css/common.less
index d0584841207a11fce0e9ee6bede9582c893d65fb..0933ee878930312dc2fb55afaec9b0ea3476983f 100644
--- a/reviewboard/static/rb/css/common.less
+++ b/reviewboard/static/rb/css/common.less
@@ -414,7 +414,7 @@ input[type=submit].btn {
  * Inline editor forms
  ****************************************************************************/
 .editicon {
-  margin-left: 4px;
+  margin-left: @edit-icon-margin;
 
   .rb-icon {
     vertical-align: bottom;
diff --git a/reviewboard/static/rb/css/defs.less b/reviewboard/static/rb/css/defs.less
index d68ed9159221c4a948e01d5d3a30bc152aeef143..4b5eb3a794323a22e7c7a3be093800b4aa792161 100644
--- a/reviewboard/static/rb/css/defs.less
+++ b/reviewboard/static/rb/css/defs.less
@@ -37,6 +37,8 @@
 @box-padding: 10px;
 @box-bg: #FFFFFF;
 
+@edit-icon-margin: 4px;
+
 @draft-bg-color: #CDFF9C;
 @draft-border-color: darken(@draft-bg-color, 50%);
 
diff --git a/reviewboard/static/rb/css/reviews.less b/reviewboard/static/rb/css/reviews.less
index 78ff69d4403a5bdc6580d7f2e33ea42d32d619ac..2bfb0b3f6ce173181a7d2e90a8dd408ea2aebb21 100644
--- a/reviewboard/static/rb/css/reviews.less
+++ b/reviewboard/static/rb/css/reviews.less
@@ -1205,11 +1205,26 @@
  * Uploaded files
  ****************************************************************************/
 .file-container {
+  &.editing .file {
+    .border-radius(@box-border-radius @box-border-radius 0 0);
+
+    .file-caption-container {
+      padding-left: 0;
+      padding-right: 0;
+
+      .file-caption {
+        text-overflow: initial;
+      }
+    }
+  }
+
   .file {
+    @file-attachment-bg: white;
     @file-attachment-width: 300px;
+    @file-attachment-border-color: #CCCCCC;
 
     background-color: #FEFEFE;
-    border: 1px #CCCCCC solid;
+    border: 1px @file-attachment-border-color solid;
     display: block;
     float: left;
     position: relative;
@@ -1218,6 +1233,7 @@
     width: @file-attachment-width;
     .border-radius(@box-border-radius);
     .box-shadow(@box-shadow);
+    .box-sizing(border-box);
 
     .actions {
       li {
@@ -1256,7 +1272,7 @@
     .file-header {
       @file-header-height: 2.5em;
 
-      background: white;
+      background: @file-attachment-bg;
       padding: 0 0.5em;
       line-height: @file-header-height;
       height: @file-header-height;
@@ -1277,7 +1293,7 @@
     .file-thumbnail-container {
       @thumbnail-height: 100px;
 
-      background: white;
+      background: @file-attachment-bg;
       height: @thumbnail-height;
       padding: 1em;
       text-align: center;
@@ -1334,11 +1350,11 @@
     }
 
     .file-caption-container {
-      @caption-height: 27px;
+      @caption-height: 31px;
 
       border-top: 1px #EEEEEE solid;
       line-height: 2.5em;
-      padding: 0 25px;
+      padding: 0 30px;
       position: relative;
       text-align: center;
       .border-radius(0 0 7px 7px);
@@ -1357,9 +1373,34 @@
         line-height: @caption-height;
         height: @caption-height;
         .ellipsize();
+
+        .buttons {
+          /*
+           * This provides enough padding to cleanly cover much of any file
+           * attachment's header below.
+           */
+          @buttons-padding-vert: 5px;
+
+          position: absolute;
+          padding: @buttons-padding-vert 0;
+
+          /* Line up with .file's side borders. */
+          margin: 0 0 0 -1px;
+
+          text-align: center;
+          background: darken(@file-attachment-bg, 5%);
+          border: 1px @file-attachment-border-color solid;
+          border-top: 0;
+          width: @file-attachment-width;
+          .border-radius(0 0 @box-border-radius @box-border-radius);
+          .box-sizing(border-box);
+          .box-shadow(@box-shadow);
+          z-index: @z-index-deco;
+        }
       }
 
-      .inline-editor-form > input {
+      .inline-editor-form > input[type='text'] {
+        background: transparent;
         border: 0;
         font-family: inherit;
         font-size: inherit;
@@ -1367,6 +1408,13 @@
         margin: 0;
         padding-top: 0;
         padding-bottom: 0;
+
+        /*
+         * The 4px is needed to align the input with the text. It matches
+         * the margin between the text and pencil.
+         */
+        padding: 0 @edit-icon-margin 0 0;
+
         text-align: inherit;
         vertical-align: bottom;
         .box-sizing(border-box);
@@ -1383,8 +1431,8 @@
       .rb-icon-edit {
         vertical-align: middle;
         position: absolute;
-        right: 4px;
-        bottom: 4px;
+        right: 6px;
+        bottom: 6px;
       }
     }
   }
diff --git a/reviewboard/static/rb/js/views/fileAttachmentThumbnailView.js b/reviewboard/static/rb/js/views/fileAttachmentThumbnailView.js
index b0a89c81e15aef4a469f49d01e19bb8d02717890..422a06ce75425e5622a6f7adb5b1d5e7262d5869 100644
--- a/reviewboard/static/rb/js/views/fileAttachmentThumbnailView.js
+++ b/reviewboard/static/rb/js/views/fileAttachmentThumbnailView.js
@@ -156,20 +156,28 @@ RB.FileAttachmentThumbnail = Backbone.View.extend({
             this._$caption
                 .inlineEditor({
                     editIconClass: 'rb-icon rb-icon-edit',
-                    showButtons: false
+                    showButtons: true
                 })
                 .on({
+                    beginEditPreShow: function() {
+                        self.$el.addClass('editing');
+                    },
                     beginEdit: function() {
-                         if ($(this).hasClass('empty-caption')) {
-                             $(this).inlineEditor('field').val('');
-                         }
+                        var $this = $(this);
+
+                        if ($this.hasClass('empty-caption')) {
+                            $this.inlineEditor('field').val('');
+                        }
 
                         self.trigger('beginEdit');
                     },
                     cancel: function() {
+                        self.$el.removeClass('editing');
                         self.trigger('endEdit');
                     },
                     complete: function(e, value) {
+                        self.$el.removeClass('editing');
+
                         /*
                          * We want to set the caption after ready() finishes,
                          * it case it loads state and overwrites.
