diff --git a/src/tap/config/ConfigurableServiceConnection.java b/src/tap/config/ConfigurableServiceConnection.java
index 1e178ed1945f8d920d1c1c734d0480a11961fced..0d4add63d8b79dfc11f8054c64a500ea7d3f1411 100644
--- a/src/tap/config/ConfigurableServiceConnection.java
+++ b/src/tap/config/ConfigurableServiceConnection.java
@@ -48,12 +48,14 @@ import static tap.config.TAPConfiguration.VALUE_VOTABLE;
 import static tap.config.TAPConfiguration.VALUE_XML;
 import static tap.config.TAPConfiguration.fetchClass;
 import static tap.config.TAPConfiguration.getProperty;
-import static tap.config.TAPConfiguration.isClassPath;
+import static tap.config.TAPConfiguration.isClassName;
 import static tap.config.TAPConfiguration.newInstance;
 import static tap.config.TAPConfiguration.parseLimit;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -174,7 +176,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 		// Read the desired file manager:
 		String fileManagerType = getProperty(tapConfig, KEY_FILE_MANAGER);
 		if (fileManagerType == null)
-			throw new TAPException("The property \"" + KEY_FILE_MANAGER + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_LOCAL + " or a class path between {...}.");
+			throw new TAPException("The property \"" + KEY_FILE_MANAGER + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_LOCAL + " or a class name between {...}.");
 		else
 			fileManagerType = fileManagerType.trim();
 
@@ -238,7 +240,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 		// Get the fetching method to use:
 		String metaFetchType = getProperty(tapConfig, KEY_METADATA);
 		if (metaFetchType == null)
-			throw new TAPException("The property \"" + KEY_METADATA + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_XML + " (to get metadata from a TableSet XML document) or " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA).");
+			throw new TAPException("The property \"" + KEY_METADATA + "\" is missing! It is required to create a TAP Service. Three possible values: " + VALUE_XML + " (to get metadata from a TableSet XML document), " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA) or the name (between {}) of a class extending TAPMetadata.");
 
 		TAPMetadata metadata = null;
 
@@ -277,6 +279,52 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 					tapFactory.freeConnection(conn);
 			}
 		}
+		// MANUAL ~ TAPMETADATA CLASS
+		else if (isClassName(metaFetchType)){
+			/* 1. Get the metadata */
+			// get the class:
+			Class<? extends TAPMetadata> metaClass = fetchClass(metaFetchType, KEY_METADATA, TAPMetadata.class);
+			if (metaClass == TAPMetadata.class)
+				throw new TAPException("Wrong class for the property \"" + KEY_METADATA + "\": \"" + metaClass.getName() + "\"! The class provided in this property MUST EXTEND tap.metadata.TAPMetadata.");
+			try{
+				// get one of the expected constructors:
+				try{
+					// (UWSFileManager, TAPFactory, TAPLog):
+					Constructor<? extends TAPMetadata> constructor = metaClass.getConstructor(UWSFileManager.class, TAPFactory.class, TAPLog.class);
+					// create the TAP metadata:
+					metadata = constructor.newInstance(fileManager, tapFactory, logger);
+				}catch(NoSuchMethodException nsme){
+					// () (empty constructor):
+					Constructor<? extends TAPMetadata> constructor = metaClass.getConstructor();
+					// create the TAP metadata:
+					metadata = constructor.newInstance();
+				}
+			}catch(NoSuchMethodException nsme){
+				throw new TAPException("Missing constructor tap.metadata.TAPMetadata() or tap.metadata.TAPMetadata(uws.service.file.UWSFileManager, tap.TAPFactory, tap.log.TAPLog)! See the value \"" + metaFetchType + "\" of the property \"" + KEY_METADATA + "\".");
+			}catch(InstantiationException ie){
+				throw new TAPException("Impossible to create an instance of an abstract class: \"" + metaClass.getName() + "\"! See the value \"" + metaFetchType + "\" of the property \"" + KEY_METADATA + "\".");
+			}catch(InvocationTargetException ite){
+				if (ite.getCause() != null){
+					if (ite.getCause() instanceof TAPException)
+						throw (TAPException)ite.getCause();
+					else
+						throw new TAPException(ite.getCause());
+				}else
+					throw new TAPException(ite);
+			}catch(Exception ex){
+				throw new TAPException("Impossible to create an instance of tap.metadata.TAPMetadata as specified in the property \"" + KEY_METADATA + "\": \"" + metaFetchType + "\"!", ex);
+			}
+
+			/* 2. Update the database */
+			DBConnection conn = null;
+			try{
+				conn = tapFactory.getConnection("SET_TAP_SCHEMA");
+				conn.setTAPSchema(metadata);
+			}finally{
+				if (conn != null)
+					tapFactory.freeConnection(conn);
+			}
+		}
 		// INCORRECT VALUE => ERROR!
 		else
 			throw new TAPException("Unsupported value for the property \"" + KEY_METADATA + "\": \"" + metaFetchType + "\"! Only two values are allowed: " + VALUE_XML + " (to get metadata from a TableSet XML document) or " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA).");
@@ -450,7 +498,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 					hasVotableFormat = true;
 			}
 			// custom OutputFormat
-			else if (isClassPath(f))
+			else if (isClassName(f))
 				outputFormats.add(TAPConfiguration.newInstance(f, KEY_OUTPUT_FORMATS, OutputFormat.class, new Class<?>[]{ServiceConnection.class}, new Object[]{this}));
 			// unknown format
 			else
@@ -583,25 +631,8 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 	private void initUserIdentifier(final Properties tapConfig) throws TAPException{
 		// Get the property value:
 		String propValue = getProperty(tapConfig, KEY_USER_IDENTIFIER);
-		if (propValue == null)
-			return;
-
-		// Check the value is a class path:
-		if (!isClassPath(propValue))
-			throw new TAPException("Class path expected for the property \"" + KEY_USER_IDENTIFIER + "\", instead of: \"" + propValue + "\"!");
-
-		// Fetch the class:
-		Class<? extends UserIdentifier> c = fetchClass(propValue, KEY_USER_IDENTIFIER, UserIdentifier.class);
-
-		// Create an instance with the empty constructor:
-		try{
-			userIdentifier = c.getConstructor().newInstance();
-		}catch(Exception e){
-			if (e instanceof TAPException)
-				throw (TAPException)e;
-			else
-				throw new TAPException("Impossible to create a UserIdentifier instance with the empty constructor of \"" + c.getName() + "\" (see the property user_identifier) for the following reason: " + e.getMessage());
-		}
+		if (propValue != null)
+			userIdentifier = newInstance(propValue, KEY_USER_IDENTIFIER, UserIdentifier.class);
 	}
 
 	private void initADQLGeometries(final Properties tapConfig) throws TAPException{
@@ -708,17 +739,17 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 							within_params = true;
 							buf.append(c);
 							break;
-						case '{': /* start of a classpath */
+						case '{': /* start of a class name */
 							within_classpath = true;
 							buf.append(c);
 							break;
-						case ',': /* separation between the signature and the classpath */
+						case ',': /* separation between the signature and the class name */
 							// count commas within this item:
 							if (++nbComma > 1)
 								// if more than 1, throw an error:
-								throw new TAPException("Wrong UDF declaration syntax: only two items (signature and classpath) can be given within brackets. (position in the property " + KEY_UDFS + ": " + ind + ")");
+								throw new TAPException("Wrong UDF declaration syntax: only two items (signature and class name) can be given within brackets. (position in the property " + KEY_UDFS + ": " + ind + ")");
 							else{
-								// end of the signature and start of the class path:
+								// end of the signature and start of the class name:
 								signature = buf.toString();
 								buf.delete(0, buf.length());
 								posSignature[1] = ind;
@@ -739,7 +770,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 
 							// no signature...
 							if (signature == null || signature.length() == 0){
-								// ...BUT a classpath => error
+								// ...BUT a class name => error
 								if (classpath != null)
 									throw new TAPException("Missing UDF declaration! (position in the property " + KEY_UDFS + ": " + posSignature[0] + "-" + posSignature[1] + ")");
 								// ... => ignore this item
@@ -751,9 +782,9 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 							try{
 								// resolve the function signature:
 								FunctionDef def = FunctionDef.parse(signature);
-								// resolve the class path:
+								// resolve the class name:
 								if (classpath != null){
-									if (isClassPath(classpath)){
+									if (isClassName(classpath)){
 										Class<? extends UserDefinedFunction> fctClass = null;
 										try{
 											// fetch the class:
@@ -761,12 +792,12 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 											// set the class inside the UDF definition:
 											def.setUDFClass(fctClass);
 										}catch(TAPException te){
-											throw new TAPException("Invalid class path for the UDF definition \"" + def + "\": " + te.getMessage() + " (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")", te);
+											throw new TAPException("Invalid class name for the UDF definition \"" + def + "\": " + te.getMessage() + " (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")", te);
 										}catch(IllegalArgumentException iae){
-											throw new TAPException("Invalid class path for the UDF definition \"" + def + "\": missing a constructor with a single parameter of type ADQLOperand[] " + (fctClass != null ? "in the class \"" + fctClass.getName() + "\"" : "") + "! (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")");
+											throw new TAPException("Invalid class name for the UDF definition \"" + def + "\": missing a constructor with a single parameter of type ADQLOperand[] " + (fctClass != null ? "in the class \"" + fctClass.getName() + "\"" : "") + "! (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")");
 										}
 									}else
-										throw new TAPException("Invalid class path for the UDF definition \"" + def + "\": \"" + classpath + "\" is not a class path (or is not surrounding by {} as expected in this property file)! (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")");
+										throw new TAPException("Invalid class name for the UDF definition \"" + def + "\": \"" + classpath + "\" is not a class name (or is not surrounding by {} as expected in this property file)! (position in the property " + KEY_UDFS + ": " + posClassPath[0] + "-" + posClassPath[1] + ")");
 								}
 								// add the UDF:
 								udfs.add(def);
@@ -794,7 +825,7 @@ public final class ConfigurableServiceConnection implements ServiceConnection {
 						case ',':
 							break;
 						default:
-							throw new TAPException("Wrong UDF declaration syntax: unexpected character at position " + ind + " in the property " + KEY_UDFS + ": \"" + c + "\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{classpath}]\".");
+							throw new TAPException("Wrong UDF declaration syntax: unexpected character at position " + ind + " in the property " + KEY_UDFS + ": \"" + c + "\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{className}]\".");
 					}
 				}
 			}
diff --git a/src/tap/config/ConfigurableTAPFactory.java b/src/tap/config/ConfigurableTAPFactory.java
index 40edfab4f8d661a852b78f5e45a3141c60924080..c0faed6c02f63f510b1be305c4cc342320fc88d2 100644
--- a/src/tap/config/ConfigurableTAPFactory.java
+++ b/src/tap/config/ConfigurableTAPFactory.java
@@ -139,8 +139,8 @@ public final class ConfigurableTAPFactory extends AbstractTAPFactory {
 		else if (sqlTranslator.equalsIgnoreCase(VALUE_PGSPHERE))
 			translator = PgSphereTranslator.class;
 
-		// case d: a client defined ADQLTranslator (with the provided class path)
-		else if (TAPConfiguration.isClassPath(sqlTranslator))
+		// case d: a client defined ADQLTranslator (with the provided class name)
+		else if (TAPConfiguration.isClassName(sqlTranslator))
 			translator = TAPConfiguration.fetchClass(sqlTranslator, KEY_SQL_TRANSLATOR, JDBCTranslator.class);
 
 		// case e: unsupported value
diff --git a/src/tap/config/ConfigurableTAPServlet.java b/src/tap/config/ConfigurableTAPServlet.java
index 69aa12fcb7c5f03b0d360c8b922e7cd8f4a8ffc4..57b1cfa9166c8e75aa328629e2bfc81667779315 100644
--- a/src/tap/config/ConfigurableTAPServlet.java
+++ b/src/tap/config/ConfigurableTAPServlet.java
@@ -25,7 +25,7 @@ import static tap.config.TAPConfiguration.KEY_HOME_PAGE;
 import static tap.config.TAPConfiguration.KEY_HOME_PAGE_MIME_TYPE;
 import static tap.config.TAPConfiguration.TAP_CONF_PARAMETER;
 import static tap.config.TAPConfiguration.getProperty;
-import static tap.config.TAPConfiguration.isClassPath;
+import static tap.config.TAPConfiguration.isClassName;
 import static tap.config.TAPConfiguration.newInstance;
 
 import java.io.File;
@@ -117,7 +117,7 @@ public class ConfigurableTAPServlet extends HttpServlet {
 		String propValue = getProperty(tapConf, KEY_HOME_PAGE);
 		if (propValue != null){
 			// If it is a class path, replace the current home page by an instance of this class:
-			if (isClassPath(propValue)){
+			if (isClassName(propValue)){
 				try{
 					tap.setHomePage(newInstance(propValue, KEY_HOME_PAGE, HomePage.class, new Class<?>[]{TAP.class}, new Object[]{tap}));
 				}catch(TAPException te){
diff --git a/src/tap/config/TAPConfiguration.java b/src/tap/config/TAPConfiguration.java
index f1e5d9fcddbaf800d828753133a7bf3695d91e7e..436ec669a2a20f078e4dac2f3436715b3d3f326b 100644
--- a/src/tap/config/TAPConfiguration.java
+++ b/src/tap/config/TAPConfiguration.java
@@ -1,10 +1,7 @@
 package tap.config;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Properties;
 
@@ -144,35 +141,35 @@ public final class TAPConfiguration {
 	}
 
 	/**
-	 * Test whether a property value is a class path.
+	 * Test whether a property value is a class name.
 	 * Expected syntax: a non-empty string surrounded by brackets ('{' and '}').
 	 * 
-	 * Note: The class path itself is not checked!
+	 * Note: The class name itself is not checked!
 	 * 
 	 * @param value	Property value.
 	 * 
-	 * @return <i>true</i> if the given value is formatted as a class path, <i>false</i> otherwise.
+	 * @return <i>true</i> if the given value is formatted as a class name, <i>false</i> otherwise.
 	 */
-	public final static boolean isClassPath(final String value){
+	public final static boolean isClassName(final String value){
 		return (value != null && value.length() > 2 && value.charAt(0) == '{' && value.charAt(value.length() - 1) == '}');
 	}
 
 	/**
-	 * Fetch the class object corresponding to the classpath provided between brackets in the given value. 
+	 * Fetch the class object corresponding to the class name provided between brackets in the given value. 
 	 * 
-	 * @param value			Value which is supposed to contain the classpath between brackets (see {@link #isClassPath(String)} for more details)
+	 * @param value			Value which is supposed to contain the class name between brackets (see {@link #isClassName(String)} for more details)
 	 * @param propertyName	Name of the property associated with the parameter "value".
 	 * @param expectedType	Type of the class expected to be returned ; it is also the type which parameterizes this function: C.
 	 * 
 	 * @return	The corresponding Class object.
 	 * 
-	 * @throws TAPException	If the classpath is incorrect or if its type is not compatible with the parameterized type C (represented by the parameter "expectedType").
+	 * @throws TAPException	If the class name is incorrect or if its type is not compatible with the parameterized type C (represented by the parameter "expectedType").
 	 * 
-	 * @see {@link #isClassPath(String)}
+	 * @see {@link #isClassName(String)}
 	 */
 	@SuppressWarnings("unchecked")
 	public final static < C > Class<? extends C> fetchClass(final String value, final String propertyName, final Class<C> expectedType) throws TAPException{
-		if (!isClassPath(value))
+		if (!isClassName(value))
 			return null;
 
 		String classPath = value.substring(1, value.length() - 1).trim();
@@ -182,13 +179,13 @@ public final class TAPConfiguration {
 		try{
 			Class<? extends C> classObject = (Class<? extends C>)Class.forName(classPath);
 			if (!expectedType.isAssignableFrom(classObject))
-				throw new TAPException("The class specified by the property " + propertyName + " (" + value + ") is not implementing " + expectedType.getName() + ".");
+				throw new TAPException("The class specified by the property \"" + propertyName + "\" (" + value + ") is not implementing " + expectedType.getName() + ".");
 			else
 				return classObject;
 		}catch(ClassNotFoundException cnfe){
-			throw new TAPException("The class specified by the property " + propertyName + " (" + value + ") can not be found.");
+			throw new TAPException("The class specified by the property \"" + propertyName + "\" (" + value + ") can not be found.");
 		}catch(ClassCastException cce){
-			throw new TAPException("The class specified by the property " + propertyName + " (" + value + ") is not implementing " + expectedType.getName() + ".");
+			throw new TAPException("The class specified by the property \"" + propertyName + "\" (" + value + ") is not implementing " + expectedType.getName() + ".");
 		}
 	}
 
@@ -197,7 +194,7 @@ public final class TAPConfiguration {
 	 * 
 	 * <p>The instance is created using the empty constructor of the specified class.</p>
 	 * 
-	 * @param value			Value which is supposed to contain the classpath between brackets (see {@link #isClassPath(String)} for more details)
+	 * @param value			Value which is supposed to contain the class name between brackets (see {@link #isClassName(String)} for more details)
 	 * @param propertyName	Name of the property associated with the parameter "value".
 	 * @param expectedType	Type of the class expected to be returned ; it is also the type which parameterizes this function: C.
 	 * 
@@ -208,7 +205,7 @@ public final class TAPConfiguration {
 	 *                     	or if the specified class has no empty constructor
 	 *                     	or if an error occurred while calling this constructor.
 	 * 
-	 * @see {@link #isClassPath(String)}
+	 * @see {@link #isClassName(String)}
 	 * @see #fetchClass(String, String, Class)
 	 */
 	public final static < C > C newInstance(final String propValue, final String propName, final Class<C> expectedType) throws TAPException{
@@ -223,7 +220,7 @@ public final class TAPConfiguration {
 	 * 	The number and types of given parameters MUST match exactly to the list of parameter types.
 	 * </p>
 	 * 
-	 * @param value			Value which is supposed to contain the classpath between brackets (see {@link #isClassPath(String)} for more details)
+	 * @param value			Value which is supposed to contain the class name between brackets (see {@link #isClassName(String)} for more details)
 	 * @param propertyName	Name of the property associated with the parameter "value".
 	 * @param expectedType	Type of the class expected to be returned ; it is also the type which parameterizes this function: C.
 	 * @param pTypes		List of each constructor parameter type. Each type MUST be exactly the type declared in the class constructor to select. <i>NULL or empty array if no parameter.</i>
@@ -236,12 +233,12 @@ public final class TAPConfiguration {
 	 *                     	or if the constructor with the specified parameters can not be found
 	 *                     	or if an error occurred while calling this constructor.
 	 * 
-	 * @see {@link #isClassPath(String)}
+	 * @see {@link #isClassName(String)}
 	 * @see #fetchClass(String, String, Class)
 	 */
 	public final static < C > C newInstance(final String propValue, final String propName, final Class<C> expectedType, final Class<?>[] pTypes, final Object[] parameters) throws TAPException{
 		// Ensure the given name is a class name specification:
-		if (!isClassPath(propValue))
+		if (!isClassName(propValue))
 			throw new TAPException("Class name expected for the property \"" + propName + "\" instead of: \"" + propValue + "\"! The specified class must extend/implement " + expectedType.getName() + ".");
 
 		Class<? extends C> classObj = null;
@@ -378,29 +375,4 @@ public final class TAPConfiguration {
 		return new Object[]{((numValue <= 0) ? -1 : numValue),unit};
 	}
 
-	public final static void main(final String[] args) throws Throwable{
-
-		FileInputStream configFileStream = null;
-		try{
-			final File configFile = new File("src/tap/config/tap_min.properties");
-			configFileStream = new FileInputStream(configFile);
-
-			Properties config = new Properties();
-			config.load(configFileStream);
-
-			configFileStream.close();
-			configFileStream = null;
-
-			Enumeration<Object> keys = config.keys();
-			String key;
-			while(keys.hasMoreElements()){
-				key = keys.nextElement().toString();
-				System.out.println("* " + key + " = " + config.getProperty(key));
-			}
-		}finally{
-			if (configFileStream != null)
-				configFileStream.close();
-		}
-	}
-
 }
diff --git a/src/tap/config/tap_configuration_file.html b/src/tap/config/tap_configuration_file.html
index 82e83a9592a29bf0a5b88f718ef13519c3abc4cf..091ad61b35340cca3c07d34c8bfed3fd8c59c50e 100644
--- a/src/tap/config/tap_configuration_file.html
+++ b/src/tap/config/tap_configuration_file.html
@@ -111,7 +111,7 @@
 						<li><u>name or relative path of a file</u>: this method MUST be chosen if the new home page is a JSP file. This file MUST be inside the directory WebContent of your web application.</li>
 						<li><u>a URI starting with <code>file://</code></u>: in this method the local file pointed by the URI will be merely returned when the home page will be requested.</li>
 						<li><u>a URL</u>: here, a redirection toward this URL will be made at each request on the home page</li>
-						<li><u>a classpath</u>: the classpath of an extension of tap.resource.HomePage which must replace the default home page resource. This class MUST have at least one constructor with exactly one parameter not NULL of type tap.resource.TAP.</li>
+						<li><u>a class name</u>: the class name of an extension of tap.resource.HomePage which must replace the default home page resource. This class MUST have at least one constructor with exactly one parameter not NULL of type tap.resource.TAP.</li>
 					</ul>
 					<p><em>By default, the default home page provided by the library is used.</em></p>
 				</td>
@@ -168,7 +168,7 @@
 				<td>
 					<p>The translator to use in order to translate ADQL to a SQL compatible with the used DBMS and its spatial extension.</p>
 					<p>The TAP library supports only Postgresql (without spatial extension) and PgSphere for the moment. But you can provide your own SQL translator
-					(even if it does not have spatial features), by providing a path to a class (within brackets: {...}) that implements ADQLTranslator and which have at least an empty constructor.</p>
+					(even if it does not have spatial features), by providing the name of a class (within brackets: {...}) that implements ADQLTranslator and which have at least an empty constructor.</p>
 				</td>
 				<td><ul><li>postgres</li><li>pgsphere</li><li>{apackage.MyADQLTranslator}</li></ul></td>
 			</tr>
@@ -242,13 +242,15 @@
 				<td>text</td>
 				<td>
 					<p>Define the way the library must get the list of all schemas, tables and columns to publish and all their metadata (e.g. utype, description, type, ...)</p>
-					<p>In its current state, the library proposes two methods:</p>
+					<p>In its current state, the library proposes three methods:</p>
 					<ol>
 						<li>Parse a TableSet XML document and load its content into the database schema TAP_SCHEMA (note: this schema is first erased and rebuilt by the library).</li>
 						<li>Get all metadata from the database schema TAP_SCHEMA.</li>
-					</ol> 
+						<li>Build yourself the metadata of your service by creating an extension of tap.metadata.TAPMetadata. This extension must have either an empty constructor
+							or a constructor with exactly 3 parameters of type UWSFileManager, TAPFactory and TAPLog ; if both constructor are provided, only the one with parameters will be used.</li>
+					</ol>
 				</td>
-				<td><ul><li>xml</li><li>db</li></ul>
+				<td><ul><li>xml</li><li>db</li><li>{apackage.MyTAPMetadata}</li></ul>
 			</tr>
 			<tr class="optional">
 				<td class="done">metadata_file</td>
@@ -269,7 +271,7 @@
 				<td>
 					<p>Type of the file manager.</p>
 					<p>Accepted values are: local (to manage files on the local system).
-					You can also add another way to manage files by providing the path (within brackets: {...}) to a class implementing TAPFileManager and having at least one constructor with only a java.util.Properties parameter.</p>
+					You can also add another way to manage files by providing the name (within brackets: {...}) of a class implementing TAPFileManager and having at least one constructor with only a java.util.Properties parameter.</p>
 				</td>
 				<td><ul><li>local</li><li>{apackage.MyTAPFileManager}</li></ul></td>
 			</tr>
@@ -451,7 +453,7 @@
 					Empty string values are allowed for each values (e.g. votable():: , votable(td)::votable).</p>
 					<p>It is also possible to define a custom Separated Value format, different from CSV and TSV, thanks to the following syntax: sv(<code>separator</code>):<code>mime_type</code>:<code>short_mime_type</code>.
 					On the contrary to the VOTable syntax, the parameter (i.e. separator) MUST BE provided. The MIME type part may be omitted ; then the MIME type will be set by default to text/plain.</p>
-					<p>There is finally a last possible value: a classpath to a class implementing OutputFormat and having at least one constructor with exactly one parameter of type tap.ServiceConnection.</p>
+					<p>There is finally a last possible value: a class name of a class implementing OutputFormat and having at least one constructor with exactly one parameter of type tap.ServiceConnection.</p>
 					<p><em>Default: <code>ALL</code></em></p>
 				</td>
 				<td><ul><li>votable</li><li>vot</li><li>vot(td,1.2)::votable</li><li>json,html ,csv, text</li><li>sv(|):text/psv:psv</li><li>sv([])</li><li>{apackage.FooOutputFormat}</li></ul></td>
@@ -550,7 +552,7 @@
 				<td>
 					<p>Class to use in order to identify a user of the TAP service. The same instance of this class will be used for every request sent to the service.</p>
 					<p>
-						The value of this property MUST be a class path (with brackets: {...}) toward a class implementing the interface uws.service.UserIdentifier.
+						The value of this property MUST be a class name (with brackets: {...}) of a class implementing the interface uws.service.UserIdentifier.
 						This class MUST have one of its constructors with no parameter.
 					</p>
 					<p><em>By default, no identification is performed ; all users are then anonymous and their jobs can be seen by everybody.</em></p>
@@ -580,10 +582,10 @@
 				<td>
 					<p>Comma-separated list of all allowed UDFs (User Defined Functions).</p>
 					<p>
-						Each item of the list must have the following syntax: <code>[fct_signature]</code> or <code>[fct_signature, classpath]</code>.
+						Each item of the list must have the following syntax: <code>[fct_signature]</code> or <code>[fct_signature, className]</code>.
 						<i>fct_function</i> is the function signature. Its syntax is the same as in <a href="http://www.ivoa.net/documents/TAPRegExt/20120827/REC-TAPRegExt-1.0.html#langs">TAPRegExt</a>.
-						<i>classpath</i> is the path of a class extending UserDefinedFunction. An instance of this class will replace any reference of a UDF
-						written in an ADQL function with the associated signature. A class path must be specified if the function to represent has a signature
+						<i>className</i> is the name of a class extending UserDefinedFunction. An instance of this class will replace any reference of a UDF
+						written in an ADQL function with the associated signature. A class name must be specified if the function to represent has a signature
 						(and more particularly a name) different in ADQL and in SQL.
 					</p>
 					<p>
diff --git a/src/tap/config/tap_full.properties b/src/tap/config/tap_full.properties
index 0d5ad3803302f10078f3de259678725eced03b55..f89fb2f34a022637eda8dbc3a00268c06a741b0d 100644
--- a/src/tap/config/tap_full.properties
+++ b/src/tap/config/tap_full.properties
@@ -19,7 +19,7 @@
 #     * name or relative path of a file: this method MUST be chosen if the new home page is a JSP file. This file MUST be inside the directory WebContent of your web application.
 #     * a URI starting with file://: in this method the local file pointed by the URI will be merely returned when the home page will be requested.
 #     * a URL: here, a redirection toward this URL will be made at each request on the home page
-#     * a classpath: the classpath of an extension of tap.resource.HomePage which must replace the default home page resource.
+#     * a class name: the class name of an extension of tap.resource.HomePage which must replace the default home page resource.
 #                    This class MUST have at least one constructor with exactly one parameter not NULL of type tap.resource.TAP.
 home_page = 
 
@@ -63,10 +63,10 @@ database_access =
 # The translator to use in order to translate ADQL to a SQL compatible with the used DBMS and its spatial extension.
 # 
 # The TAP library supports only Postgresql (without spatial extension) and PgSphere for the moment. But you can provide your own SQL translator
-# (even if it does not have spatial features), by providing a path to a class (within brackets: {...}) that implements ADQLTranslator (for instance: {apackage.MyADQLTranslator})
+# (even if it does not have spatial features), by providing the name of a class (within brackets: {...}) that implements ADQLTranslator (for instance: {apackage.MyADQLTranslator})
 # and which have at least an empty constructor.
 # 
-# Allowed values: postgres, pgsphere, a class path
+# Allowed values: postgres, pgsphere, a class name
 sql_translator = postgres
 
 #############################
@@ -119,11 +119,13 @@ db_password =
 # 
 # The value of this key defines the way the library will get the list of all schemas, tables and columns to publish and all their metadata (e.g. utype, description, type, ...).
 # 
-# In its current state, the library proposes two methods:
+# In its current state, the library proposes three methods:
 #    1/ Parse a TableSet XML document and load its content into the database schema TAP_SCHEMA (note: this schema is first erased and rebuilt by the library).
 #    2/ Get all metadata from the database schema TAP_SCHEMA.
+#    3/ Build yourself the metadata of your service by creating an extension of tap.metadata.TAPMetadata. This extension must have either an empty constructor
+#       or a constructor with exactly 3 parameters of type UWSFileManager, TAPFactory and TAPLog ; if both constructor are provided, only the one with parameters will be used.
 #  
-# Allowed values: xml, db.
+# Allowed values: xml, db or a full class name (between {}).
 metadata =  
 
 # [MANDATORY]
@@ -139,10 +141,10 @@ metadata_file =
 # Type of the file manager.
 # 
 # Accepted values are: local (to manage files on the local system). You can also add another way to manage files by providing
-# the path (within brackets: {...}) to a class implementing TAPFileManager and having at least one constructor with only a
+# the name (within brackets: {...}) of a class implementing TAPFileManager and having at least one constructor with only a
 # java.util.Properties parameter.
 # 
-# Allowed values: local, a class path.
+# Allowed values: local, a class name.
 file_manager = local
 
 # [MANDATORY]
@@ -307,7 +309,7 @@ max_execution_duration = 0
 # On the contrary to the VOTable syntax, the parameter (i.e. separator) MUST BE provided.
 # The MIME type part may be omitted ; then the MIME type will be set by default to text/plain.
 # 
-# There is finally a last possible value: a classpath to a class implementing OutputFormat and having at least one constructor with exactly one parameter of type
+# There is finally a last possible value: a class name of a class implementing OutputFormat and having at least one constructor with exactly one parameter of type
 # tap.ServiceConnection.
 # 
 # Default: ALL
@@ -406,7 +408,7 @@ upload_max_file_size = 0
 # 
 # The same instance of this class will be used for every request sent to the service.
 # 
-# The value of this property MUST be a class path (with brackets: {...}) toward a class implementing the interface uws.service.UserIdentifier.
+# The value of this property MUST be a class name (with brackets: {...}) of a class implementing the interface uws.service.UserIdentifier.
 # This class MUST have one of its constructors with no parameter.
 # 
 # Default: no identification is performed => all users are then anonymous and their jobs can be seen by everybody.
@@ -432,9 +434,9 @@ geometries =
 # [OPTIONAL]
 # Comma-separated list of all allowed UDFs (User Defined Functions).
 # 
-# Each item of the list must have the following syntax: [fct_signature] or [fct_signature, classpath]. fct_function is the function signature.
-# Its syntax is the same as in TAPRegExt. classpath is the path of a class extending UserDefinedFunction. An instance of this class will replace
-# any reference of a UDF written in an ADQL function with the associated signature. A class path must be specified if the function to represent
+# Each item of the list must have the following syntax: [fct_signature] or [fct_signature, className]. fct_function is the function signature.
+# Its syntax is the same as in TAPRegExt. className is the name of a class extending UserDefinedFunction. An instance of this class will replace
+# any reference of a UDF written in an ADQL function with the associated signature. A class name must be specified if the function to represent
 # has a signature (and more particularly a name) different in ADQL and in SQL.
 # 
 # If the list is empty (no item), all unknown functions are forbidden. And if the special value ANY is given, any unknown function is allowed ;
diff --git a/src/tap/config/tap_min.properties b/src/tap/config/tap_min.properties
index 8fe1e9a8d2bca0c145459a47d3a8b715a9f35981..20f034c6878a99ed0be1fc336f3d0ce00a242eb0 100644
--- a/src/tap/config/tap_min.properties
+++ b/src/tap/config/tap_min.properties
@@ -2,7 +2,7 @@
 #            MINIMUM TAP CONFIGURATION FILE              #
 #                                                        #
 # TAP Version: 2.0                                       #
-# Date: 12 Feb. 2015                                     #
+# Date: 18 Feb. 2015                                     #
 # Author: Gregory Mantelet (ARI)                         #
 #                                                        #
 ########################################################## 
@@ -23,10 +23,10 @@ database_access =
 # The translator to use in order to translate ADQL to a SQL compatible with the used DBMS and its spatial extension.
 # 
 # The TAP library supports only Postgresql (without spatial extension) and PgSphere for the moment. But you can provide your own SQL translator
-# (even if it does not have spatial features), by providing a path to a class (within brackets: {...}) that implements ADQLTranslator (for instance: {apackage.MyADQLTranslator})
+# (even if it does not have spatial features), by providing the name of a class (within brackets: {...}) that implements ADQLTranslator (for instance: {apackage.MyADQLTranslator})
 # and which have at least an empty constructor.
 # 
-# Allowed values: postgres, pgsphere, a class path
+# Allowed values: postgres, pgsphere, a class name
 sql_translator = postgres
 
 #############################
@@ -74,11 +74,13 @@ db_password =
 # 
 # The value of this key defines the way the library will get the list of all schemas, tables and columns to publish and all their metadata (e.g. utype, description, type, ...).
 # 
-# In its current state, the library proposes two methods:
+# In its current state, the library proposes three methods:
 #    1/ Parse a TableSet XML document and load its content into the database schema TAP_SCHEMA (note: this schema is first erased and rebuilt by the library).
 #    2/ Get all metadata from the database schema TAP_SCHEMA.
+#    3/ Build yourself the metadata of your service by creating an extension of tap.metadata.TAPMetadata. This extension must have either an empty constructor
+#       or a constructor with exactly 3 parameters of type UWSFileManager, TAPFactory and TAPLog ; if both constructor are provided, only the one with parameters will be used.
 #  
-# Allowed values: xml, db.
+# Allowed values: xml, db or a full class name (between {}).
 metadata =  
 
 # Mandatory if the value of "metadata" is "xml".
@@ -92,10 +94,10 @@ metadata_file =
 # Type of the file manager.
 #
 # Accepted values are: local (to manage files on the local system). You can also add another way to manage files by providing
-# the path (within brackets: {...}) to a class implementing TAPFileManager and having at least one constructor with only a
+# the name (within brackets: {...}) of a class implementing TAPFileManager and having at least one constructor with only a
 # java.util.Properties parameter.
 #
-# Allowed values: local, a class path.
+# Allowed values: local, a class name.
 file_manager = local
 
 # File path of the directory in which all TAP files (logs, errors, job results, backup, ...) must be.
diff --git a/test/tap/config/TestConfigurableServiceConnection.java b/test/tap/config/TestConfigurableServiceConnection.java
index 0712d9d2a16f3db534562394ca03820ec88c525c..11bfd22fa3341dab7845759764dbdeed47f20972 100644
--- a/test/tap/config/TestConfigurableServiceConnection.java
+++ b/test/tap/config/TestConfigurableServiceConnection.java
@@ -66,23 +66,24 @@ public class TestConfigurableServiceConnection {
 
 	private final static String XML_FILE = "test/tap/config/tables.xml";
 
-	private static Properties validProp, noFmProp, fmClassPathProp,
+	private static Properties validProp, noFmProp, fmClassNameProp,
 			incorrectFmProp, correctLogProp, incorrectLogLevelProp,
-			incorrectLogRotationProp, xmlMetaProp, missingMetaProp,
-			missingMetaFileProp, wrongMetaProp, wrongMetaFileProp,
-			validFormatsProp, validVOTableFormatsProp, badSVFormat1Prop,
-			badSVFormat2Prop, badVotFormat1Prop, badVotFormat2Prop,
-			badVotFormat3Prop, badVotFormat4Prop, badVotFormat5Prop,
-			badVotFormat6Prop, unknownFormatProp, maxAsyncProp,
-			negativeMaxAsyncProp, notIntMaxAsyncProp, defaultOutputLimitProp,
-			maxOutputLimitProp, bothOutputLimitGoodProp,
-			bothOutputLimitBadProp, userIdentProp, notClassPathUserIdentProp,
-			geometriesProp, noneGeomProp, anyGeomProp, noneInsideGeomProp,
-			unknownGeomProp, anyUdfsProp, noneUdfsProp, udfsProp,
-			udfsWithClassPathProp, udfsListWithNONEorANYProp,
-			udfsWithWrongParamLengthProp, udfsWithMissingBracketsProp,
-			udfsWithMissingDefProp1, udfsWithMissingDefProp2,
-			emptyUdfItemProp1, emptyUdfItemProp2, udfWithMissingEndBracketProp;
+			incorrectLogRotationProp, xmlMetaProp, wrongManualMetaProp,
+			missingMetaProp, missingMetaFileProp, wrongMetaProp,
+			wrongMetaFileProp, validFormatsProp, validVOTableFormatsProp,
+			badSVFormat1Prop, badSVFormat2Prop, badVotFormat1Prop,
+			badVotFormat2Prop, badVotFormat3Prop, badVotFormat4Prop,
+			badVotFormat5Prop, badVotFormat6Prop, unknownFormatProp,
+			maxAsyncProp, negativeMaxAsyncProp, notIntMaxAsyncProp,
+			defaultOutputLimitProp, maxOutputLimitProp,
+			bothOutputLimitGoodProp, bothOutputLimitBadProp, userIdentProp,
+			notClassPathUserIdentProp, geometriesProp, noneGeomProp,
+			anyGeomProp, noneInsideGeomProp, unknownGeomProp, anyUdfsProp,
+			noneUdfsProp, udfsProp, udfsWithClassNameProp,
+			udfsListWithNONEorANYProp, udfsWithWrongParamLengthProp,
+			udfsWithMissingBracketsProp, udfsWithMissingDefProp1,
+			udfsWithMissingDefProp2, emptyUdfItemProp1, emptyUdfItemProp2,
+			udfWithMissingEndBracketProp;
 
 	@BeforeClass
 	public static void setUp() throws Exception{
@@ -92,8 +93,8 @@ public class TestConfigurableServiceConnection {
 		noFmProp = (Properties)validProp.clone();
 		noFmProp.setProperty(KEY_FILE_MANAGER, "");
 
-		fmClassPathProp = (Properties)validProp.clone();
-		fmClassPathProp.setProperty(KEY_FILE_MANAGER, "{tap.config.TestConfigurableServiceConnection$FileManagerTest}");
+		fmClassNameProp = (Properties)validProp.clone();
+		fmClassNameProp.setProperty(KEY_FILE_MANAGER, "{tap.config.TestConfigurableServiceConnection$FileManagerTest}");
 
 		incorrectFmProp = (Properties)validProp.clone();
 		incorrectFmProp.setProperty(KEY_FILE_MANAGER, "foo");
@@ -112,6 +113,9 @@ public class TestConfigurableServiceConnection {
 		xmlMetaProp.setProperty(KEY_METADATA, VALUE_XML);
 		xmlMetaProp.setProperty(KEY_METADATA_FILE, XML_FILE);
 
+		wrongManualMetaProp = (Properties)validProp.clone();
+		wrongManualMetaProp.setProperty(KEY_METADATA, "{tap.metadata.TAPMetadata}");
+
 		missingMetaProp = (Properties)validProp.clone();
 		missingMetaProp.remove(KEY_METADATA);
 
@@ -212,8 +216,8 @@ public class TestConfigurableServiceConnection {
 		udfsProp = (Properties)validProp.clone();
 		udfsProp.setProperty(KEY_UDFS, "[toto(a string)] ,	[  titi(b REAL) -> double 	]");
 
-		udfsWithClassPathProp = (Properties)validProp.clone();
-		udfsWithClassPathProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR, {adql.db.TestDBChecker$UDFToto}]");
+		udfsWithClassNameProp = (Properties)validProp.clone();
+		udfsWithClassNameProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR, {adql.db.TestDBChecker$UDFToto}]");
 
 		udfsListWithNONEorANYProp = (Properties)validProp.clone();
 		udfsListWithNONEorANYProp.setProperty(KEY_UDFS, "[toto(a string)->VARCHAR],ANY");
@@ -247,7 +251,7 @@ public class TestConfigurableServiceConnection {
 	 * 
 	 * 	* Over the file manager:
 	 * 		- If no TAPFileManager is provided, an exception must be thrown. 
-	 * 		- If a classpath toward a valid TAPFileManager is provided, a functional DefaultServiceConnection must be successfully built.
+	 * 		- If a class name toward a valid TAPFileManager is provided, a functional DefaultServiceConnection must be successfully built.
 	 * 		- An incorrect file manager value in the configuration file must generate an exception.
 	 * 
 	 *  * Over the output format:
@@ -325,7 +329,7 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have failed because the property 'metadata' is missing!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("The property \"" + KEY_METADATA + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_XML + " (to get metadata from a TableSet XML document) or " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA).", e.getMessage());
+			assertEquals("The property \"" + KEY_METADATA + "\" is missing! It is required to create a TAP Service. Three possible values: " + VALUE_XML + " (to get metadata from a TableSet XML document), " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA) or the name (between {}) of a class extending TAPMetadata.", e.getMessage());
 		}
 
 		// Missing metadata_file property:
@@ -346,6 +350,15 @@ public class TestConfigurableServiceConnection {
 			assertEquals("Unsupported value for the property \"" + KEY_METADATA + "\": \"foo\"! Only two values are allowed: " + VALUE_XML + " (to get metadata from a TableSet XML document) or " + VALUE_DB + " (to fetch metadata from the database schema TAP_SCHEMA).", e.getMessage());
 		}
 
+		// Wrong MANUAL metadata:
+		try{
+			new ConfigurableServiceConnection(wrongManualMetaProp);
+			fail("This MUST have failed because the class specified in the property 'metadata' does not extend TAPMetadata but is TAPMetadata!");
+		}catch(Exception e){
+			assertEquals(TAPException.class, e.getClass());
+			assertEquals("Wrong class for the property \"" + KEY_METADATA + "\": \"tap.metadata.TAPMetadata\"! The class provided in this property MUST EXTEND tap.metadata.TAPMetadata.", e.getMessage());
+		}
+
 		// Wrong metadata_file property:
 		try{
 			new ConfigurableServiceConnection(wrongMetaFileProp);
@@ -361,12 +374,12 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have failed because no File Manager is specified!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("The property \"" + KEY_FILE_MANAGER + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_LOCAL + " or a class path between {...}.", e.getMessage());
+			assertEquals("The property \"" + KEY_FILE_MANAGER + "\" is missing! It is required to create a TAP Service. Two possible values: " + VALUE_LOCAL + " or a class name between {...}.", e.getMessage());
 		}
 
-		// File Manager = Class Path:
+		// File Manager = Class Name:
 		try{
-			ServiceConnection connection = new ConfigurableServiceConnection(fmClassPathProp);
+			ServiceConnection connection = new ConfigurableServiceConnection(fmClassNameProp);
 			assertNotNull(connection.getLogger());
 			assertEquals(LogLevel.DEBUG, ((DefaultUWSLog)connection.getLogger()).getMinLogLevel());
 			assertNotNull(connection.getFileManager());
@@ -383,7 +396,7 @@ public class TestConfigurableServiceConnection {
 			assertTrue(connection.getRetentionPeriod()[0] == connection.getRetentionPeriod()[1]);
 			assertTrue(connection.getExecutionDuration()[0] == connection.getExecutionDuration()[1]);
 		}catch(Exception e){
-			fail("This MUST have succeeded because the provided file manager is a class path valid! \nCaught exception: " + getPertinentMessage(e));
+			fail("This MUST have succeeded because the provided file manager is a class name valid! \nCaught exception: " + getPertinentMessage(e));
 		}
 
 		// Incorrect File Manager Value:
@@ -673,13 +686,13 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have succeeded because the class path toward the fake UserIdentifier is correct! \nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// Not a class path for user_identifier:
+		// Not a class name for user_identifier:
 		try{
 			new ConfigurableServiceConnection(notClassPathUserIdentProp);
-			fail("This MUST have failed because the user_identifier value is not a class path!");
+			fail("This MUST have failed because the user_identifier value is not a class name!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("Class path expected for the property \"" + KEY_USER_IDENTIFIER + "\", instead of: \"foo\"!", e.getMessage());
+			assertEquals("Class name expected for the property \"" + KEY_USER_IDENTIFIER + "\" instead of: \"foo\"! The specified class must extend/implement uws.service.UserIdentifier.", e.getMessage());
 		}
 
 		// Valid geometry list:
@@ -759,9 +772,9 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have succeeded because the given list of UDFs contains valid items! \nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// Valid list of UDFs containing one UDF with a classpath:
+		// Valid list of UDFs containing one UDF with a class name:
 		try{
-			ServiceConnection connection = new ConfigurableServiceConnection(udfsWithClassPathProp);
+			ServiceConnection connection = new ConfigurableServiceConnection(udfsWithClassNameProp);
 			assertNotNull(connection.getUDFs());
 			assertEquals(1, connection.getUDFs().size());
 			FunctionDef def = connection.getUDFs().iterator().next();
@@ -777,7 +790,7 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have failed because the given UDFs list contains at least 2 items, whose one is ANY!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("Wrong UDF declaration syntax: unexpected character at position 27 in the property " + KEY_UDFS + ": \"A\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{classpath}]\".", e.getMessage());
+			assertEquals("Wrong UDF declaration syntax: unexpected character at position 27 in the property " + KEY_UDFS + ": \"A\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{className}]\".", e.getMessage());
 		}
 
 		// UDF with no brackets:
@@ -786,7 +799,7 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have failed because one UDFs list item has no brackets!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("Wrong UDF declaration syntax: unexpected character at position 1 in the property " + KEY_UDFS + ": \"t\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{classpath}]\".", e.getMessage());
+			assertEquals("Wrong UDF declaration syntax: unexpected character at position 1 in the property " + KEY_UDFS + ": \"t\"! A UDF declaration must have one of the following syntaxes: \"[signature]\" or \"[signature,{className}]\".", e.getMessage());
 		}
 
 		// UDFs whose one item have more parts than supported:
@@ -795,7 +808,7 @@ public class TestConfigurableServiceConnection {
 			fail("This MUST have failed because one UDFs list item has too many parameters!");
 		}catch(Exception e){
 			assertEquals(TAPException.class, e.getClass());
-			assertEquals("Wrong UDF declaration syntax: only two items (signature and classpath) can be given within brackets. (position in the property " + KEY_UDFS + ": 58)", e.getMessage());
+			assertEquals("Wrong UDF declaration syntax: only two items (signature and class name) can be given within brackets. (position in the property " + KEY_UDFS + ": 58)", e.getMessage());
 		}
 
 		// UDF with missing definition part (or wrong since there is no comma):
diff --git a/test/tap/config/TestTAPConfiguration.java b/test/tap/config/TestTAPConfiguration.java
index a7d6390fc0a24471ae23bc75d70a20019eca298f..c77c320604ec1be79774bd13ef091835b3d4bdb0 100644
--- a/test/tap/config/TestTAPConfiguration.java
+++ b/test/tap/config/TestTAPConfiguration.java
@@ -10,7 +10,7 @@ import static tap.config.TAPConfiguration.KEY_DEFAULT_OUTPUT_LIMIT;
 import static tap.config.TAPConfiguration.KEY_FILE_MANAGER;
 import static tap.config.TAPConfiguration.KEY_MAX_OUTPUT_LIMIT;
 import static tap.config.TAPConfiguration.fetchClass;
-import static tap.config.TAPConfiguration.isClassPath;
+import static tap.config.TAPConfiguration.isClassName;
 import static tap.config.TAPConfiguration.newInstance;
 import static tap.config.TAPConfiguration.parseLimit;
 
@@ -35,33 +35,33 @@ public class TestTAPConfiguration {
 	public void setUp() throws Exception{}
 
 	/**
-	 * TEST isClassPath(String):
+	 * TEST isClassName(String):
 	 * 	- null, "", "{}", "an incorrect syntax" 				=> FALSE must be returned
 	 * 	- "{ }", "{ 	}", "{class.path}", "{ class.path	}" 	=> TRUE must be returned
 	 * 
-	 * @see ConfigurableServiceConnection#isClassPath(String)
+	 * @see ConfigurableServiceConnection#isClassName(String)
 	 */
 	@Test
 	public void testIsClassPath(){
 		// NULL and EMPTY:
-		assertFalse(isClassPath(null));
-		assertFalse(isClassPath(""));
+		assertFalse(isClassName(null));
+		assertFalse(isClassName(""));
 
 		// EMPTY CLASSPATH:
-		assertFalse(isClassPath("{}"));
+		assertFalse(isClassName("{}"));
 
 		// INCORRECT CLASSPATH:
-		assertFalse(isClassPath("incorrect class path ; missing {}"));
+		assertFalse(isClassName("incorrect class name ; missing {}"));
 
 		// VALID CLASSPATH:
-		assertTrue(isClassPath("{class.path}"));
+		assertTrue(isClassName("{class.path}"));
 
 		// CLASSPATH VALID ONLY IN THE SYNTAX:
-		assertTrue(isClassPath("{ }"));
-		assertTrue(isClassPath("{		}"));
+		assertTrue(isClassName("{ }"));
+		assertTrue(isClassName("{		}"));
 
 		// NOT TRIM CLASSPATH:
-		assertTrue(isClassPath("{ class.path	}"));
+		assertTrue(isClassName("{ class.name	}"));
 	}
 
 	/**
@@ -76,44 +76,44 @@ public class TestTAPConfiguration {
 		try{
 			assertNull(fetchClass(null, KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If a NULL value is provided as classpath: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If a NULL value is provided as class name: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 		try{
 			assertNull(fetchClass("", KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If an EMPTY value is provided as classpath: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If an EMPTY value is provided as class name: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// EMPTY CLASSPATH:
+		// EMPTY CLASS NAME:
 		try{
 			assertNull(fetchClass("{}", KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If an EMPTY classpath is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If an EMPTY class name is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 
 		// INCORRECT SYNTAX:
 		try{
-			assertNull(fetchClass("incorrect class path ; missing {}", KEY_FILE_MANAGER, String.class));
+			assertNull(fetchClass("incorrect class name ; missing {}", KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If an incorrect classpath is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If an incorrect class name is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// VALID CLASSPATH:
+		// VALID CLASS NAME:
 		try{
 			Class<? extends String> classObject = fetchClass("{java.lang.String}", KEY_FILE_MANAGER, String.class);
 			assertNotNull(classObject);
 			assertEquals(classObject.getName(), "java.lang.String");
 		}catch(TAPException e){
-			fail("If a VALID classpath is provided: getClass(...) MUST return a Class object of the wanted type!\nCaught exception: " + getPertinentMessage(e));
+			fail("If a VALID class name is provided: getClass(...) MUST return a Class object of the wanted type!\nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// INCORRECT CLASSPATH:
+		// INCORRECT CLASS NAME:
 		try{
 			fetchClass("{mypackage.foo}", KEY_FILE_MANAGER, String.class);
-			fail("This MUST have failed because an incorrect classpath is provided!");
+			fail("This MUST have failed because an incorrect class name is provided!");
 		}catch(TAPException e){
 			assertEquals(e.getClass(), TAPException.class);
-			assertEquals(e.getMessage(), "The class specified by the property " + KEY_FILE_MANAGER + " ({mypackage.foo}) can not be found.");
+			assertEquals(e.getMessage(), "The class specified by the property \"" + KEY_FILE_MANAGER + "\" ({mypackage.foo}) can not be found.");
 		}
 
 		// INCOMPATIBLE TYPES:
@@ -123,28 +123,28 @@ public class TestTAPConfiguration {
 			fail("This MUST have failed because a class of a different type has been asked!");
 		}catch(TAPException e){
 			assertEquals(e.getClass(), TAPException.class);
-			assertEquals(e.getMessage(), "The class specified by the property " + KEY_FILE_MANAGER + " ({java.util.ArrayList}) is not implementing " + String.class.getName() + ".");
+			assertEquals(e.getMessage(), "The class specified by the property \"" + KEY_FILE_MANAGER + "\" ({java.util.ArrayList}) is not implementing " + String.class.getName() + ".");
 		}
 
-		// CLASSPATH VALID ONLY IN THE SYNTAX:
+		// CLASS NAME VALID ONLY IN THE SYNTAX:
 		try{
 			assertNull(fetchClass("{ }", KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If an EMPTY classpath is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If an EMPTY class name is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 		try{
 			assertNull(fetchClass("{		}", KEY_FILE_MANAGER, String.class));
 		}catch(TAPException e){
-			fail("If an EMPTY classpath is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
+			fail("If an EMPTY class name is provided: getClass(...) MUST return null!\nCaught exception: " + getPertinentMessage(e));
 		}
 
-		// NOT TRIM CLASSPATH:
+		// NOT TRIM CLASS NAME:
 		try{
 			Class<?> classObject = fetchClass("{ java.lang.String	}", KEY_FILE_MANAGER, String.class);
 			assertNotNull(classObject);
 			assertEquals(classObject.getName(), "java.lang.String");
 		}catch(TAPException e){
-			fail("If a VALID classpath is provided: getClass(...) MUST return a Class object of the wanted type!\nCaught exception: " + getPertinentMessage(e));
+			fail("If a VALID class name is provided: getClass(...) MUST return a Class object of the wanted type!\nCaught exception: " + getPertinentMessage(e));
 		}
 	}
 
@@ -194,9 +194,8 @@ public class TestTAPConfiguration {
 
 		// NOT A CLASS NAME:
 		try{
-			TAPMetadata metadata = newInstance("tap.metadata.TAPMetadata", "metadata", TAPMetadata.class);
-			assertNotNull(metadata);
-			assertEquals("tap.metadata.TAPMetadata", metadata.getClass().getName());
+			newInstance("tap.metadata.TAPMetadata", "metadata", TAPMetadata.class);
+			fail("This MUST have failed because the property value is not a class name!");
 		}catch(Exception ex){
 			assertEquals(TAPException.class, ex.getClass());
 			assertEquals("Class name expected for the property \"metadata\" instead of: \"tap.metadata.TAPMetadata\"! The specified class must extend/implement tap.metadata.TAPMetadata.", ex.getMessage());
@@ -205,6 +204,7 @@ public class TestTAPConfiguration {
 		// NO MATCHING CONSTRUCTOR:
 		try{
 			newInstance("{tap.metadata.TAPSchema}", "schema", TAPSchema.class, new Class<?>[]{Integer.class}, new Object[]{new Integer(123)});
+			fail("This MUST have failed because the specified class does not have any expected constructor!");
 		}catch(Exception ex){
 			assertEquals(TAPException.class, ex.getClass());
 			assertEquals("Missing constructor tap.metadata.TAPSchema(java.lang.Integer)! See the value \"{tap.metadata.TAPSchema}\" of the property \"schema\".", ex.getMessage());
@@ -228,6 +228,7 @@ public class TestTAPConfiguration {
 		// WRONG CONSTRUCTOR with primitive type:
 		try{
 			newInstance("{adql.query.ColumnReference}", "colRef", ColumnReference.class, new Class<?>[]{Integer.class}, new Object[]{new Integer(123)});
+			fail("This MUST have failed because the constructor of the specified class expects an int, not an java.lang.Integer!");
 		}catch(Exception ex){
 			assertEquals(TAPException.class, ex.getClass());
 			assertEquals("Missing constructor adql.query.ColumnReference(java.lang.Integer)! See the value \"{adql.query.ColumnReference}\" of the property \"colRef\".", ex.getMessage());
@@ -236,6 +237,7 @@ public class TestTAPConfiguration {
 		// THE CONSTRUCTOR THROWS AN EXCEPTION:
 		try{
 			newInstance("{tap.metadata.TAPSchema}", "schema", TAPSchema.class, new Class<?>[]{String.class}, new Object[]{null});
+			fail("This MUST have failed because the constructor of the specified class throws an exception!");
 		}catch(Exception ex){
 			assertEquals(TAPException.class, ex.getClass());
 			assertNotNull(ex.getCause());
@@ -243,9 +245,10 @@ public class TestTAPConfiguration {
 			assertEquals("Missing schema name!", ex.getCause().getMessage());
 		}
 
-		// THE CONSTRUCTOR THROWS AN EXCEPTION:
+		// THE CONSTRUCTOR THROWS A TAPEXCEPTION:
 		try{
 			newInstance("{tap.config.TestTAPConfiguration$ClassAlwaysThrowTAPError}", "tapError", ClassAlwaysThrowTAPError.class);
+			fail("This MUST have failed because the constructor of the specified class throws a TAPException!");
 		}catch(Exception ex){
 			assertEquals(TAPException.class, ex.getClass());
 			assertEquals("This error is always thrown by ClassAlwaysThrowTAPError ^^", ex.getMessage());