diff --git a/src/wp-admin/upload.php b/src/wp-admin/upload.php
index 11175f9..de099c7 100644
--- a/src/wp-admin/upload.php
+++ b/src/wp-admin/upload.php
@@ -24,14 +24,6 @@ if ( 'grid' === $mode ) {
 	wp_enqueue_media();
 	wp_enqueue_script( 'media' );
 	require_once( ABSPATH . 'wp-admin/admin-header.php' );
-	?><div class="view-switch media-grid-view-switch">
-		<a href="<?php echo esc_url( add_query_arg( 'mode', 'list', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-list">
-			<img id="view-switch-list" src="<?php echo includes_url( 'images/blank.gif' ) ?>" width="20" height="20" title="List View" alt="List View"/>
-		</a>
-		<a href="<?php echo esc_url( add_query_arg( 'mode', 'grid', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-grid current">
-			<img id="view-switch-excerpt" src="<?php echo includes_url( 'images/blank.gif' ) ?>" width="20" height="20" title="Grid View" alt="Grid View"/>
-		</a>
-	</div><?php
 	include( ABSPATH . 'wp-admin/admin-footer.php' );
 	exit;
 }
diff --git a/src/wp-includes/css/media-views.css b/src/wp-includes/css/media-views.css
index c768479..59e1113 100644
--- a/src/wp-includes/css/media-views.css
+++ b/src/wp-includes/css/media-views.css
@@ -909,6 +909,16 @@
 	border-radius: 0;
 }
 
+.attachment .data-field {
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	display: block;
+	line-height: 19px;
+	height: 19px;
+	text-align: left;
+}
+
 /**
  * Attachments Browser
  */
@@ -924,6 +934,10 @@
 	height: 50px;
 }
 
+.attachments-browser.hide-sidebar .media-toolbar {
+	right: 0;
+}
+
 .attachments-browser .media-toolbar-primary > .media-button,
 .attachments-browser .media-toolbar-primary > .media-button-group,
 .attachments-browser .media-toolbar-secondary > .media-button,
@@ -942,6 +956,42 @@
 	outline: none;
 }
 
+/**
+ * Copied styles from the theme browser view.
+ *
+ * This should be OOCSS'd so both use a shared selector.
+ */
+.attachment .edit-media {
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+	opacity: 0;
+	position: absolute;
+	top: 25%;
+	right: 25%;
+	left: 25%;
+	background: #222;
+	background: rgba(0,0,0,0.7);
+	color: #fff;
+	font-size: 15px;
+	text-shadow: 0 1px 0 rgba(0,0,0,0.6);
+	-webkit-font-smoothing: antialiased;
+	font-weight: 600;
+	padding: 10px 0;
+	text-align: center;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+	-webkit-transition: opacity 0.1s ease-in-out;
+	transition: opacity 0.1s ease-in-out;
+}
+
+.attachment:hover .edit-media {
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
+	opacity: 1;
+}
+
+.attachments-browser.hide-sidebar .attachments {
+	right: 0;
+}
+
 .attachments-browser .instructions {
 	display: inline-block;
 	margin-top: 16px;
@@ -2388,11 +2438,11 @@
 	line-height: 29px;
 }
 
-.media-grid-view-switch {
-	position: fixed;
-	right: 10px;
-	top: 44px;
-	z-index: 300;
+.media-grid-view .view-switch {
+	display: inline-block;
+	float: none;
+	margin-top: 13px;
+	vertical-align: middle;
 }
 
 /**
@@ -2427,7 +2477,32 @@
 	display: none;
 }
 
+/**
+ * Copied styles from the Add theme toolbar.
+ *
+ * This should be OOCSS'd so both use a shared selector.
+ */
+.media-grid-view .media-toolbar {
+	background: #fff;
+	-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
+	box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+	color: #555;
+	display: inline-block;
+	font-size: 13px;
+	padding: 0 20px;
+	position: relative;
+	width: 100%;
+}
+
+.media-grid-view.hide-router .media-frame-title {
+	box-shadow: none;
+}
+
 .media-grid-view .media-frame-content {
+	background-color: transparent;
 	bottom: 40px;
 }
 @media screen and (max-width: 782px) {
diff --git a/src/wp-includes/js/media-views.js b/src/wp-includes/js/media-views.js
index c1407d3..51d1a0a 100644
--- a/src/wp-includes/js/media-views.js
+++ b/src/wp-includes/js/media-views.js
@@ -337,6 +337,60 @@
 	});
 
 	/**
+	 * A more abstracted state, because media.controller.State expects
+	 * specific regions (menu, title, etc.) to exist on the frame, which do not
+	 * exist in media.view.Frame.EditAttachment.
+	 */
+	media.controller._State = Backbone.Model.extend({
+		constructor: function() {
+			this.on( 'activate', this._preActivate, this );
+			this.on( 'activate', this.activate, this );
+			this.on( 'activate', this._postActivate, this );
+			this.on( 'deactivate', this._deactivate, this );
+			this.on( 'deactivate', this.deactivate, this );
+			this.on( 'reset', this.reset, this );
+			this.on( 'ready', this.ready, this );
+			/**
+			 * Call parent constructor with passed arguments
+			 */
+			Backbone.Model.apply( this, arguments );
+		},
+
+		/**
+		 * @abstract
+		 */
+		ready: function() {},
+		/**
+		 * @abstract
+		 */
+		activate: function() {},
+		/**
+		 * @abstract
+		 */
+		deactivate: function() {},
+		/**
+		 * @abstract
+		 */
+		reset: function() {},
+		/**
+		 * @access private
+		 */
+		_preActivate: function() {
+			this.active = true;
+		},
+		/**
+		 * @access private
+		 */
+		_postActivate: function() {},
+		/**
+		 * @access private
+		 */
+		_deactivate: function() {
+			this.active = false;
+		}
+	});
+
+	/**
 	 * wp.media.controller.State
 	 *
 	 * A state is a step in a workflow that when set will trigger the controllers
@@ -1350,6 +1404,96 @@
 	});
 
 	/**
+	 * A state for editing (cropping, etc.) an image.
+	 *
+	 * @constructor
+	 * @augments wp.media.controller.State
+	 * @augments Backbone.Model
+	 */
+	media.controller.EditImageNoFrame = media.controller._State.extend({
+		defaults: {
+			id:      'edit-attachment',
+			title:   l10n.editImage,
+			// Region mode defaults.
+			menu:    false,
+			router:  'edit-metadata',
+			content: 'edit-metadata',
+			toolbar: 'toolbar',
+
+			url:     ''
+		},
+
+		initialize: function() {
+			media.controller._State.prototype.initialize.apply( this, arguments );
+		},
+
+		activate: function() {
+			this.listenTo( this.frame, 'toolbar:render:edit-image', this.toolbar );
+		},
+
+		_postActivate: function() {
+			this._content();
+			this._router();
+		},
+
+		deactivate: function() {
+			this.stopListening( this.frame );
+		},
+
+		toolbar: function() {
+			var frame = this.frame,
+				lastState = frame.lastState(),
+				previous = lastState && lastState.id;
+
+			frame.toolbar.set( new media.view.Toolbar({
+				controller: frame,
+				items: {
+					back: {
+						style: 'primary',
+						text:     l10n.back,
+						priority: 20,
+						click:    function() {
+							if ( previous ) {
+								frame.setState( previous );
+							} else {
+								frame.close();
+							}
+						}
+					}
+				}
+			}) );
+		},
+
+		/**
+		 * @access private
+		 */
+		_router: function() {
+			var router = this.frame.router,
+				mode = this.get('router'),
+				view;
+
+			this.frame.$el.toggleClass( 'hide-router', ! mode );
+			if ( ! mode ) {
+				return;
+			}
+
+			this.frame.router.render( mode );
+
+			view = router.get();
+			if ( view && view.select ) {
+				view.select( this.frame.content.mode() );
+			}
+		},
+
+		_content: function() {
+			var mode = this.get( 'content' );
+			if ( mode ) {
+				this.frame[ 'content' ].render( mode );
+			}
+		}
+	});
+
+	/**
 	 * wp.media.controller.MediaLibrary
 	 *
 	 * @constructor
@@ -1758,7 +1902,8 @@
 			_.defaults( this.options, {
 				title:    '',
 				modal:    true,
-				uploader: true
+				uploader: true,
+				mode:     ['select']
 			});
 
 			// Ensure core UI is enabled.
@@ -1981,7 +2126,8 @@
 				library:   {},
 				multiple:  false,
 				state:     'library',
-				uploader:  true
+				uploader:  true,
+				mode:      [ 'grid', 'edit' ]
 			});
 
 			// Ensure core and media grid view UI is enabled.
@@ -2056,15 +2202,23 @@
 					router:     false,
 					content:    'browse',
 					filterable: 'mime-types'
-				}),
-
-				new media.controller.EditImage( { model: options.editImage } )
+				})
 			]);
 		},
 
 		bindHandlers: function() {
 			this.on( 'content:create:browse', this.browseContent, this );
 			this.on( 'content:render:edit-image', this.editImageContent, this );
+
+			// Handle a frame-level event for editing an attachment.
+			this.on( 'edit:attachment', this.editAttachment, this );
+		},
+
+		/**
+		 * Open the Edit Attachment modal.
+		 */
+		editAttachment: function( model ) {
+			new media.view.Frame.EditAttachment({ model: model });
 		},
 
 		/**
@@ -2088,6 +2242,7 @@
 				display:    state.get('displaySettings'),
 				dragInfo:   state.get('dragInfo'),
 				bulkEdit:   true,
+				sidebar:    false,
 
 				suggestedWidth:  state.get('suggestedWidth'),
 				suggestedHeight: state.get('suggestedHeight'),
@@ -4718,7 +4873,7 @@
 					compat:        false,
 					alt:           '',
 					description:   ''
-				});
+				}, this.options );
 
 			options.buttons  = this.buttons;
 			options.describe = this.controller.state().get('describe');
@@ -4768,11 +4923,17 @@
 		 */
 		toggleSelectionHandler: function( event ) {
 			var method;
-
 			// Catch enter and space events
 			if ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {
 				return;
 			}
+
+			// In the grid view, bubble up an edit:attachment event to the controller.
+			if ( _.contains( this.controller.options.mode, 'grid' ) ) {
+				this.controller.trigger( 'edit:attachment', this.model );
+				return;
+			}
+
 			if ( event.shiftKey ) {
 				method = 'between';
 			} else if ( event.ctrlKey || event.metaKey ) {
@@ -5303,10 +5464,11 @@
 		 */
 		createAttachmentView: function( attachment ) {
 			var view = new this.options.AttachmentView({
-				controller: this.controller,
-				model:      attachment,
-				collection: this.collection,
-				selection:  this.options.selection
+				controller:           this.controller,
+				model:                attachment,
+				collection:           this.collection,
+				selection:            this.options.selection,
+				showAttachmentFields: this.options.showAttachmentFields
 			});
 
 			return this._viewsByCid[ attachment.cid ] = view;
@@ -5603,7 +5765,6 @@
 		}
 	});
 
-
 	/**
 	 * wp.media.view.AttachmentsBrowser
 	 *
@@ -5621,13 +5782,18 @@
 				filters: false,
 				search:  true,
 				display: false,
-
+				sidebar: true,
+				showAttachmentFields: getUserSetting( 'showAttachmentFields', [ 'title', 'uploadedTo', 'dateFormatted', 'mime' ] ),
 				AttachmentView: media.view.Attachment.Library
 			});
 
 			this.createToolbar();
 			this.updateContent();
-			this.createSidebar();
+			if ( this.options.sidebar ) {
+				this.createSidebar();
+			} else {
+				this.$el.addClass( 'hide-sidebar' );
+			}
 
 			this.collection.on( 'add remove reset', this.updateContent, this );
 		},
@@ -5652,6 +5818,20 @@
 
 			this.views.add( this.toolbar );
 
+			// Feels odd to bring the global media library switcher into the Attachment
+			// browser view. Is this a use case for doAction( 'add:toolbar-items:attachments-browser', this.toolbar );
+			// which the controller can tap into and add this view?
+			if ( _.contains( this.controller.options.mode, 'grid' ) ) {
+				var libraryViewSwitcherConstructor = media.View.extend({
+					className: 'view-switch media-grid-view-switch',
+					template: media.template( 'media-library-view-switcher')
+				});
+				this.toolbar.set( 'libraryViewSwitcher', new libraryViewSwitcherConstructor({
+					controller: this.controller,
+					priority: -90
+				}).render() );
+			}
+
 			filters = this.options.filters;
 			if ( 'uploaded' === filters ) {
 				FiltersConstructor = media.view.AttachmentFilters.Uploaded;
@@ -5746,11 +5926,12 @@
 			this.removeContent();
 
 			this.attachments = new media.view.Attachments({
-				controller: this.controller,
-				collection: this.collection,
-				selection:  this.options.selection,
-				model:      this.model,
-				sortable:   this.options.sortable,
+				controller:           this.controller,
+				collection:           this.collection,
+				selection:            this.options.selection,
+				model:                this.model,
+				sortable:             this.options.sortable,
+				showAttachmentFields: this.options.showAttachmentFields,
 
 				// The single `Attachment` view to be used in the `Attachments` view.
 				AttachmentView: this.options.AttachmentView
@@ -6814,6 +6995,152 @@
 		}
 	});
 
+	media.view.Attachment.Details.TwoColumn = media.view.Attachment.Details.extend({
+		template: wp.template( 'attachment-details-two-column' ),
+
+		initialize: function() {
+			var selection = this.options.selection;
+
+			this.$el.attr('aria-label', this.model.attributes.title).attr('aria-checked', false);
+			this.model.on( 'change:sizes change:uploading', this.render, this );
+			this.model.on( 'change:title', this._syncTitle, this );
+			this.model.on( 'change:caption', this._syncCaption, this );
+			this.model.on( 'change:percent', this.progress, this );
+
+			// Update the selection.
+			this.model.on( 'add', this.select, this );
+			this.model.on( 'remove', this.deselect, this );
+		},
+	});
+	/**
+	 * A frame for editing the details of a specific media item.
+	 *
+	 * Pops open in a modal by default.
+	 */
+	media.view.Frame.EditAttachment = media.view.Frame.extend({
+
+		className: 'edit-media-overlay',
+		template: media.template( 'edit-attachment-frame' ),
+		regions:   [ 'router', 'content' ],
+
+		events: {
+			'click':                    'collapse',
+			'click .delete-media-item': 'deleteMediaItem',
+			'click .left':              'previousMediaItem',
+			'click .right':             'nextMediaItem'
+		},
+
+		initialize: function( options ) {
+			var self = this;
+			media.view.Frame.prototype.initialize.apply( this, arguments );
+
+			_.defaults( this.options, {
+				modal:    true,
+				state: 'edit-attachment'
+			});
+
+			this.createStates();
+
+			this.on( 'content:render:edit-metadata', this.editMetadata, this );
+			this.on( 'content:render:edit-image', this.editImageContentUgh, this );
+
+			// Only need a tab to Edit Image for images.
+			if ( this.model.get( 'type' ) === 'image' ) {
+				this.on( 'router:create', this.createRouter, this );
+				this.on( 'router:render', this.browseRouter, this );
+			}
+
+			// Initialize modal container view.
+			if ( this.options.modal ) {
+				this.modal = new media.view.Modal({
+					controller: this,
+					title:      this.options.title
+				});
+
+				// Completely destroy the modal DOM element when closing it.
+				this.modal.close = function() {
+					self.modal.remove();
+				};
+
+				this.modal.content( this );
+				this.modal.open();
+			}
+		},
+
+		// Add the default states to the frame.
+		createStates: function() {
+			this.states.add([
+				new media.controller.EditImageNoFrame( { model: this.model } )
+			]);
+		},
+
+		/**
+		 * @returns {wp.media.view.MediaFrame} Returns itself to allow chaining
+		 */
+		render: function() {
+			// Activate the default state if no active state exists.
+			if ( ! this.state() && this.options.state ) {
+				this.setState( this.options.state );
+			}
+			/**
+			 * call 'render' directly on the parent class
+			 */
+			return media.view.Frame.prototype.render.apply( this, arguments );
+		},
+
+		editMetadata: function() {
+			var view = new media.view.Attachment.Details.TwoColumn({
+				controller: this,
+				model:      this.model
+			});
+			this.content.set( view );
+		},
+
+		/**
+		 * For some reason the view doesn't exist in the DOM yet, don't have the
+		 * patience to track this down right now.
+		 */
+		editImageContentUgh: function() {
+			_.defer( _.bind( this.editImageContent, this ) );
+		},
+
+		/**
+		 * Render the EditImage view into the frame's content region.
+		 */
+		editImageContent: function() {
+			var view = new media.view.EditImage( { model: this.model, controller: this } ).render();
+
+			this.content.set( view );
+
+			// after creating the wrapper view, load the actual editor via an ajax call
+			view.loadEditor();
+		},
+
+		/**
+		 * @param {Object} router
+		 * @this wp.media.controller.Region
+		 */
+		createRouter: function( router ) {
+			router.view = new media.view.Router({
+				controller: this
+			});
+		},
+
+		browseRouter: function( view ) {
+			view.set({
+				'edit-metadata': {
+					text:     'Edit Metadata',
+					priority: 20
+				},
+				'edit-image': {
+					text:     'Edit Image',
+					priority: 40
+				}
+			});
+		}
+
+	});
+
 	media.view.EditImage = media.View.extend({
 
 		className: 'image-editor',
diff --git a/src/wp-includes/media-template.php b/src/wp-includes/media-template.php
index 2c0ff80..517e493 100644
--- a/src/wp-includes/media-template.php
+++ b/src/wp-includes/media-template.php
@@ -220,6 +220,15 @@ function wp_print_media_templates() {
 		</div>
 	</script>
 
+	<script type="text/html" id="tmpl-media-library-view-switcher">
+		<a href="<?php echo esc_url( add_query_arg( 'mode', 'list', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-list">
+			<img id="view-switch-list" src="<?php echo includes_url( 'images/blank.gif' ) ?>" width="20" height="20" title="List View" alt="List View"/>
+		</a>
+		<a href="<?php echo esc_url( add_query_arg( 'mode', 'grid', $_SERVER['REQUEST_URI'] ) ) ?>" class="view-grid current">
+			<img id="view-switch-excerpt" src="<?php echo includes_url( 'images/blank.gif' ) ?>" width="20" height="20" title="Grid View" alt="Grid View"/>
+		</a>
+	</script>
+
 	<script type="text/html" id="tmpl-uploader-status">
 		<h3><?php _e( 'Uploading' ); ?></h3>
 		<a class="upload-dismiss-errors" href="#"><?php _e('Dismiss Errors'); ?></a>
@@ -241,6 +250,106 @@ function wp_print_media_templates() {
 		<span class="upload-error-message">{{ data.message }}</span>
 	</script>
 
+	<script type="text/html" id="tmpl-edit-attachment-frame">
+		<div class="edit-media-header">
+			<button class="left dashicons dashicons-no"><span class="screen-reader-text"><?php _e( 'Edit previous media item' ); ?></span></button>
+			<button class="right dashicons dashicons-no"><span class="screen-reader-text"><?php _e( 'Edit next media item' ); ?></span></button>
+		</div>
+		<div class="media-frame-router"></div>
+		<div class="media-frame-content"></div>
+		<div class="media-frame-toolbar"></div>
+	</script>
+
+	<script type="text/html" id="tmpl-attachment-details-two-column">
+		<h3>
+			<?php _e('Attachment Details'); ?>
+
+			<span class="settings-save-status">
+				<span class="spinner"></span>
+				<span class="saved"><?php esc_html_e('Saved.'); ?></span>
+			</span>
+		</h3>
+		<div class="attachment-info">
+			<div class="thumbnail thumbnail-{{ data.type }}">
+				<# if ( data.uploading ) { #>
+					<div class="media-progress-bar"><div></div></div>
+				<# } else if ( 'image' === data.type ) { #>
+					<img src="{{ data.size.url }}" draggable="false" />
+				<# } else { #>
+					<img src="{{ data.icon }}" class="icon" draggable="false" />
+				<# } #>
+			</div>
+			<div class="details">
+				<div class="filename">{{ data.filename }}</div>
+				<div class="uploaded">{{ data.dateFormatted }}</div>
+
+				<div class="file-size">{{ data.filesizeHumanReadable }}</div>
+				<# if ( 'image' === data.type && ! data.uploading ) { #>
+					<# if ( data.width && data.height ) { #>
+						<div class="dimensions">{{ data.width }} &times; {{ data.height }}</div>
+					<# } #>
+
+					<# if ( data.can.save ) { #>
+						<a class="edit-attachment" href="{{ data.editLink }}&amp;image-editor" target="_blank"><?php _e( 'Edit Image' ); ?></a>
+						<a class="refresh-attachment" href="#"><?php _e( 'Refresh' ); ?></a>
+					<# } #>
+				<# } #>
+
+				<# if ( data.fileLength ) { #>
+					<div class="file-length"><?php _e( 'Length:' ); ?> {{ data.fileLength }}</div>
+				<# } #>
+
+				<# if ( ! data.uploading && data.can.remove ) { #>
+					<?php if ( MEDIA_TRASH ): ?>
+						<a class="trash-attachment" href="#"><?php _e( 'Trash' ); ?></a>
+					<?php else: ?>
+						<a class="delete-attachment" href="#"><?php _e( 'Delete Permanently' ); ?></a>
+					<?php endif; ?>
+				<# } #>
+
+				<div class="compat-meta">
+					<# if ( data.compat && data.compat.meta ) { #>
+						{{{ data.compat.meta }}}
+					<# } #>
+				</div>
+			</div>
+		</div>
+
+		<label class="setting" data-setting="url">
+			<span class="name"><?php _e('URL'); ?></span>
+			<input type="text" value="{{ data.url }}" readonly />
+		</label>
+		<# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>
+		<label class="setting" data-setting="title">
+			<span class="name"><?php _e('Title'); ?></span>
+			<input type="text" value="{{ data.title }}" {{ maybeReadOnly }} />
+		</label>
+		<label class="setting" data-setting="caption">
+			<span class="name"><?php _e('Caption'); ?></span>
+			<textarea {{ maybeReadOnly }}>{{ data.caption }}</textarea>
+		</label>
+		<# if ( 'image' === data.type ) { #>
+			<label class="setting" data-setting="alt">
+				<span class="name"><?php _e('Alt Text'); ?></span>
+				<input type="text" value="{{ data.alt }}" {{ maybeReadOnly }} />
+			</label>
+		<# } #>
+		<label class="setting" data-setting="description">
+			<span class="name"><?php _e('Description'); ?></span>
+			<textarea {{ maybeReadOnly }}>{{ data.description }}</textarea>
+		</label>
+		<label class="setting">
+				<span class="name"><?php _e( 'Uploaded By' ); ?></span>
+				<span class="value">{{ data.authorName }}</span>
+			</label>
+		<# if ( data.uploadedTo ) { #>
+			<label class="setting">
+				<span class="name"><?php _e('Uploaded To'); ?></span>
+				<span class="value"><a href="{{ data.uploadedToLink }}">{{ data.uploadedToTitle }}</a></span>
+			</label>
+		<# } #>
+	</script>
+
 	<script type="text/html" id="tmpl-attachment">
 		<div class="attachment-preview type-{{ data.type }} subtype-{{ data.subtype }} {{ data.orientation }}">
 			<# if ( data.uploading ) { #>
@@ -257,7 +366,9 @@ function wp_print_media_templates() {
 					<div>{{ data.filename }}</div>
 				</div>
 			<# } #>
-
+			<# if ( _.contains( data.controller.options.mode, 'grid' ) ) { #>
+				<span class="edit-media">Edit Media</span>
+			<# } #>
 			<# if ( data.buttons.close ) { #>
 				<a class="close media-modal-icon" href="#" title="<?php esc_attr_e('Remove'); ?>"></a>
 			<# } #>
@@ -283,6 +394,25 @@ function wp_print_media_templates() {
 					<# } #> {{ maybeReadOnly }} />
 			<# } #>
 		<# } #>
+		<# if ( _.contains( data.controller.options.mode, 'grid' ) ) { #>
+			<# _.each( data.showAttachmentFields, function( field ) { #>
+				<div class="data-field data-{{ field }}">
+					<# if ( 'uploadedTo' === field ) { #>
+
+						<# if ( data[field] ) { #>
+						<?php _e( 'Uploaded To:' ) ?>
+						<# } else { #>
+						<?php _e( 'Unattached' ) ?>
+						<# } #>
+
+					<# } #>
+				<# if ( data[field] ) { #>
+					&nbsp;{{ data[field] }}
+				<# } #>
+				</div>
+			<# }); #>
+		<# } #>
+
 	</script>
 
 	<script type="text/html" id="tmpl-attachment-details">
