Index: wp-includes/widgets.php
===================================================================
--- wp-includes/widgets.php	(revision 1817)
+++ wp-includes/widgets.php	(working copy)
@@ -945,18 +945,16 @@
 /* Internal Functions */
 
 /**
- * Retrieve full list of sidebars and their widgets.
+ * Migrate an old sidebars_widgets option
  *
- * Will upgrade sidebar widget list, if needed. Will also save updated list, if
- * needed.
- *
- * @since 2.2.0
+ * @since 2.8.1
  * @access private
  *
  * @param bool $update Optional, default is true. Whether to save upgrade of widget array list.
  * @return array Upgraded list of widgets to version 2 array format.
- */
-function wp_get_sidebars_widgets($update = true) {
+ **/
+
+function wp_migrate_widgets($update = true) {
 	global $wp_registered_widgets, $wp_registered_sidebars, $_wp_sidebars_widgets;
 
 	// If loading from front page, consult $_wp_sidebars_widgets rather than options
@@ -967,7 +965,7 @@
 		if ( empty($_wp_sidebars_widgets) )
 			$sidebars_widgets = get_option('sidebars_widgets', array());
 		else
-			$sidebars_widgets = &$_wp_sidebars_widgets;
+			return $_wp_sidebars_widgets;
 	}
 	$_sidebars_widgets = array();
 
@@ -1024,25 +1022,46 @@
 					}
 				}
 
-				// Assign to each unmatched registered sidebar the first available orphan
-				unset( $sidebars_widgets[ 'array_version' ] );
-				while ( ( $sidebar = array_shift( $sidebars ) ) && $widgets = array_shift( $sidebars_widgets ) )
-					$_sidebars_widgets[ $sidebar ] = $widgets;
+				// move the rest to wp_inactive_widgets
+				if ( !isset($_sidebars_widgets['wp_inactive_widgets']) )
+					$_sidebars_widgets['wp_inactive_widgets'] = array();
+				
+				if ( !empty($sidebars_widgets) ) {
+					foreach ( $sidebars_widgets as $lost => $val ) {
+						if ( is_array($val) )
+							$_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val );
+					}
+				}
 
-				$_sidebars_widgets['array_version'] = 3;
 				$sidebars_widgets = $_sidebars_widgets;
 				unset($_sidebars_widgets);
 			}
+			
+			$sidebars_widgets['array_version'] = 3;
 
 			if ( $update && is_admin() )
 				update_option('sidebars_widgets', $sidebars_widgets);
 	}
 
-	if ( isset($sidebars_widgets['array_version']) )
-		unset($sidebars_widgets['array_version']);
+	unset($sidebars_widgets['array_version']);
+	
+	return $sidebars_widgets;
+} # wp_migrate_widgets()
 
-	$sidebars_widgets = apply_filters('sidebars_widgets', $sidebars_widgets);
-	return $sidebars_widgets;
+/**
+ * Retrieve full list of sidebars and their widgets.
+ *
+ * Will upgrade sidebar widget list, if needed. Will also save updated list, if
+ * needed.
+ *
+ * @since 2.2.0
+ * @access private
+ *
+ * @param bool $update Optional, default is true. Whether to save upgrade of widget array list.
+ * @return array Upgraded list of widgets to version 2 array format.
+ */
+function wp_get_sidebars_widgets($update = true) {
+	return apply_filters('sidebars_widgets', wp_migrate_widgets($update));
 }
 
 /**
@@ -1087,8 +1106,9 @@
  */
 function wp_convert_widget_settings($base_name, $option_name, $settings) {
 	global $_wp_sidebars_widgets;
+	
 	// This test may need expanding.
-	$single = false;
+	$single = $changed = false;
 	if ( empty($settings) ) {
 		$single = true;
 	} else {
@@ -1109,9 +1129,9 @@
 		if ( is_admin() ) {
 			$sidebars_widgets = get_option('sidebars_widgets');
 		} else {
-			if ( empty($GLOBALS['_wp_sidebars_widgets']) )
-				$GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets');
-			$sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets'];
+			if ( empty($_wp_sidebars_widgets) )
+				$_wp_sidebars_widgets = wp_migrate_widgets(false);
+			$sidebars_widgets = &$_wp_sidebars_widgets;
 		}
 
 		foreach ( (array) $sidebars_widgets as $index => $sidebar ) {
@@ -1119,13 +1139,14 @@
 				foreach ( $sidebar as $i => $name ) {
 					if ( $base_name == $name ) {
 						$sidebars_widgets[$index][$i] = "$name-2";
+						$changed = true;
 						break 2;
 					}
 				}
 			}
 		}
 
-		if ( is_admin() )
+		if ( is_admin() && $changed )
 			update_option('sidebars_widgets', $sidebars_widgets);
 	}
 
