diff --git a/html/relnotes.html b/html/relnotes.html
index 064f225303a79ff1d632d08dcd53a1c34b90801f..07174ac1aaf4a9374c8a960cd46cb6aea3d2b134 100644
--- a/html/relnotes.html
+++ b/html/relnotes.html
@@ -64,6 +64,8 @@ with a warning:
 
 <h2>Current SVN trunk version</h2>
 
+<!--h2>Version 4.5 (17xx): ??/??/2012 - Al pesto</h2-->
+
 <!--h2>Version 4.4 (17xx): ??/??/2012 - ?????????</h2-->
 
 <p><ul compact="1">
@@ -71,18 +73,22 @@ with a warning:
   use <tt>java.lang.Properties</tt> instead; <tt>BasicParameters</tt>
   is not used anymore in the API (impl)</tt>
 <li><tt>BasicAlignment.getXNamespaces()</tt> returns <tt>Properties</tt> (impl)</li>
-<li>Finally simplified visitor patterns (impl/edoal/renderer)</li>
+<li>Simplified visitor patterns (impl/edoal/renderer)</li>
+<li><span style="color: red;">Use</span> edoal prefix instead of xsd for comparators (edoal)</li>
 <li>Integrated <tt>owl:propertyChain</tt> in OWL rendering (edoal)</li>
-<li>Corrected bug with <tt>owl:inverseOf</tt> in OWL rendering (edoal)</li>
 <!--li>Upgraded to <span style="color: green">OWL API ??</span>,
    <span style="color: green">Xerces 2.10</span>,
    <span style="color: green">log4j 1.2.16</span>,
    <span style="color: green">slf4j 1.6.4</span> (lib)</li-->
+<li>Added <tt>JSONRendererVisitor</tt> (impl)</li>
 <li>Added <tt>corresp</tt> primitive (server)</li>
 <li>Added <tt>EDOALAlignment.toEDOALAlignment()</tt> (edoal)</li>
 <li>Simplified <tt>TestGen</tt> options (cli)</li>
 <li>Fixed server initialisation error with new log4j (server)</li>
+<li>Fixed a float parsing bug in <tt>XMLParser</tt> (parser)</li>
+<li>Corrected bug with <tt>owl:inverseOf</tt> in OWL rendering (edoal)</li>
 <li>All documentation has now been revised in html and is not in the (outdated) manuals (html)</li>
+<li>Replaced version.txt and license.txt by pom.xml (lib)</li>
 </ul></p>
 
 <h2>Version 4.3 (1690): 22/02/2012 - Zimt</h2>
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..9adbb01669c76a44bd132f19ff368dc4409f8b30
--- /dev/null
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java
@@ -0,0 +1,653 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) INRIA, 2012
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+package fr.inrialpes.exmo.align.impl.renderer;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Properties;
+import java.io.PrintWriter;
+import java.net.URI;
+
+import org.semanticweb.owl.align.Alignment;
+import org.semanticweb.owl.align.AlignmentVisitor;
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Cell;
+import org.semanticweb.owl.align.Relation;
+
+import fr.inrialpes.exmo.align.impl.Annotations;
+import fr.inrialpes.exmo.align.impl.Namespace;
+import fr.inrialpes.exmo.align.impl.Extensions;
+import fr.inrialpes.exmo.align.impl.BasicAlignment;
+import fr.inrialpes.exmo.align.impl.ObjectCell;
+
+import fr.inrialpes.exmo.ontowrap.LoadedOntology;
+import fr.inrialpes.exmo.ontowrap.Ontology; //?
+
+import fr.inrialpes.exmo.align.parser.SyntaxElement;
+import fr.inrialpes.exmo.align.parser.SyntaxElement.Constructor;
+
+import fr.inrialpes.exmo.align.impl.edoal.Id;
+import fr.inrialpes.exmo.align.impl.edoal.PathExpression;
+import fr.inrialpes.exmo.align.impl.edoal.Expression;
+import fr.inrialpes.exmo.align.impl.edoal.ClassExpression;
+import fr.inrialpes.exmo.align.impl.edoal.ClassId;
+import fr.inrialpes.exmo.align.impl.edoal.ClassConstruction;
+import fr.inrialpes.exmo.align.impl.edoal.ClassTypeRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.ClassDomainRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.ClassValueRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.ClassOccurenceRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyExpression;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyId;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyConstruction;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyDomainRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyTypeRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyValueRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.RelationExpression;
+import fr.inrialpes.exmo.align.impl.edoal.RelationId;
+import fr.inrialpes.exmo.align.impl.edoal.RelationConstruction;
+import fr.inrialpes.exmo.align.impl.edoal.RelationDomainRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.RelationCoDomainRestriction;
+import fr.inrialpes.exmo.align.impl.edoal.InstanceExpression;
+import fr.inrialpes.exmo.align.impl.edoal.InstanceId;
+
+import fr.inrialpes.exmo.align.impl.edoal.Transformation;
+import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
+import fr.inrialpes.exmo.align.impl.edoal.Value;
+import fr.inrialpes.exmo.align.impl.edoal.Apply;
+import fr.inrialpes.exmo.align.impl.edoal.Datatype;
+import fr.inrialpes.exmo.align.impl.edoal.Comparator;
+import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
+import fr.inrialpes.exmo.align.impl.edoal.EDOALVisitor;
+
+/**
+ * Renders an alignment in JSON (and practically in JSON-LD)
+ * http://json-ld.org/spec/latest/json-ld-syntax/
+ *
+ * application/json <========= media type available
+ *
+ * @author Jérôme Euzenat
+ * @version $Id$
+ */
+
+public class JSONRendererVisitor extends IndentedRendererVisitor implements AlignmentVisitor,EDOALVisitor {
+
+    Alignment alignment = null;
+    Cell cell = null;
+    Hashtable<String,String> nslist = null;
+    boolean embedded = false; // if the output is XML embeded in a structure
+
+    private static Namespace DEF = Namespace.ALIGNMENT;
+    
+    private boolean isPattern = false;
+	
+    public JSONRendererVisitor( PrintWriter writer ){
+	super( writer );
+	//NL = System.getProperty("line.separator");
+    }
+
+    public void init( Properties p ) {
+	if ( p.getProperty( "embedded" ) != null 
+	     && !p.getProperty( "embedded" ).equals("") ) embedded = true;
+	if ( p.getProperty( "indent" ) != null )
+	    INDENT = p.getProperty( "indent" );
+	if ( p.getProperty( "newline" ) != null )
+	    NL = p.getProperty( "newline" );
+    }
+
+    // DONE
+    public void visit( Alignment align ) throws AlignmentException {
+	if ( subsumedInvocableMethod( this, align, Alignment.class ) ) return;
+	// default behaviour
+	String extensionString = "";
+	alignment = align;
+	nslist = new Hashtable<String,String>();
+        nslist.put( Namespace.ALIGNMENT.prefix , Namespace.ALIGNMENT.shortCut );
+        nslist.put( Namespace.RDF.prefix , Namespace.RDF.shortCut );
+        nslist.put( Namespace.XSD.prefix , Namespace.XSD.shortCut );
+	// Get the keys of the parameter
+	int gen = 0;
+	for ( String[] ext : align.getExtensions() ) {
+	    String prefix = ext[0];
+	    String name = ext[1];
+	    String tag = nslist.get(prefix);
+	    if ( tag == null ) {
+		tag = "ns"+gen++;
+		nslist.put( prefix, tag );
+	    }
+	    tag += ":"+name;
+	    extensionString += INDENT+"\""+tag+"\" : \""+ext[2]+"\","+NL;
+	}
+	if ( align instanceof BasicAlignment ) {
+	    for ( String label : ((BasicAlignment)align).getXNamespaces().stringPropertyNames() ) {
+		if ( !label.equals("rdf") && !label.equals("xsd")
+		     && !label.equals("<default>") )
+		    extensionString += INDENT+"\""+label+"\" : \""+((BasicAlignment)align).getXNamespace( label )+"\","+NL;
+	    }
+	}
+	writer.print("{ class : \""+align.getClass().getName()+"\","+NL );
+	increaseIndent();
+	indentedOutputln("@context : {");
+	increaseIndent();
+	for ( Enumeration e = nslist.keys() ; e.hasMoreElements(); ) {
+	    String k = (String)e.nextElement();
+	    indentedOutputln(nslist.get(k)+" : \""+k+"\",");
+	}
+	// Not sure that this is fully correct
+	indentedOutputln("\"align:measure\" : {");
+	increaseIndent();
+	indentedOutputln("\"@type\" : \"xsd:float\"");
+	decreaseIndent();
+	indentedOutputln("},");
+	decreaseIndent();
+	indentedOutputln("},");
+	indentedOutputln("@type : \"align:Alignment\"," );
+	String idext = align.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID );
+	if ( idext != null ) {
+	    //indentedOutputln("\"rdf:about\" : \""+idext+"\",");
+	    indentedOutputln("@id : \""+idext+"\",");
+	}
+	if ( alignment.getLevel().startsWith("2EDOALPattern") ) isPattern = true;
+	indentedOutputln( "\"align:level\" : \""+align.getLevel()+"\",");
+	indentedOutputln( "\"align:type\" : \""+align.getType()+"\",");
+	writer.print(extensionString);
+	indentedOutputln( "\"align:ontology1\" : " );
+	increaseIndent();
+	if ( align instanceof BasicAlignment ) {
+	    printOntology( ((BasicAlignment)align).getOntologyObject1() );
+	} else {
+	    printBasicOntology( align.getOntology1URI(), align.getFile1() );
+	}
+	decreaseIndent();
+	writer.print( ","+NL );
+	indentedOutputln( "\"align:ontology2\" : " );
+	increaseIndent();
+	if ( align instanceof BasicAlignment ) {
+	    printOntology( ((BasicAlignment)align).getOntologyObject2() );
+	} else {
+	    printBasicOntology( align.getOntology2URI(), align.getFile2() );
+	}
+	writer.print( ","+NL );
+	decreaseIndent();
+	indentedOutputln( "\"align:cells\" : [" );
+	increaseIndent();
+	for( Cell c : align ){ 
+	    c.accept( this ); 
+	    writer.print( ","+NL );
+	};
+	decreaseIndent();
+	indentedOutputln( "]" );
+	decreaseIndent();
+	indentedOutputln("}");
+    }
+
+    // DONE
+    private void printBasicOntology ( URI u, URI f ) {
+	indentedOutput("{ class : \"fr.inrialpes.exmo.ontowrap.BasicOntology\","+NL);
+	increaseIndent();
+	//indentedOutput("\rdf:about\" : \""+u+"\","+NL);
+	indentedOutput("@id : \""+u+"\","+NL);
+	if ( f != null ) {
+	    indentedOutput("\"align:location\" : \""+f+"\","+NL);
+	} else {
+	    indentedOutput("\"align:location\" : \""+u+"\","+NL);
+	}
+	decreaseIndent();
+	indentedOutput("}");
+    }
+
+    // DONE
+    public void printOntology( Ontology onto ) {
+	URI u = onto.getURI();
+	URI f = onto.getFile();
+	indentedOutput("{ class : \""+onto.getClass().getName()+"\","+NL );
+	increaseIndent();
+	//indentedOutput("\"rdf:about\" : \""+u+"\","+NL);
+	indentedOutput("@id : \""+u+"\","+NL);
+	if ( f != null ) {
+	    indentedOutput("\"align:location\" : \""+f+"\","+NL);
+	} else {
+	    indentedOutput("\"align:location\" : \""+u+"\","+NL);
+	}
+	if ( onto.getFormalism() != null ) {
+	    indentedOutput("\"align:formalism\" : \""+onto.getFormalism()+"\","+NL);
+	    indentedOutput("\"align:formuri\" : \""+onto.getFormURI()+"\","+NL);
+	}
+	decreaseIndent();
+	indentedOutput("}");
+    }
+
+    // DONE (NO-EDOAL)
+    public void visit( Cell cell ) throws AlignmentException {
+	if ( subsumedInvocableMethod( this, cell, Cell.class ) ) return;
+	// default behaviour
+	this.cell = cell;
+	URI u1 = cell.getObject1AsURI(alignment);
+	URI u2 = cell.getObject2AsURI(alignment);
+	if ( ( u1 != null && u2 != null)
+	     || alignment.getLevel().startsWith("2EDOAL") ){ //expensive test
+	    indentedOutputln("{ class : \""+cell.getClass().getName()+"\",");
+	    increaseIndent();
+	    if ( cell.getId() != null && !cell.getId().equals("") ){
+		//indentedOutputln("\"rdf:about\" : \""+cell.getId()+"\",");
+		indentedOutputln("@id : \""+cell.getId()+"\",");
+	    }
+	    if ( alignment.getLevel().startsWith("2EDOAL") ) {
+		indentedOutputln("<"+SyntaxElement.ENTITY1.print(DEF)+">");
+		increaseIndent();
+		((Expression)(cell.getObject1())).accept( this );
+		decreaseIndent();
+		writer.print(NL);
+		indentedOutputln("</"+SyntaxElement.ENTITY1.print(DEF)+">");
+		indentedOutputln("<"+SyntaxElement.ENTITY2.print(DEF)+">");
+		increaseIndent();
+		((Expression)(cell.getObject2())).accept( this );
+		decreaseIndent();
+		writer.print(NL);
+		indentedOutputln("</"+SyntaxElement.ENTITY2.print(DEF)+">");
+		if ( cell instanceof EDOALCell ) { // Here put the transf
+		    Set<Transformation> transfs = ((EDOALCell)cell).transformations();
+		    if ( transfs != null ) {
+			for ( Transformation transf : transfs ){
+			    indentedOutputln("<"+SyntaxElement.TRANSFORMATION.print(DEF)+">");
+			    increaseIndent();
+			    transf.accept( this );
+			    decreaseIndent();
+			    writer.print(NL);
+			    indentedOutputln("</"+SyntaxElement.TRANSFORMATION.print(DEF)+">");
+			}
+		    }
+		}
+	    } else {
+		indentedOutputln("\"align:entity1\" : \""+u1.toString()+"\",");
+		indentedOutputln("\"align:entity2\" : \""+u2.toString()+"\",");
+	    }
+	    indentedOutput("\"align:relation\" : \"");
+	    cell.getRelation().accept( this );
+	    writer.print("\","+NL);
+	    indentedOutputln("\"align:measure\" : \""+cell.getStrength()+"\",");
+	    if ( cell.getSemantics() != null &&
+		 !cell.getSemantics().equals("") &&
+		 !cell.getSemantics().equals("first-order") )
+		indentedOutputln("\"align:semantics\" : \""+cell.getSemantics()+"\",");
+	    if ( cell.getExtensions() != null ) {
+		for ( String[] ext : cell.getExtensions() ){
+		    indentedOutputln(ext[1]+" : \""+ext[2]+"\","+NL);
+		}
+	    }
+	    decreaseIndent();
+	    indentedOutput("}");
+	}
+    }
+
+    // DONE: could also be a qualified class name
+    public void visit( Relation rel ) throws AlignmentException {
+	if ( subsumedInvocableMethod( this, rel, Relation.class ) ) return;
+	// default behaviour
+	rel.write( writer );
+    };
+
+    // ********** EDOAL
+
+    public void renderVariables( Expression expr ) {
+	if ( expr.getVariable() != null ) {
+	    writer.print( " "+SyntaxElement.VAR.print(DEF)+"=\""+expr.getVariable().name() );
+	}
+    }
+
+    public void visit( final ClassId e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.CLASS_EXPR.print(DEF));
+	if ( e.getURI() != null ) {
+	    writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF));
+	    writer.print("=\""+e.getURI()+"\"");
+	}
+	if ( isPattern ) renderVariables( e );
+	writer.print("/>");
+    }
+
+    public void visit( final ClassConstruction e ) throws AlignmentException {
+	final Constructor op = e.getOperator();
+	String sop = SyntaxElement.getElement( op ).print(DEF) ;
+	indentedOutput("<"+SyntaxElement.CLASS_EXPR.print(DEF));
+	if ( isPattern ) renderVariables( e );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+sop);
+	if ( (op == Constructor.AND) || (op == Constructor.OR) ) writer.print(" "+SyntaxElement.RDF_PARSETYPE.print(DEF)+"=\"Collection\"");
+	writer.print(">"+NL);
+	increaseIndent();
+	for ( final ClassExpression ce : e.getComponents() ) {
+	    writer.print(linePrefix);
+	    ce.accept( this );
+	    writer.print(NL);
+	}
+	decreaseIndent();
+	indentedOutput("</"+sop+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.CLASS_EXPR.print(DEF)+">");
+    }
+
+    public void visit( final ClassValueRestriction c ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.VALUE_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getRestrictionPath().accept( this );
+	decreaseIndent();
+	writer.print(NL);
+	indentedOutputln("</"+SyntaxElement.ONPROPERTY.print(DEF)+">");
+	indentedOutput("<"+SyntaxElement.COMPARATOR.print(DEF));
+	writer.print(" "+SyntaxElement.RDF_RESOURCE.print(DEF));
+	writer.print("=\""+c.getComparator().getURI());
+	writer.print("\"/>"+NL);
+	indentedOutput("<"+SyntaxElement.VALUE.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getValue().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.VALUE.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.VALUE_COND.print(DEF)+">");
+    }
+
+    public void visit( final ClassTypeRestriction c ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.TYPE_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getRestrictionPath().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	c.getType().accept( this ); // Directly -> to be changed for rendering all/exists
+	decreaseIndent();
+	writer.print(NL);
+	indentedOutput("</"+SyntaxElement.TYPE_COND.print(DEF)+">");
+    }
+
+    public void visit( final ClassDomainRestriction c ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.DOMAIN_RESTRICTION.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getRestrictionPath().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	if ( c.isUniversal() ) {
+	    indentedOutput("<"+SyntaxElement.ALL.print(DEF)+">"+NL);
+	} else {
+	    indentedOutput("<"+SyntaxElement.EXISTS.print(DEF)+">"+NL);
+	}
+	increaseIndent();
+	c.getDomain().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	if ( c.isUniversal() ) {
+	    indentedOutput("</"+SyntaxElement.ALL.print(DEF)+">"+NL);
+	} else {
+	    indentedOutput("</"+SyntaxElement.EXISTS.print(DEF)+">"+NL);
+	}
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.DOMAIN_RESTRICTION.print(DEF)+">");
+    }
+
+    public void visit( final ClassOccurenceRestriction c ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.OCCURENCE_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getRestrictionPath().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.ONPROPERTY.print(DEF)+">"+NL);
+	indentedOutput("<"+SyntaxElement.COMPARATOR.print(DEF));
+	writer.print(" "+SyntaxElement.RDF_RESOURCE.print(DEF));
+	writer.print("=\""+c.getComparator().getURI());
+	writer.print("\"/>"+NL);
+	indentedOutput("<"+SyntaxElement.VALUE.print(DEF)+">");
+	writer.print(c.getOccurence());
+	writer.print("</"+SyntaxElement.VALUE.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.OCCURENCE_COND.print(DEF)+">");
+    }
+    
+    public void visit(final PropertyId e) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.PROPERTY_EXPR.print(DEF));
+	if ( e.getURI() != null ){
+	    writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF));
+	    writer.print("=\""+e.getURI()+"\"");
+	}
+	if ( isPattern ) renderVariables( e );
+	writer.print("/>");
+    }
+
+    public void visit(final PropertyConstruction e) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.PROPERTY_EXPR.print(DEF));
+	if ( isPattern ) renderVariables( e );
+	writer.print(">"+NL);
+	increaseIndent();
+	final Constructor op = e.getOperator();
+	String sop = SyntaxElement.getElement( op ).print(DEF) ;
+	indentedOutput("<"+sop);
+	if ( (op == Constructor.AND) || (op == Constructor.OR) || (op == Constructor.COMP) ) writer.print(" "+SyntaxElement.RDF_PARSETYPE.print(DEF)+"=\"Collection\"");
+	writer.print(">"+NL);
+	increaseIndent();
+	if ( (op == Constructor.AND) || (op == Constructor.OR) || (op == Constructor.COMP) ) {
+	    for ( final PathExpression pe : e.getComponents() ) {
+		writer.print(linePrefix);
+		pe.accept( this );
+		writer.print(NL);
+	    }
+	} else {
+	    for (final PathExpression pe : e.getComponents()) {
+		pe.accept( this );
+		writer.print(NL);
+	    }
+	}
+	decreaseIndent();
+	indentedOutput("</"+sop+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.PROPERTY_EXPR.print(DEF)+">");
+    }
+
+    public void visit(final PropertyValueRestriction c) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.PROPERTY_VALUE_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.COMPARATOR.print(DEF));
+	writer.print(" "+SyntaxElement.RDF_RESOURCE.print(DEF));
+	writer.print("=\""+c.getComparator().getURI());
+	writer.print("\"/>"+NL);
+	indentedOutput("<"+SyntaxElement.VALUE.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getValue().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.VALUE.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.PROPERTY_VALUE_COND.print(DEF)+">");
+    }
+
+    public void visit(final PropertyDomainRestriction c) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.PROPERTY_DOMAIN_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getDomain().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.PROPERTY_DOMAIN_COND.print(DEF)+">");
+    }
+
+    public void visit(final PropertyTypeRestriction c) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.PROPERTY_TYPE_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	c.getType().accept( this );
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.PROPERTY_TYPE_COND.print(DEF)+">");
+    }
+    
+    public void visit( final RelationId e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.RELATION_EXPR.print(DEF));
+	if ( e.getURI() != null ) {
+	    writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF));
+	    writer.print("=\""+e.getURI()+"\"");
+	}
+	if ( isPattern ) renderVariables( e );
+	writer.print("/>");
+    }
+
+    public void visit( final RelationConstruction e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.RELATION_EXPR.print(DEF));
+	if ( isPattern ) renderVariables( e );
+	writer.print(">"+NL);
+	increaseIndent();
+	final Constructor op = e.getOperator();
+	String sop = SyntaxElement.getElement( op ).print(DEF) ;
+	indentedOutput("<"+sop);
+	if ( (op == Constructor.OR) || (op == Constructor.AND) || (op == Constructor.COMP) ) writer.print(" "+SyntaxElement.RDF_PARSETYPE.print(DEF)+"=\"Collection\"");
+	writer.print(">"+NL);
+	increaseIndent();
+	if ( (op == Constructor.AND) || (op == Constructor.OR) || (op == Constructor.COMP) ) {
+	    for (final PathExpression re : e.getComponents()) {
+		writer.print(linePrefix);
+		re.accept( this );
+		writer.print(NL);
+	    }
+	} else { // NOT... or else: enumerate them
+	    for (final PathExpression re : e.getComponents()) {
+		re.accept( this );
+		writer.print(NL);
+	    }
+	}
+	decreaseIndent();
+	indentedOutput("</"+sop+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.RELATION_EXPR.print(DEF)+">");
+    }
+	
+    public void visit(final RelationCoDomainRestriction c) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.RELATION_CODOMAIN_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getCoDomain().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.RELATION_CODOMAIN_COND.print(DEF)+">");
+    }
+
+    public void visit(final RelationDomainRestriction c) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.RELATION_DOMAIN_COND.print(DEF));
+	if ( isPattern ) renderVariables( c );
+	writer.print(">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	increaseIndent();
+	c.getDomain().accept( this );
+	writer.print(NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.TOCLASS.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.RELATION_DOMAIN_COND.print(DEF)+">");
+    }
+
+    public void visit( final InstanceId e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.INSTANCE_EXPR.print(DEF));
+	if ( e.getURI() != null ) {
+	    writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF));
+	    writer.print("=\""+e.getURI()+"\"");
+	}
+	if ( isPattern ) renderVariables( e );
+	writer.print("/>");
+    }
+    
+    public void visit( final Value e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.LITERAL.print(DEF)+" ");
+	if ( e.getType() != null ) {
+	    writer.print(SyntaxElement.ETYPE.print(DEF)+"=\""+e.getType()+"\" ");
+	}
+	writer.print(SyntaxElement.STRING.print(DEF)+"=\""+e.getValue()+"\"/>");
+    }
+	
+    public void visit( final Apply e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.APPLY.print(DEF)+" "+SyntaxElement.OPERATOR.print(DEF)+"=\""+e.getOperation()+"\">"+NL);
+	increaseIndent();
+	indentedOutput("<"+SyntaxElement.ARGUMENTS.print(DEF)+" "+SyntaxElement.RDF_PARSETYPE.print(DEF)+"=\"Collection\">"+NL);
+	increaseIndent();
+	for ( final ValueExpression ve : e.getArguments() ) {
+	    writer.print(linePrefix);
+	    ve.accept( this );
+	    writer.print(NL);
+	}
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.ARGUMENTS.print(DEF)+">"+NL);
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.APPLY.print(DEF)+">");
+    }
+
+    public void visit( final Transformation transf ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.TRANSF.print(DEF)+" "+SyntaxElement.TRDIR.print(DEF)+"=\""+transf.getType()+"\">"+NL);
+	increaseIndent();
+	indentedOutputln("<"+SyntaxElement.TRENT1.print(DEF)+">");
+	increaseIndent();
+	transf.getObject1().accept( this );
+	decreaseIndent();
+	writer.print(NL);
+	indentedOutputln("</"+SyntaxElement.TRENT1.print(DEF)+">");
+	indentedOutputln("<"+SyntaxElement.TRENT2.print(DEF)+">");
+	increaseIndent();
+	transf.getObject2().accept( this );
+	decreaseIndent();
+	writer.print(NL);
+	indentedOutputln("</"+SyntaxElement.TRENT2.print(DEF)+">");
+	decreaseIndent();
+	indentedOutput("</"+SyntaxElement.TRANSF.print(DEF)+">");
+    }
+
+    public void visit( final Datatype e ) throws AlignmentException {
+	indentedOutput("<"+SyntaxElement.EDATATYPE.print(DEF)+">");
+	writer.print("<"+SyntaxElement.DATATYPE.print(DEF)+" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+e.getType()+"\"/>");
+	writer.print("</"+SyntaxElement.EDATATYPE.print(DEF)+">");
+    }
+	
+}