Index: wp-includes/js/media-models.js
===================================================================
--- wp-includes/js/media-models.js	(revision )
+++ wp-includes/js/media-models.js	(working copy)
@@ -1,7 +1,7 @@
 window.wp = window.wp || {};
 
 (function($){
-	var Attachment, Attachments, Query, compare, l10n, media, bindSyncEvents;
+	var Attachment, Attachments, Query, compare, l10n, media;
 
 	/**
 	 * wp.media( attributes )
@@ -67,27 +67,6 @@ window.wp = window.wp || {};
 			return a > b ? -1 : 1;
 	};
 
-	// Ensures the 'sync' and 'error' events are always
-	// correctly triggered when overloading `Backbone.sync`.
-	bindSyncEvents = function( model, options ) {
-		var success = options.success,
-			error = options.error;
-
-		options.success = function( resp ) {
-			if ( success )
-				success( resp );
-			model.trigger( 'sync', model, resp, options );
-		};
-
-		options.error = function( xhr ) {
-			if ( error )
-				error( xhr );
-			model.trigger( 'error', model, xhr, options );
-		};
-
-		return options;
-	};
-
 	_.extend( media, {
 		/**
 		 * media.template( id )
@@ -197,7 +176,6 @@ window.wp = window.wp || {};
 					action: 'get-attachment',
 					id: this.id
 				});
-				bindSyncEvents( model, options );
 				return media.ajax( options );
 
 			// Overload the `update` request so properties can be saved.
@@ -226,7 +204,6 @@ window.wp = window.wp || {};
 					}, this );
 				}
 
-				bindSyncEvents( model, options );
 				return media.ajax( options );
 
 			// Overload the `delete` request so attachments can be removed.
@@ -244,7 +221,6 @@ window.wp = window.wp || {};
 					_wpnonce: this.get('nonces')['delete']
 				});
 
-				bindSyncEvents( model, options );
 				return media.ajax( options ).done( function() {
 					this.destroyed = true;
 				}).fail( function() {
@@ -506,6 +482,19 @@ window.wp = window.wp || {};
 			return this.mirroring ? this.mirroring.hasMore() : false;
 		},
 
+		parse: function( resp, xhr ) {
+			if (! _.isArray(resp))
+				resp = [resp];
+
+			return _.map( resp, function( attrs ) {
+				if (attrs instanceof Backbone.Model )
+					return attrs;
+
+				var attachment = Attachment.get( attrs.id );
+				return attachment.set( attachment.parse( attrs, xhr ) );
+			});
+		},
+
 		_requery: function() {
 			if ( this.props.get('query') )
 				this.mirror( Query.get( this.props.toJSON() ) );
@@ -701,7 +690,6 @@ window.wp = window.wp || {};
 					args.paged = Math.floor( this.length / args.posts_per_page ) + 1;
 
 				options.data.query = args;
-				bindSyncEvents( model, options );
 				return media.ajax( options );
 
 			// Otherwise, fall back to Backbone.sync()
