diff --git src/wp-includes/js/customize-preview-nav-menus.js src/wp-includes/js/customize-preview-nav-menus.js
index 27c5251..754e5ec 100644
--- src/wp-includes/js/customize-preview-nav-menus.js
+++ src/wp-includes/js/customize-preview-nav-menus.js
@@ -21,11 +21,10 @@ wp.customize.navMenusPreview = wp.customize.MenusCustomizerPreview = ( function(
 		 * Keep track of whether we synced to determine whether or not bindSettingListener
 		 * should also initially fire the listener. This initial firing needs to wait until
 		 * after all of the settings have been synced from the pane in order to prevent
-		 * an infinite selective fallback-refresh. Note that this sync handler will be
-		 * added after the sync handler in customize-preview.js, so it will be triggered
-		 * after all of the settings are added.
+		 * an infinite selective fallback-refresh. Note that the active message is sent
+		 * from the controls once the synced message is sent from the preview.
 		 */
-		api.preview.bind( 'sync', function() {
+		api.preview.bind( 'active', function() {
 			synced = true;
 		} );
 
diff --git src/wp-includes/js/customize-selective-refresh.js src/wp-includes/js/customize-selective-refresh.js
index f6dfa0b..3e6cb7e 100644
--- src/wp-includes/js/customize-selective-refresh.js
+++ src/wp-includes/js/customize-selective-refresh.js
@@ -951,7 +951,9 @@ wp.customize.selectiveRefresh = ( function( $, api ) {
 			setting.unbind( handleSettingChange );
 		};
 
-		api.bind( 'add', watchSettingChange );
+		api.preview.bind( 'sync', function() {
+			api.bind( 'add', watchSettingChange );
+		} );
 		api.bind( 'remove', unwatchSettingChange );
 		api.each( function( setting ) {
 			setting.bind( handleSettingChange );
