Index: /CKEditor/trunk/_source/core/command.js
===================================================================
--- /CKEditor/trunk/_source/core/command.js	(revision 3118)
+++ /CKEditor/trunk/_source/core/command.js	(revision 3119)
@@ -49,3 +49,3 @@
 }
 
-CKEDITOR.event.implementOn( CKEDITOR.command.prototype );
+CKEDITOR.event.implementOn( CKEDITOR.command.prototype, true );
Index: /CKEditor/trunk/_source/core/dom/domobject.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/domobject.js	(revision 3118)
+++ /CKEditor/trunk/_source/core/dom/domobject.js	(revision 3119)
@@ -193,5 +193,5 @@
 
 	// Implement CKEDITOR.event.
-	CKEDITOR.event.implementOn( domObjectProto );
+	CKEDITOR.event.implementOn( domObjectProto, true );
 
 })( CKEDITOR.dom.domObject.prototype );
Index: /CKEditor/trunk/_source/core/editor_basic.js
===================================================================
--- /CKEditor/trunk/_source/core/editor_basic.js	(revision 3118)
+++ /CKEditor/trunk/_source/core/editor_basic.js	(revision 3119)
@@ -175,4 +175,4 @@
 
 	// "Inherit" (copy actually) from CKEDITOR.event.
-	CKEDITOR.event.implementOn( CKEDITOR.editor.prototype );
+	CKEDITOR.event.implementOn( CKEDITOR.editor.prototype, true );
 }
Index: /CKEditor/trunk/_source/core/event.js
===================================================================
--- /CKEditor/trunk/_source/core/event.js	(revision 3118)
+++ /CKEditor/trunk/_source/core/event.js	(revision 3119)
@@ -19,5 +19,8 @@
 	CKEDITOR.event = function()
 	{
-		( this._ || ( this._ = {} ) ).events = {};
+		//In case of preserving existed events
+		var preExistedEvents = this._	&& this._.events;
+		if( !preExistedEvents )
+			( this._ || ( this._ = {} ) ).events = {};
 	};
 
@@ -25,4 +28,7 @@
 	 * Implements the {@link CKEDITOR.event} features in an object.
 	 * @param {Object} targetObject The object in which implement the features.
+	 * @param {Boolean} isTargetPrototype If the target is a prototype of
+	 *            constructor, the internal 'events' object will not be copied,
+	 *            which should be composed by the constructor itself.
 	 * @example
 	 * var myObject = { message : 'Example' };
@@ -34,12 +40,28 @@
 	 * myObject.fire( 'testEvent' );
 	 */
-	CKEDITOR.event.implementOn = function( targetObject )
+	CKEDITOR.event.implementOn = function( targetObject , isTargetPrototype)
 	{
-		CKEDITOR.event.call( targetObject );
+		if( !isTargetPrototype )
+			CKEDITOR.event.call( targetObject );
 
 		for ( var prop in CKEDITOR.event.prototype )
 		{
-			if ( targetObject[ prop ] == undefined )
-				targetObject[ prop ] = CKEDITOR.event.prototype[ prop ];
+			(function(){
+				
+				var property = prop;
+				
+				if ( targetObject[ property ] == undefined )
+					targetObject[ property ] = isTargetPrototype?
+					function()
+					{
+						//pre-setup events model 
+						if( ! ( this._ && this._.events ) )
+							CKEDITOR.event.call( this );
+						
+						( this[ property ] = CKEDITOR.event.prototype[ property ] )
+							.apply( this, arguments );
+					} :
+					CKEDITOR.event.prototype[ property ];
+			})();
 		}
 	};
Index: /CKEditor/trunk/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 3118)
+++ /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 3119)
@@ -1000,5 +1000,5 @@
 	// "Inherit" (copy actually) from CKEDITOR.event.
 	CKEDITOR.event.implementOn( CKEDITOR.dialog );
-	CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype );
+	CKEDITOR.event.implementOn( CKEDITOR.dialog.prototype, true );
 
 	var defaultDialogDefinition =
