Index: trunk/phase3/resources/mediawiki/mediawiki.util.js
===================================================================
--- trunk/phase3/resources/mediawiki/mediawiki.util.js	(revision 109783)
+++ trunk/phase3/resources/mediawiki/mediawiki.util.js	(working copy)
@@ -277,6 +277,21 @@
 		 */
 		$content: null,
 
+		/*
+		 * @var jQuery.Callback
+		 * A jQuery.Callbacks object that fires every time $content is updated
+		 *
+		 * @example Bind a custom callback function
+		 * mw.util.callback.add( function () {
+		 *	console.log( 'There are ' + mw.util.$content.find( 'a' ).length + ' links in the text.' );
+		 * });
+		 *
+		 * @example Fire the callback functions after changing the content
+		 * mw.util.$content.html( 'new content' );
+		 * mw.util.callback.fire();
+		 */
+		callback: jQuery.Callbacks( 'memory' ),
+
 		/**
 		 * Add a link to a portlet menu on the page, such as:
 		 *
Index: trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js
===================================================================
--- trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js	(revision 109783)
+++ trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js	(working copy)
@@ -1,27 +1,32 @@
-jQuery( document ).ready( function( $ ) {
-
-	/* Initialize utilities (messageBoxNew, profile, tooltip access keys, TOC etc.) */
-	mw.util.init();
-
-	/* Emulate placeholder if not supported by browser */
-	if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
-		$( 'input[placeholder]' ).placeholder();
-	}
-
-	/* Enable makeCollapsible */
-	$( '.mw-collapsible' ).makeCollapsible();
-
-	/* Lazy load jquery.tablesorter */
-	if ( $( 'table.sortable' ).length ) {
-		mw.loader.using( 'jquery.tablesorter', function() {
-			$( 'table.sortable' ).tablesorter();
-		});
-	}
-
-	/* Enable CheckboxShiftClick */
-	$( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
-
-	/* Add accesskey hints to the tooltips */
-	mw.util.updateTooltipAccessKeys();
-
-} );
+( function ( $, mw ) {
+	mw.util.callback.add( function () {
+		/* Enable makeCollapsible */
+		$( '.mw-collapsible' ).makeCollapsible();
+
+		/* Lazy load jquery.tablesorter */
+		if ( $( 'table.sortable' ).length ) {
+			mw.loader.using( 'jquery.tablesorter', function() {
+				$( 'table.sortable' ).tablesorter();
+			});
+		}
+	});
+
+	$( document ).ready( function () {
+		/* Initialize utilities (messageBoxNew, profile, tooltip access keys, TOC etc.) */
+		mw.util.init();
+
+		/* Emulate placeholder if not supported by browser */
+		if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
+			$( 'input[placeholder]' ).placeholder();
+		}
+
+		/* Enable CheckboxShiftClick */
+		$( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
+
+		/* Add accesskey hints to the tooltips */
+		mw.util.updateTooltipAccessKeys();
+
+		/* Fire the callbacks for the first time */
+		mw.util.callback.fire();
+	});
+} )( jQuery, mediaWiki );
Index: trunk/phase3/resources/Resources.php
===================================================================
--- trunk/phase3/resources/Resources.php	(revision 109783)
+++ trunk/phase3/resources/Resources.php	(working copy)
@@ -852,7 +852,7 @@
 		'scripts' => 'common/preview.js',
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => 'mediawiki.legacy.wikibits',
+		'dependencies' => array( 'mediawiki.legacy.wikibits', 'mediawiki.util' ),
 	),
 	'mediawiki.legacy.protect' => array(
 		'scripts' => 'common/protect.js',
Index: trunk/phase3/skins/common/preview.js
===================================================================
--- trunk/phase3/skins/common/preview.js	(revision 109783)
+++ trunk/phase3/skins/common/preview.js	(working copy)
@@ -49,6 +49,7 @@
 				loadSpinner.remove();
 
 				$( mw ).trigger( 'LivePreviewDone', [copyElements] );
+				mw.util.callback.fire();
 			} );
 	};
