Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 19413)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -1129,8 +1129,8 @@
 		$args['s'] = stripslashes( $_POST['search'] );
 	$args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;
 
-	require(ABSPATH . WPINC . '/class-wp-editor.php');
-	$results = WP_Editor::wp_link_query( $args );
+	$wp_editor = _get_wp_editor();
+	$results = $wp_editor->wp_link_query( $args );
 
 	if ( ! isset( $results ) )
 		die( '0' );
Index: wp-admin/includes/deprecated.php
===================================================================
--- wp-admin/includes/deprecated.php	(revision 19413)
+++ wp-admin/includes/deprecated.php	(working copy)
@@ -711,26 +711,16 @@
 function wp_tiny_mce( $teeny = false, $settings = false ) {
 	_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );
 
-	global $wp_editor;
 	static $num = 1;
+	$wp_editor = _get_wp_editor();
+	$editor_id = 'content' . $num++;
 
-	if ( !is_a($wp_editor, 'WP_Editor') ) {
-		if ( !class_exists('WP_Editor') )
-			require_once( ABSPATH . WPINC . '/class-wp-editor.php' );
-
-		$wp_editor = new WP_Editor;
-	}
-
-	$editor_id = 'content' . $num;
-	++$num;
-
 	$set = array(
 		'teeny' => $teeny,
 		'tinymce' => $settings ? $settings : true,
 		'quicktags' => false
 	);
 
-	$set = $wp_editor->parse_settings($editor_id, $set);
 	$wp_editor->editor_settings($editor_id, $set);
 }
 
Index: wp-includes/class-wp-editor.php
===================================================================
--- wp-includes/class-wp-editor.php	(revision 19413)
+++ wp-includes/class-wp-editor.php	(working copy)
@@ -8,31 +8,41 @@
  * Private, not included by default. See wp_editor() in wp-includes/general-template.php.
  */
 
-class WP_Editor {
+final class WP_Editor {
 
-	var $mce_settings = array();
-	var $qt_settings = array();
-	var $plugins = array();
-	var $qt_buttons = array();
-	var $mce_locale;
-	var $ext_plugins;
-	var $baseurl;
-	var $can_richedit;
-	var $default_editor;
-	var $first_init;
-	var $this_tinymce = false;
-	var $this_quicktags = false;
-	var $has_tinymce = false;
-	var $has_quicktags = false;
-	var $has_medialib = false;
-	var $editor_buttons_css = true;
+	private static $_instance = array();
+	private $mce_settings = array();
+	private $qt_settings = array();
+	private $plugins = array();
+	private $qt_buttons = array();
+	private $mce_locale;
+	private $ext_plugins;
+	private $baseurl;
+	private $can_richedit;
+	private $default_editor;
+	private $first_init;
+	private $this_tinymce = false;
+	private $this_quicktags = false;
+	private $has_tinymce = false;
+	private $has_quicktags = false;
+	private $has_medialib = false;
+	private $editor_buttons_css = true;
 
-	function __construct() {
-		$this->can_richedit = user_can_richedit();
-		$this->default_editor = $this->wp_default_editor();
+	// Single instance only
+	public function __construct() {
+		$classname = __CLASS__;
+		if ( ! isset(self::$_instance[$classname]) ) {
+			self::$_instance[$classname] = $this;
+			$this->can_richedit = user_can_richedit();
+			$this->default_editor = $this->wp_default_editor();
+		} else {
+			throw new Exception('Multiple instances of WP_Editor are not allowed.');
+		}
 	}
+	
+	public function __clone() {}
 
-	function parse_settings($editor_id, $settings) {
+	private function parse_settings($editor_id, $settings) {
 		$set = wp_parse_args( $settings,  array(
 			'wpautop' => true, // use wpautop?
 			'media_buttons' => true, // show insert/upload button(s)
@@ -56,6 +66,7 @@
 		if ( $this->this_quicktags )
 			$this->has_quicktags = true;
 
+		$set['_parset'] = 1;
 		return $set;
 	}
 
@@ -66,7 +77,7 @@
 	 * @param string $editor_id ID for the textarea and TinyMCE and Quicktags instances (can contain only ASCII letters and numbers).
 	 * @param array $settings See WP_Editor::_parse_settings for description.
 	 */
-	function editor( $content, $editor_id, $settings = array() ) {
+	public function editor( $content, $editor_id, $settings = array() ) {
 
 		$set = $this->parse_settings($editor_id, $settings);
 		$editor_class = ' class="' . trim( $set['editor_class'] . ' wp-editor-area' ) . '"';
@@ -128,10 +139,13 @@
 		$this->editor_settings($editor_id, $set);
 	}
 
-	function editor_settings($editor_id, $set) {
+	public function editor_settings($editor_id, $set) {
 		global $editor_styles;
 		$first_run = false;
 
+		if ( !array_key_exists($set['_parset']) )
+			$set = $this->parse_settings($editor_id, $set);
+
 		if ( empty($this->first_init) ) {
 			if ( is_admin() ) {
 				add_action( 'admin_print_footer_scripts', array($this, 'editor_js'), 50 );
@@ -413,7 +427,7 @@
 		} // end if $this->this_tinymce
 	}
 
-	function _parse_init($init) {
+	private function _parse_init($init) {
 		$options = '';
 
 		foreach ( $init as $k => $v ) {
@@ -441,7 +455,7 @@
 	 *
 	 * @return string Either 'tinymce', or 'html', or 'test'
 	 */
-	function wp_default_editor() {
+	public function wp_default_editor() {
 		$r = user_can_richedit() ? 'tinymce' : 'html'; // defaults
 		if ( $user = wp_get_current_user() ) { // look for cookie
 			$ed = get_user_setting('editor', 'tinymce');
@@ -450,7 +464,7 @@
 		return apply_filters( 'wp_default_editor', $r ); // filter
 	}
 
-	function enqueue_scripts() {
+	public function enqueue_scripts() {
 		wp_enqueue_script('word-count');
 
 		if ( $this->has_tinymce )
@@ -474,7 +488,7 @@
 		}
 	}
 
-	function editor_js() {
+	public function editor_js() {
 		global $tinymce_version, $concatenate_scripts, $compress_scripts;
 
 		/**
@@ -608,7 +622,7 @@
 		do_action('after_wp_tiny_mce', $this->mce_settings);
 	}
 
-	function wp_fullscreen_html() {
+	public static function wp_fullscreen_html() {
 		global $content_width, $post;
 
 		$width = isset($content_width) && 800 > $content_width ? $content_width : 800;
@@ -705,7 +719,7 @@
 	 * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments.
 	 * @return array Results.
 	 */
-	function wp_link_query( $args = array() ) {
+	public static function wp_link_query( $args = array() ) {
 		$pts = get_post_types( array( 'public' => true ), 'objects' );
 		$pt_names = array_keys( $pts );
 
@@ -758,7 +772,7 @@
 	 *
 	 * @since 3.1.0
 	 */
-	function wp_link_dialog() {
+	public static function wp_link_dialog() {
 	?>
 	<div style="display:none;">
 	<form id="wp-link" tabindex="-1">
Index: wp-includes/deprecated.php
===================================================================
--- wp-includes/deprecated.php	(revision 19413)
+++ wp-includes/deprecated.php	(working copy)
@@ -2628,12 +2628,7 @@
 function wp_default_editor() {
 	_deprecated_function( __FUNCTION__, '3.3' );
 
-	global $wp_editor;
-	if ( !is_a($wp_editor, 'WP_Editor') ) {
-		require_once( ABSPATH . WPINC . '/class-wp-editor.php' );
-		$wp_editor = new WP_Editor;
-	}
-
+	$wp_editor = _get_wp_editor();
 	return $wp_editor->wp_default_editor();
 }
 
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 19413)
+++ wp-includes/general-template.php	(working copy)
@@ -1786,14 +1786,20 @@
  * @param array $settings See WP_Editor::editor().
  */
 function wp_editor( $content, $editor_id, $settings = array() ) {
-	global $wp_editor;
+	$wp_editor = _get_wp_editor();
+	$wp_editor->editor($content, $editor_id, $settings);
+}
 
-	if ( !is_a($wp_editor, 'WP_Editor') ) {
+// private
+function _get_wp_editor() {
+	static $instance;
+
+	if ( !is_a($instance, 'WP_Editor') ) {
 		require( ABSPATH . WPINC . '/class-wp-editor.php' );
-		$wp_editor = new WP_Editor;
+		$instance = new WP_Editor;
 	}
 
-	$wp_editor->editor($content, $editor_id, $settings);
+	return $instance;
 }
 
 /**
Index: wp-includes/js/tinymce/langs/wp-langs.php
===================================================================
--- wp-includes/js/tinymce/langs/wp-langs.php	(revision 19413)
+++ wp-includes/js/tinymce/langs/wp-langs.php	(working copy)
@@ -1,13 +1,7 @@
 <?php
 
-// escape text only if it needs translating
 function mce_escape($text) {
-	global $wp_editor;
-
-	if ( 'en' == $wp_editor->mce_locale )
-		return $text;
-	else
-		return esc_js($text);
+	return esc_js($text);
 }
 
 $lang = 'tinyMCE.addI18n({' . $this->mce_locale . ':{
