Index: /CKEditor/trunk/_source/core/resourcemanager.js
===================================================================
--- /CKEditor/trunk/_source/core/resourcemanager.js	(revision 3244)
+++ /CKEditor/trunk/_source/core/resourcemanager.js	(revision 3245)
@@ -103,5 +103,5 @@
 
 	/**
-	 * Get the full path for a specific loaded resource.
+	 * Get the folder path for a specific loaded resource.
 	 * @param {String} name The resource name.
 	 * @type String
@@ -111,16 +111,38 @@
 	getPath : function( name )
 	{
-		return this.externals[ name ] || this.basePath + name + '/';
-	},
-
-	/**
-	 * Registers a resource to be loaded from an external path instead of the core base path.
+		var external = this.externals[ name ]
+		return CKEDITOR.getUrl( ( external && external.dir ) || this.basePath + name + '/' );
+	},
+
+	/**
+	 * Get the file path for a specific loaded resource.
+	 * @param {String} name The resource name.
+	 * @type String
+	 * @example
+	 * alert( <b>CKEDITOR.plugins.getFilePath( 'sample' )</b> );  // "&lt;editor path&gt;/plugins/sample/plugin.js"
+	 */
+	getFilePath : function( name )
+	{
+		var external = this.externals[ name ]
+		return CKEDITOR.getUrl( 
+				this.getPath( name ) + 
+				( ( external && external.file ) || ( this.fileName + '.js' ) ) );
+	},
+
+	/**
+	 * Registers one or more resources to be loaded from an external path
+	 * instead of the core base path.
 	 * @param {String} names The resource names, separated by commas.
-	 * @param {String} path The resource external path.
+	 * @param {String} path The path of the folder containing the resource.
+	 * @param {String} [fileName] The resource file name. If not provided, the
+	 *		default name is used.
 	 * @example
 	 * // Loads a plugin from '/myplugin/samples/plugin.js'.
 	 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
-	 */
-	addExternal : function( names, path )
+	 * @example
+	 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
+	 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
+	 */
+	addExternal : function( names, path, fileName )
 	{
 		names = names.split( ',' );
@@ -128,8 +150,10 @@
 		{
 			var name = names[ i ];
-			if ( this.registered[ name ] || this.externals[ name ] )
-				throw '[CKEDITOR.resourceManager.import] The resource name "' + name + '" is already registered or imported.';
-
-			this.externals[ name ] = path;
+
+			this.externals[ name ] =
+			{
+				dir : path,
+				file : fileName
+			};
 		}
 	},
@@ -173,5 +197,5 @@
 			if ( !loaded[ name ] && !registered[ name ] )
 			{
-				var url = CKEDITOR.getUrl( this.getPath( name ) + this.fileName + '.js' );
+				var url = this.getFilePath( name );
 				urls.push( url );
 				if ( !( url in urlsNames ) )
Index: /CKEditor/trunk/_source/tests/core/plugins.html
===================================================================
--- /CKEditor/trunk/_source/tests/core/plugins.html	(revision 3245)
+++ /CKEditor/trunk/_source/tests/core/plugins.html	(revision 3245)
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>CKEDITOR.plugins</title>
+	<link rel="stylesheet" type="text/css" href="../test.css" />
+	<script type="text/javascript" src="../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
+	<script type="text/javascript" src="../test.js"></script>
+	<script type="text/javascript">
+	//<![CDATA[
+
+CKEDITOR.test.addTestCase( (function()
+{
+	// Local reference to the "assert" object.
+	var assert = CKEDITOR.test.assert;
+	
+	return {
+
+		/**
+		 * Test loading self defined external plugin file paths.
+		 */
+		test_addExternal : function()
+		{
+			CKEDITOR.plugins.addExternal( 'myplugin', 
+			'_source/' + // %REMOVE_LINE%
+			'tests/core/plugins/myplugins/sample/', 'my_plugin.js' );
+			
+			CKEDITOR.plugins.load( 'myplugin', function(){
+				this.resume( function(){
+					
+					assert.isTrue( CKEDITOR.plugins.get( 'myplugin' ).definition );
+				} );				
+			}, this );
+			this.wait();
+		},
+
+		name : document.title
+	};
+})() );
+
+	//]]>
+	</script>
+</head>
+<body>
+</body>
+</html>
Index: /CKEditor/trunk/_source/tests/core/plugins/myplugins/sample/my_plugin.js
===================================================================
--- /CKEditor/trunk/_source/tests/core/plugins/myplugins/sample/my_plugin.js	(revision 3245)
+++ /CKEditor/trunk/_source/tests/core/plugins/myplugins/sample/my_plugin.js	(revision 3245)
@@ -0,0 +1,3 @@
+CKEDITOR.plugins.add( 'myplugin' , {
+	definition :  true
+} );
