diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
index 631df0b..0a88dca 100644
--- src/wp-admin/js/customize-controls.js
+++ src/wp-admin/js/customize-controls.js
@@ -1484,7 +1484,7 @@
 
 		initialize: function( id, options ) {
 			var control = this,
-				nodes, radios, settings;
+				nodes, radios, deferredSettingIds = [];
 
 			control.params = {};
 			$.extend( control, options || {} );
@@ -1504,31 +1504,6 @@
 
 			control.elements = [];
 
-			nodes  = control.container.find('[data-customize-setting-link]');
-			radios = {};
-
-			nodes.each( function() {
-				var node = $( this ),
-					name;
-
-				if ( node.is( ':radio' ) ) {
-					name = node.prop( 'name' );
-					if ( radios[ name ] ) {
-						return;
-					}
-
-					radios[ name ] = true;
-					node = nodes.filter( '[name="' + name + '"]' );
-				}
-
-				api( node.data( 'customizeSettingLink' ), function( setting ) {
-					var element = new api.Element( node );
-					control.elements.push( element );
-					element.sync( setting );
-					element.set( setting() );
-				});
-			});
-
 			control.active.bind( function ( active ) {
 				var args = control.activeArgumentsQueue.shift();
 				args = $.extend( {}, control.defaultActiveArguments, args );
@@ -1541,49 +1516,42 @@
 
 			api.utils.bubbleChildValueChanges( control, [ 'section', 'priority', 'active' ] );
 
+			control.settings = {};
+
 			/*
 			 * After all settings related to the control are available,
 			 * make them available on the control and embed the control into the page.
 			 */
-			settings = $.map( control.params.settings, function( value ) {
-				return value;
-			});
+			_.each( control.params.settings, function( setting, key ) {
+				if ( _.isObject( setting ) ) {
+					control.settings[ key ] = setting;
+				} else {
+					deferredSettingIds.push( setting );
+				}
+			} );
+			control.setting = control.settings['default'] || null;
 
-			if ( 0 === settings.length ) {
+			if ( _.isEmpty( control.params.settings ) ) {
 				control.setting = null;
-				control.settings = {};
+				control.embed();
+			} else if ( _.isEmpty( deferredSettingIds ) ) {
+				control._linkElements();
+				control._linkNotifications();
 				control.embed();
 			} else {
-				api.apply( api, settings.concat( function() {
+				api.apply( api, deferredSettingIds.concat( function() {
 					var key;
 
-					control.settings = {};
-					for ( key in control.params.settings ) {
-						control.settings[ key ] = api( control.params.settings[ key ] );
-					}
+					_.each( control.params.settings, function( settingId, key ) {
+						if ( _.isString( settingId ) ) {
+							control.settings[ key ] = api( settingId );
+						}
+					} );
 
 					control.setting = control.settings['default'] || null;
 
-					// Add setting notifications to the control notification.
-					_.each( control.settings, function( setting ) {
-						setting.notifications.bind( 'add', function( settingNotification ) {
-							var controlNotification, code, params;
-							code = setting.id + ':' + settingNotification.code;
-							params = _.extend(
-								{},
-								settingNotification,
-								{
-									setting: setting.id
-								}
-							);
-							controlNotification = new api.Notification( code, params );
-							control.notifications.add( controlNotification.code, controlNotification );
-						} );
-						setting.notifications.bind( 'remove', function( settingNotification ) {
-							control.notifications.remove( setting.id + ':' + settingNotification.code );
-						} );
-					} );
-
+					control._linkElements();
+					control._linkNotifications();
 					control.embed();
 				}) );
 			}
@@ -1610,6 +1578,68 @@
 		},
 
 		/**
+		 * Link elements.
+		 *
+		 * @private
+		 */
+		_linkElements: function() {
+			var control = this, nodes, radios;
+
+			nodes  = control.container.find('[data-customize-setting-link]');
+			radios = {};
+
+			nodes.each( function() {
+				var node = $( this ),
+					name;
+
+				if ( node.is( ':radio' ) ) {
+					name = node.prop( 'name' );
+					if ( radios[ name ] ) {
+						return;
+					}
+
+					radios[ name ] = true;
+					node = nodes.filter( '[name="' + name + '"]' );
+				}
+
+				api( node.data( 'customizeSettingLink' ), function( setting ) {
+					var element = new api.Element( node );
+					control.elements.push( element );
+					element.sync( setting );
+					element.set( setting() );
+				});
+			});
+		},
+
+		/**
+		 * Add setting notifications to the control notification.
+		 *
+		 * @private
+		 */
+		_linkNotifications: function() {
+			var control = this;
+
+			_.each( control.settings, function( setting ) {
+				setting.notifications.bind( 'add', function( settingNotification ) {
+					var controlNotification, code, params;
+					code = setting.id + ':' + settingNotification.code;
+					params = _.extend(
+						{},
+						settingNotification,
+						{
+							setting: setting.id
+						}
+					);
+					controlNotification = new api.Notification( code, params );
+					control.notifications.add( controlNotification.code, controlNotification );
+				} );
+				setting.notifications.bind( 'remove', function( settingNotification ) {
+					control.notifications.remove( setting.id + ':' + settingNotification.code );
+				} );
+			} );
+		},
+
+		/**
 		 * Embed the control into the page.
 		 */
 		embed: function () {
