diff --git a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
index b6b76e542e5a8518a2f9da33ec90eea51ea65f89..fcd6509a3181649b3e69656a9291ae1aac28a1d9 100644
--- a/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
+++ b/src/fr/inrialpes/exmo/align/service/AServProtocolManager.java
@@ -355,6 +355,7 @@ public class AServProtocolManager {
 
     // ABSOLUTELY NOT IMPLEMENTED
     // Implements: find
+    // This may be useful when calling WATSON
     public Message find(Message mess){
     //\prul{search-success}{a - request ( find (O, T) ) \rightarrow S}{O' \Leftarrow Match(O,T)\\S - inform (O') \rightarrow a}{reachable(O)\wedge Match(O,T)\not=\emptyset}
 
@@ -365,12 +366,24 @@ public class AServProtocolManager {
     }
 
     // Implements: translate
+    // This should be applied to many more kind of messages with different kind of translation
     public Message translate(Message mess){
-
-//\prul{translate-success}{a - request ( translate ( M, n)) \rightarrow S}{\langle O, O', A\rangle \Leftarrow Retrieve(n)\\m'\Leftarrow Translate(m,A)\\S - inform ( m' ) \rightarrow a}{Retrieve(n)\not=\emptyset}
-
-//\prul{translate-unknown}{a - request ( translate ( M, n)) \rightarrow S}{S - failure ( unknown (n) )  \rightarrow a}{Retrieve(n)=\emptyset}
-	return new TranslatedMessage(newId(),mess,myId,mess.getSender(),"dummy//",(Parameters)null);
+	Parameters params = mess.getParameters();
+	// Retrieve the alignment
+	String id = (String)params.getParameter("id");
+	Alignment al = null;
+	try {
+	    al = alignmentCache.getAlignment( id );
+	} catch (Exception e) {
+	    return new UnknownAlignment(newId(),mess,myId,mess.getSender(),id,(Parameters)null);
+	}
+	// Translate the query
+	try {
+	    String translation = QueryMediator.rewriteQuery( (String)params.getParameter("query"), al );
+	    return new TranslatedMessage(newId(),mess,myId,mess.getSender(),translation,(Parameters)null);
+	} catch (AlignmentException e) {
+	    return new ErrorMsg(newId(),mess,myId,mess.getSender(),e.toString(),(Parameters)null);
+	}
     }
 
     // DONE
diff --git a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
index df9964daf5a2689a1db1e758070976677485602f..a62735ce1c282f9ed2e20f5ff5ccc56d854a5adb 100644
--- a/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
+++ b/src/fr/inrialpes/exmo/align/service/HTMLAServProfile.java
@@ -272,7 +272,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    }
 	    msg += "</ul>";
 	} else if ( perf.equals("prmsqlquery") ){
-	    msg = "<h1>SQL query</h1><form action=\"sqlquery\">Query: <input type=\"textarea\" name=\"query\" rows=\"8\"size=\"60\"/> (sql)<br /><small>An SQL SELECT query</small><br /><input type=\"submit\" value=\"Query\"/></form>";
+	    msg = "<h1>SQL query</h1><form action=\"sqlquery\">Query:<br /><textarea name=\"query\" rows=\"20\" cols=\"60\" size=\"60\">SELECT \nFROM \nWHERE </textarea> (sql)<br /><small>An SQL SELECT query</small><br /><input type=\"submit\" value=\"Query\"/></form>";
 	} else if ( perf.equals("sqlquery") ){
 	    String answer = manager.query( (String)params.getParameter("query") );
 	    msg = "<pre>"+answer+"</pre>";
@@ -430,6 +430,24 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 		return new Response( HTTP_OK, MIME_HTML, answer.getContent() );
 	    }
 	    // Metadata not done yet
+	} else if ( perf.equals("prmtranslate") ) {
+	    msg = "<h1>Translate query</h1><form action=\"translate\">";
+	    msg += "Alignment id:  <select name=\"id\">";
+	    for( Enumeration e = manager.alignments(); e.hasMoreElements(); ){
+		String id = ((Alignment)e.nextElement()).getExtension("id");
+		msg += "<option value=\""+id+"\">"+id+"</option>";
+	    }
+	    msg += "</select><br />";
+	    msg += "Turtle query:<br /> <textarea name=\"query\" rows=\"20\" cols=\"60\" size=\"60\">PREFIX foaf: <http://xmlns.com/foaf/0.1/>\nSELECT *\nFROM <>\nWHERE {\n\n}</textarea> (turtle)<br /><small>A SPARQL query expressed in Turtle syntax (PREFIX prefix: &lt;URI&gt; SELECT variables FROM &lt;URL&gt; WHERE { triples })</small><br /><input type=\"submit\" value=\"Query\"/></form>";
+	} else if ( perf.equals("translate") ) {
+	    Message answer = manager.translate( new Message(newId(),(Message)null,myId,serverId,"", params) );
+	    if ( answer instanceof ErrorMsg ) {
+		msg = testErrorMessages( answer );
+	    } else {
+		// Depending on the type we should change the MIME type
+		// This should be returned in answer.getParameters()
+		return new Response( HTTP_OK, MIME_HTML, answer.getContent() );
+	    }
 	} else if ( perf.equals("prmmetadata") ) {
 	    msg = "<h1>Retrieve alignment metadata</h1><form action=\"metadata\">";
 	    msg += "Alignment id:  <select name=\"id\">";
@@ -457,7 +475,7 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "Alignment file: <form enctype=\"multipart/form-data\" action=\"loadfile\" method=\"POST\">";
 	    msg += " <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\""+MAX_FILE_SIZE+"\"/>";
 	    msg += "<input name=\"content\" type=\"file\" size=\"35\">";
-	    msg += "<br /><small>NOTE: Max file size is"+(MAX_FILE_SIZE/1024)+"KB</small><br />";
+	    msg += "<br /><small>NOTE: Max file size is "+(MAX_FILE_SIZE/1024)+"KB</small><br />";
 	    msg += " <input type=\"submit\" Value=\"Upload\">";
 	    msg +=  " </form>";
 	} else if ( perf.equals("load") ) {
@@ -478,9 +496,6 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 		msg = "<h1>Alignment loaded</h1>";
 		msg += displayAnswer( answer );
 	    }
-	} else if ( perf.equals("prmtranslate") ) {
-	} else if ( perf.equals("translate") ) {
-	    // translate( mess )
 	} else if ( perf.equals("") ) {
 	    msg = "<h1>Available commands</h1><ul compact=\"1\">";
 	    msg += "<li><form action=\"prmfind\"><input type=\"submit\" value=\"Find an alignment for ontologies\"/></form></li>";
@@ -488,7 +503,8 @@ public class HTMLAServProfile implements AlignmentServiceProfile {
 	    msg += "<li><form action=\"prmcut\"><input type=\"submit\" value=\"Trim an alignment above some threshold\"/></form></li>";
 	    msg += "<li><form action=\"prmload\"><input type=\"submit\" value=\"Load alignments\"/></form></li>";
 	    msg += "<li><form action=\"prmstore\"><input type=\"submit\" value=\"Store an alignment in the server\"/></form></li>";
-	    msg += "<li><form action=\"prmretrieve\"><input type=\"submit\" value=\"Retrieve an alignment from its id\"/></form></li>";
+	    msg += "<li><form action=\"prmretrieve\"><input type=\"submit\" value=\"Retrieve an alignment from id\"/></form></li>";
+	    msg += "<li><form action=\"prmtranslate\"><input type=\"submit\" value=\"Translate a query\"/></form></li>";
 	    msg += "<li><form action=\"../admin/\"><input type=\"submit\" value=\"Server management\"/></form></li>";
 	    msg += "</ul>";
 	} else {
diff --git a/src/fr/inrialpes/exmo/align/service/QueryMediator.java b/src/fr/inrialpes/exmo/align/service/QueryMediator.java
index 99fa969f1cd5f19f195afb02e117695cf08b2b01..23669921a3b10a385c3407a4a805ffe6e0258531 100644
--- a/src/fr/inrialpes/exmo/align/service/QueryMediator.java
+++ b/src/fr/inrialpes/exmo/align/service/QueryMediator.java
@@ -148,6 +148,10 @@ public class QueryMediator implements QueryProcessor {
      *    (use invert() in this case).
      */    
     public String rewriteQuery( String aQuery ) throws AlignmentException {
+	return rewriteQuery( aQuery, alignment );
+    }
+
+    public static String rewriteQuery( String aQuery, Alignment align ) throws AlignmentException {
 	// The first part expands the prefixes of the query
         aQuery = aQuery.replaceAll("PREFIX", "prefix");
         String mainQuery = ""; 
@@ -174,7 +178,7 @@ public class QueryMediator implements QueryProcessor {
             }
         } else mainQuery = aQuery;
 	// The second part replaces the named items by their counterparts
-	for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){
+	for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){
 	    Cell cell = (Cell)e.nextElement();
 	    mainQuery = mainQuery.replaceAll(
 					     cell.getObject1AsURI().toString(),