Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 8783)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -486,7 +486,7 @@
 
 <div id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>" class="postarea">
 
-<div id="add-media-button"><a href="<?php echo clean_url( admin_url( 'media-upload.php?post_id=' . ( $post_ID ? $post_ID : $temp_ID ) . '&amp;type=image&amp;TB_iframe=true' ) ); ?>" class="thickbox button"><?php _e( 'Add Media' ); ?></a></div>
+<div id="add-media-button"><a id="add-media-link" href="<?php echo clean_url( admin_url( 'media-upload.php?post_id=' . ( $post_ID ? $post_ID : $temp_ID ) . '&amp;type=image&amp;TB_iframe=true' ) ); ?>" class="thickbox button"><?php _e( 'Add Media' ); ?></a></div>
 
 <h3><?php _e('Post') ?></h3>
 
Index: wp-admin/edit-page-form.php
===================================================================
--- wp-admin/edit-page-form.php	(revision 8783)
+++ wp-admin/edit-page-form.php	(working copy)
@@ -358,7 +358,7 @@
 
 <div id="<?php echo user_can_richedit() ? 'postdivrich' : 'postdiv'; ?>" class="postarea">
 
-<div id="add-media-button"><a href="<?php echo clean_url( admin_url( 'media-upload.php?post_id=' . ( $post_ID ? $post_ID : $temp_ID ) . '&amp;type=image&amp;TB_iframe=true' ) ); ?>" class="thickbox button"><?php _e( 'Add Media' ); ?></a></div>
+<div id="add-media-button"><a id="add-media-link" href="<?php echo clean_url( admin_url( 'media-upload.php?post_id=' . ( $post_ID ? $post_ID : $temp_ID ) . '&amp;type=image&amp;TB_iframe=true' ) ); ?>" class="thickbox button"><?php _e( 'Add Media' ); ?></a></div>
 
 <h3><?php _e('Page') ?></h3>
 <?php the_editor($post->post_content); ?>
Index: wp-admin/js/editor.js
===================================================================
--- wp-admin/js/editor.js	(revision 8783)
+++ wp-admin/js/editor.js	(working copy)
@@ -1,24 +1,31 @@
-wpEditorInit = function() {
-	var H;
 
-	// Activate tinyMCE if it's the user's default editor
-	if ( ( 'undefined' == typeof wpTinyMCEConfig ) || 'tinymce' == wpTinyMCEConfig.defaultEditor ) {
-		try { document.getElementById('editorcontainer').style.padding = '0px'; } catch(e){};
-		try { document.getElementById("quicktags").style.display = "none"; } catch(e){};
-		tinyMCE.execCommand("mceAddControl", false, "content");
-	} else {
-		if ( H = tinymce.util.Cookie.getHash("TinyMCE_content_size") )
-			try { document.getElementById('content').style.height = H.ch - 30 + 'px'; } catch(e){};
-	}
-};
-
 switchEditors = {
 
+	I : function(e) {
+		return document.getElementById(e);
+	},
+
+	edInit : function() {
+		var h = tinymce.util.Cookie.getHash("TinyMCE_content_size"), H = this.I('edButtonHTML'), P = this.I('edButtonPreview');
+
+		// Activate TinyMCE if it's the user's default editor
+		if ( getUserSetting( 'editor', 'tinymce' ) == 'tinymce' ) {
+			try { P.onclick = ''; P.className = 'active'; } catch(e){};
+			try { this.I('editorcontainer').style.padding = '0px'; } catch(e){};
+			try { this.I("quicktags").style.display = "none"; } catch(e){};
+			tinyMCE.execCommand("mceAddControl", false, "content");
+		} else {
+			try { H.onclick = ''; H.className = 'active'; } catch(e){};
+			if ( h )
+				try { this.I('content').style.height = h.ch - 30 + 'px'; } catch(e){};
+		}
+	},
+	
 	saveCallback : function(el, content, body) {
 
-		document.getElementById(el).style.color = '#fff';
+		this.I(el).style.color = '#fff';
 		if ( tinyMCE.activeEditor.isHidden() )
-			content = document.getElementById(el).value;
+			content = this.I(el).value;
 		else
 			content = this.pre_wpautop(content);
 
@@ -84,11 +91,11 @@
 
 	go : function(id) {
 		var ed = tinyMCE.get(id);
-		var qt = document.getElementById('quicktags');
-		var H = document.getElementById('edButtonHTML');
-		var P = document.getElementById('edButtonPreview');
-		var ta = document.getElementById(id);
-		var ec = document.getElementById('editorcontainer');
+		var qt = this.I('quicktags');
+		var H = this.I('edButtonHTML');
+		var P = this.I('edButtonPreview');
+		var ta = this.I(id);
+		var ec = (ta.parentNode && ta.parentNode.nodeName == 'DIV') ? ta.parentNode : '';
 
 		if ( ! ed || ed.isHidden() ) {
 			ta.style.color = '#fff';
@@ -97,15 +104,16 @@
 			edCloseAllTags(); // :-(
 
 			qt.style.display = 'none';
-			ec.style.padding = '0px';
 			ta.style.padding = '0px';
+			if ( ec )
+				ec.style.padding = '0px';
 
 			ta.value = this.wpautop(ta.value);
 
 			if ( ed ) ed.show();
 			else tinyMCE.execCommand("mceAddControl", false, id);
 
-			this.wpSetDefaultEditor('tinymce');
+			setUserSetting( 'editor', 'tinymce' );
 		} else {
 			this.edToggle(H, P);
 			ta.style.height = ed.getContentAreaContainer().offsetHeight + 6 + 'px';
@@ -115,15 +123,17 @@
 
 			if ( tinymce.isIE6 ) {
 				ta.style.width = '98%';
-				ec.style.padding = '0px';
+				if ( ec )
+					ec.style.padding = '0px';
 				ta.style.padding = '6px';
 			} else {
 				ta.style.width = '100%';
-				ec.style.padding = '6px';
+				if ( ec )
+					ec.style.padding = '6px';
 			}
 
 			ta.style.color = '';
-			this.wpSetDefaultEditor('html');
+			setUserSetting( 'editor', 'html' );
 		}
 	},
 
@@ -135,19 +145,6 @@
 		A.onclick = null;
 	},
 
-	wpSetDefaultEditor : function(editor) {
-		try {
-			editor = escape( editor.toString() );
-		} catch(err) {
-			editor = 'tinymce';
-		}
-
-		var userID = document.getElementById('user-id');
-		var date = new Date();
-		date.setTime(date.getTime()+(10*365*24*60*60*1000));
-		document.cookie = "wordpress_editor_" + userID.value + "=" + editor + "; expires=" + date.toGMTString();
-	},
-
 	wpautop : function(pee) {
 		var blocklist = 'table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]';
 
Index: wp-admin/js/user-settings.js
===================================================================
--- wp-admin/js/user-settings.js	(revision 0)
+++ wp-admin/js/user-settings.js	(revision 0)
@@ -0,0 +1,129 @@
+
+wpCookies = {
+// The following functions are from Cookie.js class in TinyMCE, Moxiecode, used under LGPL.
+
+	each : function(o, cb, s) {
+		var n, l;
+
+		if (!o)
+			return 0;
+
+		s = s || o;
+
+		if (typeof(o.length) != 'undefined') {
+			for (n=0, l = o.length; n<l; n++) {
+				if (cb.call(s, o[n], n, o) === false)
+					return 0;
+			}
+		} else {
+			for (n in o) {
+				if (o.hasOwnProperty(n)) {
+					if (cb.call(s, o[n], n, o) === false)
+						return 0;
+				}
+			}
+		}
+		return 1;
+	},
+
+	getHash : function(n) {
+		var v = this.get(n), h;
+
+		if (v) {
+			this.each(v.split('&'), function(v) {
+				v = v.split('=');
+				h = h || {};
+				h[v[0]] = v[1];
+			});
+		}
+		return h;
+	},
+
+	setHash : function(n, v, e, p, d, s) {
+		var o = '';
+
+		this.each(v, function(v, k) {
+			o += (!o ? '' : '&') + k + '=' + v;
+		});
+
+		this.set(n, o, e, p, d, s);
+	},
+
+	get : function(n) {
+		var c = document.cookie, e, p = n + "=", b;
+
+		if (!c)
+			return;
+
+		b = c.indexOf("; " + p);
+
+		if (b == -1) {
+			b = c.indexOf(p);
+
+			if (b != 0)
+				return null;
+		} else
+			b += 2;
+
+		e = c.indexOf(";", b);
+
+		if (e == -1)
+			e = c.length;
+
+		return decodeURIComponent(c.substring(b + p.length, e));
+	},
+
+	set : function(n, v, e, p, d, s) {
+		document.cookie = n + "=" + encodeURIComponent(v) +
+			((e) ? "; expires=" + e.toGMTString() : "") +
+			((p) ? "; path=" + p : "") +
+			((d) ? "; domain=" + d : "") +
+			((s) ? "; secure" : "");
+	},
+
+	remove : function(n, p) {
+		var d = new Date();
+
+		d.setTime(d.getTime() - 1000);
+
+		this.set(n, '', d, p, d);
+	}
+};
+
+// Returns the value as string. Second arg or empty string is returned when value is not set.
+function getUserSetting( name, def ) {
+	var o = getAllUserSettings();
+
+	if ( o.hasOwnProperty(name) )
+		return o[name];
+
+	if ( typeof def != 'undefined' )
+		return def;
+
+	return '';
+}
+
+// Both name and value must be only ASCII letters, numbers or underscore
+// and the shorter, the better (cookies can store maximum 4KB). Not suitable to store text.
+function setUserSetting( name, value, del ) {
+	var c = 'wp-settings-'+userSettings.uid, o = wpCookies.getHash(c) || {}, d = new Date();
+	var n = name.toString().replace(/[^A-Za-z0-9_]/, ''), v = value.toString().replace(/[^A-Za-z0-9_]/, '');
+
+	if ( del ) delete o[n];
+	else o[n] = v;
+
+	d.setTime( d.getTime() + 31536000000 );
+	p = userSettings.url;
+
+	wpCookies.setHash(c, o, d, p );
+	wpCookies.set('wp-settings-time-'+userSettings.uid, userSettings.time, d, p );
+}
+
+function deleteUserSetting( name ) {
+	setUserSetting( name, '', 1 );
+}
+
+// Returns all settings as js object.
+function getAllUserSettings() {
+	return wpCookies.getHash('wp-settings-'+userSettings.uid) || {};
+}
Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 8783)
+++ wp-includes/default-filters.php	(working copy)
@@ -192,5 +192,6 @@
 add_action('template_redirect', 'wp_old_slug_redirect');
 add_action('edit_post', 'wp_check_for_changed_slugs');
 add_action('edit_form_advanced', 'wp_remember_old_slug');
+add_action('init', 'wp_user_settings', 9);
 
 ?>
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 8783)
+++ wp-includes/functions.php	(working copy)
@@ -644,6 +644,134 @@
 }
 
 /**
+ * Saves and restores user interface settings stored in a cookie.
+ *
+ * @package WordPress
+ * @subpackage Option
+ * @since 2.7.0
+ *
+ * Checks if the current user-settings cookie is updated and stores it.
+ * When no cookie exists (different browser used), adds the last saved cookie restoring the settings.
+ */
+function wp_user_settings() {
+
+	if ( ! is_admin() )
+		return;
+
+	if ( ! $user = wp_get_current_user() )
+		return;
+
+	$settings = get_user_option( 'user-settings', $user->ID );
+
+	if ( isset($_COOKIE['wp-settings-'.$user->ID]) ) {
+		$cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-'.$user->ID] );
+
+		if ( ! empty($cookie) && strpos($cookie, '=') ) {
+			if ( $cookie == $settings )
+				return;
+
+			$last_time = (int) get_user_option( 'user-settings-time', $user->ID );
+			$saved = isset($_COOKIE['wp-settings-time-'.$user->ID]) ? preg_replace( '/[^0-9]/', '', $_COOKIE['wp-settings-time-'.$user->ID] ) : 0;
+
+			if ( $saved > $last_time ) {
+				update_user_option( $user->ID, 'user-settings', $cookie );
+				update_user_option( $user->ID, 'user-settings-time', time() - 5 );
+				return;
+			}
+		}
+	}
+
+	setcookie('wp-settings-'.$user->ID, $settings, time() + 31536000, SITECOOKIEPATH);
+	setcookie('wp-settings-time-'.$user->ID, time(), time() + 31536000, SITECOOKIEPATH);
+}
+
+/**
+ * Retrieve user interface setting value based on setting name.
+ *
+ * @package WordPress
+ * @subpackage Option
+ * @since 2.7.0 
+ *   
+ * @param string $name The name of the setting.
+ * @param string $default Optional default value to return when $name is not set.
+ * @return mixed the last saved user setting or the default value/false if it doesn't exist.
+ */
+function get_user_setting( $name, $default = false ) {
+
+	$arr = get_all_user_settings();
+
+	return isset($arr[$name]) ? $arr[$name] : $default;
+}
+
+/**
+ * Delete user interface settings.
+ *
+ * @package WordPress
+ * @subpackage Option
+ * @since 2.7.0
+ *
+ * Deleting settings would reset them to the defaults.
+ *
+ * @param mixed $names The name or array of names of the setting to be deleted.
+ */
+function delete_user_setting( $names ) {
+	global $current_user;
+
+	$arr = get_all_user_settings();
+	$names = (array) $names;
+
+	foreach ( $names as $name ) {
+		if ( isset($arr[$name]) ) {
+			unset($arr[$name]);
+			$settings = '';
+		}
+	}
+
+	if ( isset($settings) ) {
+		foreach ( $arr as $k => $v )
+			$settings .= $k . '=' . $v . '&';
+
+		$settings = rtrim($settings, '&');
+
+		update_user_option( $current_user->ID, 'user-settings', $settings );
+		setcookie('wp-settings-'.$current_user->ID, $settings, time() + 31536000, SITECOOKIEPATH);
+	}
+}
+
+/**
+ * Retrieve all user interface settings.
+ *
+ * @package WordPress
+ * @subpackage Option
+ * @since 2.7.0
+ *
+ * @return array the last saved user settings or empty array.
+ */
+function get_all_user_settings() {
+	if ( ! $user = wp_get_current_user() )
+		return array();
+
+	if ( isset($_COOKIE['wp-settings-'.$user->ID]) ) {
+		$cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-'.$user->ID] );
+
+		if ( $cookie && strpos($cookie, '=') ) { // the '=' cannot be 1st char
+			parse_str($cookie, $arr);
+			return $arr;
+		}
+	}
+
+	return array();
+}
+
+function delete_all_user_settings() {
+	if ( ! $user = wp_get_current_user() )
+		return;
+
+	delete_usermeta( $user->ID, 'user-settings' );
+	setcookie('wp-settings-'.$user->ID, ' ', time() - 31536000, SITECOOKIEPATH);
+}
+
+/**
  * Serialize data, if needed.
  *
  * @since 2.0.5
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 8783)
+++ wp-includes/general-template.php	(working copy)
@@ -942,8 +942,8 @@
 function wp_default_editor() {
 	$r = user_can_richedit() ? 'tinymce' : 'html'; // defaults
 	if ( $user = wp_get_current_user() ) { // look for cookie
-		if ( isset($_COOKIE['wordpress_editor_' . $user->ID]) && in_array($_COOKIE['wordpress_editor_' . $user->ID], array('tinymce', 'html', 'test') ) )
-			$r = $_COOKIE['wordpress_editor_' . $user->ID];
+		$ed = get_user_setting('editor', 'tinymce');
+		$r = ( in_array($ed, array('tinymce', 'html', 'test') ) ) ? $ed : $r;
 	}
 	return apply_filters( 'wp_default_editor', $r ); // filter
 }
Index: wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js
===================================================================
--- wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	(revision 8783)
+++ wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js	(working copy)
@@ -14,7 +14,7 @@
 			var moreHTML = '<img src="' + url + '/img/trans.gif" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />';
 			var nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />';
 
-			if ( tinymce.util.Cookie.get('kitchenSink') == '1' )
+			if ( getUserSetting('hidetb', '0') == '1' )
 				ed.settings.wordpress_adv_hidden = 0;
 
 			// Hides the specified toolbar and resizes the iframe
@@ -44,23 +44,20 @@
 				});
 
 			ed.addCommand('WP_Adv', function() {
-				var id = ed.controlManager.get(tbId).id, cm = ed.controlManager, cook = tinymce.util.Cookie, date;
+				var id = ed.controlManager.get(tbId).id, cm = ed.controlManager;
 
-				date = new Date();
-				date.setTime(date.getTime()+(10*365*24*60*60*1000));
-
 				if (DOM.isHidden(id)) {
 					cm.setActive('wp_adv', 1);
 					DOM.show(id);
 					t._resizeIframe(ed, tbId, -28);
 					ed.settings.wordpress_adv_hidden = 0;
-					cook.set('kitchenSink', '1', date);
+					setUserSetting('hidetb', '1');
 				} else {
 					cm.setActive('wp_adv', 0);
 					DOM.hide(id);
 					t._resizeIframe(ed, tbId, 28);
 					ed.settings.wordpress_adv_hidden = 1;
-					cook.set('kitchenSink', '0', date);
+					setUserSetting('hidetb', '0');
 				}
 			});
 
@@ -94,11 +91,14 @@
 				title : 'wordpress.add_media',
 				image : url + '/img/media.gif',
 				onclick : function() {
-					tb_show('', tinymce.DOM.get('add_media').href);
-					tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' );
+					var a = tinymce.DOM.get('add-media-link');
+					if ( a ) {
+						tb_show('', a.href);
+						tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' );
+					}
 				}
 			});
-
+/*
 			ed.addButton('add_image', {
 				title : 'wordpress.add_image',
 				image : url + '/img/image.gif',
@@ -125,12 +125,12 @@
 					tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' );
 				}
 			});
-
+*/
 			// Add Media buttons to fullscreen
 			ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) {
 				if ( 'mceFullScreen' != cmd ) return;
 				if ( 'mce_fullscreen' != ed.id )
-					ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media';
+					ed.settings.theme_advanced_buttons1 += ',|,add_media';
 			});
 
 			// Add class "alignleft", "alignright" and "aligncenter" when selecting align for images.
Index: wp-includes/js/tinymce/tiny_mce_config.php
===================================================================
--- wp-includes/js/tinymce/tiny_mce_config.php	(revision 8783)
+++ wp-includes/js/tinymce/tiny_mce_config.php	(working copy)
@@ -134,7 +134,7 @@
 // TinyMCE init settings
 $initArray = array (
 	'mode' => 'none',
-	'onpageload' => 'wpEditorInit',
+	'onpageload' => 'switchEditors.edInit',
 	'width' => '100%',
 	'theme' => 'advanced',
 	'skin' => 'wp_theme',
@@ -214,7 +214,7 @@
 // Setup cache info
 if ( $disk_cache ) {
 
-	$cacheKey = apply_filters('tiny_mce_version', '20080731');
+	$cacheKey = apply_filters('tiny_mce_version', '20080830');
 
 	foreach ( $initArray as $v )
 		$cacheKey .= $v;
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 8783)
+++ wp-includes/script-loader.php	(working copy)
@@ -35,12 +35,16 @@
  * @param object $scripts WP_Scripts object.
  */
 function wp_default_scripts( &$scripts ) {
+	global $current_user;
+	
 	if (!$guessurl = site_url())
 		$guessurl = wp_guess_url();
+	
+	$userid = isset($current_user) ? $current_user->ID : 0;
 	$scripts->base_url = $guessurl;
 	$scripts->default_version = get_bloginfo( 'version' );
 
-	$scripts->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080318' );
+	$scripts->add( 'common', '/wp-admin/js/common.js', array('jquery', 'user-settings'), '20080318' );
 	$scripts->add( 'sack', '/wp-includes/js/tw-sack.js', false, '1.6.1' );
 
 	$scripts->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '20080823' );
@@ -65,7 +69,7 @@
 	$scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080823' );
 
 	// Modify this version when tinyMCE plugins are changed.
-	$mce_version = apply_filters('tiny_mce_version', '20080730');
+	$mce_version = apply_filters('tiny_mce_version', '20080830');
 	$scripts->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('editor_functions'), $mce_version );
 
 	$scripts->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
@@ -242,6 +246,13 @@
 		) );
 
 		$scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array('jquery'), '1.2' );
+		
+		$scripts->add( 'user-settings', '/wp-admin/js/user-settings.js', array(), '20080829' );
+		$scripts->localize( 'user-settings', 'userSettings', array(
+			'url' => SITECOOKIEPATH,
+			'uid' => $userid,
+			'time' => time()
+		) );
 	}
 }
 
@@ -334,7 +345,6 @@
  * @since 2.5.0
  */
 function wp_just_in_time_script_localization() {
-	wp_localize_script( 'tiny_mce', 'wpTinyMCEConfig', array( 'defaultEditor' => wp_default_editor() ) );
 	wp_localize_script( 'autosave', 'autosaveL10n', array(
 		'autosaveInterval' => AUTOSAVE_INTERVAL,
 		'previewPageText' => __('Preview this Page'),
