Index: src/wp-includes/theme.php
===================================================================
--- src/wp-includes/theme.php	(revision 33894)
+++ src/wp-includes/theme.php	(working copy)
@@ -675,8 +675,13 @@
  * @param string $stylesheet Stylesheet name
  */
 function switch_theme( $stylesheet ) {
-	global $wp_theme_directories, $wp_customize, $sidebars_widgets;
+	global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars;
 
+	$primary_sidebars = wp_get_primary_widget_areas( $wp_registered_sidebars );
+	if ( $primary_sidebars && ! empty( $primary_sidebars ) ) {
+		set_transient( 'old_primary_sidebars', $primary_sidebars, MINUTE_IN_SECONDS );
+	}
+
 	$_sidebars_widgets = null;
 	if ( 'wp_ajax_customize_save' === current_action() ) {
 		$_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) );
Index: src/wp-includes/widget-functions.php
===================================================================
--- src/wp-includes/widget-functions.php	(revision 33894)
+++ src/wp-includes/widget-functions.php	(working copy)
@@ -165,6 +165,7 @@
 		'after_widget' => "</li>\n",
 		'before_title' => '<h2 class="widgettitle">',
 		'after_title' => "</h2>\n",
+		'is_primary' => false,
 	);
 
 	$sidebar = wp_parse_args( $args, $defaults );
@@ -997,8 +998,11 @@
 
 	$registered_sidebar_keys = array_keys( $wp_registered_sidebars );
 	$orphaned = 0;
+	$old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );
+	$old_primary_areas    = get_transient( 'old_primary_sidebars' );
+	delete_transient( 'old_primary_sidebars' );
 
-	$old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );
+
 	if ( is_array( $old_sidebars_widgets ) ) {
 		// time() that sidebars were stored is in $old_sidebars_widgets['time']
 		$_sidebars_widgets = $old_sidebars_widgets['data'];
@@ -1036,18 +1040,39 @@
 
 		unset( $sidebars_widgets['wp_inactive_widgets'] );
 
+		$primary_areas      = wp_get_primary_widget_areas( $wp_registered_sidebars );
+		$primary_widget     = ( $primary_areas && isset( $primary_areas[0] ) ) ?  $primary_areas[0] : false;
+		$old_primary_widget = ( $old_primary_areas && isset( $old_primary_areas[0] ) ) ? $old_primary_areas[0]: false;
+
+		if ( $theme_changed ) {
+			if ( $primary_widget && $old_primary_widget ) {
+				$_sidebars_widgets[ $primary_widget ] = $sidebars_widgets[ $old_primary_widget ];
+				unset( $sidebars_widgets[ $old_primary_widget ] );
+			} else if( $primary_widget ) {
+				//there was no old primary widget area - let's assume the first one should be the primary
+					$sidebar_keys                         = array_keys( $sidebars_widgets );
+					$first_sidebar                        = $sidebars_widgets[ $sidebar_keys[0] ];
+					$_sidebars_widgets[ $primary_widget ] = $first_sidebar;
+					unset( $sidebars_widgets[ $sidebar_keys[0] ] );
+			}
+		}
+
 		foreach ( $wp_registered_sidebars as $id => $settings ) {
 			if ( $theme_changed ) {
-				$_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
+				//we've attempted to handle the primary widget area above - now do the others
+				$_sidebars_widgets[ $id ] = array_shift( $sidebars_widgets );
 			} else {
 				// no theme change, grab only sidebars that are currently registered
-				if ( isset( $sidebars_widgets[$id] ) ) {
-					$_sidebars_widgets[$id] = $sidebars_widgets[$id];
-					unset( $sidebars_widgets[$id] );
+				if ( isset( $sidebars_widgets[ $id ] ) ) {
+					$_sidebars_widgets[ $id ] = $sidebars_widgets[ $id ];
+					unset( $sidebars_widgets[ $id ] );
 				}
 			}
 		}
 
+
+
+
 		foreach ( $sidebars_widgets as $val ) {
 			if ( is_array($val) && ! empty( $val ) )
 				$_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
@@ -1097,6 +1122,24 @@
 }
 
 /**
+ * Retrieve the list of registered sidebars marked as primary.
+ *
+ * @since 4.4.0
+ *
+ * @param array $wp_registered_sidebars The list of currently registered sidebars.
+ * @return array
+ */
+function wp_get_primary_widget_areas( $wp_registered_sidebars ) {
+	$primary_list = array();
+	foreach( $wp_registered_sidebars as $sidebar_name => $sidebar_details ) {
+		if ( true === $sidebar_details['is_primary'] ) {
+			$primary_list[] = $sidebar_name;
+		}
+	}
+	return $primary_list;
+}
+
+/**
  * Display the RSS entries in a list.
  *
  * @since 2.5.0
