diff --git a/src/fr/inrialpes/exmo/align/service/AlignmentService.java b/src/fr/inrialpes/exmo/align/service/AlignmentService.java
index 522abc1358fa7367074d27d6930f90b90c2a8626..e74619c8893f6fca6a9c6640a5c18655d5cdd1e3 100644
--- a/src/fr/inrialpes/exmo/align/service/AlignmentService.java
+++ b/src/fr/inrialpes/exmo/align/service/AlignmentService.java
@@ -24,8 +24,6 @@ import fr.inrialpes.exmo.queryprocessor.QueryProcessor;
 import fr.inrialpes.exmo.queryprocessor.Result;
 import fr.inrialpes.exmo.queryprocessor.Type;
 
-import fr.inrialpes.exmo.align.service.jade.JadeFIPAAServProfile;
-
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 import fr.inrialpes.exmo.align.impl.BasicParameters;
 
@@ -34,6 +32,8 @@ import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.Parameters;
 
 import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Enumeration;
 
 import gnu.getopt.LongOpt;
 import gnu.getopt.Getopt;
@@ -63,14 +63,14 @@ $Id$
  */
 public class AlignmentService {
 
-    public static final String
+    public static final String //DBMS Strings
 	DBHOST = "localhost",
 	DBPORT = "3306",
 	DBUSER = "adminAServ",
 	DBPASS = "aaa345",
 	DBBASE = "AServDB";
 
-    public static final String
+    public static final String //Port Strings
 	HTML = "8089",
 	JADE = "8888",
 	WSDL = "7777",
@@ -80,6 +80,7 @@ public class AlignmentService {
     private String filename = null;
     private String outfile = null;
     private String paramfile = null;
+    private Hashtable services = null;
 
     private AServProtocolManager manager;
 
@@ -90,6 +91,7 @@ public class AlignmentService {
     }
     
     public void run(String[] args) throws Exception {
+	services = new Hashtable();
 	// Read parameters
 	Parameters params = readParameters( args );
 	if ( debug > 0 ) System.err.println("Parameter parsed");
@@ -97,11 +99,11 @@ public class AlignmentService {
 	// Connect database
 	DBService connection = new DBServiceImpl();
 	connection.init();
-	connection.connect((String)params.getParameter( "dbmshost"), 
-			   (String)params.getParameter( "dbmsport"), 
-			   (String)params.getParameter( "dbmsuser"), 
-			   (String)params.getParameter( "dbmspass"), 
-			   (String)params.getParameter( "dbmsbase") );
+	connection.connect((String)params.getParameter("dbmshost"), 
+			   (String)params.getParameter("dbmsport"), 
+			   (String)params.getParameter("dbmsuser"), 
+			   (String)params.getParameter("dbmspass"), 
+			   (String)params.getParameter("dbmsbase") );
 	if ( debug > 0 ) System.err.println("Database connected");
 
 	// Create a AServProtocolManager
@@ -109,44 +111,36 @@ public class AlignmentService {
 	manager.init( connection, params );
 	if ( debug > 0 ) System.err.println("Manager created");
 
-	// This will have to be changed to a more generic way by
-	// launching all the requested profile or all the available profiles
-	// For all services:
-	// Get a list of services
-	// Create them
-	// init( params ) -- parameters must be passed
-
-	// Launch HTTP Server
-	if ( params.getParameter( "http" ) != null ){
-	    HTMLAServProfile htmlS;
-	    // May be put some Runable here...
+	// Launch services
+	for ( Enumeration e = services.keys() ; e.hasMoreElements() ; ) {
+	    String name = (String)e.nextElement();
+	    Class serviceClass = Class.forName(name);
+	    //Object[] mparams = {(Object)onto1, (Object)onto2 };
+	    //Class[] cparams = { oClass, oClass };
+	    java.lang.reflect.Constructor constructor = serviceClass.getConstructor( null );
+	    AlignmentServiceProfile serv = (AlignmentServiceProfile)constructor.newInstance( null );
 	    try {
-		htmlS = new HTMLAServProfile();
-		htmlS.init( params, manager );
-		if ( debug > 0 ) System.err.println("HTTP AServ launched on http://localhost:"+params.getParameter("http"));
-	    } catch ( AServException e ) {
-		System.err.println( "Couldn't start HTTP server:\n");
-		e.printStackTrace();
-	    }
-	}
-
-	if ( params.getParameter( "jade" ) != null ){
-	    JadeFIPAAServProfile JADEServeur = new JadeFIPAAServProfile();
-	    try{ 
-		JADEServeur.init( params, manager );
-		if ( debug > 0 ) System.err.println("JADE AServ launched on http://localhost:"+params.getParameter("jadeport")); }
-	    catch ( AServException e ) {
-		System.err.println( "Couldn't start JADE server:\n");
-		e.printStackTrace();
+		serv.init( params, manager );
+		if ( debug > 0 ) System.err.println(name+" launched on ");
+	    } catch ( AServException ex ) {
+		System.err.println( "Couldn't start "+name+" server:\n");
+		ex.printStackTrace();
 	    }
+	    services.put( name, serv );
 	}
 
 	// Wait loop
 	try { System.in.read(); } catch( Throwable t ) {};
 
-	// I must do something for stoping them
-	// For all list of services
-	// close()
+	// Close services
+	for ( Enumeration e = services.elements() ; e.hasMoreElements() ; ) {
+	    AlignmentServiceProfile serv = (AlignmentServiceProfile)e.nextElement();
+	    try { serv.close();
+	    } catch ( AServException ex ) {
+		System.err.println("Cannot close "+serv);
+		ex.printStackTrace();
+	    }
+	}
 
 	// Shut down database connection
 	connection.close();
@@ -165,7 +159,7 @@ public class AlignmentService {
 
 	// Read parameters
 
-	LongOpt[] longopts = new LongOpt[14];
+	LongOpt[] longopts = new LongOpt[15];
 	// General parameters
 	longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
 	longopts[1] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null, 'o');
@@ -183,10 +177,11 @@ public class AlignmentService {
 	longopts[11] = new LongOpt("dbmsuser", LongOpt.REQUIRED_ARGUMENT, null, 'u');
 	longopts[12] = new LongOpt("dbmspass", LongOpt.REQUIRED_ARGUMENT, null, 'p');
 	longopts[13] = new LongOpt("dbmsbase", LongOpt.REQUIRED_ARGUMENT, null, 'b');
+	longopts[3] = new LongOpt("serv", LongOpt.REQUIRED_ARGUMENT, null, 'i');
 	// Is there a way for that in LongOpt ???
-	longopts[5] = new LongOpt("D", LongOpt.REQUIRED_ARGUMENT, null, 'D');
+	longopts[4] = new LongOpt("D", LongOpt.REQUIRED_ARGUMENT, null, 'D');
 
-	Getopt g = new Getopt("", args, "ho:d::l:D:H::A::W::P::m:s:u:p:b:", longopts);
+	Getopt g = new Getopt("", args, "ho:d::l:D:H::A::W::P::m:s:u:p:b:i:", longopts);
 	int c;
 	String arg;
 
@@ -194,6 +189,7 @@ public class AlignmentService {
 	    switch (c) {
 	    case 'h' :
 		usage();
+		System.exit(0);
 	    case 'o' :
 		/* Use filename instead of stdout */
 		outfile = g.getOptarg();
@@ -213,6 +209,11 @@ public class AlignmentService {
 		if ( arg != null ) debug = Integer.parseInt(arg.trim());
 		else debug = 4;
 		break;
+	    case 'i' :
+		/* external service */
+		arg = g.getOptarg();
+		services.put( arg, arg );
+		break;
 	    case 'H' :
 		/* HTTP Server + port */
 		arg = g.getOptarg();
@@ -221,6 +222,7 @@ public class AlignmentService {
 		} else {
 		    params.setParameter( "http", HTML );
 		}		    
+		services.put( "fr.inrialpes.exmo.align.service.HTMLAServProfile", params.getParameter( "http" ) );
 		break;
 	    case 'A' :
 		/* JADE Server + port */
@@ -230,6 +232,7 @@ public class AlignmentService {
 		} else {
 		    params.setParameter( "jade", JADE );
 		}		    
+		services.put( "fr.inrialpes.exmo.align.service.jade.JadeFIPAAServProfile", params.getParameter( "jade" ) );
 		break;
 	    case 'W' :
 		/* WSDL Server + port */
@@ -289,17 +292,30 @@ public class AlignmentService {
 	return params;
     }
 
-
+    // Really missing:
+    // OUTPUT(o): what for, there is no output (maybe LOGS)
+    // LOAD(l): good idea, load from file, but what kind? sql?
+    // PARAMS(p is taken, P is taken): yes good as well to read parameters from file
     public void usage() {
 	System.err.println("usage: AlignmentService [options]");
-	System.err.println("$Id$\n");
 	System.err.println("options are:");
-	System.err.println("\t--load=filename -l filename\t\tInitialize the Service with the content of this file.");
-	System.err.println("\t--output=filename -o filename\tOutput the alignment in filename");
-	System.err.println("\t--params=filename -p filename\tReads parameters from filename");
+	//System.err.println("\t--load=filename -l filename\t\tInitialize the Service with the content of this ");
+	//System.err.println("\t--output=filename -o filename\tOutput the alignment in filename");
+	System.err.println("\t--html[=port] -H [port]\t\t\tLaunch HTTP service");
+	System.err.println("\t--jade[=port] -A [port]\t\t\tLaunch Agent service");
+	System.err.println("\t--wsdl[=port] -W [port]\t\t\tLaunch Web service");
+	System.err.println("\t--jxta[=port] -P [port]\t\t\tLaunch P2P service");
+	System.err.println("\t--serv=class -i class\t\t\tLaunch service corresponding to fully qualified classname");
+	//System.err.println("\t--params=filename -p filename\tReads parameters from filename");
+	System.err.println("\t--dbmshost=host -m host\t\t\tUse DBMS host");
+	System.err.println("\t--dbmsport=port -s port\t\t\tUse DBMS port");
+	System.err.println("\t--dbmsuser=name -u name\t\t\tUse DBMS user name");
+	System.err.println("\t--dbmspass=pwd -p pwd\t\t\tUse DBMS password");
+	System.err.println("\t--dbmsbase=name -b name\t\t\tUse Database name");
 	System.err.println("\t--debug[=n] -d [n]\t\tReport debug info at level n");
 	System.err.println("\t-Dparam=value\t\t\tSet parameter");
 	System.err.println("\t--help -h\t\t\tPrint this message");
+	System.err.println("\n$Id$\n");
     }
     
 }