Index: src/wp-admin/js/theme.js
===================================================================
--- src/wp-admin/js/theme.js	(revision 27969)
+++ src/wp-admin/js/theme.js	(working copy)
@@ -442,6 +442,23 @@
 		this.touchDrag = true;
 	},
 
+	// Handles .disabled classes for next/previous buttons in theme installer preview
+	setNavButtonsState: function() {
+		var $themeInstaller = $( '#theme-installer' ),
+			current = _.isUndefined( this.current ) ? this.model : this.current;
+
+		// Disable Left at the zero position
+		if ( 0 === this.model.collection.indexOf( current ) ) {
+			$themeInstaller.find( '.previous-theme' ).addClass( 'disabled' );
+		}
+
+		// Disable next if the next model is undefined
+		if ( _.isUndefined( this.model.collection.at( this.model.collection.indexOf( current ) + 1 ) ) ) {
+			$themeInstaller.find( '.next-theme' ).addClass( 'disabled' );
+		}
+	},
+
+
 	preview: function( event ) {
 		var self = this,
 			current, preview;
@@ -494,6 +511,7 @@
 
 			// If we have no more themes, bail.
 			if ( _.isUndefined( self.current ) ) {
+				self.options.parent.parent.trigger( 'theme:end' );
 				return self.current = current;
 			}
 
@@ -504,6 +522,7 @@
 
 			// Render and append.
 			preview.render();
+			this.setNavButtonsState();
 			$( 'div.wrap' ).append( preview.el );
 		})
 		.listenTo( preview, 'theme:previous', function() {
@@ -531,8 +550,10 @@
 
 			// Render and append.
 			preview.render();
+			this.setNavButtonsState();
 			$( 'div.wrap' ).append( preview.el );
 		});
+		self.setNavButtonsState();
 	}
 });
 
