Index: /CKEditor/branches/prototype/_source/core/dom/document.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/dom/document.js	(revision 2492)
+++ /CKEditor/branches/prototype/_source/core/dom/document.js	(revision 2493)
@@ -36,11 +36,4 @@
 {
 	CKEDITOR.dom.domObject.call( this, domDocument );
-
-	/**
-	 * The native DOM document represented by this class instance.
-	 * @type Object
-	 * @example
-	 */
-	this.$ = domDocument;
 };
 
Index: /CKEditor/branches/prototype/_source/core/dom/element.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/dom/element.js	(revision 2492)
+++ /CKEditor/branches/prototype/_source/core/dom/element.js	(revision 2493)
@@ -45,12 +45,6 @@
 		element = ( ownerDocument ? ownerDocument.$ : document ).createElement( element );
 
-	/**
-	 * The native DOM element represented by this class instance.
-	 * @type Object
-	 * @example
-	 * var element = new CKEDITOR.dom.element( 'span' );
-	 * alert( element.$.nodeType );  // "1"
-	 */
-	this.$ = element;
+	// Call the base constructor (we must not call CKEDITOR.dom.node).
+	CKEDITOR.dom.domObject.call( this, element );
 };
 
Index: /CKEditor/branches/prototype/_source/core/dom/node.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/dom/node.js	(revision 2492)
+++ /CKEditor/branches/prototype/_source/core/dom/node.js	(revision 2493)
@@ -49,12 +49,6 @@
 		}
 
-		/**
-		 * The native DOM node represented by this class instance.
-		 * @type Object
-		 * @example
-		 * var element = new CKEDITOR.dom.node( document.body );
-		 * alert( element.$.nodeType );  // "1"
-		 */
-		this.$ = domNode;
+		// Call the base constructor.
+		CKEDITOR.dom.domObject.call( this, domNode );
 	}
 
@@ -163,10 +157,20 @@
 		getChild : function( indices )
 		{
+			var rawNode = this.$;
+
 			if ( !indices.slice )
-				indices = [indices];
-			var rawNode = this.$;
-			while ( indices.length > 0 && rawNode )
-				rawNode = rawNode.childNodes[ indices.shift() ];
+				rawNode = rawNode.childNodes[ indices ];
+			else
+			{
+				while ( indices.length > 0 && rawNode )
+					rawNode = rawNode.childNodes[ indices.shift() ];
+			}
+
 			return rawNode ? new CKEDITOR.dom.node( rawNode ) : null;
+		},
+		
+		getChildCount : function()
+		{
+			return this.$.childNodes.length;
 		}
 	}
Index: /CKEditor/branches/prototype/_source/core/dom/text.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/dom/text.js	(revision 2492)
+++ /CKEditor/branches/prototype/_source/core/dom/text.js	(revision 2493)
@@ -44,4 +44,11 @@
 		text = ( ownerDocument ? ownerDocument.$ : document ).createTextNode( text );
 
+	// Theoretically, we should call the base constructor here
+	// (not CKEDITOR.dom.node though). But, IE doesn't support expando
+	// properties on text node, so the features provided by domObject will not
+	// work for text nodes (which is not a big issue for us).
+	//
+	// CKEDITOR.dom.domObject.call( this, element );
+
 	/**
 	 * The native DOM text node represented by this class instance.
Index: /CKEditor/branches/prototype/_source/core/test.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/test.js	(revision 2492)
+++ /CKEditor/branches/prototype/_source/core/test.js	(revision 2493)
@@ -68,4 +68,16 @@
 	{
 		YAHOO.tool.TestRunner.add( new YAHOO.tool.TestCase( testCase ) );
+	},
+	
+	/**
+	 * Gets the inner HTML of an element, for testing purposes.
+	 */
+	getInnerHtml : function( elementId )
+	{
+		var html = document.getElementById( elementId ).innerHTML;
+		html = html.toLowerCase();
+		html = html.replace( /"/g, '' );
+		html = html.replace( /\s+_cke_expando=\d+/, '' );
+		return html;
 	}
 };
Index: /CKEditor/branches/prototype/_source/tests/core/dom/element.html
===================================================================
--- /CKEditor/branches/prototype/_source/tests/core/dom/element.html	(revision 2492)
+++ /CKEditor/branches/prototype/_source/tests/core/dom/element.html	(revision 2493)
@@ -13,4 +13,5 @@
 	// Local reference to the "assert" object.
 	var assert = CKEDITOR.test.assert;
+	var getInnerHtml = CKEDITOR.test.getInnerHtml;
 
 	return {
@@ -289,7 +290,7 @@
 			element.appendTo( new CKEDITOR.dom.element( document.getElementById( 'removeClass' ) ) );
 
-			assert.areSame( '<div class=classa></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classA' );
-			assert.areSame( '<div></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -301,13 +302,13 @@
 			element.appendTo( new CKEDITOR.dom.element( document.getElementById( 'removeClass' ) ) );
 
-			assert.areSame( '<div class=classa classb classc classd></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa classb classc classd></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classA' );
-			assert.areSame( '<div class=classb classc classd></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classb classc classd></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classC' );
-			assert.areSame( '<div class=classb classd></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classb classd></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classD' );
-			assert.areSame( '<div class=classb></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classb></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classB' );
-			assert.areSame( '<div></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -319,11 +320,11 @@
 			element.appendTo( new CKEDITOR.dom.element( document.getElementById( 'removeClass' ) ) );
 
-			assert.areSame( '<div class=classa classb></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa classb></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classXXX' );
-			assert.areSame( '<div class=classa classb></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa classb></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classB' );
-			assert.areSame( '<div class=classa></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa></div>', getInnerHtml( 'removeClass' ) );
 			element.removeClass( 'classYYY' );
-			assert.areSame( '<div class=classa></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div class=classa></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -336,5 +337,5 @@
 
 			element.removeAttribute( 'class' );
-			assert.areSame( '<div></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -347,5 +348,5 @@
 
 			element.removeAttribute( 'style' );
-			assert.areSame( '<div></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -358,5 +359,5 @@
 
 			element.removeAttribute( 'title' );
-			assert.areSame( '<div></div>', document.getElementById( 'removeClass' ).innerHTML.toLowerCase().replace( /"/g, '' ) );
+			assert.areSame( '<div></div>', getInnerHtml( 'removeClass' ) );
 		},
 
@@ -366,5 +367,5 @@
 			element.remove();
 
-			assert.areSame( '', document.getElementById( 'removeOuter' ).innerHTML );
+			assert.areSame( '', getInnerHtml( 'removeOuter' ) );
 		},
 
@@ -427,4 +428,20 @@
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndexScriptDef' ) );
 			assert.areSame( -1, element.getTabIndex() );
+		},
+		
+		test_private1 : function()
+		{
+			var a = new CKEDITOR.dom.element( document.getElementById( 'test1' ) );
+			var b = new CKEDITOR.dom.element( document.getElementById( 'test1' ) );
+			
+			assert.areSame( a._, b._ );
+		},
+
+		test_private2 : function()
+		{
+			var a = new CKEDITOR.dom.element( document.getElementById( 'test1' ) );
+			var b = new CKEDITOR.dom.element( document.getElementById( 'test2' ) );
+			
+			assert.areNotSame( a._, b._ );
 		},
 
