Index: /CKEditor/trunk/_source/core/config.js
===================================================================
--- /CKEditor/trunk/_source/core/config.js	(revision 3286)
+++ /CKEditor/trunk/_source/core/config.js	(revision 3287)
@@ -174,9 +174,12 @@
 
 	/**
-	 * The skin to load.
+	 * The skin to load. It may be the name of the skin folder inside the
+	 * editor installation path, or the name and the path separated by a comma.
 	 * @type String
 	 * @default 'default'
 	 * @example
 	 * config.skin = 'v2';
+	 * @example
+	 * config.skin = 'myskin,/customstuff/myskin/';
 	 */
 	skin : 'v2',
Index: /CKEditor/trunk/_source/core/editor.js
===================================================================
--- /CKEditor/trunk/_source/core/editor.js	(revision 3286)
+++ /CKEditor/trunk/_source/core/editor.js	(revision 3287)
@@ -112,11 +112,13 @@
 		// Set config related properties.
 
-		var skin = editor.config.skin;
-
-		editor.skinPath = CKEDITOR.getUrl(
-			'_source/' +	// %REMOVE_LINE%
-			'skins/' + skin + '/' );
-
-		editor.skinClass = 'cke_skin_' + skin;
+		var skin = editor.config.skin.split( ',' ),
+			skinName = skin[ 0 ],
+			skinPath = CKEDITOR.getUrl( skin[ 1 ] || (
+				'_source/' +	// %REMOVE_LINE%
+				'skins/' + skinName + '/' ) );
+
+		editor.skinName = skinName;
+		editor.skinPath = skinPath;
+		editor.skinClass = 'cke_skin_' + skinName;
 
 		// Fire the "configLoaded" event.
@@ -229,5 +231,5 @@
 	var loadSkin = function( editor )
 	{
-		CKEDITOR.skins.load( editor.config.skin, 'editor', function()
+		CKEDITOR.skins.load( editor, 'editor', function()
 			{
 				loadTheme( editor );
Index: /CKEditor/trunk/_source/core/skins.js
===================================================================
--- /CKEditor/trunk/_source/core/skins.js	(revision 3286)
+++ /CKEditor/trunk/_source/core/skins.js	(revision 3287)
@@ -19,4 +19,5 @@
 	var loaded = {};
 	var preloaded = {};
+	var paths = {};
 
 	var loadedPart = function( skinName, part, callback )
@@ -29,7 +30,5 @@
 			for ( var n = 0 ; n < fileNames.length ; n++ )
 			{
-				fileNames[ n ] = CKEDITOR.getUrl(
-					'_source/' +	// %REMOVE_LINE%
-					'skins/' + skinName + '/' + fileNames[ n ] );
+				fileNames[ n ] = paths[ skinName ] + fileNames[ n ];
 			}
 		};
@@ -134,7 +133,5 @@
 			loaded[ skinName ] = skinDefinition;
 
-			skinDefinition.skinPath = CKEDITOR.getUrl(
-					'_source/' +	// %REMOVE_LINE%
-					'skins/' + skinName + '/' );
+			skinDefinition.skinPath = paths[ skinName ];
 		},
 
@@ -150,16 +147,18 @@
 		 * @example
 		 */
-		load : function( skinName, skinPart, callback )
+		load : function( editor, skinPart, callback )
 		{
+			var skinName = editor.skinName,
+				skinPath = editor.skinPath;
+
 			if ( loaded[ skinName ] )
 				loadedPart( skinName, skinPart, callback );
 			else
 			{
-				CKEDITOR.scriptLoader.load( CKEDITOR.getUrl(
-					'_source/' +	// %REMOVE_LINE%
-					'skins/' + skinName + '/skin.js' ), function()
+				paths[ skinName ] = skinPath;
+				CKEDITOR.scriptLoader.load( skinPath + 'skin.js', function()
 						{
 							loadedPart( skinName, skinPart, callback );
-						} );
+						});
 			}
 		}
Index: /CKEditor/trunk/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 3286)
+++ /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 3287)
@@ -400,5 +400,5 @@
 		this._.dummyText.appendTo( themeBuilt.element );
 
-		CKEDITOR.skins.load( editor.config.skin, 'dialog' );
+		CKEDITOR.skins.load( editor, 'dialog' );
 	};
 
@@ -423,5 +423,5 @@
 					{
 						dialog : this,
-						skin : this._.editor.config.skin,
+						skin : this._.editor.skinName,
 						width : width,
 						height : height
@@ -1335,5 +1335,5 @@
 			editor = dialog.getParentEditor(),
 			magnetDistance = editor.config.dialog_magnetDistance,
-			margins = skinData[ editor.config.skin ].margins || [ 0, 0, 0, 0 ];
+			margins = skinData[ editor.skinName ].margins || [ 0, 0, 0, 0 ];
 
 		function mouseMoveHandler( evt )
@@ -1408,5 +1408,5 @@
 			minHeight = definition.minHeight || 0,
 			resizable = definition.resizable,
-			margins = skinData[ dialog.getParentEditor().config.skin ].margins || [ 0, 0, 0, 0 ];
+			margins = skinData[ dialog.getParentEditor().skinName ].margins || [ 0, 0, 0, 0 ];
 
 		function topSizer( coords, dy )
Index: /CKEditor/trunk/_source/plugins/image/dialogs/image.js
===================================================================
--- /CKEditor/trunk/_source/plugins/image/dialogs/image.js	(revision 3286)
+++ /CKEditor/trunk/_source/plugins/image/dialogs/image.js	(revision 3287)
@@ -174,7 +174,5 @@
 
 			// Set Error image.
-			var noimage = CKEDITOR.getUrl(
-				'_source/' +	// %REMOVE_LINE%
-				'skins/' + editor.config.skin + '/images/noimage.png' );
+			var noimage = CKEDITOR.getUrl( editor.skinPath + 'images/noimage.png' );
 
 			if ( this.preview )
Index: /CKEditor/trunk/_source/plugins/templates/dialogs/templates.js
===================================================================
--- /CKEditor/trunk/_source/plugins/templates/dialogs/templates.js	(revision 3286)
+++ /CKEditor/trunk/_source/plugins/templates/dialogs/templates.js	(revision 3287)
@@ -99,5 +99,5 @@
 		{
 			// Load skin at first.
-			CKEDITOR.skins.load( 'default', 'templates' );
+			CKEDITOR.skins.load( editor, 'templates' );
 
 			/**
Index: /CKEditor/trunk/_source/themes/default/theme.js
===================================================================
--- /CKEditor/trunk/_source/themes/default/theme.js	(revision 3286)
+++ /CKEditor/trunk/_source/themes/default/theme.js	(revision 3287)
@@ -113,5 +113,5 @@
 
 			var element = CKEDITOR.dom.element.createFromHtml( [
-					'<div class="cke_skin_', editor.config.skin,
+					'<div class="cke_skin_', editor.skinName,
 						' ', browserCssClass,
 						' ', CKEDITOR.env.quirks ? 'cke_mode_quirks' : 'cke_mode_standards',
