diff --git a/html/relnotes.html b/html/relnotes.html
index 9e69bff18c1e22ceda9dbc7e660aa060228c7cb8..7c79777b3036666f9019a960be5179c9c1e0d7e5 100644
--- a/html/relnotes.html
+++ b/html/relnotes.html
@@ -39,6 +39,9 @@ The development of 4 versions continues.
 <p><ul compact="1">
 <li>Provide several URIs for the same alignment (serv)</li>
 <li>Implement database store for EDOAL (serv)</li>
+<li>Implementation of a provenance metadata tag (serv/impl)</li>
+<li>Complete tutorial4 (doc).</li>
+<li>Implement metadata edition (serv)</li>
 <li>Add simple "harder" test generator (gen)</li>
 <li>Add simple "hidden" test generator (gen)</li>
 <li>Add a <tt>dependsOn</tt> alignment property (api)</li>
@@ -46,18 +49,14 @@ The development of 4 versions continues.
 <li>Use the OWLReasoner interface and HermiT for adding inference to Ontowrap (ontowrap)</li>
 <li>Integrate tests from generator (test)</li>
 <li>Integrate some basic reasoning (impl).</li>
-<li>Complete tutorial4 with distributed reasoning.</li>
 <li>Genericize evaluators in <tt>GraphEvaluator</tt> and <tt>GenPlot</tt> (eval)</li>
-<li>Implementation of a provenance metadata tag (serv/impl)</li>
 <li>Replace <tt>DistanceAlignment</tt> and <tt>Similarity</tt> with a version more in line with <a href="http://ontosim.gforge.inria.fr">OntoSim</a> (impl)</tt>
 <!--li>Implemented transformations in EDOAL (edoal)</li-->
 <li>Improve HTML interface layout and usability (serv)</li>
-<li>Implement metadata edition (serv)</li>
 <li>Implement correspondence selection (serv)</li>
 <li>Automatically switch to correct <tt>ontowrap</tt> implementation in parsers (parser)</li>
 <li>Render alignments as module descriptions (impl)</li>
 <li>Implement extensive evaluation framework (impl)</li>
-<li>Implement debug options with log4j</li>
 <li>Matcher plugin for OpenII? (util)</li>
 <li>Add more tests</li>
 </ul></p>
diff --git a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
index ca642fa89922e58839deb8eff78e88b91dcd035a..303e040573b34ce1223316cce5ca83771c0a73ba 100644
--- a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
+++ b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $id: AServProtocolManager.java 1902 2014-03-17 19:39:04Z euzenat $
  *
  * Copyright (C) INRIA, 2006-2014
  *
@@ -233,9 +233,8 @@ public class AServProtocolManager implements Service {
 
     // DONE
     // Implements: store (different from store below)
-    public Message load( Message mess ) {
+    public Message load( Properties params ) {
 	boolean todiscard = false;
-	Properties params = mess.getParameters();
 	// load the alignment
 	String name = params.getProperty("url");
 	String file = null;
@@ -251,7 +250,7 @@ public class AServProtocolManager implements Service {
 	    al = aparser.parse( name );
 	    //logger.trace(" Alignment parsed");
 	} catch (Exception e) {
-	    return new UnreachableAlignment(newId(),mess,serverId,mess.getSender(),name,(Properties)null);
+	    return new UnreachableAlignment( params, newId(), serverId,name );
 	}
 	// We preserve the pretty tag within the loaded ontology
 	String pretty = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY );
@@ -265,43 +264,42 @@ public class AServProtocolManager implements Service {
 	if ( al != null && al != null ) {
 	    // try unlink
 	}
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),id,(Properties)null,pretty);
+	return new AlignmentId( params, newId(), serverId, id ,pretty );
     }
 
     // Implements: align
     @SuppressWarnings( "unchecked" )
-    public Message align( Message mess ){
+    public Message align( Properties params ){
 	Message result = null;
-	Properties p = mess.getParameters();
 	// These are added to the parameters wich are in the message
 	//for ( String key : commandLineParams ) {
 	// Unfortunately non iterable
 	for ( Enumeration<String> e = (Enumeration<String>)commandLineParams.propertyNames(); e.hasMoreElements();) { //[W:unchecked]
 	    String key = e.nextElement();
-	    if ( p.getProperty( key ) == null ){
-		p.setProperty( key , commandLineParams.getProperty( key ) );
+	    if ( params.getProperty( key ) == null ){
+		params.setProperty( key , commandLineParams.getProperty( key ) );
 	    }
 	}
 	// Do the fast part (retrieve)
-	result = retrieveAlignment( mess );
+	result = retrieveAlignment( params );
 	if ( result != null ) return result;
 	// [JE2013:ID]
 	String uri = alignmentCache.generateAlignmentUri();
 
 	// [JE2013:ID]
-	Aligner althread = new Aligner( mess, uri );
+	Aligner althread = new Aligner( params, uri );
 	Thread th = new Thread(althread);
 	// Do the slow part (align)
-	if ( mess.getParameters().getProperty("async") != null ) {
+	if ( params.getProperty("async") != null ) {
 	    th.start();
 	    // Parameters are used
 	    // [JE2013:ID]
-	    return new AlignmentId(newId(),mess,serverId,mess.getSender(),uri,mess.getParameters());
+	    return new AlignmentId( params, newId(), serverId, uri );
 	} else {
 	    th.start();
 	    try{ th.join(); }
 	    catch ( InterruptedException is ) {
-		return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Interrupted exception",(Properties)null);
+		return new ErrorMsg( params, newId(), serverId,"Interrupted exception" );
 	    };
 	    return althread.getResult();
 	}
@@ -311,25 +309,24 @@ public class AServProtocolManager implements Service {
      * returns null if alignment not retrieved
      * Otherwise returns AlignmentId or an ErrorMsg
      */
-    private Message retrieveAlignment( Message mess ){
-	Properties params = mess.getParameters();
+    private Message retrieveAlignment( Properties params ){
 	String method = params.getProperty("method");
 	// find and access o, o'
 	URI uri1 = null;
 	URI uri2 = null;
 	try {
-	    uri1 = new URI(params.getProperty("onto1"));
-	    uri2 = new URI(params.getProperty("onto2"));
+	    uri1 = new URI( params.getProperty("onto1"));
+	    uri2 = new URI( params.getProperty("onto2"));
 	} catch (Exception e) {
-	    return new NonConformParameters(newId(),mess,serverId,mess.getSender(),"nonconform/params/onto",(Properties)null);
+	    return new NonConformParameters( params, newId(), serverId,"nonconform/params/onto" );
 	};
 	Set<Alignment> alignments = alignmentCache.getAlignments( uri1, uri2 );
 	if ( alignments != null && params.getProperty("force") == null ) {
 	    for ( Alignment al: alignments ){
 		String meth2 = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.METHOD );
 		if ( meth2 != null && meth2.equals(method) ) {
-		    return new AlignmentId(newId(),mess,serverId,mess.getSender(),
-					   al.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID ),(Properties)null,
+		    return new AlignmentId( params, newId(), serverId,
+					   al.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID ) ,
 					   al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ) );
 		}
 	    }
@@ -339,8 +336,7 @@ public class AServProtocolManager implements Service {
 
     // DONE
     // Implements: query-aligned
-    public Message existingAlignments( Message mess ){
-	Properties params = mess.getParameters();
+    public Message existingAlignments( Properties params ){
 	// find and access o, o'
 	String onto1 = params.getProperty("onto1");
 	String onto2 = params.getProperty("onto2");
@@ -356,7 +352,7 @@ public class AServProtocolManager implements Service {
 	    }
 	    alignments = alignmentCache.getAlignments( uri1, uri2 );
 	} catch (Exception e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"MalformedURI problem",(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,"MalformedURI problem" );
 	}; //done below
 	String msg = "";
 	String prettys = "";
@@ -364,25 +360,24 @@ public class AServProtocolManager implements Service {
 	    msg += al.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID )+" ";
 	    prettys += al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY )+ ":";
 	}
-	return new AlignmentIds(newId(),mess,serverId,mess.getSender(),msg,(Properties)null,prettys);
+	return new AlignmentIds( params, newId(), serverId, msg, prettys );
     }
 
-    public Message findCorrespondences( Message mess ) {
-	Properties params = mess.getParameters();
+    public Message findCorrespondences( Properties params ) {
 	// Retrieve the alignment
 	Alignment al = null;
 	String id = params.getProperty("id");
 	try {
 	    al = alignmentCache.getAlignment( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
 	// Find matched
 	URI uri = null;
 	try {
 	    uri = new URI( params.getProperty("entity") );
 	} catch (Exception e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"MalformedURI problem",(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,"MalformedURI problem" );
 	};
 	// Retrieve correspondences
 	String msg = params.getProperty("strict");
@@ -398,26 +393,25 @@ public class AServProtocolManager implements Service {
 		}
 	    }
 	} catch ( AlignmentException alex ) { // should never happen
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Unexpected Alignment API Error",(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,"Unexpected Alignment API Error" );
 	}
-	return new EntityList( newId(), mess, serverId, mess.getSender(), msg, (Properties)null );
+	return new EntityList( params, newId(), serverId, msg );
     }
 
     // ABSOLUTELY NOT IMPLEMENTED
     // But look at existingAlignments
     // Implements: find
     // This may be useful when calling WATSON
-    public Message find(Message mess){
+    public Message find(Properties params){
     //\prul{search-success}{a --request ( find (O, T) )--> S}{O' <= Match(O,T); S --inform (O')--> a}{reachable(O) & Match(O,T)!=null}
     //\prul{search-void}{a - request ( find (O, T) ) \rightarrow S}{S - failure (nomatch) \rightarrow a}{reachable(O)\wedge Match(O,T)=\emptyset}
     //\prul{search-unreachable}{a - request ( find (O, T) ) \rightarrow S}{S - failure ( unreachable (O) ) \rightarrow a}{\neg reachable(O)}
-	return new OntologyURI(newId(),mess,serverId,mess.getSender(),"Find not implemented",(Properties)null);
+	return new OntologyURI( params, newId(), serverId,"Find not implemented" );
     }
 
     // Implements: translate
     // This should be applied to many more kind of messages with different kind of translation
-    public Message translate(Message mess){
-	Properties params = mess.getParameters();
+    public Message translate(Properties params){
 	// Retrieve the alignment
 	String id = params.getProperty("id");
 	BasicAlignment al = null;
@@ -425,21 +419,20 @@ public class AServProtocolManager implements Service {
 	    // JE:This one is risky
 	    al = (BasicAlignment)alignmentCache.getAlignment( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
 	// Translate the query
 	try {
 	    String translation = al.rewriteSPARQLQuery( params.getProperty("query") );
-	    return new TranslatedMessage(newId(),mess,serverId,mess.getSender(),translation,(Properties)null);
+	    return new TranslatedMessage( params, newId(), serverId,translation );
 	} catch (AlignmentException e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),e.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,e.toString() );
 	}
     }
 
     // DONE
     // Implements: render
-    public Message render( Message mess ){
-	Properties params = mess.getParameters();
+    public Message render( Properties params ){
 	// Retrieve the alignment
 	String id = params.getProperty( "id" );
 	Alignment al = null;
@@ -448,7 +441,7 @@ public class AServProtocolManager implements Service {
 	    al = alignmentCache.getAlignment( id );
 	    logger.trace("Alignment found");
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
 	// Render it
 	String method = params.getProperty("method");
@@ -468,22 +461,22 @@ public class AServProtocolManager implements Service {
 	    } catch ( ClassNotFoundException cnfex ) {
 		// should return the message
 		logger.error( "Unknown method", cnfex );
-		return new UnknownMethod(newId(),mess,serverId,mess.getSender(),method,(Properties)null);
+		return new UnknownMethod( params, newId(), serverId,method );
 	    }
 	    renderer.init( params );
 	    al.render( renderer );
 	} catch ( AlignmentException e ) {
-	    return new CannotRenderAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new CannotRenderAlignment( params, newId(), serverId,id );
 	} catch ( Exception e ) { // These are exceptions related to I/O
 	    writer.flush();
 	    //logger.trace( "Resulting rendering : {}", result.toString() );
 	    logger.error( "Cannot render alignment", e );
-	    return new Message(newId(),mess,serverId,mess.getSender(),"Failed to render alignment",(Properties)null);
+	    return new Message( params, newId(), serverId,"Failed to render alignment" );
 	} finally {
 	    writer.flush();
 	    writer.close();
 	}
-	return new RenderedAlignment(newId(),mess,serverId,mess.getSender(),result.toString(),params);
+	return new RenderedAlignment( params, newId(), serverId, result.toString() );
     }
 
 
@@ -492,8 +485,8 @@ public class AServProtocolManager implements Service {
      *********************************************************************/
 
     // Implementation specific
-    public Message store( Message mess ) {
-	String id = mess.getContent();
+    public Message store( Properties params ) {
+	String id = params.getProperty("id");
 	Alignment al = null;
 	 
 	try {
@@ -520,16 +513,16 @@ public class AServProtocolManager implements Service {
 	    }
 	    // register by them
 	    // Could also be an AlreadyStoredAlignment error
-	    return new AlignmentId(newId(),mess,serverId,mess.getSender(),id,(Properties)null,
+	    return new AlignmentId( params, newId(), serverId, id,
 				   al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ));
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
     }
 
     // Implementation specific
-    public Message erase( Message mess ) {
-	String id = mess.getContent();
+    public Message erase( Properties params ) {
+	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getAlignment( id );
@@ -547,10 +540,10 @@ public class AServProtocolManager implements Service {
 		logger.debug( "IGNORED Cannot erase alignment", ex );
 	    }
 	    // Should be a SuppressedAlignment
-	    return new AlignmentId(newId(),mess,serverId,mess.getSender(),id,(Properties)null,
+	    return new AlignmentId( params, newId(), serverId, id ,
 				   al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ));
 	} catch ( Exception ex ) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
     }
 
@@ -558,26 +551,26 @@ public class AServProtocolManager implements Service {
      * Returns only the metadata of an alignment and returns it in 
      * parameters
      */
-    public Message metadata( Message mess ){
+    public Message metadata( Properties params ){
 	// Retrieve the alignment
-	String id = mess.getParameters().getProperty("id");
+	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getMetadata( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
 	// JE: Other possibility is to render the metadata through XMLMetadataRendererVisitor into content...
 	// Put all the local metadata in parameters
-	Properties params = new Properties();
-	params.setProperty( "file1", al.getFile1().toString() );
-	params.setProperty( "file2", al.getFile2().toString() );
-	params.setProperty( Namespace.ALIGNMENT.uri+"#level", al.getLevel() );
-	params.setProperty( Namespace.ALIGNMENT.uri+"#type", al.getType() );
+	Properties p = new Properties();
+	p.setProperty( "file1", al.getFile1().toString() );
+	p.setProperty( "file2", al.getFile2().toString() );
+	p.setProperty( Namespace.ALIGNMENT.uri+"#level", al.getLevel() );
+	p.setProperty( Namespace.ALIGNMENT.uri+"#type", al.getType() );
 	for ( String[] ext : al.getExtensions() ){
-	    params.setProperty( ext[0]+ext[1], ext[2] );
+	    p.setProperty( ext[0]+ext[1], ext[2] );
 	}
-	return new AlignmentMetadata(newId(),mess,serverId,mess.getSender(),id,params);
+	return new AlignmentMetadata( params, newId(), serverId, id, p );
     }
 
     /*********************************************************************
@@ -587,86 +580,84 @@ public class AServProtocolManager implements Service {
      * There is no way an alignment server could modify an alignment
      *********************************************************************/
 
-    public Message trim( Message mess ) {
+    public Message trim( Properties params ) {
 	// Retrieve the alignment
-	String id = mess.getParameters().getProperty("id");
+	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getAlignment( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,id );
 	}
 	// get the trim parameters
-	String type = mess.getParameters().getProperty("type");
+	String type = params.getProperty("type");
 	if ( type == null ) type = "hard";
-	double threshold = Double.parseDouble(mess.getParameters().getProperty("threshold"));
+	double threshold = Double.parseDouble( params.getProperty("threshold"));
 	al = (BasicAlignment)((BasicAlignment)al).clone();
 	try { al.cut( type, threshold );}
 	catch (AlignmentException e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),e.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,e.toString() );
 	}
 	String pretty = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY );
 	if ( pretty != null ){
 	    al.setExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY, pretty+"/trimmed "+threshold );
 	};
 	String newId = alignmentCache.recordNewAlignment( al, true );
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),newId,(Properties)null,
+	return new AlignmentId( params, newId(), serverId, newId,
 			       al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ));
     }
 
-    public Message harden( Message mess ){
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),"Harden not implemented",(Properties)null);
+    public Message harden( Properties params ){
+	return new NonConformParameters( params, newId(), serverId, "Harden not implemented" );
     }
 
-    public Message inverse( Message mess ){
-	Properties params = mess.getParameters();
+    public Message inverse( Properties params ){
 	// Retrieve the alignment
 	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getAlignment( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),"unknown/Alignment/"+id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,"unknown/Alignment/"+id );
 	}
 
 	// Invert it
 	try { al = al.inverse(); }
 	catch (AlignmentException e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),e.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,e.toString() );
 	}
 	String pretty = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY );
 	if ( pretty != null ){
 	    al.setExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY, pretty+"/inverted" );
 	};
 	String newId = alignmentCache.recordNewAlignment( al, true );
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),newId,(Properties)null,
+	return new AlignmentId( params, newId(), serverId, newId,
 			       al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ));
     }
 
-    public Message meet( Message mess ){
+    public Message meet( Properties params ){
 	// Retrieve alignments
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),"Meet not available",(Properties)null);
+	return new NonConformParameters( params, newId(), serverId, "Meet not available" );
     }
 
-    public Message join( Message mess ){
+    public Message join( Properties params ){
 	// Retrieve alignments
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),"Join not available",(Properties)null);
+	return new NonConformParameters( params, newId(), serverId, "Join not available" );
     }
 
-    public Message compose( Message mess ){
+    public Message compose( Properties params ){
 	// Retrieve alignments
-	return new AlignmentId(newId(),mess,serverId,mess.getSender(),"Compose not available",(Properties)null);
+	return new NonConformParameters( params, newId(), serverId, "Compose not available" );
     }
 
-    public Message eval( Message mess ){
-	Properties params = mess.getParameters();
+    public Message eval( Properties params ){
 	// Retrieve the alignment
 	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getAlignment( id );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),"unknown/Alignment/"+id,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,"unknown/Alignment/"+id );
 	}
 	// Retrieve the reference alignment
 	String rid = params.getProperty("ref");
@@ -674,7 +665,7 @@ public class AServProtocolManager implements Service {
 	try {
 	    ref = alignmentCache.getAlignment( rid );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),"unknown/Alignment/"+rid,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,"unknown/Alignment/"+rid );
 	}
 	// Set the comparison method
 	String classname = params.getProperty("method");
@@ -688,32 +679,31 @@ public class AServProtocolManager implements Service {
 	    eval = (Evaluator)evaluatorConstructor.newInstance( mparams );
 	} catch ( ClassNotFoundException cnfex ) {
 	    logger.error( "Unknown method", cnfex );
-	    return new UnknownMethod(newId(),mess,serverId,mess.getSender(),classname,(Properties)null);
+	    return new UnknownMethod( params, newId(), serverId,classname );
 	} catch ( InvocationTargetException itex ) {
 	    String msg = itex.toString();
 	    if ( itex.getCause() != null ) msg = itex.getCause().toString();
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),msg,(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,msg );
 	} catch ( Exception ex ) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),ex.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,ex.toString() );
 	}
 	// Compare it
-	try { eval.eval(params); }
+	try { eval.eval( params); }
 	catch ( AlignmentException e ) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),e.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,e.toString() );
 	}
 	// Could also be EvaluationId if we develop a more elaborate evaluation description
-	return new EvalResult(newId(),mess,serverId,mess.getSender(),classname,eval.getResults());
+	return new EvalResult( params, newId(), serverId, classname, eval.getResults() );
     }
 
-    public Message diff( Message mess ){
-	Properties params = mess.getParameters();
+    public Message diff( Properties params ){
 	// Retrieve the alignment
 	String id1 = params.getProperty("id1");
 	Alignment al1 = null;
 	try {
 	    al1 = alignmentCache.getAlignment( id1 );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),"unknown/Alignment/"+id1,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,"unknown/Alignment/"+id1 );
 	}
 	// Retrieve the reference alignment
 	String id2 = params.getProperty("id2");
@@ -721,23 +711,23 @@ public class AServProtocolManager implements Service {
 	try {
 	    al2 = alignmentCache.getAlignment( id2 );
 	} catch (Exception e) {
-	    return new UnknownAlignment(newId(),mess,serverId,mess.getSender(),"unknown/Alignment/"+id2,(Properties)null);
+	    return new UnknownAlignment( params, newId(), serverId,"unknown/Alignment/"+id2 );
 	}
 	try { 
 	    DiffEvaluator diff = new DiffEvaluator( al1, al2 );
 	    diff.eval( params ); 
 	    // This will only work with HTML
-	    return new EvalResult(newId(),mess,serverId,mess.getSender(),diff.HTMLString(),(Properties)null);
+	    return new EvalResult( params, newId(), serverId, diff.HTMLString(), (Properties)null );
 	} catch (AlignmentException e) {
-	    return new ErrorMsg(newId(),mess,serverId,mess.getSender(),e.toString(),(Properties)null);
+	    return new ErrorMsg( params, newId(), serverId,e.toString() );
 	}
     }
 
     /**
      * Store evaluation result from its URI
      */
-    public Message storeEval( Message mess ){
-	return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Not yet implemented",(Properties)null);
+    public Message storeEval( Properties params ){
+	return new ErrorMsg( params, newId(), serverId,"Not yet implemented" );
     }
 
     /**
@@ -749,27 +739,27 @@ public class AServProtocolManager implements Service {
     //            ~~> PRGraph (but this may be a Evaluator)
     //            ~~> Triangle
     //            ~~> Cross
-    public Message groupEval( Message mess ){
-	return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Not yet implemented",(Properties)null);
+    public Message groupEval( Properties params ){
+	return new ErrorMsg( params, newId(), serverId,"Not yet implemented" );
     }
 
     /**
      * Store the result
      */
-    public Message storeGroupEval( Message mess ){
-	return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Not yet implemented",(Properties)null);
+    public Message storeGroupEval( Properties params ){
+	return new ErrorMsg( params, newId(), serverId,"Not yet implemented" );
     }
 
     /**
      * Retrieve the results (all registered result) of a particular test
      */
-    public Message getResults( Message mess ){
-	return new ErrorMsg(newId(),mess,serverId,mess.getSender(),"Not yet implemented",(Properties)null);
+    public Message getResults( Properties params ){
+	return new ErrorMsg( params, newId(), serverId,"Not yet implemented" );
     }
 
-    public boolean storedAlignment( Message mess ) {
+    public boolean storedAlignment( Properties params ) {
 	// Retrieve the alignment
-	String id = mess.getParameters().getProperty("id");
+	String id = params.getProperty("id");
 	Alignment al = null;
 	try {
 	    al = alignmentCache.getAlignment( id );
@@ -808,16 +798,16 @@ public class AServProtocolManager implements Service {
      */
 
     // Implements: reply-with
-    public Message replywith(Message mess){
+    public Message replywith(Properties params){
 
     //\prul{redirect}{a - request ( q(x)~reply-with:~i) \rightarrow S}{
     //Q \Leftarrow Q\cup\{\langle a, i, !i', q(x), S'\rangle\}\		\
     //S - request( q( R(x) )~reply-with:~i')\rightarrow S'}{S'\in C(q)}
-	return new Message(newId(),mess,serverId,mess.getSender(),"dummy//",(Properties)null);
+	return new Message( params, newId(), serverId,"dummy//" );
     }
 
     // Implements: reply-to
-    public Message replyto(Message mess){
+    public Message replyto(Properties params){
 
     //\prul{handle-return}{S' - inform ( y~reply-to:~i') \rightarrow S}{
     //Q \Leftarrow Q-\{\langle a, i, i', _, S'\rangle\}\		\
@@ -827,16 +817,16 @@ public class AServProtocolManager implements Service {
     //Q \Leftarrow Q-\{\langle a, i, i', _, S'\rangle\}\	\
     //R \Leftarrow R\cup\{\langle a, !y', y, S'\rangle\}\		\
     //S - inform( R^{-1}(y)~reply-to:~i)\rightarrow a}{\langle a, i, i', _, S'\rangle \in Q, surr(y)}
-	return new Message(newId(),mess,serverId,mess.getSender(),"dummy//",(Properties)null);
+	return new Message( params, newId(), serverId,"dummy//" );
     }
 
     // Implements: failure
-    public Message failure(Message mess){
+    public Message failure(Properties params){
 
     //\prul{failure-return}{S' - failure ( y~reply-to:~i') \rightarrow S}{
     //Q \Leftarrow Q-\{\langle a, i, i', _, S'\rangle\}\		\
     //S - failure( R^{-1}(y)~reply-to:~i)\rightarrow a}{\langle a, i, i', _, S'\rangle \in Q}
-	return new Message(newId(),mess,serverId,mess.getSender(),"dummy//",(Properties)null);
+	return new Message( params, newId(), serverId,"dummy//" );
     }
 
     /*********************************************************************
@@ -1085,12 +1075,12 @@ public class AServProtocolManager implements Service {
     }
 
     protected class Aligner implements Runnable {
-	private Message mess = null;
+	private Properties params = null;
 	private Message result = null;
 	private String id = null;
 
-	public Aligner( Message m, String id ) {
-	    mess = m;
+	public Aligner( Properties p, String id ) {
+	    params = p;
 	    this.id = id;
 	}
 
@@ -1099,17 +1089,16 @@ public class AServProtocolManager implements Service {
 	}
 
 	public void run() {
-	    Properties params = mess.getParameters();
 	    String method = params.getProperty("method");
 	    // find and access o, o'
 	    URI uri1 = null;
 	    URI uri2 = null;
 
 	    try {
-		uri1 = new URI(params.getProperty("onto1"));
-		uri2 = new URI(params.getProperty("onto2"));
+		uri1 = new URI( params.getProperty("onto1"));
+		uri2 = new URI( params.getProperty("onto2"));
 	    } catch (Exception e) {
-		result = new NonConformParameters(newId(),mess,serverId,mess.getSender(),"nonconform/params/onto",(Properties)null);
+		result = new NonConformParameters( params, newId(), serverId,"nonconform/params/onto" );
 		return;
 	    };
 
@@ -1121,11 +1110,11 @@ public class AServProtocolManager implements Service {
 		    try {
 			init = alignmentCache.getAlignment( params.getProperty("init") );
 		} catch (Exception e) {
-			result = new UnknownAlignment(newId(),mess,serverId,mess.getSender(),params.getProperty("init"),(Properties)null);
+			result = new UnknownAlignment( params, newId(), serverId,params.getProperty("init") );
 			return;
 		    }
 		} catch (Exception e) {
-		    result = new UnknownAlignment(newId(),mess,serverId,mess.getSender(),params.getProperty("init"),(Properties)null);
+		    result = new UnknownAlignment( params, newId(), serverId,params.getProperty("init") );
 		    return;
 		}
 	    }
@@ -1153,33 +1142,33 @@ public class AServProtocolManager implements Service {
 		    // The unreachability test has already been done
 		    // JE 15/1/2009: commented the unreachability test
 		    if ( reachable( uri1 ) == null ){
-			result = new UnreachableOntology(newId(),mess,serverId,mess.getSender(),params.getProperty("onto1"),(Properties)null);
+			result = new UnreachableOntology( params, newId(), serverId,params.getProperty("onto1") );
 		    } else if ( reachable( uri2 ) == null ){
-			result = new UnreachableOntology(newId(),mess,serverId,mess.getSender(),params.getProperty("onto2"),(Properties)null);
+			result = new UnreachableOntology( params, newId(), serverId,params.getProperty("onto2") );
 		    } else {
-			result = new NonConformParameters(newId(),mess,serverId,mess.getSender(),"nonconform/params/"+e.getMessage(),(Properties)null);
+			result = new NonConformParameters( params, newId(), serverId,"nonconform/params/"+e.getMessage() );
 		    }
 		    return;
 		}
 		// ask to store A'
 		alignmentCache.recordNewAlignment( id, aresult, true );
-		result = new AlignmentId(newId(),mess,serverId,mess.getSender(),id,(Properties)null,
+		result = new AlignmentId( params, newId(), serverId, id,
 			       aresult.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY ));
 	    } catch ( ClassNotFoundException cnfex ) {
 		logger.error( "Unknown method", cnfex );
-		result = new UnknownMethod(newId(),mess,serverId,mess.getSender(),method,(Properties)null);
+		result = new UnknownMethod( params, newId(), serverId,method );
 	    } catch (NoSuchMethodException e) {
-		result = new RunTimeError(newId(),mess,serverId,mess.getSender(),"No such method: "+method+"(Object, Object)",(Properties)null);
+		result = new RunTimeError( params, newId(), serverId, "No such method: "+method+"(Object, Object)" );
 	    } catch (InstantiationException e) {
-		result = new RunTimeError(newId(),mess,serverId,mess.getSender(),"Instantiation",(Properties)null);
+		result = new RunTimeError( params, newId(), serverId, "Instantiation" );
 	    } catch (IllegalAccessException e) {
-		result = new RunTimeError(newId(),mess,serverId,mess.getSender(),"Cannot access",(Properties)null);
+		result = new RunTimeError( params, newId(), serverId, "Cannot access" );
 	    } catch (InvocationTargetException e) {
-		result = new RunTimeError(newId(),mess,serverId,mess.getSender(),"Invocation target",(Properties)null);
+		result = new RunTimeError( params, newId(), serverId, "Invocation target" );
 	    } catch (AlignmentException e) {
-		result = new NonConformParameters(newId(),mess,serverId,mess.getSender(),"nonconform/params/",(Properties)null);
+		result = new NonConformParameters( params, newId(), serverId, "nonconform/params/" );
 	    } catch (Exception e) {
-		result = new RunTimeError(newId(),mess,serverId,mess.getSender(),"Unexpected exception :"+e,(Properties)null);
+		result = new RunTimeError( params, newId(), serverId, "Unexpected exception :"+e );
 	    }
 	}
     }
diff --git a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
index a2881f74a048c8d8341d4f43028e9590be49bd2d..2e6c2376fd963c0f37e324808d4628312bb8c9d0 100644
--- a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
+++ b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
@@ -70,18 +70,16 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 
     private AServProtocolManager manager;
 
-    private String myId;
-    private String serverId;
+    private String serverURL;
     private int localId = 0;
 
-    private int newId() { return localId++; }
-
     public static final int MAX_FILE_SIZE = 10000;
 
     public static final String HEADER = "<style type=\"text/css\">body { font-family: sans-serif } button {background-color: #DDEEFF; margin-left: 1%; border: #CCC 1px solid;}</style>";
 
     public void init( Properties params, AServProtocolManager manager ) throws AServException {
 	this.manager = manager;
+	serverURL = manager.serverURL()+"/html/";
     }
 
     public boolean accept( String prefix ) {
@@ -258,7 +256,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	} else if ( perf.equals("errrazze") ){ // Suppress an alignment
 	    String id = params.getProperty("id");
 	    if ( id != null && !id.equals("") ) { // Erase it
-		Message answer = manager.erase( new Message(newId(),(Message)null,myId,serverId,id, params) );
+		Message answer = manager.erase( params );
 		if ( answer instanceof ErrorMsg ) {
 		    msg = testErrorMessages( answer, params );
 		} else {
@@ -273,7 +271,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    for ( Alignment al : manager.alignments() ) {
 		String id = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID);
 		params.setProperty("id", id);
-		if ( !manager.storedAlignment( new Message(newId(),(Message)null,myId,serverId,"", params ) ) ){
+		if ( !manager.storedAlignment( params ) ){
 		    String pid = al.getExtension( Namespace.ALIGNMENT.uri, Annotations.PRETTY );
 		    if ( pid == null ) pid = id; else pid = id+" ("+pid+")";
 		    msg += "<option value=\""+id+"\">"+pid+"</option>";
@@ -286,7 +284,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    String id = params.getProperty("id");
 	    String url = params.getProperty("url");
 	    if ( url != null && !url.equals("") ) { // Load the URL
-		Message answer = manager.load( new Message(newId(),(Message)null,myId,serverId,"", params) );
+		Message answer = manager.load( params );
 		if ( answer instanceof ErrorMsg ) {
 		    msg = testErrorMessages( answer, params );
 		} else {
@@ -294,7 +292,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 		}
 	    }
 	    if ( id != null ){ // Store it
-		Message answer = manager.store( new Message(newId(),(Message)null,myId,serverId,id, params) );
+		Message answer = manager.store( params );
 		if ( answer instanceof ErrorMsg ) {
 		    msg = testErrorMessages( answer, params );
 		} else {
@@ -322,7 +320,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    String id = params.getProperty("id");
 	    String threshold = params.getProperty("threshold");
 	    if ( id != null && !id.equals("") && threshold != null && !threshold.equals("") ){ // Trim it
-		Message answer = manager.trim( new Message(newId(),(Message)null,myId,serverId,id, params) );
+		Message answer = manager.trim( params );
 		if ( answer instanceof ErrorMsg ) {
 		    msg = testErrorMessages( answer, params );
 		} else {
@@ -344,7 +342,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	} else if ( perf.equals("inv") ) {
 	    String id = params.getProperty("id");
 	    if ( id != null && !id.equals("") ){ // Invert it
-		Message answer = manager.inverse( new Message(newId(),(Message)null,myId,serverId,id, params) );
+		Message answer = manager.inverse( params );
 		if ( answer instanceof ErrorMsg ) {
 		    msg = testErrorMessages( answer, params );
 		} else {
@@ -381,7 +379,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "  <input type=\"checkbox\" name=\"force\" /> Force <input type=\"checkbox\" name=\"async\" /> Asynchronous<br />";
 	    msg += "Additional parameters:<br /><input type=\"text\" name=\"paramn1\" size=\"15\"/> = <input type=\"text\" name=\"paramv1\" size=\"65\"/><br /><input type=\"text\" name=\"paramn2\" size=\"15\"/> = <input type=\"text\" name=\"paramv2\" size=\"65\"/><br /><input type=\"text\" name=\"paramn3\" size=\"15\"/> = <input type=\"text\" name=\"paramv3\" size=\"65\"/><br /><input type=\"text\" name=\"paramn4\" size=\"15\"/> = <input type=\"text\" name=\"paramv4\" size=\"65\"/></form>";
 	} else if ( perf.equals("match") ) {
-	    Message answer = manager.align( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.align( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -391,7 +389,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	} else if ( perf.equals("prmfind") ) {
 	    msg ="<h1>Find alignments between ontologies</h1><form action=\"find\">Ontology 1: <input type=\"text\" name=\"onto1\" size=\"80\"/> (uri)<br />Ontology 2: <input type=\"text\" name=\"onto2\" size=\"80\"/> (uri)<br /><small>These are the URI identifying the ontologies. Not those of places where to upload them.</small><br /><input type=\"submit\" name=\"action\" value=\"Find\"/></form>";
 	} else if ( perf.equals("find") ) {
-	    Message answer = manager.existingAlignments( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.existingAlignments( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -399,7 +397,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 		msg += displayAnswer( answer, params );
 	    }
 	} else if ( perf.equals("corresp") ) {
-	    Message answer = manager.findCorrespondences( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.findCorrespondences( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -427,7 +425,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    }
 	    msg += "</select><br /><input type=\"submit\" value=\"Retrieve\"/></form>";
 	} else if ( perf.equals("retrieve") ) {
-	    Message answer = manager.render( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.render( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -451,7 +449,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    	params.setProperty("method", "fr.inrialpes.exmo.align.impl.renderer.HTMLMetadataRendererVisitor");
 	    else
 		params.setProperty("method", "fr.inrialpes.exmo.align.impl.renderer.XMLMetadataRendererVisitor");
-	    Message answer = manager.render( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.render( params );
 	    //logger.trace( "Content: {}", answer.getContent() );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
@@ -474,7 +472,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg +=  " </form>";
 	} else if ( perf.equals("load") ) {
 	    // load
-	    Message answer = manager.load( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.load( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -493,7 +491,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "</select><br />";
 	    msg += "PREFIX rdf: &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .<br /><br />SPARQL query:<br /> <textarea name=\"query\" rows=\"20\" cols=\"80\">PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nSELECT *\nFROM <>\nWHERE {\n\n}</textarea> (SPARQL)<br /><small>A SPARQL query (PREFIX prefix: &lt;uri&gt; SELECT variables FROM &lt;url&gt; WHERE { triples })</small><br /><input type=\"submit\" value=\"Translate\"/></form>";
 	} else if ( perf.equals("translate") ) {
-	    Message answer = manager.translate( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.translate( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -531,7 +529,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "</select><br /><input type=\"submit\" name=\"action\" value=\"Evaluate\"/>\n";
 	    msg += "</form>\n";
 	} else if ( perf.equals("eval") ) {
-	    Message answer = manager.eval( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.eval( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
@@ -567,7 +565,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "<br /><input type=\"submit\" name=\"action\" value=\"Compare\"/>\n";
 	    msg += "</form>\n";
 	} else if ( perf.equals("diff") ) {
-	    Message answer = manager.diff( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    Message answer = manager.diff( params );
 	    if ( answer instanceof ErrorMsg ) {
 		msg = testErrorMessages( answer, params );
 	    } else {
diff --git a/src/fr/inrialpes/exmo/align/service/HTTPTransport.java b/src/fr/inrialpes/exmo/align/service/HTTPTransport.java
index caceb554ea5aaede7b4205e9b50e092ef017fa5c..fba2095302c58b3195b1b22ef056fb59eed8c051 100644
--- a/src/fr/inrialpes/exmo/align/service/HTTPTransport.java
+++ b/src/fr/inrialpes/exmo/align/service/HTTPTransport.java
@@ -358,7 +358,7 @@ public class HTTPTransport {
 	    params.setProperty( "method", "fr.inrialpes.exmo.align.impl.renderer.HTMLRendererVisitor" );
 	}
 	logger.trace( "Bloody URI : {}", manager.serverURL()+uri);
-	Message answer = manager.render( new Message( newId(), (Message)null, myId, serverId, "", params) );
+	Message answer = manager.render( params );
 	if ( answer instanceof ErrorMsg ) {
 	    return new HTTPResponse( HTTPResponse.HTTP_NOTFOUND, HTTPResponse.MIME_PLAINTEXT, "Alignment server: unknown alignment : "+answer.getContent() );
 	} else {
diff --git a/src/fr/inrialpes/exmo/align/service/WSAServProfile.java b/src/fr/inrialpes/exmo/align/service/WSAServProfile.java
index d2db0461d57cfb03beeb197761df321c3883307a..08f95fb88bde7c393525404bf6dd5162f61c895a 100644
--- a/src/fr/inrialpes/exmo/align/service/WSAServProfile.java
+++ b/src/fr/inrialpes/exmo/align/service/WSAServProfile.java
@@ -307,14 +307,14 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    if ( newparameters.getProperty( "id" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.store( new Message(newId(),(Message)null,myId,serverURL,newparameters.getProperty( "id" ), newparameters) );
+		answer = manager.store( newparameters );
 	    }
 	    msg += render( "storeResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("invertRequest") || method.equals("invert") ) { // URI -> URI
 	    if ( newparameters.getProperty( "id" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.inverse( new Message(newId(),(Message)null,myId,serverURL, newparameters.getProperty( "id" ), newparameters) );
+		answer = manager.inverse( newparameters );
 	    }
 	    msg += render( "invertResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("trimRequest") || method.equals("trim") ) { // URI * string * float -> URI
@@ -326,7 +326,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 		if ( newparameters.getProperty( "type" ) == null ) {
 		    newparameters.setProperty( "type", "hard" );
 		}
-		answer = manager.trim( new Message(newId(),(Message)null,myId,serverURL,newparameters.getProperty( "id" ), newparameters) );
+		answer = manager.trim( newparameters );
 	    }
 	    msg += render( "trimResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("matchRequest") || method.equals("match") ) { // URL * URL * URI * String * boolean * (newparameters) -> URI
@@ -335,7 +335,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    } else if ( newparameters.getProperty( "onto2" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.align( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		answer = manager.align( newparameters );
 	    }
 	    msg += render( "matchResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("align") ) { // URL * URL * (newparameters) -> URI
@@ -350,7 +350,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 		} else {
 		    newparameters.setProperty( "method", newparameters.getProperty( "wsmethod" ) );
 	    	} // Match the two ontologies
-		Message result = manager.align( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		Message result = manager.align( newparameters );
 		if ( result instanceof ErrorMsg ) {
 		    answer = result;
 		} else {
@@ -362,7 +362,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 		    } else {
 			newparameters.setProperty( "method",  "fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor" );
 			newparameters.setProperty( "embedded", "true" );
-			answer = manager.render( new Message(newId(),(Message)null,myId,serverURL, "", newparameters) );
+			answer = manager.render( newparameters );
 		    }
 		}
 	    }
@@ -373,14 +373,14 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    } else if ( newparameters.getProperty( "entity" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.findCorrespondences( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		answer = manager.findCorrespondences( newparameters );
 	    }
 	    msg += render( "correspResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("findRequest") || method.equals("find") ) { // URI * URI -> List of URI
 	    if ( newparameters.getProperty( "onto1" ) == null && newparameters.getProperty( "onto2" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.existingAlignments( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		answer = manager.existingAlignments( newparameters );
             }
 	    msg += render( "findResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("retrieveRequest") || method.equals("retrieve")) { // URI * method -> XML
@@ -390,7 +390,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
 		newparameters.setProperty( "embedded", "true" );
-		answer = manager.render( new Message(newId(),(Message)null,myId,serverURL, "", newparameters) );
+		answer = manager.render( newparameters );
 	    }
 	    msg += render( "retrieveResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("metadataRequest") || method.equals("metadata") ) { // URI -> XML
@@ -399,7 +399,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    } else {
 		newparameters.setProperty( "embedded", "true" );
 		newparameters.setProperty( "method", "fr.inrialpes.exmo.align.impl.renderer.XMLMetadataRendererVisitor");
-		answer = manager.render( new Message(newId(),(Message)null,myId,serverURL, "", newparameters) );
+		answer = manager.render( newparameters );
             }
 	    msg += render( "metadataResponse", answer, param.getProperty("returnType"), newparameters);
 	} else if ( method.equals("loadRequest") || method.equals("load") ) { // URL -> URI
@@ -411,7 +411,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 		 param.getProperty( "filename" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    }
-	    answer = manager.load( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+	    answer = manager.load( newparameters );
 	    msg += render( "loadResponse", answer, param.getProperty("returnType"), newparameters);
 	    /*
 	      // This has never been in use.
@@ -419,7 +419,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    if ( newparameters.getProperty( "url" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.load( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		answer = manager.load( newparameters );
 	    }
 	    msg += "    <loadResponse"+svcNS+">\n"+answer.SOAPString()+"    </loadResponse>\n";
 	    */
@@ -429,7 +429,7 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	    } else if ( newparameters.getProperty( "query" ) == null ) {
 		answer = new NonConformParameters(0,(Message)null,myId,"",message,(Properties)null);
 	    } else {
-		answer = manager.translate( new Message(newId(),(Message)null,myId,serverURL,"", newparameters) );
+		answer = manager.translate( newparameters );
 	    }
 	    msg += render( "translateResponse", answer, param.getProperty("returnType"), newparameters);
 	} else {
@@ -539,6 +539,4 @@ public class WSAServProfile implements AlignmentServiceProfile {
 	return params;
     }
 
-    private int newId() { return localId++; }
-
 }
diff --git a/src/fr/inrialpes/exmo/align/service/jade/JadeFIPAAServiceAgent.java b/src/fr/inrialpes/exmo/align/service/jade/JadeFIPAAServiceAgent.java
index 3f67c5ae630c03bc87cae08fe8e3dd5b5433b834..799b14416abcca30d27ec8b1e1f196f8d8d54bde 100755
--- a/src/fr/inrialpes/exmo/align/service/jade/JadeFIPAAServiceAgent.java
+++ b/src/fr/inrialpes/exmo/align/service/jade/JadeFIPAAServiceAgent.java
@@ -2,7 +2,7 @@
  * $Id$
  *
  * Copyright (C) Orange R&D, 2006
- * Copyright (C) INRIA, 2006, 2008-2009, 2011-2013
+ * Copyright (C) INRIA, 2006, 2008-2009, 2011-2014
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -61,222 +61,207 @@ import fr.inrialpes.exmo.align.service.jade.messageontology.TRANSLATE;
 public class JadeFIPAAServiceAgent extends Agent {
     final static Logger logger = LoggerFactory.getLogger( JadeFIPAAServiceAgent.class );
 
-    private static final long serialVersionUID = 330;
-	public static final String SERVICE_NAME = "Alignment";
-	public static final String SERVICE_TYPE = "Alignment-service";
-
-	private String myId;
-	private String serverId;
-	private AServProtocolManager manager;
-	private int localId=0;
-	private Properties initialParameters;
-
-	//	FIPA ACL stuff
-
-	private ContentManager CTmanager=new ContentManager();
-	private SLCodec codec=new SLCodec();
-	private Ontology ontology=JADEFIPAAlignmentServerOntology.getInstance();
-
-
-	protected void setup() {
-	    logger.info( "{} started", getAID().getName() );
-	    super.setup();
-	    codec = new SLCodec();
-
-	    // ontology =  ContextAgentManagerOntology.getInstance();
-	    CTmanager = this.getContentManager();
-	    
-	    // logger.trace("agent {} {} is created", getAID(), getLocalName() );
-
-	    CTmanager.registerOntology(ontology);
-	    CTmanager.registerLanguage(codec);
-
-
-		// Read arguments
-		Object[] args = getArguments();
-		if (args != null) {
-			/**for (int i = 0; i < args.length; ++i) {
-				logger.debug( "Arg-{} = {}", i, args[i] );
-			}**/
-
-		    manager=(AServProtocolManager) args[0];
-		    initialParameters = (Properties)args[1];
-		}
-
-		myId = "LocalJADEInterface";
-		serverId = "dummy";
-		localId = 0;
-
-		// Add initial behaviours to manage incoming message
-		addBehaviour(new CyclicBehaviour(this) {
-			private static final long serialVersionUID = 330;
-			public void action() {
-
-				String perf; // performative
-				String info; //parameters
-				Properties params = initialParameters;
+    private static final long serialVersionUID = 460;
+    public static final String SERVICE_NAME = "Alignment";
+    public static final String SERVICE_TYPE = "Alignment-service";
+
+    private AServProtocolManager manager;
+    private Properties initialParameters;
+    
+    //	FIPA ACL stuff
+
+    private ContentManager CTmanager=new ContentManager();
+    private SLCodec codec=new SLCodec();
+    private Ontology ontology=JADEFIPAAlignmentServerOntology.getInstance();
+
+
+    protected void setup() {
+	logger.info( "{} started", getAID().getName() );
+	super.setup();
+	codec = new SLCodec();
+	
+	// ontology =  ContextAgentManagerOntology.getInstance();
+	CTmanager = this.getContentManager();
+	
+	// logger.trace("agent {} {} is created", getAID(), getLocalName() );
+
+	CTmanager.registerOntology(ontology);
+	CTmanager.registerLanguage(codec);
+
+	// Read arguments
+	Object[] args = getArguments();
+	if ( args != null ) {
+	    /**for (int i = 0; i < args.length; ++i) {
+	       logger.debug( "Arg-{} = {}", i, args[i] );
+	       }**/
+	    manager = (AServProtocolManager)args[0];
+	    initialParameters = (Properties)args[1];
+	}
 
-				MessageTemplate tpl =MessageTemplate.and(MessageTemplate.and(
+	// Add initial behaviours to manage incoming message
+	addBehaviour(new CyclicBehaviour(this) {
+		private static final long serialVersionUID = 330;
+		public void action() {
+		    
+		    String perf; // performative
+		    String info; //parameters
+		    Properties params = initialParameters;
+		    
+		    MessageTemplate tpl = MessageTemplate.and(MessageTemplate.and(
 						MessageTemplate.MatchLanguage( codec.getName()),
 						MessageTemplate.MatchOntology( ontology.getName())),
 						MessageTemplate.MatchPerformative(ACLMessage.REQUEST));
 
-				ACLMessage msg = myAgent.receive(tpl);
-				if (msg != null) {
-//					---------------------------------------------------------					
-					//logger.debug( "Received message: {}", msg.toString() );
-
-					try{
-						ContentElement ce = null;
-						ce = CTmanager.extractContent(msg);
-						params = decodeMessage(ce,params);
-
-						if (ce instanceof ALIGN){
-							Message answer = manager.align(new Message(newId(), (Message)null,myId,serverId,"",params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								//JADEanswer.setContent(answer.getContent());
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								myAgent.send(JADEanswer);								
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else if (ce instanceof LOAD){
-							Message answer = manager.load(new Message(newId(), (Message)null,myId,serverId,"",params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								//JADEanswer.setContent(answer.getContent());
-								myAgent.send(JADEanswer);
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else if (ce instanceof RETRIEVE){
-							Message answer = manager.render(new Message(newId(), (Message)null,myId,serverId,"",params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								//JADEanswer.setContent(answer.getContent());
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								myAgent.send(JADEanswer);
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else if (ce instanceof TRANSLATE){
-							//TODO
-						}else if (ce instanceof METADATA){
-							//TODO
-						}else if (ce instanceof STORE){
-							Message answer = manager.store(new Message(newId(), (Message)null,myId,serverId,params.getProperty("id"),params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								//JADEanswer.setContent(answer.getContent());
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								myAgent.send(JADEanswer);
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else if (ce instanceof FIND){
-							Message answer = manager.existingAlignments(new Message(newId(), (Message)null,myId,serverId,"",params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								//JADEanswer.setContent(answer.getContent());
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								myAgent.send(JADEanswer);
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else if (ce instanceof CUT){
-							Message answer = manager.trim(new Message(newId(), (Message)null,myId,serverId,"",params));
-							if(!(answer instanceof ErrorMsg)){
-								ACLMessage JADEanswer=msg.createReply();
-								JADEanswer.setLanguage(codec.getName());
-								JADEanswer.setOntology(ontology.getName());
-								JADEanswer.setPerformative(ACLMessage.INFORM);
-								//JADEanswer.setContent(answer.getContent());
-								((Action)ce).setResult(answer.getContent());
-								CTmanager.fillContent(JADEanswer, ce);
-								myAgent.send(JADEanswer);
-							}else{
-							    logger.warn( answer.getContent() );
-							}
-						}else {
-							ACLMessage JADEanswer=msg.createReply();
-							JADEanswer.setLanguage(codec.getName());
-							JADEanswer.setOntology(ontology.getName());
-							JADEanswer.setPerformative(ACLMessage.NOT_UNDERSTOOD);						
-							myAgent.send(JADEanswer);
-						}
-					} catch( CodecException ce ) {
-					    logger.debug( "IGNORED Exception", ce );
-					} catch( OntologyException oe ) {
-					    logger.debug( "IGNORED Exception", oe );
-					}
-				}else {
-					block();
+		    ACLMessage msg = myAgent.receive(tpl);
+		    if (msg != null) {
+			//logger.debug( "Received message: {}", msg.toString() );
+			try{
+			    ContentElement ce = null;
+			    ce = CTmanager.extractContent(msg);
+			    params = decodeMessage(ce,params);
+			    
+			    if (ce instanceof ALIGN) {
+				Message answer = manager.align( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    //JADEanswer.setContent(answer.getContent());
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    myAgent.send(JADEanswer);								
+				} else {
+				    logger.warn( answer.getContent() );
+				}
+			    } else if (ce instanceof LOAD) {
+				Message answer = manager.load( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    //JADEanswer.setContent(answer.getContent());
+				    myAgent.send(JADEanswer);
+				} else {
+				    logger.warn( answer.getContent() );
 				}
-				params = initialParameters;
+			    } else if (ce instanceof RETRIEVE) {
+				Message answer = manager.render( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    //JADEanswer.setContent(answer.getContent());
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    myAgent.send(JADEanswer);
+				} else {
+				    logger.warn( answer.getContent() );
+				}
+			    } else if (ce instanceof TRANSLATE) {
+				//TODO
+			    } else if (ce instanceof METADATA) {
+				//TODO
+			    } else if (ce instanceof STORE) {
+				Message answer = manager.store( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    //JADEanswer.setContent(answer.getContent());
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    myAgent.send(JADEanswer);
+				} else {
+				    logger.warn( answer.getContent() );
+				}
+			    } else if (ce instanceof FIND) {
+				Message answer = manager.existingAlignments( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    //JADEanswer.setContent(answer.getContent());
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    myAgent.send(JADEanswer);
+				} else {
+				    logger.warn( answer.getContent() );
+				}
+			    } else if (ce instanceof CUT) {
+				Message answer = manager.trim( params );
+				if(!(answer instanceof ErrorMsg)) {
+				    ACLMessage JADEanswer=msg.createReply();
+				    JADEanswer.setLanguage(codec.getName());
+				    JADEanswer.setOntology(ontology.getName());
+				    JADEanswer.setPerformative(ACLMessage.INFORM);
+				    //JADEanswer.setContent(answer.getContent());
+				    ((Action)ce).setResult(answer.getContent());
+				    CTmanager.fillContent(JADEanswer, ce);
+				    myAgent.send(JADEanswer);
+				} else {
+				    logger.warn( answer.getContent() );
+				}
+			    } else {
+				ACLMessage JADEanswer=msg.createReply();
+				JADEanswer.setLanguage(codec.getName());
+				JADEanswer.setOntology(ontology.getName());
+				JADEanswer.setPerformative(ACLMessage.NOT_UNDERSTOOD);						
+				myAgent.send(JADEanswer);
+			    }
+			} catch( CodecException ce ) {
+			    logger.debug( "IGNORED Exception", ce );
+			} catch( OntologyException oe ) {
+			    logger.debug( "IGNORED Exception", oe );
 			}
-
-		});//end of CyclicBehaviour
-
-
-		// Register with the DF
-		registerWithDF();
-	}//end of Setup
-
-	protected void takeDown() {
-	    logger.info( "Agent Alignement Service closed" );
-	    this.doDelete();
-	}
-
-	private void registerWithDF() {
-		DFAgentDescription dfd = new DFAgentDescription();
-		dfd.setName(getAID());
-		ServiceDescription sd = new ServiceDescription();
-		sd.setName(getLocalName()+'-'+SERVICE_NAME);
-		sd.setType(SERVICE_TYPE);
-		dfd.addServices(sd);
-		try {
-		    logger.debug( "Registering with DF..." );
-		    DFService.register(this, dfd);
-		    logger.debug( "Registration OK." );
-		}
-		catch ( FIPAException fex ) {
-		    logger.warn( "Error registering with DF", fex );
+		    } else {
+			block();
+		    }
+		    params = initialParameters;
 		}
+		
+	    });//end of CyclicBehaviour
+	
+	// Register with the DF
+	registerWithDF();
+    }//end of Setup
+    
+    protected void takeDown() {
+	logger.info( "Agent Alignement Service closed" );
+	this.doDelete();
+    }
+    
+    private void registerWithDF() {
+	DFAgentDescription dfd = new DFAgentDescription();
+	dfd.setName(getAID());
+	ServiceDescription sd = new ServiceDescription();
+	sd.setName(getLocalName()+'-'+SERVICE_NAME);
+	sd.setType(SERVICE_TYPE);
+	dfd.addServices(sd);
+	try {
+	    logger.debug( "Registering with DF..." );
+	    DFService.register(this, dfd);
+	    logger.debug( "Registration OK." );
 	}
-
-	private int newId(){return localId++;}
-
-    private Properties decodeMessage(ContentElement ce, Properties param){
+	catch ( FIPAException fex ) {
+	    logger.warn( "Error registering with DF", fex );
+	}
+    }
+    
+    private Properties decodeMessage(ContentElement ce, Properties param) {
 	Properties toReturn = param;
 	Action action= (Action)ce;
-	for( Iterator<Parameter> iter = action.getAllHasParameter(); iter.hasNext(); ){
+	for( Iterator<Parameter> iter = action.getAllHasParameter(); iter.hasNext(); ) {
 	    Parameter OntoParam = iter.next();
 	    toReturn.setProperty( OntoParam.getName(), OntoParam.getValue() ); 
 	}
 	return toReturn;
     }
 
-
 }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/AlignmentId.java b/src/fr/inrialpes/exmo/align/service/msg/AlignmentId.java
index 8b32160dddbf204f60e77324440bb63976b0bfea..226486edd6952b2dfd09b76bf1ca09be6556c855 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/AlignmentId.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/AlignmentId.java
@@ -33,10 +33,21 @@ public class AlignmentId extends Success {
     public AlignmentId ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
     public AlignmentId ( int surr, Message rep, String from, String to, String cont, Properties param, String pretty ) {
 	super( surr, rep, from, to, cont, param );
 	this.pretty = pretty;
     }
+
+    public AlignmentId ( Properties mess, int surr, String from, String cont, String pretty ) {
+	super( mess, surr, from, cont );
+	this.pretty = pretty;
+    }
+
+    public AlignmentId ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String getPretty( String alid ) {
 	if ( pretty == null ) {
 	    return alid;
diff --git a/src/fr/inrialpes/exmo/align/service/msg/AlignmentIds.java b/src/fr/inrialpes/exmo/align/service/msg/AlignmentIds.java
index abf927dc634a46a20af2cd6a051f23130a1f6f0f..8540cc6662eec50fa5eea8baae4c0ccc3b96aa25 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/AlignmentIds.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/AlignmentIds.java
@@ -37,10 +37,21 @@ public class AlignmentIds extends Success {
     public AlignmentIds ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
     public AlignmentIds ( int surr, Message rep, String from, String to, String cont, Properties param, String pretty ) {
 	super( surr, rep, from, to, cont, param );
 	this.pretty = pretty;
     }
+
+    public AlignmentIds ( Properties mess, int surr, String from, String cont, String pretty ) {
+	super( mess, surr, from, cont );
+	this.pretty = pretty;
+    }
+
+    public AlignmentIds ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	String id[] = content.split(" ");
 	String pid[] = pretty.split(":");
diff --git a/src/fr/inrialpes/exmo/align/service/msg/AlignmentMetadata.java b/src/fr/inrialpes/exmo/align/service/msg/AlignmentMetadata.java
index f017b395621aa4117aaff15ff4c86e5c4dbfbf48..73495ad398e445f4482f5d1e460490e3d763e682 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/AlignmentMetadata.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/AlignmentMetadata.java
@@ -32,6 +32,11 @@ public class AlignmentMetadata extends Success {
 	super( surr, rep, from, to, cont, param );
     }
 
+    public AlignmentMetadata ( Properties mess, int surr, String from, String cont, Properties param ) {
+	super( mess, surr, from, cont );
+	parameters = param;
+    }
+
     public String HTMLString() {
 	return "Metadata not implemented";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/CannotRenderAlignment.java b/src/fr/inrialpes/exmo/align/service/msg/CannotRenderAlignment.java
index 8cee1d1fb48207b5e9e61c127747346c7ef08054..bad36e44b50701e7b7ca52c93f4b821df626d67c 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/CannotRenderAlignment.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/CannotRenderAlignment.java
@@ -27,9 +27,15 @@ import java.util.Properties;
  */
 
 public class CannotRenderAlignment extends ErrorMsg {
+
     public CannotRenderAlignment ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public CannotRenderAlignment ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	return "Cannot render alignment "+content;
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/EntityList.java b/src/fr/inrialpes/exmo/align/service/msg/EntityList.java
index bf334567bfb7cf1cd7d50a55a2d5eb647b22a1e2..175a0b8f021ea2612bf4dc85bc43a1ec72ab5bcd 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/EntityList.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/EntityList.java
@@ -34,6 +34,10 @@ public class EntityList extends Success {
 	super( surr, rep, from, to, cont, param );
     }
 
+    public EntityList( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	String id[] = content.split(" ");
 	String result = "No entity.";
diff --git a/src/fr/inrialpes/exmo/align/service/msg/ErrorMsg.java b/src/fr/inrialpes/exmo/align/service/msg/ErrorMsg.java
index 2020ef07237bd9229e447686b5f546ec27900d32..5e8293ebf66e9f3a6a1c03392d67da06fc951144 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/ErrorMsg.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/ErrorMsg.java
@@ -31,6 +31,11 @@ public class ErrorMsg extends Message {
     public ErrorMsg ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public ErrorMsg ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	String message = "Generic error: "+content;
 	if ( parameters != null ) {
diff --git a/src/fr/inrialpes/exmo/align/service/msg/EvalResult.java b/src/fr/inrialpes/exmo/align/service/msg/EvalResult.java
index 88e87324c1a2d960f9b1b454fd37185012551d76..c21b169c870b20fa27d01b46e6b9488bdff1f6ad 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/EvalResult.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/EvalResult.java
@@ -31,6 +31,12 @@ public class EvalResult extends Success {
     public EvalResult ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public EvalResult ( Properties mess, int surr, String from, String cont, Properties param ) {
+	super( mess, surr, from, cont );
+	parameters = param;
+    }
+
     public String HTMLString(){
 	String results = "";
 	if ( getParameters() == null ) {
@@ -44,6 +50,8 @@ public class EvalResult extends Success {
 	}
 	return results;
     }
+
+    // A diff will never be rendered outside of HTML
     public String RESTString(){
 	String results = "<EvaluationResults>";
 	for ( String key : getParameters().stringPropertyNames() ) {
diff --git a/src/fr/inrialpes/exmo/align/service/msg/Message.java b/src/fr/inrialpes/exmo/align/service/msg/Message.java
index b39f3746df89b9ad6e423b59881546715916c1c7..5d8691227a67888075ba30c990f43157cbf7b7db 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/Message.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/Message.java
@@ -46,6 +46,14 @@ public class Message {
 	parameters = param;
     }
 
+    public Message ( Properties mess, int surr, String from, String cont ) { 
+	surrogate = surr;
+	//inReplyTo = (Message)mess.getProperty( "msgid" );
+	receiver = mess.getProperty( "sender" );
+	sender = from;
+	content = cont;
+    }
+
     public String HTMLString(){
 	return "<h1>Message</h1><dl><dt>id:</dt><dd>"+surrogate+"</dd><dt>sender:</dt><dd>"+sender+"</dd><dt>receiver:</dt><dd>"+receiver+"</dd><dt>in-reply-to:</dt><dd>"+inReplyTo+"</dd><dt>content:</dt><dd>"+content+"</dd></dl>";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/NonConformParameters.java b/src/fr/inrialpes/exmo/align/service/msg/NonConformParameters.java
index 6731707f612ad94e1059ed81fb41e0ff794be27b..78a3e129246e6661d850c82f3648808f4a61687b 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/NonConformParameters.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/NonConformParameters.java
@@ -27,10 +27,15 @@ import java.util.Properties;
  */
 
 public class NonConformParameters extends ErrorMsg {
+
     public NonConformParameters ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
 
+    public NonConformParameters ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	// Here I may display the parameters in parameters
 	return "<h1>Non conform parameters</h1><dl><dt>id:</dt><dd>"+surrogate+"</dd><dt>sender:</dt><dd>"+sender+"</dd><dt>receiver:</dt><dd>"+receiver+"</dd><dt>in-reply-to:</dt><dd>"+inReplyTo+"</dd><dt>content:</dt><dd>"+content+"</dd></dl>";
diff --git a/src/fr/inrialpes/exmo/align/service/msg/OntologyURI.java b/src/fr/inrialpes/exmo/align/service/msg/OntologyURI.java
index 8f8731902604a808a7ab4d283bb5b4ab44cbceb5..595c7e48bffc5fe8c827af05ab392bd2bd0faf65 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/OntologyURI.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/OntologyURI.java
@@ -31,6 +31,11 @@ public class OntologyURI extends Success {
     public OntologyURI ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public OntologyURI ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString(){
 	return "Ontology URI: "+content;
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/RenderedAlignment.java b/src/fr/inrialpes/exmo/align/service/msg/RenderedAlignment.java
index 829f960941b36822deba5966018e55dec3cd1d4d..8b188ecf34c4967eca945758141d12e00791eb5a 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/RenderedAlignment.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/RenderedAlignment.java
@@ -31,6 +31,12 @@ public class RenderedAlignment extends Success {
     public RenderedAlignment ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public RenderedAlignment ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+	parameters = mess; // This is used below
+    }
+
     public String RESTString(){
 	String method = (parameters==null)?null:parameters.getProperty( "method" );
 	if ( method != null && method.equals("fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor" ) ) {
diff --git a/src/fr/inrialpes/exmo/align/service/msg/RunTimeError.java b/src/fr/inrialpes/exmo/align/service/msg/RunTimeError.java
index 0404bd6af59a2f8c637e5557799f25f1144aef66..a181f7c7249a97a6e84afb0375d941552988afb0 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/RunTimeError.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/RunTimeError.java
@@ -27,9 +27,15 @@ import java.util.Properties;
  */
 
 public class RunTimeError extends ErrorMsg {
+
     public RunTimeError ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public RunTimeError ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String RESTString(){
 	return "<RunTimeError>"+getXMLContent()+"</RunTimeError>";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/Success.java b/src/fr/inrialpes/exmo/align/service/msg/Success.java
index da13ce48734b009103cbd20e2c725dd9d4d4f04f..12596ab68ee20d4b19d6bcf403b1053c19dcee49 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/Success.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/Success.java
@@ -31,6 +31,11 @@ public class Success extends Message {
     public Success ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public Success ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String RESTString(){
 	return "<content>"+getXMLContent()+"</content>";	
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/TranslatedMessage.java b/src/fr/inrialpes/exmo/align/service/msg/TranslatedMessage.java
index ae35c4c88394d3b304acc89f9ead4b1d4624fa0f..7538fca4b4611429ed496dc5c26d15cfc96cd5e1 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/TranslatedMessage.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/TranslatedMessage.java
@@ -31,6 +31,11 @@ public class TranslatedMessage extends Success {
     public TranslatedMessage ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public TranslatedMessage ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString() {
 	return content;
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/UnknownAlignment.java b/src/fr/inrialpes/exmo/align/service/msg/UnknownAlignment.java
index bfc5998f18e8b7c10f94cf5803e59f0ab4b32951..a7949fb2f35189b58978e24c5ec63e02edd5aeff 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/UnknownAlignment.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/UnknownAlignment.java
@@ -30,6 +30,11 @@ public class UnknownAlignment extends ErrorMsg {
     public UnknownAlignment ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public UnknownAlignment ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String RESTString(){
 	return "<UnknownAlignment>"+getXMLContent()+"</UnknownAlignment>";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/UnknownMethod.java b/src/fr/inrialpes/exmo/align/service/msg/UnknownMethod.java
index 2de814b415078c0eb6491b751fa8eb90413df8e4..cac8bd30b1d059f03611acd127e54395aac04ac6 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/UnknownMethod.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/UnknownMethod.java
@@ -30,6 +30,11 @@ public class UnknownMethod extends ErrorMsg {
     public UnknownMethod ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public UnknownMethod ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String HTMLString() {
 	return "Unknown method: "+content;
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/UnreachableAlignment.java b/src/fr/inrialpes/exmo/align/service/msg/UnreachableAlignment.java
index e512d0d3bc4504447d538b045caeadfdebbfb0aa..f2737dcf6b58fccf98bc0c29b89968480542cef7 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/UnreachableAlignment.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/UnreachableAlignment.java
@@ -30,6 +30,11 @@ public class UnreachableAlignment extends ErrorMsg {
     public UnreachableAlignment ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public UnreachableAlignment ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String RESTString() {
 	return "<UnreachableAlignment>"+getXMLContent()+"</UnreachableAlignment>";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/msg/UnreachableOntology.java b/src/fr/inrialpes/exmo/align/service/msg/UnreachableOntology.java
index ebdd67bc249ef760e0a29b4f8efc3938ea181ebd..8137010a4d9b24ed033a3cfb765fca1f8ba2bda5 100644
--- a/src/fr/inrialpes/exmo/align/service/msg/UnreachableOntology.java
+++ b/src/fr/inrialpes/exmo/align/service/msg/UnreachableOntology.java
@@ -30,6 +30,11 @@ public class UnreachableOntology extends ErrorMsg {
     public UnreachableOntology ( int surr, Message rep, String from, String to, String cont, Properties param ) {
 	super( surr, rep, from, to, cont, param );
     }
+
+    public UnreachableOntology ( Properties mess, int surr, String from, String cont ) {
+	super( mess, surr, from, cont );
+    }
+
     public String RESTString() {
 	return "<UnreachableOntology>"+getXMLContent()+"</UnreachableOntology>";
     }
diff --git a/src/fr/inrialpes/exmo/align/service/osgi/Service.java b/src/fr/inrialpes/exmo/align/service/osgi/Service.java
index d904310235ddd6a38c23d75fee8a081de0f5be6d..8547d57618f664f9180572e12f557502699bf363 100644
--- a/src/fr/inrialpes/exmo/align/service/osgi/Service.java
+++ b/src/fr/inrialpes/exmo/align/service/osgi/Service.java
@@ -20,6 +20,7 @@
 
 package fr.inrialpes.exmo.align.service.osgi;
 
+import java.util.Properties;
 import java.util.Set;
 import java.util.Collection;
 import java.net.URI;
@@ -61,29 +62,29 @@ public interface Service {
      * Basic protocol primitives
      *********************************************************************/
 
-    public Message load( Message mess );
+    public Message load( Properties mess );
 
-    public Message align( Message mess );
+    public Message align( Properties mess );
 
-    public Message existingAlignments( Message mess );
+    public Message existingAlignments( Properties mess );
 
-    public Message findCorrespondences( Message mess );
+    public Message findCorrespondences( Properties mess );
 
-    public Message find( Message mess );
+    public Message find( Properties mess );
 
-    public Message translate( Message mess );
+    public Message translate( Properties mess );
 
-    public Message render( Message mess );
+    public Message render( Properties mess );
 
     /*********************************************************************
      * Extended protocol primitives
      *********************************************************************/
 
-    public Message store( Message mess );
+    public Message store( Properties mess );
 
-    //public Message erase( Message mess );
+    //public Message erase( Properties mess );
 
-    public Message metadata( Message mess );
+    public Message metadata( Properties mess );
 
     /*********************************************************************
      * Extra alignment primitives
@@ -92,23 +93,23 @@ public interface Service {
      * There is no way an alignment server could modify an alignment
      *********************************************************************/
 
-    public Message trim( Message mess );
+    public Message trim( Properties mess );
 
-    public Message harden( Message mess );
+    public Message harden( Properties mess );
 
-    public Message inverse( Message mess );
+    public Message inverse( Properties mess );
 
-    public Message meet( Message mess );
+    public Message meet( Properties mess );
 
-    public Message join( Message mess );
+    public Message join( Properties mess );
 
-    public Message compose( Message mess );
+    public Message compose( Properties mess );
 
-    public Message eval( Message mess );
+    public Message eval( Properties mess );
 
-    public Message diff( Message mess );
+    public Message diff( Properties mess );
 
-    public boolean storedAlignment( Message mess );
+    public boolean storedAlignment( Properties mess );
 
     /*********************************************************************
      * Network of alignment server implementation