Index: Gruntfile.js
===================================================================
--- Gruntfile.js	(revision 31627)
+++ Gruntfile.js	(working copy)
@@ -117,11 +117,23 @@
 			}
 		},
 		browserify: {
-			media: {
+			mediaModels: {
+				files: {
+					'src/wp-includes/js/media/models.js' : [ SOURCE_DIR + 'wp-includes/js/media/models.manifest.js' ]
+				}
+			},
+			mediaViews: {
+				files: {
+					'src/wp-includes/js/media/views.js' : [ SOURCE_DIR + 'wp-includes/js/media/views.manifest.js' ]
+				}
+			},
+			mediaAV: {
+				files: {
+					'src/wp-includes/js/media/audio-video.js' : [ SOURCE_DIR + 'wp-includes/js/media/audio-video.manifest.js' ]
+				}
+			},
+			mediaGrid: {
 				files: {
-					'src/wp-includes/js/media/models.js' : [ SOURCE_DIR + 'wp-includes/js/media/models.manifest.js' ],
-					'src/wp-includes/js/media/views.js' : [ SOURCE_DIR + 'wp-includes/js/media/views.manifest.js' ],
-					'src/wp-includes/js/media/audio-video.js' : [ SOURCE_DIR + 'wp-includes/js/media/audio-video.manifest.js' ],
 					'src/wp-includes/js/media/grid.js' : [ SOURCE_DIR + 'wp-includes/js/media/grid.manifest.js' ]
 				}
 			}
@@ -556,13 +568,16 @@
 
 	// Register tasks.
 
-	// RTL task.
-	grunt.registerTask('rtl', ['rtlcss:core', 'rtlcss:colors']);
+	grunt.registerTask( 'rtl', [
+		'rtlcss:core',
+		'rtlcss:colors'
+	] );
 
-	// Color schemes task.
-	grunt.registerTask('colors', ['sass:colors', 'autoprefixer:colors']);
+	grunt.registerTask( 'colors', [
+		'sass:colors',
+		'autoprefixer:colors'
+	] );
 
-	// JSHint task.
 	grunt.registerTask( 'jshint:corejs', [
 		'jshint:grunt',
 		'jshint:tests',
@@ -571,41 +586,91 @@
 		'jshint:media'
 	] );
 
-	// Pre-commit task.
-	grunt.registerTask('precommit', 'Runs front-end dev/test tasks in preparation for a commit.',
-		['autoprefixer:core', 'imagemin:core', 'jshint:corejs', 'qunit:compiled', 'uglify:bookmarklet']);
-
-	// Copy task.
-	grunt.registerTask('copy:all', ['copy:files', 'copy:wp-admin-rtl', 'copy:version']);
-
-	// Build task.
-	grunt.registerTask('build', ['clean:all', 'copy:all', 'cssmin:core', 'colors', 'rtl', 'cssmin:rtl', 'cssmin:colors',
-		'browserify:media', 'uglify:core', 'uglify:media', 'uglify:jqueryui', 'concat:tinymce', 'compress:tinymce',
-		'clean:tinymce', 'jsvalidate:build']);
-
-	// Testing tasks.
-	grunt.registerMultiTask('phpunit', 'Runs PHPUnit tests, including the ajax, external-http, and multisite tests.', function() {
-		grunt.util.spawn({
+	grunt.registerTask( 'watchify', function() {
+		grunt.config( 'browserify.options', {
+			browserifyOptions: {
+				debug: true
+			},
+			watch: true
+		} );
+
+		grunt.config( 'browserify.mediaGrid.options', {
+			keepAlive: true
+		} );
+
+		grunt.task.run( [
+			'browserify'
+			// Any grunt watch task can go here,
+			// but the keepAlive option needs to be false.
+		] );
+	} );
+
+	grunt.registerTask( 'precommit', 'Runs front-end dev/test tasks in preparation for a commit.', [
+		'autoprefixer:core',
+		'imagemin:core',
+		'browserify',
+		'jshint:corejs',
+		'qunit:compiled',
+		'uglify:bookmarklet'
+	] );
+
+	grunt.registerTask( 'copy:all', [
+		'copy:files',
+		'copy:wp-admin-rtl',
+		'copy:version'
+	] );
+
+	grunt.registerTask( 'build', [
+		'clean:all',
+		'copy:all',
+		'cssmin:core',
+		'colors',
+		'rtl',
+		'cssmin:rtl',
+		'cssmin:colors',
+		'browserify',
+		'uglify:core',
+		'uglify:media',
+		'uglify:jqueryui',
+		'concat:tinymce',
+		'compress:tinymce',
+		'clean:tinymce',
+		'jsvalidate:build'
+	] );
+
+	grunt.registerMultiTask( 'phpunit', 'Runs PHPUnit tests, including the ajax, external-http, and multisite tests.', function() {
+		grunt.util.spawn( {
 			cmd: this.data.cmd,
 			args: this.data.args,
-			opts: {stdio: 'inherit'}
-		}, this.async());
-	});
+			opts: { stdio: 'inherit' }
+		}, this.async() );
+	} );
+
+	grunt.registerTask( 'qunit:compiled', 'Runs QUnit tests on compiled as well as uncompiled scripts.', [
+		'build',
+		'copy:qunit',
+		'qunit'
+	] );
 
-	grunt.registerTask('qunit:compiled', 'Runs QUnit tests on compiled as well as uncompiled scripts.',
-		['build', 'copy:qunit', 'qunit']);
+	grunt.registerTask( 'test', 'Runs all QUnit and PHPUnit tasks.', [
+		'qunit:compiled',
+		'phpunit'
+	] );
 
-	grunt.registerTask('test', 'Runs all QUnit and PHPUnit tasks.', ['qunit:compiled', 'phpunit']);
+	grunt.registerTask( 'travis:js', 'Runs Javascript Travis CI tasks.', [
+		'jshint:corejs',
+		'qunit:compiled'
+	] );
 
-	// Travis CI tasks.
-	grunt.registerTask('travis:js', 'Runs Javascript Travis CI tasks.', [ 'jshint:corejs', 'qunit:compiled' ]);
-	grunt.registerTask('travis:phpunit', 'Runs PHPUnit Travis CI tasks.', 'phpunit');
+	grunt.registerTask( 'travis:phpunit', 'Runs PHPUnit Travis CI tasks.', [
+		'phpunit'
+	] );
 
-	// Patch task.
-	grunt.renameTask('patch_wordpress', 'patch');
+	grunt.registerTask( 'default', [
+		'build'
+	] );
 
-	// Default task.
-	grunt.registerTask('default', ['build']);
+	grunt.renameTask( 'patch_wordpress', 'patch' );
 
 	// Add a listener to the watch task.
 	//
