Index: wp-includes/js/media-models.js
===================================================================
--- wp-includes/js/media-models.js	(revision 22954)
+++ wp-includes/js/media-models.js	(working copy)
@@ -490,11 +490,29 @@
 		},
 
 		more: function( options ) {
-			if ( this.mirroring && this.mirroring.more )
-				return this.mirroring.more( options );
-			return $.Deferred().resolve().promise();
+			var deferred = $.Deferred(),
+				mirroring = this.mirroring,
+				attachments = this;
+
+			if ( ! mirroring || ! mirroring.more )
+				return deferred.resolveWith( this ).promise();
+
+			// If we're mirroring another collection, forward `more` to
+			// the mirrored collection. Account for a race condition by
+			// checking if we're still mirroring that collection when
+			// the request resolves.
+			mirroring.more( options ).done( function() {
+				if ( this === attachments.mirroring )
+					deferred.resolveWith( this );
+			});
+
+			return deferred.promise();
 		},
 
+		hasMore: function() {
+			return this.mirroring ? this.mirroring.hasMore() : false;
+		},
+
 		parse: function( resp, xhr ) {
 			return _.map( resp, function( attrs ) {
 				var attachment = Attachment.get( attrs.id );
@@ -583,9 +601,9 @@
 			options = options || {};
 			Attachments.prototype.initialize.apply( this, arguments );
 
-			this.args    = options.args;
-			this.hasMore = true;
-			this.created = new Date();
+			this.args     = options.args;
+			this._hasMore = true;
+			this.created  = new Date();
 
 			this.filters.order = function( attachment ) {
 				var orderby = this.props.get('orderby'),
@@ -627,21 +645,25 @@
 				this.observe( wp.Uploader.queue );
 		},
 
+		hasMore: function() {
+			return this._hasMore;
+		},
+
 		more: function( options ) {
 			var query = this;
 
 			if ( this._more && 'pending' === this._more.state() )
 				return this._more;
 
-			if ( ! this.hasMore )
-				return $.Deferred().resolve().promise();
+			if ( ! this.hasMore() )
+				return $.Deferred().resolveWith( this ).promise();
 
 			options = options || {};
 			options.add = true;
 
 			return this._more = this.fetch( options ).done( function( resp ) {
 				if ( _.isEmpty( resp ) || -1 === this.args.posts_per_page || resp.length < this.args.posts_per_page )
-					query.hasMore = false;
+					query._hasMore = false;
 			});
 		},
 
Index: wp-includes/js/media-views.js
===================================================================
--- wp-includes/js/media-views.js	(revision 22954)
+++ wp-includes/js/media-views.js	(working copy)
@@ -2821,7 +2821,7 @@
 			if ( ! this.$el.is(':visible') )
 				return;
 
-			if ( this.el.scrollHeight < this.el.scrollTop + ( this.el.clientHeight * this.options.refreshThreshold ) ) {
+			if ( this.collection.hasMore() && this.el.scrollHeight < this.el.scrollTop + ( this.el.clientHeight * this.options.refreshThreshold ) ) {
 				this.collection.more().done( this.scroll );
 			}
 		}
