diff --git a/examples/omwg/total.xml b/examples/omwg/total.xml
index 322b38a64e55e0804952b7f855037f6979a079dc..bdeb4a591449909bba0025a6436a89ee288f0d25 100644
--- a/examples/omwg/total.xml
+++ b/examples/omwg/total.xml
@@ -752,5 +752,31 @@
 	</edoal:transformation>
       </Cell>
     </map>
+    <!-- test on linkkeys -->
+    <map>
+      <Cell rdf:about="LinkkeyTest">
+	<entity1>
+          <edoal:Class rdf:about="&wine;VintageYear" />
+	</entity1>
+	<entity2>
+          <edoal:Class rdf:about="&vin;Millesime" />
+	</entity2>
+        <measure rdf:datatype='&xsd;float'>1.</measure>        
+        <edoal:linkkey> 
+          <Linkkey edoal:type="weak">
+            <binding>
+              <Corresp edoal:type="eq">
+                <property1>
+                  <edoal:Property rdf:about="&wine;yearValue" />
+                </property1>
+                <property2>
+                  <edoal:Property rdf:about="&vin;annee_millesime" />
+                </property2>
+              </Corresp>
+            </binding>
+          </Linkkey>
+        </edoal:linkkey>
+      </Cell>
+    </map>
   </Alignment>
 </rdf:RDF>
diff --git a/lib/align.jar b/lib/align.jar
index 779ee7158751af1a5c023bfd94dc1db7bb37d611..bc2c4275e62c1db625810fc8eeac9619e7ac1a17 100644
Binary files a/lib/align.jar and b/lib/align.jar differ
diff --git a/lib/align.pom b/lib/align.pom
index e8d450ff45f7d10b2c02da511c7b8c11d7674ea0..39203cc445c6f53098ed53bcb4a6576b142b01ee 100644
--- a/lib/align.pom
+++ b/lib/align.pom
@@ -17,13 +17,13 @@
   <groupId>org.semanticweb.owl</groupId>
   <artifactId>align</artifactId>
   <version>4.6</version>
-  <!-- Rev 1874M 22/01/2014 -->
+  <!-- Rev 1954M 10/07/2014 -->
   <name>The Alignment API</name>
   <description>The Alignment API is an API for manipulating ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
   <organization>
     <name>INRIA Exmo team</name>
-    <url>http://exmo.inrialpes.fr</url>
+    <url>http://exmo.inria.fr</url>
   </organization>
   <!-- (C) INRIA, 2003-2014 -->
   <licenses>
diff --git a/lib/alignsvc.jar b/lib/alignsvc.jar
index a2a535cb0b4ebb4b594df5e1feb7f3d786b0281a..f26d84e6b646e17e6fc16213565fca0b2d90d04c 100644
Binary files a/lib/alignsvc.jar and b/lib/alignsvc.jar differ
diff --git a/lib/alignsvc.pom b/lib/alignsvc.pom
index 59c6bb748c89931cb4b14586cc5318229066ac1a..10a1fcd9be1a27082562cbb84b6b13ce904d0732 100644
--- a/lib/alignsvc.pom
+++ b/lib/alignsvc.pom
@@ -17,13 +17,13 @@
   <groupId>fr.inrialpes.exmo.align</groupId>
   <artifactId>alignsvc</artifactId>
   <version>4.6</version>
-  <!-- Rev 1874M 22/01/2014 -->
+  <!-- Rev 1954M 10/07/2014 -->
   <name>Alignment server</name>
   <description>A server for storing and sharing ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
   <organization>
     <name>INRIA Exmo team</name>
-    <url>http://exmo.inrialpes.fr</url>
+    <url>http://exmo.inria.fr</url>
   </organization>
   <!-- (C) INRIA, 2003-2014 -->
   <licenses>
diff --git a/lib/ontowrap.jar b/lib/ontowrap.jar
index 7ea883bed77365fc13a4f931a5a5f687abe74eb0..cb7f281a04249058aa34097be08f937d3bc7117c 100644
Binary files a/lib/ontowrap.jar and b/lib/ontowrap.jar differ
diff --git a/lib/ontowrap.pom b/lib/ontowrap.pom
index cd11bc2d7cd393e426a29ec05c0b29f34cf28837..5fa75a0ece5f84d6ffc389eb8c058faf843a5e40 100644
--- a/lib/ontowrap.pom
+++ b/lib/ontowrap.pom
@@ -17,13 +17,13 @@
   <groupId>fr.inrialpes.exmo</groupId>
   <artifactId>ontowrap</artifactId>
   <version>4.6</version>
-  <!-- Rev 1874M 22/01/2014 -->
+  <!-- Rev 1954M 10/07/2014 -->
   <name>Ontology wrapping API</name>
   <description>An ontology wrapping API and library.</description>
   <url>http://alignapi.gforge.inria.fr</url>
   <organization>
     <name>INRIA Exmo team</name>
-    <url>http://exmo.inrialpes.fr</url>
+    <url>http://exmo.inria.fr</url>
   </organization>
   <!-- (C) INRIA, 2003-2014 -->
   <licenses>
diff --git a/lib/procalign.jar b/lib/procalign.jar
index a6c717077a4d26e731c7579459ca27feaffadde1..89763fdacf1212f722c49dc3be96cf055982809a 100644
Binary files a/lib/procalign.jar and b/lib/procalign.jar differ
diff --git a/lib/procalign.pom b/lib/procalign.pom
index e7a7285bf812f461151dcc01373d71918746947d..e1e9f9e83ca1bbbce4f720f280cdb6475ab10e65 100644
--- a/lib/procalign.pom
+++ b/lib/procalign.pom
@@ -17,13 +17,13 @@
   <groupId>fr.inrialpes.exmo.align</groupId>
   <artifactId>procalign</artifactId>
   <version>4.6</version>
-  <!-- Rev 1874M 22/01/2014 -->
+  <!-- Rev 1954M 10/07/2014 -->
   <name>Reference implementation of the Alignment API</name>
   <description>Implementation of the Alignment API for manipulating ontology alignments.</description>
   <url>http://alignapi.gforge.inria.fr</url>
   <organization>
     <name>INRIA Exmo team</name>
-    <url>http://exmo.inrialpes.fr</url>
+    <url>http://exmo.inria.fr</url>
   </organization>
   <!-- (C) INRIA, 2003-2014 -->
   <licenses>
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/ClassRestriction.java b/src/fr/inrialpes/exmo/align/impl/edoal/ClassRestriction.java
index b63eac313eac39a8ab38277fc12ee35dc214bccf..68050bf6fd978651c283e2c6a6a1cd19c2ecfae3 100644
--- a/src/fr/inrialpes/exmo/align/impl/edoal/ClassRestriction.java
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/ClassRestriction.java
@@ -22,9 +22,6 @@
 
 package fr.inrialpes.exmo.align.impl.edoal;
 
-import org.semanticweb.owl.align.AlignmentException;
-import org.semanticweb.owl.align.AlignmentVisitor;
-
 /**
  * <p>
  * Superclass for all ClassRestrictions.
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/EDOALCell.java b/src/fr/inrialpes/exmo/align/impl/edoal/EDOALCell.java
index 6081ec7a539d3d09d7a32bb76780936b18d9efd7..330d34a648ae28c72153e1544198fc9b3a3f8037 100644
--- a/src/fr/inrialpes/exmo/align/impl/edoal/EDOALCell.java
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/EDOALCell.java
@@ -22,15 +22,8 @@
 
 package fr.inrialpes.exmo.align.impl.edoal;
 
-import java.io.PrintStream;
-import java.io.IOException;
-import java.util.Comparator;
 import java.util.Set;
 import java.util.HashSet;
-import java.lang.ClassNotFoundException;
-import java.lang.Float;
-import java.lang.Double;
-import java.net.URISyntaxException;
 import java.net.URI;
 
 import org.semanticweb.owl.align.Alignment;
@@ -40,7 +33,6 @@ import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Relation;
 
 import fr.inrialpes.exmo.align.impl.BasicCell;
-import fr.inrialpes.exmo.align.impl.rel.*;
 
 import fr.inrialpes.exmo.align.parser.TypeCheckingVisitor;
 
@@ -72,6 +64,7 @@ public class EDOALCell extends BasicCell {
     private URI id; // This is the id
 
     private Set<Transformation> transformations;
+    private Set<Linkkey> linkkeys;
 
     public void accept( AlignmentVisitor visitor) throws AlignmentException {
         visitor.visit( this );
@@ -110,6 +103,16 @@ public class EDOALCell extends BasicCell {
     public Set<Transformation> transformations() {
 	return transformations;
     }
+    
+    public void addLinkkey( Linkkey linkkey ){
+	if ( linkkeys == null ) {
+	    linkkeys = new HashSet<Linkkey>();
+	}
+	linkkeys.add( linkkey );
+    }
+    public Set<Linkkey> linkkeys() {
+	return linkkeys;
+    }
 
     public Cell inverse() throws AlignmentException {
 	EDOALCell invcell = new EDOALCell( (String)null, (Expression)object2, (Expression)object1, relation.inverse(), strength );
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/EDOALVisitor.java b/src/fr/inrialpes/exmo/align/impl/edoal/EDOALVisitor.java
index 8d784e9087b8ff5d06b7d54ad9eb7e3d3833648f..d8374c9936e35b6203cf9a01d54af24e2eff84a7 100644
--- a/src/fr/inrialpes/exmo/align/impl/edoal/EDOALVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/EDOALVisitor.java
@@ -45,6 +45,8 @@ public interface EDOALVisitor {
     public void visit( Value o ) throws AlignmentException;
     public void visit( Apply o ) throws AlignmentException;
     public void visit( Datatype o ) throws AlignmentException;
+    public void visit( Linkkey o ) throws AlignmentException;
+    public void visit( LinkkeyBinding o ) throws AlignmentException;
     //public void visit( Comparator o ) throws AlignmentException;
     //public void visit( EDOALCell o ) throws AlignmentException;
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/Linkkey.java b/src/fr/inrialpes/exmo/align/impl/edoal/Linkkey.java
new file mode 100644
index 0000000000000000000000000000000000000000..df2cee152ad61027bf520cf681616cb9f4d2b810
--- /dev/null
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/Linkkey.java
@@ -0,0 +1,59 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package fr.inrialpes.exmo.align.impl.edoal;
+
+import fr.inrialpes.exmo.align.parser.TypeCheckingVisitor;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.semanticweb.owl.align.AlignmentException;
+
+/**
+ *
+ * @author Nicolas Guillouet <nicolas@meaningengines.com>
+ */
+public class Linkkey {
+    public static final String PLAIN = "plain";
+    public static final String WEAK = "weak";
+    public static final String STRONG = "strong";
+    private static List<String> ALLOWED_TYPES = Arrays.asList(PLAIN, WEAK, STRONG);
+    
+    private String type;
+    private Set<LinkkeyBinding> bindings;
+    
+    public void accept(EDOALVisitor visitor) throws AlignmentException {
+        visitor.visit(this);
+    }
+    
+    public TypeCheckingVisitor.TYPE accept( TypeCheckingVisitor visitor ) throws AlignmentException {
+	return visitor.visit(this);
+    }
+
+    public Linkkey() throws AlignmentException {
+        this(PLAIN);
+    }
+
+    public Linkkey(String type) throws AlignmentException {
+        if(!ALLOWED_TYPES.contains(type)){
+            throw new AlignmentException("The  type " + type + " is not allowed !");
+        }
+        this.type = type;
+        bindings = new HashSet<>();
+    }
+
+    public void addBinding(LinkkeyBinding binding){
+        bindings.add(binding);
+    }
+    
+    public Set<LinkkeyBinding> bindings(){
+        return bindings;
+    }
+    
+    public String getType() {
+        return type;
+    }
+}
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/LinkkeyBinding.java b/src/fr/inrialpes/exmo/align/impl/edoal/LinkkeyBinding.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6ed8b66944a206622c6f911252e0f5129e008cf
--- /dev/null
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/LinkkeyBinding.java
@@ -0,0 +1,56 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package fr.inrialpes.exmo.align.impl.edoal;
+
+import fr.inrialpes.exmo.align.parser.TypeCheckingVisitor;
+import java.util.Arrays;
+import java.util.List;
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.AlignmentVisitor;
+import org.semanticweb.owl.align.Visitable;
+
+/**
+ *
+ * @author Nicolas Guillouet <nicolas@meaningengines.com>
+ */
+public class LinkkeyBinding {
+    public static final String IN = "in";
+    public static final String EQ = "eq";
+    private static List<String> ALLOWED_TYPES = Arrays.asList(IN, EQ);
+    
+    private PathExpression expression1;
+    private PathExpression expression2;
+    private String type;
+    
+    public LinkkeyBinding(PathExpression expression1, PathExpression expression2, String type) throws AlignmentException {
+        if(!ALLOWED_TYPES.contains(type)){
+            throw new AlignmentException("The  type " + type + " is not allowed !");
+        }
+        this.type = type;
+        this.expression1 = expression1;
+        this.expression2 = expression2;
+    }
+    
+    public void accept(EDOALVisitor visitor) throws AlignmentException {
+        visitor.visit(this);
+    }
+    
+    public TypeCheckingVisitor.TYPE accept( TypeCheckingVisitor visitor ) throws AlignmentException {
+	return visitor.visit(this);
+    }
+    
+    public String getType(){
+        return type;
+    }
+    
+    public PathExpression getExpression1(){
+        return expression1;
+    }
+    public PathExpression getExpression2(){
+        return expression2;
+    }
+}
diff --git a/src/fr/inrialpes/exmo/align/impl/edoal/PropertyExpression.java b/src/fr/inrialpes/exmo/align/impl/edoal/PropertyExpression.java
index b419a5ae3f42c752af505f644cc1cdbce7ca3731..81973e4a95269b15aa83dd34d47635ff5dba3389 100644
--- a/src/fr/inrialpes/exmo/align/impl/edoal/PropertyExpression.java
+++ b/src/fr/inrialpes/exmo/align/impl/edoal/PropertyExpression.java
@@ -22,9 +22,6 @@
 
 package fr.inrialpes.exmo.align.impl.edoal;
 
-import java.util.Collection;
-import java.util.Set;
-
 /**
  * <p>
  * Represents a PropertyExpression.
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java
index bf87c92cf6ae83c2525f2eaabea3b3b8d9899470..d659d127d3b01baee374fb58b6306b008a95165a 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/JSONRendererVisitor.java
@@ -78,6 +78,8 @@ 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;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 /**
  * Renders an alignment in JSON (and in fact in JSON-LD)
@@ -646,5 +648,13 @@ public class JSONRendererVisitor extends IndentedRendererVisitor implements Alig
 	decreaseIndent();
 	decreaseIndent();
     }
+    
+    public void visit(final Linkkey linkkey) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
+    
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
 	
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
index 7e3816cd52bfe550e827ae93af2c589a387fe64b..3f2ee321b0423d6b6b11372f9dd531138476bbcd 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
@@ -81,6 +81,8 @@ import fr.inrialpes.exmo.align.impl.edoal.Comparator;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALVisitor;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 /**
  * Renders an alignment as a new ontology merging these.
@@ -846,4 +848,11 @@ public class OWLAxiomsRendererVisitor extends IndentedRendererVisitor implements
 	indentedOutput("<owl:Datatype><owl:onDataType rdf:resource=\""+e.getType()+"\"/></owl:Datatype>");
     }
 
+    public void visit(final Linkkey linkkey) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
+    
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
index 59ff583ee8d68b40bcd457c323c2f109bd068daf..d943129b42bf3f050f1f628b997957ff6e03cfed 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
@@ -17,13 +17,11 @@
  * 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;
@@ -39,17 +37,12 @@ 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;
@@ -59,18 +52,15 @@ 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;
@@ -78,9 +68,10 @@ 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;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 /**
  * Renders an alignment in its RDF format
@@ -88,574 +79,672 @@ import fr.inrialpes.exmo.align.impl.edoal.EDOALVisitor;
  * @author Jérôme Euzenat
  * @version $Id$
  */
+public class RDFRendererVisitor extends IndentedRendererVisitor implements AlignmentVisitor, EDOALVisitor {
 
-public class RDFRendererVisitor extends IndentedRendererVisitor implements AlignmentVisitor,EDOALVisitor {
-    final static Logger logger = LoggerFactory.getLogger( RDFRendererVisitor.class );
+    final static Logger logger = LoggerFactory.getLogger(RDFRendererVisitor.class);
 
     Alignment alignment = null;
     Cell cell = null;
-    Hashtable<String,String> nslist = 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 RDFRendererVisitor( PrintWriter writer ){
-	super( writer );
+
+    public RDFRendererVisitor(PrintWriter writer) {
+        super(writer);
     }
 
-    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" );
+    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");
+        }
     }
 
-    public void visit( Alignment align ) throws AlignmentException {
-	//logger.trace( "Processing alignment {}", align );
-	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 ( prefix.equals( Namespace.ALIGNMENT.uri ) ) { tag = name; }
-	    else {
-		if ( tag == null ) {
-		    tag = "ns"+gen++;
-		    nslist.put( prefix, tag );
-		}
-		tag += ":"+name;
-	    }
-	    extensionString += INDENT+"<"+tag+">"+ext[2]+"</"+tag+">"+NL;
-	}
-	if ( embedded == false ) {
-	    writer.print("<?xml version='1.0' encoding='utf-8");
-	    writer.print("' standalone='no'?>"+NL);
-	}
-	writer.print("<"+SyntaxElement.RDF.print(DEF)+" xmlns='"+Namespace.ALIGNMENT.prefix+"'");
-	// JE2009: (1) I must use xml:base
-	//writer.print(NL+"         xml:base='"+Namespace.ALIGNMENT.uri+"'");
-	for ( Enumeration e = nslist.keys() ; e.hasMoreElements(); ) {
-	    String k = (String)e.nextElement();
-	    writer.print(NL+INDENT+INDENT+INDENT+INDENT+" xmlns:"+nslist.get(k)+"='"+k+"'");
-	}
-	if ( align instanceof BasicAlignment ) {
-	    for ( String label : ((BasicAlignment)align).getXNamespaces().stringPropertyNames() ) {
-		if ( !label.equals("rdf") && !label.equals("xsd")
-		     && !label.equals("<default>") )
-		    writer.print(NL+INDENT+INDENT+INDENT+INDENT+" xmlns:"+label+"='"+((BasicAlignment)align).getXNamespace( label )+"'");
-	    }
-	}
-	writer.print(">"+NL);
-	indentedOutput("<"+SyntaxElement.ALIGNMENT.print(DEF));
-	String idext = align.getExtension( Namespace.ALIGNMENT.uri, Annotations.ID );
-	if ( idext != null ) {
-	    writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+idext+"\"");
-	}
-	writer.print(">"+NL);
-	increaseIndent();
-	indentedOutputln( "<"+SyntaxElement.XML.print(DEF)+">yes</"+SyntaxElement.XML.print(DEF)+">" );
-	if ( alignment.getLevel().startsWith("2EDOALPattern") ) isPattern = true;
-	indentedOutputln( "<"+SyntaxElement.LEVEL.print(DEF)+">"+align.getLevel()+"</"+SyntaxElement.LEVEL.print(DEF)+">" );
-	indentedOutputln( "<"+SyntaxElement.TYPE.print(DEF)+">"+align.getType()+"</"+SyntaxElement.TYPE.print(DEF)+">");
-	writer.print(extensionString);
-	indentedOutputln( "<"+SyntaxElement.MAPPING_SOURCE.print(DEF)+">" );
-	increaseIndent();
-	if ( align instanceof BasicAlignment ) {
-	    printOntology( ((BasicAlignment)align).getOntologyObject1() );
-	} else {
-	    printBasicOntology( align.getOntology1URI(), align.getFile1() );
-	}
-	decreaseIndent();
-	indentedOutputln( "</"+SyntaxElement.MAPPING_SOURCE.print(DEF)+">" );
-	indentedOutputln( "<"+SyntaxElement.MAPPING_TARGET.print(DEF)+">" );
-	increaseIndent();
-	if ( align instanceof BasicAlignment ) {
-	    printOntology( ((BasicAlignment)align).getOntologyObject2() );
-	} else {
-	    printBasicOntology( align.getOntology2URI(), align.getFile2() );
-	}
-	decreaseIndent();
-	indentedOutputln( "</"+SyntaxElement.MAPPING_TARGET.print(DEF)+">" );
-	for( Cell c : align ){ c.accept( this ); };
-	decreaseIndent();
-	indentedOutputln("</"+SyntaxElement.ALIGNMENT.print(DEF)+">");
-	writer.print("</"+SyntaxElement.RDF.print(DEF)+">"+NL);
+    public void visit(Alignment align) throws AlignmentException {
+        //logger.trace( "Processing alignment {}", align );
+        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 (prefix.equals(Namespace.ALIGNMENT.uri)) {
+                tag = name;
+            } else {
+                if (tag == null) {
+                    tag = "ns" + gen++;
+                    nslist.put(prefix, tag);
+                }
+                tag += ":" + name;
+            }
+            extensionString += INDENT + "<" + tag + ">" + ext[2] + "</" + tag + ">" + NL;
+        }
+        if (embedded == false) {
+            writer.print("<?xml version='1.0' encoding='utf-8");
+            writer.print("' standalone='no'?>" + NL);
+        }
+        writer.print("<" + SyntaxElement.RDF.print(DEF) + " xmlns='" + Namespace.ALIGNMENT.prefix + "'");
+        // JE2009: (1) I must use xml:base
+        //writer.print(NL+"         xml:base='"+Namespace.ALIGNMENT.uri+"'");
+        for (Enumeration e = nslist.keys(); e.hasMoreElements();) {
+            String k = (String) e.nextElement();
+            writer.print(NL + INDENT + INDENT + INDENT + INDENT + " xmlns:" + nslist.get(k) + "='" + k + "'");
+        }
+        if (align instanceof BasicAlignment) {
+            for (String label : ((BasicAlignment) align).getXNamespaces().stringPropertyNames()) {
+                if (!label.equals("rdf") && !label.equals("xsd")
+                        && !label.equals("<default>")) {
+                    writer.print(NL + INDENT + INDENT + INDENT + INDENT + " xmlns:" + label + "='" + ((BasicAlignment) align).getXNamespace(label) + "'");
+                }
+            }
+        }
+        writer.print(">" + NL);
+        indentedOutput("<" + SyntaxElement.ALIGNMENT.print(DEF));
+        String idext = align.getExtension(Namespace.ALIGNMENT.uri, Annotations.ID);
+        if (idext != null) {
+            writer.print(" " + SyntaxElement.RDF_ABOUT.print(DEF) + "=\"" + idext + "\"");
+        }
+        writer.print(">" + NL);
+        increaseIndent();
+        indentedOutputln("<" + SyntaxElement.XML.print(DEF) + ">yes</" + SyntaxElement.XML.print(DEF) + ">");
+        if (alignment.getLevel().startsWith("2EDOALPattern")) {
+            isPattern = true;
+        }
+        indentedOutputln("<" + SyntaxElement.LEVEL.print(DEF) + ">" + align.getLevel() + "</" + SyntaxElement.LEVEL.print(DEF) + ">");
+        indentedOutputln("<" + SyntaxElement.TYPE.print(DEF) + ">" + align.getType() + "</" + SyntaxElement.TYPE.print(DEF) + ">");
+        writer.print(extensionString);
+        indentedOutputln("<" + SyntaxElement.MAPPING_SOURCE.print(DEF) + ">");
+        increaseIndent();
+        if (align instanceof BasicAlignment) {
+            printOntology(((BasicAlignment) align).getOntologyObject1());
+        } else {
+            printBasicOntology(align.getOntology1URI(), align.getFile1());
+        }
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.MAPPING_SOURCE.print(DEF) + ">");
+        indentedOutputln("<" + SyntaxElement.MAPPING_TARGET.print(DEF) + ">");
+        increaseIndent();
+        if (align instanceof BasicAlignment) {
+            printOntology(((BasicAlignment) align).getOntologyObject2());
+        } else {
+            printBasicOntology(align.getOntology2URI(), align.getFile2());
+        }
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.MAPPING_TARGET.print(DEF) + ">");
+        for (Cell c : align) {
+            c.accept(this);
+        };
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.ALIGNMENT.print(DEF) + ">");
+        writer.print("</" + SyntaxElement.RDF.print(DEF) + ">" + NL);
     }
 
-    private void printBasicOntology ( URI u, URI f ) {
-	indentedOutput("<"+SyntaxElement.ONTOLOGY.print(DEF)+" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+u+"\">"+NL);
-	increaseIndent();
-	if ( f != null ) {
-	    indentedOutputln("<"+SyntaxElement.LOCATION.print(DEF)+">"+f+"</"+SyntaxElement.LOCATION.print(DEF)+">");
-	} else {
-	    indentedOutputln("<"+SyntaxElement.LOCATION.print(DEF)+">"+u+"</"+SyntaxElement.LOCATION.print(DEF)+">");
-	}
-	decreaseIndent();
-	indentedOutput("</"+SyntaxElement.ONTOLOGY.print(DEF)+">"+NL);
+    private void printBasicOntology(URI u, URI f) {
+        indentedOutput("<" + SyntaxElement.ONTOLOGY.print(DEF) + " " + SyntaxElement.RDF_ABOUT.print(DEF) + "=\"" + u + "\">" + NL);
+        increaseIndent();
+        if (f != null) {
+            indentedOutputln("<" + SyntaxElement.LOCATION.print(DEF) + ">" + f + "</" + SyntaxElement.LOCATION.print(DEF) + ">");
+        } else {
+            indentedOutputln("<" + SyntaxElement.LOCATION.print(DEF) + ">" + u + "</" + SyntaxElement.LOCATION.print(DEF) + ">");
+        }
+        decreaseIndent();
+        indentedOutput("</" + SyntaxElement.ONTOLOGY.print(DEF) + ">" + NL);
     }
 
-    public void printOntology( Ontology onto ) {
-	URI u = onto.getURI();
-	URI f = onto.getFile();
-	indentedOutput("<"+SyntaxElement.ONTOLOGY.print(DEF)+" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+u+"\">"+NL);
-	increaseIndent();
-	if ( f != null ) {
-	    indentedOutputln("<"+SyntaxElement.LOCATION.print(DEF)+">"+f+"</"+SyntaxElement.LOCATION.print(DEF)+">");
-	} else {
-	    indentedOutputln("<"+SyntaxElement.LOCATION.print(DEF)+">"+u+"</"+SyntaxElement.LOCATION.print(DEF)+">");
-	}
-	if ( onto.getFormalism() != null ) {
-	    indentedOutputln("<"+SyntaxElement.FORMATT.print(DEF)+">");
-	    increaseIndent();
-	    indentedOutputln("<"+SyntaxElement.FORMALISM.print(DEF)+" "+SyntaxElement.NAME.print()+"=\""+onto.getFormalism()+"\" "+SyntaxElement.URI.print()+"=\""+onto.getFormURI()+"\"/>");
-	    decreaseIndent();
-	    indentedOutputln("</"+SyntaxElement.FORMATT.print(DEF)+">");
-	}
-	decreaseIndent();
-	indentedOutputln("</"+SyntaxElement.ONTOLOGY.print(DEF)+">");
+    public void printOntology(Ontology onto) {
+        URI u = onto.getURI();
+        URI f = onto.getFile();
+        indentedOutput("<" + SyntaxElement.ONTOLOGY.print(DEF) + " " + SyntaxElement.RDF_ABOUT.print(DEF) + "=\"" + u + "\">" + NL);
+        increaseIndent();
+        if (f != null) {
+            indentedOutputln("<" + SyntaxElement.LOCATION.print(DEF) + ">" + f + "</" + SyntaxElement.LOCATION.print(DEF) + ">");
+        } else {
+            indentedOutputln("<" + SyntaxElement.LOCATION.print(DEF) + ">" + u + "</" + SyntaxElement.LOCATION.print(DEF) + ">");
+        }
+        if (onto.getFormalism() != null) {
+            indentedOutputln("<" + SyntaxElement.FORMATT.print(DEF) + ">");
+            increaseIndent();
+            indentedOutputln("<" + SyntaxElement.FORMALISM.print(DEF) + " " + SyntaxElement.NAME.print() + "=\"" + onto.getFormalism() + "\" " + SyntaxElement.URI.print() + "=\"" + onto.getFormURI() + "\"/>");
+            decreaseIndent();
+            indentedOutputln("</" + SyntaxElement.FORMATT.print(DEF) + ">");
+        }
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.ONTOLOGY.print(DEF) + ">");
     }
 
-    public void visit( Cell cell ) throws AlignmentException {
-	//logger.trace( "Processing cell {}", cell );
-	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("<"+SyntaxElement.MAP.print(DEF)+">");
-	    increaseIndent();
-	    indentedOutput("<"+SyntaxElement.CELL.print(DEF));
-	    if ( cell.getId() != null && !cell.getId().equals("") ){
-		writer.print(" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+cell.getId()+"\"");
-	    }
-	    writer.print(">"+NL);
-	    increaseIndent();
-	    if ( alignment.getLevel().startsWith("2EDOAL") ) {
-		indentedOutputln("<"+SyntaxElement.ENTITY1.print(DEF)+">");
-		increaseIndent();
-		//logger.trace( "Processing ob1 {}", cell.getObject1() );
-		((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 );
-		//logger.trace( "Processing ob2 {}", cell.getObject2() );
-		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("<"+SyntaxElement.ENTITY1.print(DEF)+" "+SyntaxElement.RDF_RESOURCE.print(DEF)+"='"+u1.toString()+"'/>");
-		indentedOutputln("<"+SyntaxElement.ENTITY2.print(DEF)+" "+SyntaxElement.RDF_RESOURCE.print(DEF)+"='"+u2.toString()+"'/>");
-	    }
-	    indentedOutput("<"+SyntaxElement.RULE_RELATION.print(DEF)+">");
-	    cell.getRelation().accept( this );
-	    writer.print("</"+SyntaxElement.RULE_RELATION.print(DEF)+">"+NL);
-	    indentedOutputln("<"+SyntaxElement.MEASURE.print(DEF)+" "+SyntaxElement.RDF_DATATYPE.print(DEF)+"='"+Namespace.XSD.getUriPrefix()+"float'>"+cell.getStrength()+"</"+SyntaxElement.MEASURE.print(DEF)+">");
-	    if ( cell.getSemantics() != null &&
-		 !cell.getSemantics().equals("") &&
-		 !cell.getSemantics().equals("first-order") )
-		indentedOutputln("<"+SyntaxElement.SEMANTICS.print(DEF)+">"+cell.getSemantics()+"</"+SyntaxElement.SEMANTICS.print(DEF)+">");
-	    if ( cell.getExtensions() != null ) {
-		for ( String[] ext : cell.getExtensions() ){
-		    String uri = ext[0];
-		    String tag = nslist.get( uri );
-		    if ( tag == null ){
-			tag = ext[1];
-			// That's heavy.
-			// Maybe adding an extra: ns extension in the alignment at parsing time
-			// would help redisplaying it better...
-			indentedOutputln("<alignapilocalns:"+tag+" xmlns:alignapilocalns=\""+uri+"\">"+ext[2]+"</alignapilocalns:"+tag+">");
-		    } else {
-			tag += ":"+ext[1];
-			indentedOutputln("<"+tag+">"+ext[2]+"</"+tag+">");
-		    }
-		}
-	    }
-	    decreaseIndent();
-	    indentedOutputln("</"+SyntaxElement.CELL.print(DEF)+">");
-	    decreaseIndent();
-	    indentedOutputln("</"+SyntaxElement.MAP.print(DEF)+">");
-	}
+    public void visit(Cell cell) throws AlignmentException {
+        //logger.trace( "Processing cell {}", cell );
+        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("<" + SyntaxElement.MAP.print(DEF) + ">");
+            increaseIndent();
+            indentedOutput("<" + SyntaxElement.CELL.print(DEF));
+            if (cell.getId() != null && !cell.getId().equals("")) {
+                writer.print(" " + SyntaxElement.RDF_ABOUT.print(DEF) + "=\"" + cell.getId() + "\"");
+            }
+            writer.print(">" + NL);
+            increaseIndent();
+            if (alignment.getLevel().startsWith("2EDOAL")) {
+                indentedOutputln("<" + SyntaxElement.ENTITY1.print(DEF) + ">");
+                increaseIndent();
+                //logger.trace( "Processing ob1 {}", cell.getObject1() );
+                ((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);
+                //logger.trace( "Processing ob2 {}", cell.getObject2() );
+                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) + ">");
+                        }
+                    }
+                    Set<Linkkey> linkkeys = ((EDOALCell) cell).linkkeys();
+                    if (linkkeys != null) {
+                        for (Linkkey linkkey : linkkeys) {
+                            indentedOutputln("<" + SyntaxElement.LINKKEY.print(DEF) + ">");
+                            increaseIndent();
+                            linkkey.accept(this);
+                            decreaseIndent();
+                            writer.print(NL);
+                            indentedOutputln("</" + SyntaxElement.LINKKEY.print(DEF) + ">");
+                        }
+                    }
+                }
+            } else {
+                indentedOutputln("<" + SyntaxElement.ENTITY1.print(DEF) + " " + SyntaxElement.RDF_RESOURCE.print(DEF) + "='" + u1.toString() + "'/>");
+                indentedOutputln("<" + SyntaxElement.ENTITY2.print(DEF) + " " + SyntaxElement.RDF_RESOURCE.print(DEF) + "='" + u2.toString() + "'/>");
+            }
+            indentedOutput("<" + SyntaxElement.RULE_RELATION.print(DEF) + ">");
+            cell.getRelation().accept(this);
+            writer.print("</" + SyntaxElement.RULE_RELATION.print(DEF) + ">" + NL);
+            indentedOutputln("<" + SyntaxElement.MEASURE.print(DEF) + " " + SyntaxElement.RDF_DATATYPE.print(DEF) + "='" + Namespace.XSD.getUriPrefix() + "float'>" + cell.getStrength() + "</" + SyntaxElement.MEASURE.print(DEF) + ">");
+            if (cell.getSemantics() != null
+                    && !cell.getSemantics().equals("")
+                    && !cell.getSemantics().equals("first-order")) {
+                indentedOutputln("<" + SyntaxElement.SEMANTICS.print(DEF) + ">" + cell.getSemantics() + "</" + SyntaxElement.SEMANTICS.print(DEF) + ">");
+            }
+            if (cell.getExtensions() != null) {
+                for (String[] ext : cell.getExtensions()) {
+                    String uri = ext[0];
+                    String tag = nslist.get(uri);
+                    if (tag == null) {
+                        tag = ext[1];
+                        // That's heavy.
+                        // Maybe adding an extra: ns extension in the alignment at parsing time
+                        // would help redisplaying it better...
+                        indentedOutputln("<alignapilocalns:" + tag + " xmlns:alignapilocalns=\"" + uri + "\">" + ext[2] + "</alignapilocalns:" + tag + ">");
+                    } else {
+                        tag += ":" + ext[1];
+                        indentedOutputln("<" + tag + ">" + ext[2] + "</" + tag + ">");
+                    }
+                }
+            }
+            decreaseIndent();
+            indentedOutputln("</" + SyntaxElement.CELL.print(DEF) + ">");
+            decreaseIndent();
+            indentedOutputln("</" + SyntaxElement.MAP.print(DEF) + ">");
+        }
     }
 
-    public void visit( Relation rel ) throws AlignmentException {
-	if ( subsumedInvocableMethod( this, rel, Relation.class ) ) return;
-	// default behaviour
-	rel.write( writer );
-    };
+    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 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 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 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 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 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 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 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("/>");
+        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)+">");
+        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)+">");
+        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)+">");
+        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)+">");
+        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 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 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)+">");
+        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)+">");
+        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 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 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 {
+        indentedOutputln("<" + SyntaxElement.APPLY.print(DEF) + " " + SyntaxElement.OPERATOR.print(DEF) + "=\"" + e.getOperation() + "\">");
+        increaseIndent();
+        indentedOutputln("<" + SyntaxElement.ARGUMENTS.print(DEF) + " " + SyntaxElement.RDF_PARSETYPE.print(DEF) + "=\"Collection\">");
+        increaseIndent();
+        for (final ValueExpression ve : e.getArguments()) {
+            writer.print(linePrefix);
+            ve.accept(this);
+            writer.print(NL);
+        }
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.ARGUMENTS.print(DEF) + ">");
+        decreaseIndent();
+        indentedOutput("</" + SyntaxElement.APPLY.print(DEF) + ">");
     }
-	
-    public void visit( final Apply e ) throws AlignmentException {
-	indentedOutputln("<"+SyntaxElement.APPLY.print(DEF)+" "+SyntaxElement.OPERATOR.print(DEF)+"=\""+e.getOperation()+"\">");
-	increaseIndent();
-	indentedOutputln("<"+SyntaxElement.ARGUMENTS.print(DEF)+" "+SyntaxElement.RDF_PARSETYPE.print(DEF)+"=\"Collection\">");
-	increaseIndent();
-	for ( final ValueExpression ve : e.getArguments() ) {
-	    writer.print(linePrefix);
-	    ve.accept( this );
-	    writer.print(NL);
-	}
-	decreaseIndent();
-	indentedOutputln("</"+SyntaxElement.ARGUMENTS.print(DEF)+">");
-	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) {
+        indentedOutput("<" + SyntaxElement.EDATATYPE.print(DEF) + ">");
+        writer.print("<" + SyntaxElement.DATATYPE.print(DEF) + " " + SyntaxElement.RDF_ABOUT.print(DEF) + "=\"" + e.getType() + "\"/>");
+        writer.print("</" + SyntaxElement.EDATATYPE.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 Linkkey linkkey) throws AlignmentException {
+        indentedOutputln("<" + SyntaxElement.LINKKEYS.print(DEF) + ">");
+        increaseIndent();
+        indentedOutput("<" + SyntaxElement.LINKKEY.print(DEF) + " " + SyntaxElement.EDOAL_TYPE.print(DEF) + "=\"" + linkkey.getType() + "\">" + NL);
+        increaseIndent();
+        for(LinkkeyBinding linkkeyBinding : linkkey.bindings()){
+            linkkeyBinding.accept(this);
+        }
+        decreaseIndent();
+        indentedOutput("</" + SyntaxElement.LINKKEY.print(DEF) + ">" + NL);
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.LINKKEYS.print(DEF) + ">");
     }
 
-    public void visit( final Datatype e ) {
-	indentedOutput("<"+SyntaxElement.EDATATYPE.print(DEF)+">");
-	writer.print("<"+SyntaxElement.DATATYPE.print(DEF)+" "+SyntaxElement.RDF_ABOUT.print(DEF)+"=\""+e.getType()+"\"/>");
-	writer.print("</"+SyntaxElement.EDATATYPE.print(DEF)+">");
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        indentedOutputln("<" + SyntaxElement.LINKKEY_BINDING.print(DEF) + ">");
+        increaseIndent();
+        indentedOutput("<" + SyntaxElement.CORRESP.print(DEF) + " " + SyntaxElement.EDOAL_TYPE.print(DEF) + "=\"" + linkkeyBinding.getType() + "\">" + NL);
+        increaseIndent();
+        indentedOutputln("<" + SyntaxElement.CORRESP_PROPERTY1.print(DEF) + ">");
+        linkkeyBinding.getExpression1().accept(this);
+        indentedOutputln("</" + SyntaxElement.CORRESP_PROPERTY1.print(DEF) + ">");
+        indentedOutputln("<" + SyntaxElement.CORRESP_PROPERTY2.print(DEF) + ">");
+        linkkeyBinding.getExpression2().accept(this);
+        indentedOutputln("</" + SyntaxElement.CORRESP_PROPERTY2 .print(DEF) + ">");
+        decreaseIndent();
+        indentedOutput("</" + SyntaxElement.CORRESP.print(DEF) + ">" + NL);
+        decreaseIndent();
+        indentedOutputln("</" + SyntaxElement.LINKKEY_BINDING.print(DEF) + ">");
     }
-	
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java
index 0b8cee7f20debf3518476663b8cbc7950399fa7f..c4c28ffbf21f1d545c4d861c698208ae3fe21b5f 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SILKRendererVisitor.java
@@ -33,6 +33,8 @@ import fr.inrialpes.exmo.ontowrap.Ontology;
 import fr.inrialpes.exmo.align.impl.Namespace;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.Expression;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 import java.net.URI;
 import java.util.Enumeration;
@@ -252,5 +254,12 @@ public class SILKRendererVisitor extends GraphPatternRendererVisitor implements
 	// default behaviour
 	// rel.write( writer );
     }
+    public void visit(final Linkkey linkkey) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
+    
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
 	
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
index 29b724a7c882029c0f591b3d13fed5a9496a9741..e00ec0264a605b4eae01f214882052737e552820 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLConstructRendererVisitor.java
@@ -28,6 +28,8 @@ import org.semanticweb.owl.align.Relation;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.Expression;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 import java.io.PrintWriter;
 import java.net.URI;
@@ -142,6 +144,13 @@ public class SPARQLConstructRendererVisitor extends GraphPatternRendererVisitor
         // default behaviour
         // rel.write( writer );
     }
+    public void visit(final Linkkey linkkey) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
+    
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
 
     protected void generateConstruct(Cell cell, Expression expr1, Expression expr2) throws AlignmentException {
         // Here the generation is dependent on global variables
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
index c3bdccaea1858b1bf1d91109aac56f8e32b4f090..cc2762c81cb3547b06e45bbf397f14428f67218c 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SPARQLSelectRendererVisitor.java
@@ -28,6 +28,8 @@ import org.semanticweb.owl.align.Relation;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.Expression;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 import java.io.PrintWriter;
 import java.net.URI;
@@ -131,4 +133,12 @@ public class SPARQLSelectRendererVisitor extends GraphPatternRendererVisitor imp
 	// default behaviour
         // rel.write( writer );
     }
+    
+    public void visit(final Linkkey linkkey) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
+    
+    public void visit(final LinkkeyBinding linkkeyBinding) throws AlignmentException {
+        throw new AlignmentException("NOT IMPLEMENTED !");
+    }
 }
diff --git a/src/fr/inrialpes/exmo/align/parser/RDFParser.java b/src/fr/inrialpes/exmo/align/parser/RDFParser.java
index 60b6eeadef7ca2f18123d97a92883f9221056928..f9eed4f2d98a8f253282678ee04ae40a49ad6450 100644
--- a/src/fr/inrialpes/exmo/align/parser/RDFParser.java
+++ b/src/fr/inrialpes/exmo/align/parser/RDFParser.java
@@ -19,7 +19,6 @@
  * 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.parser;
 
 import org.semanticweb.owl.align.AlignmentException;
@@ -35,12 +34,9 @@ import fr.inrialpes.exmo.align.impl.Namespace;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
 import fr.inrialpes.exmo.align.impl.edoal.Expression;
-import fr.inrialpes.exmo.align.impl.edoal.Id;
-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.ClassRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.ClassTypeRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.ClassDomainRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.ClassValueRestriction;
@@ -49,14 +45,12 @@ import fr.inrialpes.exmo.align.impl.edoal.PathExpression;
 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.PropertyRestriction;
 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.RelationRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.RelationDomainRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.RelationCoDomainRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.InstanceExpression;
@@ -79,8 +73,6 @@ import java.io.InputStream;
 import java.io.Reader;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.Set;
-import java.util.HashSet;
 import java.util.List;
 import java.util.LinkedList;
 
@@ -96,27 +88,27 @@ import com.hp.hpl.jena.rdf.model.Literal;
 import com.hp.hpl.jena.rdf.model.Statement;
 import com.hp.hpl.jena.rdf.model.StmtIterator;
 import com.hp.hpl.jena.rdf.model.RDFNode;
-import com.hp.hpl.jena.rdf.model.RDFList;
-import com.hp.hpl.jena.rdf.model.Container;
-import com.hp.hpl.jena.rdf.model.NodeIterator;
-import com.hp.hpl.jena.rdf.model.impl.RDFDefaultErrorHandler;
 import com.hp.hpl.jena.vocabulary.RDF;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
+import java.io.StringWriter;
 
 /**
  * <p>
  * Parser for the EDOAL syntax. The reader is Jena, input is an EDOALAlignment
- * The input document format shall be consistent with format document 
- * 
+ * The input document format shall be consistent with format document
+ *
  * </p>
  * <p>
  * $Id$
  * </p>
- * 
+ *
  * @author Richard Pöttler
  * @version $Revision: 1.7 $
  */
 public class RDFParser {
-    final static Logger logger = LoggerFactory.getLogger( RDFParser.class );
+
+    final static Logger logger = LoggerFactory.getLogger(RDFParser.class);
 
     private static Model rDFModel;
 
@@ -125,773 +117,913 @@ public class RDFParser {
 
     private EDOALAlignment alignment;
 
-    /** 
+    /**
      * Creates an RDF Parser.
      */
-    public RDFParser() {}
+    public RDFParser() {
+    }
 
-    /** 
+    /**
      * Creates an RDF Parser.
+     *
      * @param debugMode The value of the debug mode (DEPRECATED)
      */
-    public RDFParser( int debugMode ) {}
+    public RDFParser(int debugMode) {
+    }
 
     /**
-     * Initialisation of the structures
-     * This creates an RDF Model which contains all the syntactic elements.
-     * This is to be called before parsing, i.e., before exploring RDF resources
+     * Initialisation of the structures This creates an RDF Model which contains
+     * all the syntactic elements. This is to be called before parsing, i.e.,
+     * before exploring RDF resources
      */
     public static void initSyntax() {
-	if ( rDFModel == null ) {
-	    rDFModel = ModelFactory.createDefaultModel();
-	    for ( SyntaxElement el : SyntaxElement.values() ) {
-		if ( el.isProperty == true ) {
-		    el.resource = rDFModel.createProperty( el.id() );
-		} else {
-		    el.resource = rDFModel.createResource( el.id() );
-		}
-	    }
-	}
+        if (rDFModel == null) {
+            rDFModel = ModelFactory.createDefaultModel();
+            for (SyntaxElement el : SyntaxElement.values()) {
+                if (el.isProperty == true) {
+                    el.resource = rDFModel.createProperty(el.id());
+                } else {
+                    el.resource = rDFModel.createResource(el.id());
+                }
+            }
+        }
     }
 
     /**
-     * Parse the input model. The model shall include one statement that include (?,RDF.type,Alignment)
-     * @param rdfmodel the rdfmodel containing the RDF representation of the parsed alignment
+     * Parse the input model. The model shall include one statement that include
+     * (?,RDF.type,Alignment)
+     *
+     * @param rdfmodel the rdfmodel containing the RDF representation of the
+     * parsed alignment
      * @return the result EDOALAlignment
-     * @throws AlignmentException if there is any exception, throw AlignmentException that include describe infomation
-     * and a caused exception.
+     * @throws AlignmentException if there is any exception, throw
+     * AlignmentException that include describe infomation and a caused
+     * exception.
      */
-    public EDOALAlignment parse( final Model rdfmodel ) throws AlignmentException {
-	// Initialize the syntax description
-	initSyntax();
-	// Get the statement including alignment resource as rdf:type
-	StmtIterator stmtIt = rdfmodel.listStatements(null, RDF.type,(Resource)SyntaxElement.getResource("Alignment"));
-	// Take the first one if it exists
-	if ( !stmtIt.hasNext() ) throw new AlignmentException("There is no alignment in the RDF document");
-	Statement alignDoc = stmtIt.nextStatement();
-	// Step from this statement
-	alignment = parseAlignment( alignDoc.getSubject() );
-	// If necessary type-check the alignment
-	if ( !speedparse ) alignment.accept( new TypeCheckingVisitor() );
-	// Clean up memory
-	rdfmodel.close();
-	return alignment;
+    public EDOALAlignment parse(final Model rdfmodel) throws AlignmentException {
+        // Initialize the syntax description
+        initSyntax();
+        // Get the statement including alignment resource as rdf:type
+        StmtIterator stmtIt = rdfmodel.listStatements(null, RDF.type, (Resource) SyntaxElement.getResource("Alignment"));
+        // Take the first one if it exists
+        if (!stmtIt.hasNext()) {
+            throw new AlignmentException("There is no alignment in the RDF document");
+        }
+        Statement alignDoc = stmtIt.nextStatement();
+        // Step from this statement
+        alignment = parseAlignment(alignDoc.getSubject());
+        // If necessary type-check the alignment
+        if (!speedparse) {
+            alignment.accept(new TypeCheckingVisitor());
+        }
+        // Clean up memory
+        rdfmodel.close();
+        return alignment;
     }
 
     // Below is the plumbing:
     // Load the RDF under an RDFModel
     // Call the above parse: RDFModel -> EDOALAlignment
-
-    public EDOALAlignment parse( final File file ) throws AlignmentException {
-	try {
-	    return parse( new FileInputStream( file ) );
-	} catch ( FileNotFoundException fnfe ) {
-	    throw new AlignmentException("RDFParser: There isn't such file: "+ file.getName(), fnfe);
-	}
+    public EDOALAlignment parse(final File file) throws AlignmentException {
+        try {
+            return parse(new FileInputStream(file));
+        } catch (FileNotFoundException fnfe) {
+            throw new AlignmentException("RDFParser: There isn't such file: " + file.getName(), fnfe);
+        }
     }
 
-    public EDOALAlignment parse( final Reader is ) throws AlignmentException {
-	if (is == null) throw new AlignmentException("The reader must not be null");
-	Model align = ModelFactory.createDefaultModel();
-	align.read( is, null );
-	return parse( align );
+    public EDOALAlignment parse(final Reader is) throws AlignmentException {
+        if (is == null) {
+            throw new AlignmentException("The reader must not be null");
+        }
+        Model align = ModelFactory.createDefaultModel();
+        align.read(is, null);
+        return parse(align);
     }
-    
-    public EDOALAlignment parse( final InputStream is ) throws AlignmentException {
-	if (is == null) throw new AlignmentException("The inputstream must not be null");
-	Model align = ModelFactory.createDefaultModel();
-	align.read( is, null );
-	return parse( align );
+
+    public EDOALAlignment parse(final InputStream is) throws AlignmentException {
+        if (is == null) {
+            throw new AlignmentException("The inputstream must not be null");
+        }
+        Model align = ModelFactory.createDefaultModel();
+        align.read(is, null);
+        return parse(align);
     }
 
-    public EDOALAlignment parse( final String uri ) throws AlignmentException {
-	Model align = ModelFactory.createDefaultModel();
-	align.read( uri );
-	return parse( align );
+    public EDOALAlignment parse(final String uri) throws AlignmentException {
+        Model align = ModelFactory.createDefaultModel();
+        align.read(uri);
+        return parse(align);
     }
 
     // Below is the real work
     /**
      * Parses a mapping document. The resource passed to this method must be a
      * <code>&lt;Alignment&gt;</code> tag.
-     * 
-     * @param node    the alignment resource
+     *
+     * @param node the alignment resource
      * @return the parsed mapping document
      * @throws AlignmentException
      */
-    public EDOALAlignment parseAlignment( final Resource node ) throws AlignmentException {
-	if (node == null) throw new NullPointerException("Alignment must not be null");
-	try {
-	    Ontology source = null;
-	    Ontology target = null;
-	    
-	    // getting the id of the document
-	    final URI id = getNodeId( node );
-	    
-	    alignment = new EDOALAlignment();
-	    if ( id != null )
-		alignment.setExtension( Namespace.ALIGNMENT.uri, Annotations.ID, id.toString() );
-	    
-	    StmtIterator stmtIt = node.listProperties((Property)SyntaxElement.MAPPING_SOURCE.resource );
-	    if ( stmtIt.hasNext() ) {
-		source = parseOntology( stmtIt.nextStatement().getResource() );
-	    } else {
-		throw new AlignmentException( "Missing ontology "+"onto1" );
-	    }
-	    stmtIt = node.listProperties((Property)SyntaxElement.MAPPING_TARGET.resource );
-	    if ( stmtIt.hasNext() ) {
-		target = parseOntology( stmtIt.nextStatement().getResource() );
-	    } else {
-		throw new AlignmentException( "Missing ontology "+"onto2" );
-	    }
-	    stmtIt = node.listProperties((Property)SyntaxElement.LEVEL.resource );
-	    if ( stmtIt.hasNext() ) {
-		final String level = stmtIt.nextStatement().getString();
-		if ((level != null) && (!level.equals(""))) {
-		    //if ( level.equals("0") ) {
-		    //	alignment.setLevel( level );
-		    //} else 
-		    if ( level.startsWith("2EDOAL") ) {
-			alignment.setLevel( level );
-			if ( level.equals("2EDOALPattern") ) isPattern = true;
-		    } else {
-			throw new AlignmentException( "Cannot parse alignment of level "+level );
-		    }
-		}			    
-	    } else {
-		throw new AlignmentException( "Missing level " );
-	    }
-	    stmtIt = node.listProperties((Property)SyntaxElement.TYPE.resource );
-	    if ( stmtIt.hasNext() ) {
-		final String arity = stmtIt.nextStatement().getString();
-		if ((arity != null) && (!arity.equals(""))) {
-		    alignment.setType( arity );
-		}
-	    } else {
-		throw new AlignmentException( "Missing type " );
-	    }
-	    
-	    stmtIt = node.listProperties((Property)SyntaxElement.MAP.resource );
-	    while (stmtIt.hasNext()) {
-		Statement stmt = stmtIt.nextStatement();
-		//logger.trace( "  ---------------> {}", stmt );
-		try { alignment.addAlignCell( parseCell( stmt.getResource() ) ); }
-		catch ( AlignmentException ae ) {
-		    logger.debug( "IGNORED Exception", ae );
-		}
-	    }
-
-	    // Remaining resources...
-	    // rdf:type must be forgotten
-	    //else if ( !pred.equals( SyntaxElement.getResource("rdftype") ) ) { // Unknown is annotation
-	    //	parseAnnotation( stmt, alignment );
-	    //}
-
-	    if ( source != null && target != null ) {
-		alignment.init( source, target );
-	    } else {
-		throw new IllegalArgumentException("Missing ontology description");
-	    }
-	    return alignment;
-	    
-	} catch (AlignmentException e) {
-	    throw e;
-	} catch (Exception e) {
-	    throw new AlignmentException("There is some error in parsing alignment: " + node.getLocalName(), e);
-	}
+    public EDOALAlignment parseAlignment(final Resource node) throws AlignmentException {
+        if (node == null) {
+            throw new NullPointerException("Alignment must not be null");
+        }
+        try {
+            Ontology source = null;
+            Ontology target = null;
+
+            // getting the id of the document
+            final URI id = getNodeId(node);
+
+            alignment = new EDOALAlignment();
+            if (id != null) {
+                alignment.setExtension(Namespace.ALIGNMENT.uri, Annotations.ID, id.toString());
+            }
+
+            StmtIterator stmtIt = node.listProperties((Property) SyntaxElement.MAPPING_SOURCE.resource);
+            if (stmtIt.hasNext()) {
+                source = parseOntology(stmtIt.nextStatement().getResource());
+            } else {
+                throw new AlignmentException("Missing ontology " + "onto1");
+            }
+            stmtIt = node.listProperties((Property) SyntaxElement.MAPPING_TARGET.resource);
+            if (stmtIt.hasNext()) {
+                target = parseOntology(stmtIt.nextStatement().getResource());
+            } else {
+                throw new AlignmentException("Missing ontology " + "onto2");
+            }
+            stmtIt = node.listProperties((Property) SyntaxElement.LEVEL.resource);
+            if (stmtIt.hasNext()) {
+                final String level = stmtIt.nextStatement().getString();
+                if ((level != null) && (!level.equals(""))) {
+                    //if ( level.equals("0") ) {
+                    //	alignment.setLevel( level );
+                    //} else 
+                    if (level.startsWith("2EDOAL")) {
+                        alignment.setLevel(level);
+                        if (level.equals("2EDOALPattern")) {
+                            isPattern = true;
+                        }
+                    } else {
+                        throw new AlignmentException("Cannot parse alignment of level " + level);
+                    }
+                }
+            } else {
+                throw new AlignmentException("Missing level ");
+            }
+            stmtIt = node.listProperties((Property) SyntaxElement.TYPE.resource);
+            if (stmtIt.hasNext()) {
+                final String arity = stmtIt.nextStatement().getString();
+                if ((arity != null) && (!arity.equals(""))) {
+                    alignment.setType(arity);
+                }
+            } else {
+                throw new AlignmentException("Missing type ");
+            }
+
+            stmtIt = node.listProperties((Property) SyntaxElement.MAP.resource);
+            while (stmtIt.hasNext()) {
+                Statement stmt = stmtIt.nextStatement();
+                //logger.trace( "  ---------------> {}", stmt );
+                try {
+                    alignment.addAlignCell(parseCell(stmt.getResource()));
+                } catch (AlignmentException ae) {
+                    logger.debug("IGNORED Exception", ae);
+                }
+            }
+
+            // Remaining resources...
+            // rdf:type must be forgotten
+            //else if ( !pred.equals( SyntaxElement.getResource("rdftype") ) ) { // Unknown is annotation
+            //	parseAnnotation( stmt, alignment );
+            //}
+            if (source != null && target != null) {
+                alignment.init(source, target);
+            } else {
+                throw new IllegalArgumentException("Missing ontology description");
+            }
+            return alignment;
+
+        } catch (AlignmentException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new AlignmentException("There is some error in parsing alignment: " + node.getLocalName(), e);
+        }
     }
 
     /**
      * Parse an ontology node <code>&lt;onto1&gt;</code> or
      * <code>&lt;onto2&gt;</code> Node to an Ontology object. The node must
      * contain the <code>&lt;onto...&gt;</code> element.
-     * 
-     * @param node
-     *            the ontology node
+     *
+     * @param node the ontology node
      * @return the Ontology object
-     * @throws NullPointerException
-     *             if the node is null
+     * @throws NullPointerException if the node is null
      */
     protected Ontology parseOntology(final Resource node) throws AlignmentException {
-	if (node == null) throw new AlignmentException("The Ontology node must not be null");
-	try {
-	    Resource formu = node.getProperty((Property)SyntaxElement.FORMATT.resource).getResource();
-	    final String formalismName = formu.getProperty((Property)SyntaxElement.NAME.resource).getString();
-	    final String formalismUri = formu.getProperty((Property)SyntaxElement.URI.resource).getString();
-	    final Statement location = node.getProperty((Property)SyntaxElement.LOCATION.resource);
-	    Ontology onto = new BasicOntology();
-	    onto.setURI( new URI( node.getURI() ) );
-	    onto.setFormURI( new URI( formalismUri ) );
-	    onto.setFormalism( formalismName );
-	    if ( location != null ) onto.setFile( new URI( location.getString() ) );
-	    return onto;
-	} catch ( Exception e ) {
-	    throw new AlignmentException("The Ontology node is not correct: "+ node.getLocalName(), e);
-	}
+        if (node == null) {
+            throw new AlignmentException("The Ontology node must not be null");
+        }
+        try {
+            Resource formu = node.getProperty((Property) SyntaxElement.FORMATT.resource).getResource();
+            final String formalismName = formu.getProperty((Property) SyntaxElement.NAME.resource).getString();
+            final String formalismUri = formu.getProperty((Property) SyntaxElement.URI.resource).getString();
+            final Statement location = node.getProperty((Property) SyntaxElement.LOCATION.resource);
+            Ontology onto = new BasicOntology();
+            onto.setURI(new URI(node.getURI()));
+            onto.setFormURI(new URI(formalismUri));
+            onto.setFormalism(formalismName);
+            if (location != null) {
+                onto.setFile(new URI(location.getString()));
+            }
+            return onto;
+        } catch (Exception e) {
+            throw new AlignmentException("The Ontology node is not correct: " + node.getLocalName(), e);
+        }
     }
 
     /**
-     * Parses a mapping rule. The parsed node must be a Cell resource including the mandatory Statement.
-     * <code>&lt;Cell&gt;</code> tag.
-     * 
-     * @param node
-     *            the <code>&lt;Cell&gt;</code> tag
+     * Parses a mapping rule. The parsed node must be a Cell resource including
+     * the mandatory Statement. <code>&lt;Cell&gt;</code> tag.
+     *
+     * @param node the <code>&lt;Cell&gt;</code> tag
      * @return the parsed rule
      * @exception AlignmentException
      */
-    protected EDOALCell parseCell( final Resource node ) throws AlignmentException {
-	if (node == null) {
-	    throw new NullPointerException("The node must not be null");
-	}
-	try {
-	    // Should be better to use Alignment API relation recognition
-	    // determine the relation, the relation shall be Literal
-	    Statement st = node.getProperty((Property)SyntaxElement.RULE_RELATION.resource);
-	    if ( st == null ) {
-		throw new AlignmentException("Correspondence must contain a relation" + node.getLocalName());
-	    }
-	    final String relation = st.getString();
-	    //Get the relation
-	    final Relation type = BasicRelation.createRelation( relation );
-	    if (type == null) {	// I raise an error in this case anyway
-		throw new IllegalArgumentException("Cannot parse the string \""+relation+"\" to a valid relation");
-	    }
-	    // parse the measure, the node shall be Literal and it's a number
-	    st = node.getProperty((Property)SyntaxElement.MEASURE.resource);
-	    if ( st == null ) {
-		throw new AlignmentException("Correspondence must contain a measure" + node.getLocalName());
-	    }
-	    final float m = st.getFloat();
-	    // get the id
-	    final String id = node.getURI();
-	    //parsing the entity1 and entity2 
-	    st = node.getProperty((Property)SyntaxElement.ENTITY1.resource);
-	    if ( st == null ) {
-		throw new AlignmentException("Correspondence must contain an entity1" + node.getLocalName());
-	    }
-	    Resource entity1 = st.getResource();
-	    st = node.getProperty((Property)SyntaxElement.ENTITY2.resource);
-	    if ( st == null ) {
-		throw new AlignmentException("Correspondence must contain an entity2" + node.getLocalName());
-	    }
-	    Resource entity2 = st.getResource();
-	    // JE2010:
-	    // Here it would be better to check if the entity has a type.
-	    // If both have none, then we get a old-style correspondence for free
-	    // If it has one, let's go parsing
-	    // I also assume that the factory only do dispatch
-	    // JE2010 ~later: that would also allow for parsing old alignments
-	    
-	    Expression s = parseExpression( entity1 );
-	    Expression t = parseExpression( entity2 );
-	    //logger.trace(" s : {}", s);	    
-	    //logger.trace(" t : {}", t);
-
-	    EDOALCell cell = new EDOALCell( id, s, t, type, m );
-	    // Parse the possible transformations
-	    StmtIterator stmtIt = node.listProperties((Property)SyntaxElement.TRANSFORMATION.resource );
-	    while ( stmtIt.hasNext() ) {
-		Statement stmt = stmtIt.nextStatement();
-		try { cell.addTransformation( parseTransformation( stmt.getResource() ) ); }
-		catch ( AlignmentException ae ) {
-		    logger.debug( "INGORED Exception", ae );
-		}
-	    }
-	    return cell;
-	} catch (Exception e) {  //wrap other type exception
-	    throw new AlignmentException("Cannot parse correspondence " + node.getLocalName(), e);
-	}
+    protected EDOALCell parseCell(final Resource node) throws AlignmentException {
+        if (node == null) {
+            throw new NullPointerException("The node must not be null");
+        }
+        try {
+            // Should be better to use Alignment API relation recognition
+            // determine the relation, the relation shall be Literal
+            Statement st = node.getProperty((Property) SyntaxElement.RULE_RELATION.resource);
+            if (st == null) {
+                throw new AlignmentException("Correspondence must contain a relation" + node.getLocalName());
+            }
+            final String relation = st.getString();
+            //Get the relation
+            final Relation type = BasicRelation.createRelation(relation);
+            if (type == null) {	// I raise an error in this case anyway
+                throw new IllegalArgumentException("Cannot parse the string \"" + relation + "\" to a valid relation");
+            }
+            // parse the measure, the node shall be Literal and it's a number
+            st = node.getProperty((Property) SyntaxElement.MEASURE.resource);
+            if (st == null) {
+                throw new AlignmentException("Correspondence must contain a measure" + node.getLocalName());
+            }
+            final float m = st.getFloat();
+            // get the id
+            final String id = node.getURI();
+            //parsing the entity1 and entity2 
+            st = node.getProperty((Property) SyntaxElement.ENTITY1.resource);
+            if (st == null) {
+                throw new AlignmentException("Correspondence must contain an entity1" + node.getLocalName());
+            }
+            Resource entity1 = st.getResource();
+            st = node.getProperty((Property) SyntaxElement.ENTITY2.resource);
+            if (st == null) {
+                throw new AlignmentException("Correspondence must contain an entity2" + node.getLocalName());
+            }
+            Resource entity2 = st.getResource();
+            // JE2010:
+            // Here it would be better to check if the entity has a type.
+            // If both have none, then we get a old-style correspondence for free
+            // If it has one, let's go parsing
+            // I also assume that the factory only do dispatch
+            // JE2010 ~later: that would also allow for parsing old alignments
+
+            Expression s = parseExpression(entity1);
+            Expression t = parseExpression(entity2);
+            //logger.trace(" s : {}", s);	    
+            //logger.trace(" t : {}", t);
+
+            EDOALCell cell = new EDOALCell(id, s, t, type, m);
+            // Parse the possible transformations
+            StmtIterator stmtIt = node.listProperties((Property) SyntaxElement.TRANSFORMATION.resource);
+            while (stmtIt.hasNext()) {
+                Statement stmt = stmtIt.nextStatement();
+                try {
+                    cell.addTransformation(parseTransformation(stmt.getResource()));
+                } catch (AlignmentException ae) {
+                    logger.debug("INGORED Exception on Transformation parsing", ae);
+                }
+            }
+            //parse the linkkeys
+            stmtIt = node.listProperties((Property) SyntaxElement.LINKKEYS.resource);
+            while (stmtIt.hasNext()) {
+                Statement stmt = stmtIt.nextStatement();
+                //logger.trace( "  ---------------> {}", stmt );
+                try {
+                    cell.addLinkkey(parseLinkkey(stmt.getResource()));
+                } catch (AlignmentException ae) {
+                    logger.debug("IGNORED Exception linkkeys parsing", ae);
+                }
+            }
+
+            return cell;
+        } catch (Exception e) {  //wrap other type exception
+            throw new AlignmentException("Cannot parse correspondence " + node.getLocalName(), e);
+        }
     }
 
-    protected Transformation parseTransformation( final Resource node ) throws AlignmentException {
-	if (node == null) throw new NullPointerException("The node must not be null");
-	try {
-	    // parsing type
-	    Statement stmt = node.getProperty( (Property)SyntaxElement.TRDIR.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required "+SyntaxElement.TRDIR.print()+" property in Transformation" );
-	    String type = stmt.getLiteral().toString();
-	    // parsing entity1 and entity2 
-	    Resource entity1 = node.getProperty((Property)SyntaxElement.TRENT1.resource).getResource();
-	    Resource entity2 = node.getProperty((Property)SyntaxElement.TRENT2.resource).getResource();
-	    ValueExpression s = parseValue( entity1 );
-	    ValueExpression t = parseValue( entity2 );
-	    //logger.trace(" (Transf)s : {}", s);	    
-	    //logger.trace(" (Transf)t : {}", t);
-	    return new Transformation( type, s, t );
-	} catch (Exception e) {  //wrap other type exception
-	    throw new AlignmentException("Cannot parse transformation " + node, e);
-	}
+    protected Transformation parseTransformation(final Resource node) throws AlignmentException {
+        if (node == null) {
+            throw new NullPointerException("The node must not be null");
+        }
+        try {
+            // parsing type
+            Statement stmt = node.getProperty((Property) SyntaxElement.TRDIR.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required " + SyntaxElement.TRDIR.print() + " property in Transformation");
+            }
+            String type = stmt.getLiteral().toString();
+            // parsing entity1 and entity2 
+            Resource entity1 = node.getProperty((Property) SyntaxElement.TRENT1.resource).getResource();
+            Resource entity2 = node.getProperty((Property) SyntaxElement.TRENT2.resource).getResource();
+            ValueExpression s = parseValue(entity1);
+            ValueExpression t = parseValue(entity2);
+            //logger.trace(" (Transf)s : {}", s);	    
+            //logger.trace(" (Transf)t : {}", t);
+            return new Transformation(type, s, t);
+        } catch (Exception e) {  //wrap other type exception
+            throw new AlignmentException("Cannot parse transformation " + node, e);
+        }
+    }
+
+    protected Linkkey parseLinkkey(final Resource node) throws AlignmentException {
+        if (node == null) {
+            throw new NullPointerException("The node must not be null");
+        }
+        try {
+            // parsing type
+            Statement stmt = node.getProperty((Property) SyntaxElement.EDOAL_TYPE.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required " + SyntaxElement.EDOAL_TYPE.print() + " property in Linkkey");
+            }
+            String type = stmt.getLiteral().toString();
+            Linkkey linkkey = new Linkkey(type);
+
+            StmtIterator stmtIt = node.listProperties((Property) SyntaxElement.LINKKEY_BINDING.resource);
+            while (stmtIt.hasNext()) {
+                Statement bindingStmt = stmtIt.nextStatement();
+                try {
+                    linkkey.addBinding(parseLinkkeyBinding(bindingStmt.getResource()));
+                } catch (AlignmentException ae) {
+                    logger.debug("IGNORED Exception", ae);
+                }
+            }
+            return linkkey;
+        } catch (Exception e) {  //wrap other type exception
+            throw new AlignmentException("Cannot parse linkkey " + node, e);
+        }
+    }
+
+    protected LinkkeyBinding parseLinkkeyBinding(final Resource node) throws AlignmentException {
+        if (node == null) {
+            throw new NullPointerException("The node must not be null");
+        }
+        try {
+            Statement bindingTypeStmt = node.getProperty((Property) SyntaxElement.EDOAL_TYPE.resource);
+            if (bindingTypeStmt == null) {
+                throw new AlignmentException("Required " + SyntaxElement.EDOAL_TYPE.print() + " property in Corresp");
+            }
+            String bindingType = bindingTypeStmt.getLiteral().toString();
+            Statement property1Stmt = node.getProperty((Property) SyntaxElement.CORRESP_PROPERTY1.resource);
+            Statement property2Stmt = node.getProperty((Property) SyntaxElement.CORRESP_PROPERTY2.resource);
+            if (property1Stmt == null || property2Stmt == null) {
+                throw new AlignmentException("Required " + SyntaxElement.CORRESP_PROPERTY1.print() + " and " + SyntaxElement.CORRESP_PROPERTY2.print() + " properties in Linkkey binding corresp.");
+            }
+            PathExpression pathExpression1 = parsePathExpression(property1Stmt.getResource());
+            PathExpression pathExpression2 = parsePathExpression(property2Stmt.getResource());
+            return new LinkkeyBinding(pathExpression1, pathExpression2, bindingType);
+        } catch (Exception e) {  //wrap other type exception
+            throw new AlignmentException("Cannot parse linkkey " + node, e);
+        }
     }
 
     // Here given the type of expression, this can be grand dispatch
-    protected Expression parseExpression( final Resource node ) throws AlignmentException {
-	Expression result;
-	Resource rdfType = node.getProperty( RDF.type ).getResource();
-	if ( rdfType.equals( SyntaxElement.CLASS_EXPR.resource ) ||
-	     rdfType.equals( SyntaxElement.OCCURENCE_COND.resource ) ||
-	     rdfType.equals( SyntaxElement.DOMAIN_RESTRICTION.resource ) ||
-	     rdfType.equals( SyntaxElement.TYPE_COND.resource ) ||
-	     rdfType.equals( SyntaxElement.VALUE_COND.resource ) ) {
-	    result = parseClass( node );
-	} else if ( rdfType.equals( SyntaxElement.PROPERTY_EXPR.resource ) ||
-		    rdfType.equals( SyntaxElement.PROPERTY_DOMAIN_COND.resource ) ||
-		    rdfType.equals( SyntaxElement.PROPERTY_TYPE_COND.resource ) ||
-		    rdfType.equals( SyntaxElement.PROPERTY_VALUE_COND.resource ) ) {
-	    result = parseProperty( node );
-	} else if ( rdfType.equals( SyntaxElement.RELATION_EXPR.resource ) ||
-		    rdfType.equals( SyntaxElement.RELATION_DOMAIN_COND.resource ) || // no chance
-		    rdfType.equals( SyntaxElement.RELATION_CODOMAIN_COND.resource ) ) {
-	    result = parseRelation( node );
-	} else if ( rdfType.equals( SyntaxElement.INSTANCE_EXPR.resource ) ) {
-	    result = parseInstance( node );
-	} else {
-	    throw new AlignmentException("There is no parser for entity "+rdfType.getLocalName());
-	}
-	if ( isPattern ) {
-	    StmtIterator stmtIt = node.listProperties( (Property)SyntaxElement.VAR.resource );
-	    if ( stmtIt.hasNext() ) {
-		final String varname = stmtIt.nextStatement().getString();
-		final Variable var = alignment.recordVariable( varname, result );
-		result.setVariable( var );
-	    }
-	}
-	return result;
+    protected Expression parseExpression(final Resource node) throws AlignmentException {
+        Expression result;
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        if (rdfType.equals(SyntaxElement.CLASS_EXPR.resource)
+                || rdfType.equals(SyntaxElement.OCCURENCE_COND.resource)
+                || rdfType.equals(SyntaxElement.DOMAIN_RESTRICTION.resource)
+                || rdfType.equals(SyntaxElement.TYPE_COND.resource)
+                || rdfType.equals(SyntaxElement.VALUE_COND.resource)) {
+            result = parseClass(node);
+        } else if (rdfType.equals(SyntaxElement.PROPERTY_EXPR.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_DOMAIN_COND.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_TYPE_COND.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_VALUE_COND.resource)) {
+            result = parseProperty(node);
+        } else if (rdfType.equals(SyntaxElement.RELATION_EXPR.resource)
+                || rdfType.equals(SyntaxElement.RELATION_DOMAIN_COND.resource) || // no chance
+                rdfType.equals(SyntaxElement.RELATION_CODOMAIN_COND.resource)) {
+            result = parseRelation(node);
+        } else if (rdfType.equals(SyntaxElement.INSTANCE_EXPR.resource)) {
+            result = parseInstance(node);
+        } else {
+            throw new AlignmentException("There is no parser for entity " + rdfType.getLocalName());
+        }
+        if (isPattern) {
+            StmtIterator stmtIt = node.listProperties((Property) SyntaxElement.VAR.resource);
+            if (stmtIt.hasNext()) {
+                final String varname = stmtIt.nextStatement().getString();
+                final Variable var = alignment.recordVariable(varname, result);
+                result.setVariable(var);
+            }
+        }
+        return result;
     }
-    
-    protected ClassExpression parseClass( final Resource node ) throws AlignmentException {
-	//StmtIterator it = node.listProperties();
-	//while ( it.hasNext() ) logger.trace( "   > {}", it.next() );
-	Resource rdfType = node.getProperty(RDF.type).getResource();
-	if ( rdfType.equals( SyntaxElement.CLASS_EXPR.resource ) ) {
-	    URI id = getNodeId( node );
-	    if ( id != null ) {
-		return new ClassId( id );
-	    } else {
-		Statement stmt = null;
-		Constructor op = null;
-		// Using a List preserves the order... useful mostly for COMPOSE
-		// Given the Jena encoding of Collection, LinkedList seems the best
-		List<ClassExpression> clexpr = new LinkedList<ClassExpression>();
-		if ( node.hasProperty( (Property)SyntaxElement.AND.resource ) ) {
-		    op = SyntaxElement.AND.getOperator();
-		    // listProperties would give them all
-		    stmt = node.getProperty( (Property)SyntaxElement.AND.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.OR.resource ) ) { 
-		    op = SyntaxElement.OR.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.OR.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.NOT.resource ) ) {
-		    op = SyntaxElement.NOT.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.NOT.resource );
-		} else {
-		    if ( isPattern ) { // not necessarily with a variable (real patterns)
-			return new ClassId();
-		    } else {
-			throw new AlignmentException( "Class statement must containt one constructor or Id : "+node );
-		    }
-		}
-		// Jena encode these collections as first/rest statements
-		Object o = stmt.getObject();
-		Resource coll = null; // Errors if null tackled below
-		if ( o instanceof Resource) coll = (Resource)o;
-		if ( o instanceof Literal && !o.toString().equals("") )
-		    throw new AlignmentException( "Invalid content of constructor : "+o );
-		if ( op == SyntaxElement.NOT.getOperator() ) {
-		    if ( coll == null )
-		    	throw new AlignmentException( "NOT constructor cannot be empty : "+node );
-		    clexpr.add( parseClass( coll ) );
-		} else {
-		    if ( coll != null ) {
-			 while ( !RDF.nil.getURI().equals( coll.getURI() ) ) {
-			     clexpr.add( parseClass( coll.getProperty( RDF.first ).getResource() ) );
-			     coll = coll.getProperty( RDF.rest ).getResource(); // MUSTCHECK
-			 }
-		    }
-		}
-		return new ClassConstruction( op, clexpr );
-	    }
-	} else {
-	    if ( !rdfType.equals( SyntaxElement.OCCURENCE_COND.resource ) &&
-		 !rdfType.equals( SyntaxElement.DOMAIN_RESTRICTION.resource ) &&
-		 !rdfType.equals( SyntaxElement.TYPE_COND.resource ) &&
-		 !rdfType.equals( SyntaxElement.VALUE_COND.resource ) ) {
-		throw new AlignmentException( "Bad class restriction type : "+rdfType );
-	    }
-	    PathExpression pe;
-	    Comparator comp;
-	    // Find onAttribute
-	    Statement stmt = node.getProperty( (Property)SyntaxElement.ONPROPERTY.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:onAttribute property" );
-	    pe = parsePathExpression( stmt.getResource() ); // MUSTCHECK
-	    if ( rdfType.equals( SyntaxElement.TYPE_COND.resource ) ) {
-		// Check that pe is a Property / Relation
-		// ==> different treatment
-		stmt = node.getProperty( (Property)SyntaxElement.EDATATYPE.resource );
-		if ( stmt == null ) throw new AlignmentException( "Required "+SyntaxElement.EDATATYPE.print()+" property" );
-		return new ClassTypeRestriction( pe, parseDatatype( stmt.getObject() ) );
-	    } else if ( rdfType.equals( SyntaxElement.DOMAIN_RESTRICTION.resource ) ) {
-		if ( (stmt = node.getProperty( (Property)SyntaxElement.TOCLASS.resource ) ) != null || (stmt = node.getProperty( (Property)SyntaxElement.ALL.resource ) ) != null ) {
-		    RDFNode nn = stmt.getObject();
-		    if ( !nn.isResource() ) throw new AlignmentException( "Incorrect class expression "+nn );
-		    return new ClassDomainRestriction( pe, true, parseClass( (Resource)nn ) );
-		} else if ( (stmt = node.getProperty( (Property)SyntaxElement.EXISTS.resource ) ) != null ) {
-		    RDFNode nn = stmt.getObject();
-		    if ( !nn.isResource() ) throw new AlignmentException( "Incorrect class expression "+nn );
-		    return new ClassDomainRestriction( pe, false, parseClass( (Resource)nn ) );
-		} else throw new AlignmentException( "Required edoal:class property" );
-	    } else { // It is a Value or Occurence restruction
-		// Find comparator
-		stmt = node.getProperty( (Property)SyntaxElement.COMPARATOR.resource );
-		if ( stmt == null ) throw new AlignmentException( "Required edoal:comparator property" );
-		URI id = getNodeId( stmt.getResource() );
-		if ( id != null ) comp = Comparator.getComparator( id );
-		else throw new AlignmentException("edoal:comparator requires a URI");
-		if ( rdfType.equals( SyntaxElement.OCCURENCE_COND.resource ) ) {
-		    stmt = node.getProperty( (Property)SyntaxElement.VALUE.resource );
-		    if ( stmt == null ) throw new AlignmentException( "Required edoal:value property" );
-		    RDFNode nn = stmt.getObject();
-		    if ( nn.isLiteral() ) {
-			return new ClassOccurenceRestriction( pe, comp, ((Literal)nn).getInt() );
-		    } else {
-			throw new AlignmentException( "Bad occurence specification : "+nn );
-		    }
-		} else if ( rdfType.equals( SyntaxElement.VALUE_COND.resource ) ) {
-		    stmt = node.getProperty( (Property)SyntaxElement.VALUE.resource );
-		    if ( stmt == null ) throw new AlignmentException( "Required edoal:value property" );
-		    ValueExpression v = parseValue( stmt.getObject() );
-		    return new ClassValueRestriction( pe, comp, v );
-		}
-	    }
-	}
-	return null;
+
+    protected ClassExpression parseClass(final Resource node) throws AlignmentException {
+        //StmtIterator it = node.listProperties();
+        //while ( it.hasNext() ) logger.trace( "   > {}", it.next() );
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        if (rdfType.equals(SyntaxElement.CLASS_EXPR.resource)) {
+            URI id = getNodeId(node);
+            if (id != null) {
+                return new ClassId(id);
+            } else {
+                Statement stmt = null;
+                Constructor op = null;
+                // Using a List preserves the order... useful mostly for COMPOSE
+                // Given the Jena encoding of Collection, LinkedList seems the best
+                List<ClassExpression> clexpr = new LinkedList<ClassExpression>();
+                if (node.hasProperty((Property) SyntaxElement.AND.resource)) {
+                    op = SyntaxElement.AND.getOperator();
+                    // listProperties would give them all
+                    stmt = node.getProperty((Property) SyntaxElement.AND.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.OR.resource)) {
+                    op = SyntaxElement.OR.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.OR.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.NOT.resource)) {
+                    op = SyntaxElement.NOT.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.NOT.resource);
+                } else {
+                    if (isPattern) { // not necessarily with a variable (real patterns)
+                        return new ClassId();
+                    } else {
+                        throw new AlignmentException("Class statement must containt one constructor or Id : " + node);
+                    }
+                }
+                // Jena encode these collections as first/rest statements
+                Object o = stmt.getObject();
+                Resource coll = null; // Errors if null tackled below
+                if (o instanceof Resource) {
+                    coll = (Resource) o;
+                }
+                if (o instanceof Literal && !o.toString().equals("")) {
+                    throw new AlignmentException("Invalid content of constructor : " + o);
+                }
+                if (op == SyntaxElement.NOT.getOperator()) {
+                    if (coll == null) {
+                        throw new AlignmentException("NOT constructor cannot be empty : " + node);
+                    }
+                    clexpr.add(parseClass(coll));
+                } else {
+                    if (coll != null) {
+                        while (!RDF.nil.getURI().equals(coll.getURI())) {
+                            clexpr.add(parseClass(coll.getProperty(RDF.first).getResource()));
+                            coll = coll.getProperty(RDF.rest).getResource(); // MUSTCHECK
+                        }
+                    }
+                }
+                return new ClassConstruction(op, clexpr);
+            }
+        } else {
+            if (!rdfType.equals(SyntaxElement.OCCURENCE_COND.resource)
+                    && !rdfType.equals(SyntaxElement.DOMAIN_RESTRICTION.resource)
+                    && !rdfType.equals(SyntaxElement.TYPE_COND.resource)
+                    && !rdfType.equals(SyntaxElement.VALUE_COND.resource)) {
+                throw new AlignmentException("Bad class restriction type : " + rdfType);
+            }
+            PathExpression pe;
+            Comparator comp;
+            // Find onAttribute
+            Statement stmt = node.getProperty((Property) SyntaxElement.ONPROPERTY.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:onAttribute property");
+            }
+            pe = parsePathExpression(stmt.getResource()); // MUSTCHECK
+            if (rdfType.equals(SyntaxElement.TYPE_COND.resource)) {
+                // Check that pe is a Property / Relation
+                // ==> different treatment
+                stmt = node.getProperty((Property) SyntaxElement.EDATATYPE.resource);
+                if (stmt == null) {
+                    throw new AlignmentException("Required " + SyntaxElement.EDATATYPE.print() + " property");
+                }
+                return new ClassTypeRestriction(pe, parseDatatype(stmt.getObject()));
+            } else if (rdfType.equals(SyntaxElement.DOMAIN_RESTRICTION.resource)) {
+                if ((stmt = node.getProperty((Property) SyntaxElement.TOCLASS.resource)) != null || (stmt = node.getProperty((Property) SyntaxElement.ALL.resource)) != null) {
+                    RDFNode nn = stmt.getObject();
+                    if (!nn.isResource()) {
+                        throw new AlignmentException("Incorrect class expression " + nn);
+                    }
+                    return new ClassDomainRestriction(pe, true, parseClass((Resource) nn));
+                } else if ((stmt = node.getProperty((Property) SyntaxElement.EXISTS.resource)) != null) {
+                    RDFNode nn = stmt.getObject();
+                    if (!nn.isResource()) {
+                        throw new AlignmentException("Incorrect class expression " + nn);
+                    }
+                    return new ClassDomainRestriction(pe, false, parseClass((Resource) nn));
+                } else {
+                    throw new AlignmentException("Required edoal:class property");
+                }
+            } else { // It is a Value or Occurence restruction
+                // Find comparator
+                stmt = node.getProperty((Property) SyntaxElement.COMPARATOR.resource);
+                if (stmt == null) {
+                    throw new AlignmentException("Required edoal:comparator property");
+                }
+                URI id = getNodeId(stmt.getResource());
+                if (id != null) {
+                    comp = Comparator.getComparator(id);
+                } else {
+                    throw new AlignmentException("edoal:comparator requires a URI");
+                }
+                if (rdfType.equals(SyntaxElement.OCCURENCE_COND.resource)) {
+                    stmt = node.getProperty((Property) SyntaxElement.VALUE.resource);
+                    if (stmt == null) {
+                        throw new AlignmentException("Required edoal:value property");
+                    }
+                    RDFNode nn = stmt.getObject();
+                    if (nn.isLiteral()) {
+                        return new ClassOccurenceRestriction(pe, comp, ((Literal) nn).getInt());
+                    } else {
+                        throw new AlignmentException("Bad occurence specification : " + nn);
+                    }
+                } else if (rdfType.equals(SyntaxElement.VALUE_COND.resource)) {
+                    stmt = node.getProperty((Property) SyntaxElement.VALUE.resource);
+                    if (stmt == null) {
+                        throw new AlignmentException("Required edoal:value property");
+                    }
+                    ValueExpression v = parseValue(stmt.getObject());
+                    return new ClassValueRestriction(pe, comp, v);
+                }
+            }
+        }
+        return null;
     }
 
     // JE2010: Here is the problem again with DOMAIN (for instance)
-    protected PathExpression parsePathExpression( final Resource node ) throws AlignmentException {
-	Resource rdfType = node.getProperty(RDF.type).getResource();
-	if ( rdfType.equals( SyntaxElement.PROPERTY_EXPR.resource ) ||
-	     rdfType.equals( SyntaxElement.PROPERTY_DOMAIN_COND.resource ) ||
-	     rdfType.equals( SyntaxElement.PROPERTY_TYPE_COND.resource ) ||
-	     rdfType.equals( SyntaxElement.PROPERTY_VALUE_COND.resource ) ) {
-	    return parseProperty( node );
-	} else if ( rdfType.equals( SyntaxElement.RELATION_EXPR.resource ) ||
-	     rdfType.equals( SyntaxElement.RELATION_CODOMAIN_COND.resource ) ||
-	     rdfType.equals( SyntaxElement.RELATION_DOMAIN_COND.resource ) ) {
-	    return parseRelation( node );
-	} else throw new AlignmentException( "Cannot parse path expression ("+rdfType+"): "+node );
-	
+    protected PathExpression parsePathExpression(final Resource node) throws AlignmentException {
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        if (rdfType.equals(SyntaxElement.PROPERTY_EXPR.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_DOMAIN_COND.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_TYPE_COND.resource)
+                || rdfType.equals(SyntaxElement.PROPERTY_VALUE_COND.resource)) {
+            return parseProperty(node);
+        } else if (rdfType.equals(SyntaxElement.RELATION_EXPR.resource)
+                || rdfType.equals(SyntaxElement.RELATION_CODOMAIN_COND.resource)
+                || rdfType.equals(SyntaxElement.RELATION_DOMAIN_COND.resource)) {
+            return parseRelation(node);
+        } else {
+            throw new AlignmentException("Cannot parse path expression (" + rdfType + "): " + node);
+        }
+
     }
 
     // rdf:parseType="Collection" is supposed to preserve the order ()
     // Jena indeed always preserves the order so this can be used
-    protected PropertyExpression parseProperty( final Resource node ) throws AlignmentException {
-	Resource rdfType = node.getProperty(RDF.type).getResource();
-	Statement stmt = null;
-	if ( rdfType.equals( SyntaxElement.PROPERTY_EXPR.resource ) ) {
-	    URI id = getNodeId( node );
-	    if ( id != null ) {
-		return new PropertyId( id );
-	    } else {
-		Constructor op = null;
-		List<PathExpression> clexpr = new LinkedList<PathExpression>();
-		if ( node.hasProperty( (Property)SyntaxElement.AND.resource ) ) {
-		    op = SyntaxElement.AND.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.AND.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.OR.resource ) ) { 
-		    op = SyntaxElement.OR.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.OR.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.COMPOSE.resource ) ) { 
-		    op = SyntaxElement.COMPOSE.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.COMPOSE.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.NOT.resource ) ) {
-		    op = SyntaxElement.NOT.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.NOT.resource );
-		} else {
-		    if ( isPattern ) { // not necessarily with a variable (real patterns)
-			return new PropertyId();
-		    } else {
-			throw new AlignmentException( "Property statement must containt one constructor or Id : "+node );
-		    }
-		}
-		// Jena encode these collections as first/rest statements
-		Object o = stmt.getObject();
-		Resource coll = null; // Errors if null tackled below
-		if ( o instanceof Resource) coll = (Resource)o;
-		if ( o instanceof Literal && !o.toString().equals("") )
-		    throw new AlignmentException( "Invalid content of constructor : "+o );
-		if ( op == SyntaxElement.NOT.getOperator() ) {
-		    if ( coll == null )
-		    	throw new AlignmentException( "NOT constructor cannot be empty : "+node );
-		    clexpr.add( parseProperty( coll ) );
-		} else if ( op == SyntaxElement.COMPOSE.getOperator() ) {
-		    if ( coll == null )
-		    	throw new AlignmentException( "COMPOSE constructor for properties cannot be empty : "+node );
-		    while ( !RDF.nil.getURI().equals( coll.getURI() ) ) {
-			// In this present case, it is a series of Relations followed by a Property
-			Resource newcoll = coll.getProperty( RDF.rest ).getResource(); // MUSTCHECK
-			if ( !RDF.nil.getURI().equals( newcoll.getURI() ) ) {
-			    clexpr.add( parseRelation( coll.getProperty( RDF.first ).getResource() ) );
-			} else {
-			    clexpr.add( parseProperty( coll.getProperty( RDF.first ).getResource() ) );
-			}
-			coll = newcoll;
-		    }
-		} else { // This is a first/rest statements
-		    if ( coll != null ) {
-			while ( !RDF.nil.getURI().equals( coll.getURI() ) ) {
-			    clexpr.add( parseProperty( coll.getProperty( RDF.first ).getResource() ) );
-			    coll = coll.getProperty( RDF.rest ).getResource(); // MUSTCHECK
-			}
-		    }
-		}
-		return new PropertyConstruction( op, clexpr );
-	    }
-	} else if ( rdfType.equals( SyntaxElement.PROPERTY_DOMAIN_COND.resource ) ) {
-	    stmt = node.getProperty( (Property)SyntaxElement.TOCLASS.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:toClass property" );
-	    RDFNode nn = stmt.getObject();
-	    if ( nn.isResource() ) {
-		return new PropertyDomainRestriction( parseClass( (Resource)nn ) );
-	    } else {
-		throw new AlignmentException( "Incorrect class expression "+nn );
-	    } 
-	} else if ( rdfType.equals( SyntaxElement.PROPERTY_TYPE_COND.resource ) ) {
-	    stmt = node.getProperty( (Property)SyntaxElement.EDATATYPE.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required "+SyntaxElement.EDATATYPE.print()+" property" );
-	    return new PropertyTypeRestriction( parseDatatype( stmt.getObject() ) );
-	} else if ( rdfType.equals( SyntaxElement.PROPERTY_VALUE_COND.resource ) ) {
-	    // Find comparator
-	    stmt = node.getProperty( (Property)SyntaxElement.COMPARATOR.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:comparator property" );
-	    URI id = getNodeId( stmt.getResource() );
-	    if ( id == null ) throw new AlignmentException("edoal:comparator requires and URI");
-	    Comparator comp = Comparator.getComparator( id );
-	    stmt = node.getProperty( (Property)SyntaxElement.VALUE.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:value property" );
-	    ValueExpression v = parseValue( stmt.getObject() );
-	    return new PropertyValueRestriction( comp, v );
-	} else {
-	    throw new AlignmentException("There is no pasrser for entity "+rdfType.getLocalName());
-	}
+    protected PropertyExpression parseProperty(final Resource node) throws AlignmentException {
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        Statement stmt = null;
+        if (rdfType.equals(SyntaxElement.PROPERTY_EXPR.resource)) {
+            URI id = getNodeId(node);
+            if (id != null) {
+                return new PropertyId(id);
+            } else {
+                Constructor op = null;
+                List<PathExpression> clexpr = new LinkedList<PathExpression>();
+                if (node.hasProperty((Property) SyntaxElement.AND.resource)) {
+                    op = SyntaxElement.AND.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.AND.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.OR.resource)) {
+                    op = SyntaxElement.OR.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.OR.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.COMPOSE.resource)) {
+                    op = SyntaxElement.COMPOSE.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.COMPOSE.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.NOT.resource)) {
+                    op = SyntaxElement.NOT.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.NOT.resource);
+                } else {
+                    if (isPattern) { // not necessarily with a variable (real patterns)
+                        return new PropertyId();
+                    } else {
+                        throw new AlignmentException("Property statement must containt one constructor or Id : " + node);
+                    }
+                }
+                // Jena encode these collections as first/rest statements
+                Object o = stmt.getObject();
+                Resource coll = null; // Errors if null tackled below
+                if (o instanceof Resource) {
+                    coll = (Resource) o;
+                }
+                if (o instanceof Literal && !o.toString().equals("")) {
+                    throw new AlignmentException("Invalid content of constructor : " + o);
+                }
+                if (op == SyntaxElement.NOT.getOperator()) {
+                    if (coll == null) {
+                        throw new AlignmentException("NOT constructor cannot be empty : " + node);
+                    }
+                    clexpr.add(parseProperty(coll));
+                } else if (op == SyntaxElement.COMPOSE.getOperator()) {
+                    if (coll == null) {
+                        throw new AlignmentException("COMPOSE constructor for properties cannot be empty : " + node);
+                    }
+                    while (!RDF.nil.getURI().equals(coll.getURI())) {
+                        // In this present case, it is a series of Relations followed by a Property
+                        Resource newcoll = coll.getProperty(RDF.rest).getResource(); // MUSTCHECK
+                        if (!RDF.nil.getURI().equals(newcoll.getURI())) {
+                            clexpr.add(parseRelation(coll.getProperty(RDF.first).getResource()));
+                        } else {
+                            clexpr.add(parseProperty(coll.getProperty(RDF.first).getResource()));
+                        }
+                        coll = newcoll;
+                    }
+                } else { // This is a first/rest statements
+                    if (coll != null) {
+                        while (!RDF.nil.getURI().equals(coll.getURI())) {
+                            clexpr.add(parseProperty(coll.getProperty(RDF.first).getResource()));
+                            coll = coll.getProperty(RDF.rest).getResource(); // MUSTCHECK
+                        }
+                    }
+                }
+                return new PropertyConstruction(op, clexpr);
+            }
+        } else if (rdfType.equals(SyntaxElement.PROPERTY_DOMAIN_COND.resource)) {
+            stmt = node.getProperty((Property) SyntaxElement.TOCLASS.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:toClass property");
+            }
+            RDFNode nn = stmt.getObject();
+            if (nn.isResource()) {
+                return new PropertyDomainRestriction(parseClass((Resource) nn));
+            } else {
+                throw new AlignmentException("Incorrect class expression " + nn);
+            }
+        } else if (rdfType.equals(SyntaxElement.PROPERTY_TYPE_COND.resource)) {
+            stmt = node.getProperty((Property) SyntaxElement.EDATATYPE.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required " + SyntaxElement.EDATATYPE.print() + " property");
+            }
+            return new PropertyTypeRestriction(parseDatatype(stmt.getObject()));
+        } else if (rdfType.equals(SyntaxElement.PROPERTY_VALUE_COND.resource)) {
+            // Find comparator
+            stmt = node.getProperty((Property) SyntaxElement.COMPARATOR.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:comparator property");
+            }
+            URI id = getNodeId(stmt.getResource());
+            if (id == null) {
+                throw new AlignmentException("edoal:comparator requires and URI");
+            }
+            Comparator comp = Comparator.getComparator(id);
+            stmt = node.getProperty((Property) SyntaxElement.VALUE.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:value property");
+            }
+            ValueExpression v = parseValue(stmt.getObject());
+            return new PropertyValueRestriction(comp, v);
+        } else {
+            throw new AlignmentException("There is no pasrser for entity " + rdfType.getLocalName());
+        }
     }
 
-    protected Datatype parseDatatype ( final RDFNode nn ) throws AlignmentException {
-	String uri = null;
-	if ( nn.isLiteral() ) { // Legacy
-	    logger.warn( "Datatypes must be Datatype objects ({})", ((Literal)nn).getString() );
-	    uri = ((Literal)nn).getString();
-	} else if ( nn.isResource() ) {
-	    if ( !((Resource)nn).getProperty(RDF.type).getResource().equals( SyntaxElement.DATATYPE.resource ) )
-		throw new AlignmentException( "datatype requires a "+SyntaxElement.DATATYPE.print()+" value" );
-	    uri = ((Resource)nn).getURI();
-	    // check URI
-	} else throw new AlignmentException( "Bad "+SyntaxElement.EDATATYPE.print()+" value" );
-	return new Datatype( uri );
+    protected Datatype parseDatatype(final RDFNode nn) throws AlignmentException {
+        String uri = null;
+        if (nn.isLiteral()) { // Legacy
+            logger.warn("Datatypes must be Datatype objects ({})", ((Literal) nn).getString());
+            uri = ((Literal) nn).getString();
+        } else if (nn.isResource()) {
+            if (!((Resource) nn).getProperty(RDF.type).getResource().equals(SyntaxElement.DATATYPE.resource)) {
+                throw new AlignmentException("datatype requires a " + SyntaxElement.DATATYPE.print() + " value");
+            }
+            uri = ((Resource) nn).getURI();
+            // check URI
+        } else {
+            throw new AlignmentException("Bad " + SyntaxElement.EDATATYPE.print() + " value");
+        }
+        return new Datatype(uri);
     }
 
-    protected RelationExpression parseRelation( final Resource node ) throws AlignmentException {
-	Resource rdfType = node.getProperty(RDF.type).getResource();
-	Statement stmt = null;
-	if ( rdfType.equals( SyntaxElement.RELATION_EXPR.resource ) ) {
-	    URI id = getNodeId( node );
-	    if ( id != null ) {
-		return new RelationId( id );
-	    } else {
-		Constructor op = null;
-		// Remains a PathExpression (that this is a relation is checked by typing)
-		List<PathExpression> clexpr = new LinkedList<PathExpression>();
-		if ( node.hasProperty( (Property)SyntaxElement.AND.resource ) ) {
-		    op = SyntaxElement.AND.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.AND.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.OR.resource ) ) { 
-		    op = SyntaxElement.OR.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.OR.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.COMPOSE.resource ) ) { 
-		    op = SyntaxElement.COMPOSE.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.COMPOSE.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.NOT.resource ) ) {
-		    op = SyntaxElement.NOT.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.NOT.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.INVERSE.resource ) ) {
-		    op = SyntaxElement.INVERSE.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.INVERSE.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.REFLEXIVE.resource ) ) {
-		    op = SyntaxElement.REFLEXIVE.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.REFLEXIVE.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.SYMMETRIC.resource ) ) {
-		    op = SyntaxElement.SYMMETRIC.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.SYMMETRIC.resource );
-		} else if ( node.hasProperty( (Property)SyntaxElement.TRANSITIVE.resource ) ) {
-		    op = SyntaxElement.TRANSITIVE.getOperator();
-		    stmt = node.getProperty( (Property)SyntaxElement.TRANSITIVE.resource );
-		} else {
-		    if ( isPattern ) { // not necessarily with a variable (real patterns)
-			return new RelationId();
-		    } else {
-			throw new AlignmentException( "Relation statement must containt one constructor or Id : "+node );
-		    }
-		}
-		// Jena encode these collections as first/rest statements
-		Object o = stmt.getObject();
-		Resource coll = null; // Errors if null tackled below
-		if ( o instanceof Resource) coll = (Resource)o;
-		if ( o instanceof Literal && !o.toString().equals("") )
-		    throw new AlignmentException( "Invalid content of constructor : "+o );
-		if ( op == SyntaxElement.NOT.getOperator() ||
-		     op == SyntaxElement.INVERSE.getOperator() || 
-		     op == SyntaxElement.REFLEXIVE.getOperator() || 
-		     op == SyntaxElement.SYMMETRIC.getOperator() || 
-		     op == SyntaxElement.TRANSITIVE.getOperator() ) {
-		    if ( coll == null )
-		    	throw new AlignmentException( op+" constructor cannot be empty : "+node );
-		    clexpr.add( parseRelation( coll ) );
-		} else { // This is a first/rest statements
-		    if ( coll != null ) {
-			while ( !RDF.nil.getURI().equals( coll.getURI() ) ) { 
-			    clexpr.add( parseRelation( coll.getProperty( RDF.first ).getResource() ) );
-			    coll = coll.getProperty( RDF.rest ).getResource(); // MUSTCHECK
-			}
-		    }
-		}
-		return new RelationConstruction( op, clexpr );
-	    }
-	} else if ( rdfType.equals( SyntaxElement.RELATION_DOMAIN_COND.resource ) ) {
-	    stmt = node.getProperty( (Property)SyntaxElement.TOCLASS.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:toClass property" );
-	    RDFNode nn = stmt.getObject();
-	    if ( nn.isResource() ) {
-		return new RelationDomainRestriction( parseClass( (Resource)nn ) );
-	    } else {
-		throw new AlignmentException( "Incorrect class expression "+nn );
-	    } 
-	} else if ( rdfType.equals( SyntaxElement.RELATION_CODOMAIN_COND.resource ) ) {
-	    stmt = node.getProperty( (Property)SyntaxElement.TOCLASS.resource );
-	    if ( stmt == null ) throw new AlignmentException( "Required edoal:toClass property" );
-	    RDFNode nn = stmt.getObject();
-	    if ( nn.isResource() ) {
-		return new RelationCoDomainRestriction( parseClass( (Resource)nn ) );
-	    } else {
-		throw new AlignmentException( "Incorrect class expression "+nn );
-	    } 
-	} else {
-	    throw new AlignmentException("There is no pasrser for entity "+rdfType.getLocalName());
-	}
+    protected RelationExpression parseRelation(final Resource node) throws AlignmentException {
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        Statement stmt = null;
+        if (rdfType.equals(SyntaxElement.RELATION_EXPR.resource)) {
+            URI id = getNodeId(node);
+            if (id != null) {
+                return new RelationId(id);
+            } else {
+                Constructor op = null;
+                // Remains a PathExpression (that this is a relation is checked by typing)
+                List<PathExpression> clexpr = new LinkedList<PathExpression>();
+                if (node.hasProperty((Property) SyntaxElement.AND.resource)) {
+                    op = SyntaxElement.AND.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.AND.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.OR.resource)) {
+                    op = SyntaxElement.OR.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.OR.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.COMPOSE.resource)) {
+                    op = SyntaxElement.COMPOSE.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.COMPOSE.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.NOT.resource)) {
+                    op = SyntaxElement.NOT.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.NOT.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.INVERSE.resource)) {
+                    op = SyntaxElement.INVERSE.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.INVERSE.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.REFLEXIVE.resource)) {
+                    op = SyntaxElement.REFLEXIVE.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.REFLEXIVE.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.SYMMETRIC.resource)) {
+                    op = SyntaxElement.SYMMETRIC.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.SYMMETRIC.resource);
+                } else if (node.hasProperty((Property) SyntaxElement.TRANSITIVE.resource)) {
+                    op = SyntaxElement.TRANSITIVE.getOperator();
+                    stmt = node.getProperty((Property) SyntaxElement.TRANSITIVE.resource);
+                } else {
+                    if (isPattern) { // not necessarily with a variable (real patterns)
+                        return new RelationId();
+                    } else {
+                        throw new AlignmentException("Relation statement must containt one constructor or Id : " + node);
+                    }
+                }
+                // Jena encode these collections as first/rest statements
+                Object o = stmt.getObject();
+                Resource coll = null; // Errors if null tackled below
+                if (o instanceof Resource) {
+                    coll = (Resource) o;
+                }
+                if (o instanceof Literal && !o.toString().equals("")) {
+                    throw new AlignmentException("Invalid content of constructor : " + o);
+                }
+                if (op == SyntaxElement.NOT.getOperator()
+                        || op == SyntaxElement.INVERSE.getOperator()
+                        || op == SyntaxElement.REFLEXIVE.getOperator()
+                        || op == SyntaxElement.SYMMETRIC.getOperator()
+                        || op == SyntaxElement.TRANSITIVE.getOperator()) {
+                    if (coll == null) {
+                        throw new AlignmentException(op + " constructor cannot be empty : " + node);
+                    }
+                    clexpr.add(parseRelation(coll));
+                } else { // This is a first/rest statements
+                    if (coll != null) {
+                        while (!RDF.nil.getURI().equals(coll.getURI())) {
+                            clexpr.add(parseRelation(coll.getProperty(RDF.first).getResource()));
+                            coll = coll.getProperty(RDF.rest).getResource(); // MUSTCHECK
+                        }
+                    }
+                }
+                return new RelationConstruction(op, clexpr);
+            }
+        } else if (rdfType.equals(SyntaxElement.RELATION_DOMAIN_COND.resource)) {
+            stmt = node.getProperty((Property) SyntaxElement.TOCLASS.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:toClass property");
+            }
+            RDFNode nn = stmt.getObject();
+            if (nn.isResource()) {
+                return new RelationDomainRestriction(parseClass((Resource) nn));
+            } else {
+                throw new AlignmentException("Incorrect class expression " + nn);
+            }
+        } else if (rdfType.equals(SyntaxElement.RELATION_CODOMAIN_COND.resource)) {
+            stmt = node.getProperty((Property) SyntaxElement.TOCLASS.resource);
+            if (stmt == null) {
+                throw new AlignmentException("Required edoal:toClass property");
+            }
+            RDFNode nn = stmt.getObject();
+            if (nn.isResource()) {
+                return new RelationCoDomainRestriction(parseClass((Resource) nn));
+            } else {
+                throw new AlignmentException("Incorrect class expression " + nn);
+            }
+        } else {
+            throw new AlignmentException("There is no pasrser for entity " + rdfType.getLocalName());
+        }
     }
 
-    protected InstanceExpression parseInstance( final Resource node ) throws AlignmentException {
-	Resource rdfType = node.getProperty(RDF.type).getResource();
-	if ( rdfType.equals( SyntaxElement.INSTANCE_EXPR.resource ) ) {
-	    URI id = getNodeId( node );
-	    if ( id != null ) return new InstanceId( id );
-	    else throw new AlignmentException("Cannot parse anonymous individual");
-	} else if ( isPattern ) { // not necessarily with a variable (real patterns)
-	    return new InstanceId();
-	} else {
-	    throw new AlignmentException("There is no pasrser for entity "+rdfType.getLocalName());
-	}
+    protected InstanceExpression parseInstance(final Resource node) throws AlignmentException {
+        Resource rdfType = node.getProperty(RDF.type).getResource();
+        if (rdfType.equals(SyntaxElement.INSTANCE_EXPR.resource)) {
+            URI id = getNodeId(node);
+            if (id != null) {
+                return new InstanceId(id);
+            } else {
+                throw new AlignmentException("Cannot parse anonymous individual");
+            }
+        } else if (isPattern) { // not necessarily with a variable (real patterns)
+            return new InstanceId();
+        } else {
+            throw new AlignmentException("There is no pasrser for entity " + rdfType.getLocalName());
+        }
     }
 
-    protected ValueExpression parseValue( final RDFNode node ) throws AlignmentException {
-	if ( node.isLiteral() ) { // should not appear anymore
-	    return new Value( ((Literal)node).getString() );
-	} else if ( node.isResource() ) {
-	    Resource nodeType = ((Resource)node).getProperty(RDF.type).getResource();
-	    if ( nodeType.equals( SyntaxElement.INSTANCE_EXPR.resource ) ) {
-		return parseInstance( (Resource)node );
-	    } else if ( nodeType.equals( SyntaxElement.LITERAL.resource ) ) {
-		if ( ((Resource)node).hasProperty( (Property)SyntaxElement.STRING.resource ) ) {
-		    URI u = null;
-		    if ( ((Resource)node).hasProperty( (Property)SyntaxElement.ETYPE.resource ) ) {
-			try {
-			    u = new URI( ((Resource)node).getProperty( (Property)SyntaxElement.ETYPE.resource ).getLiteral().getString() );
-			} catch (URISyntaxException urisex) {
-			    //throw new AlignmentException( "Incorect URI for edoal:type : "+ ((Resource)node).getProperty( (Property)SyntaxElement.TYPE.resource ).getLiteral().getString() );
-			    logger.debug( "IGNORED Exception", urisex );
-			}
-		    }
-		    if ( u != null ) {
-			return new Value( ((Resource)node).getProperty( (Property)SyntaxElement.STRING.resource ).getLiteral().getString(), u );
-		    } else {
-			return new Value( ((Resource)node).getProperty( (Property)SyntaxElement.STRING.resource ).getLiteral().getString() );
-		    }
-		} else {
-		    throw new AlignmentException( "edoal:Literal requires a edoal:value" );
-		}
-	    } else if ( nodeType.equals( SyntaxElement.APPLY.resource ) ) {
-		// Get the operation
-		URI op;
-		if ( ((Resource)node).hasProperty( (Property)SyntaxElement.OPERATOR.resource ) ) {
-		    String operation = ((Resource)node).getProperty( (Property)SyntaxElement.OPERATOR.resource ).getLiteral().getString();
-		    try {
-			op = new URI( operation ); 
-		    } catch (URISyntaxException e) {
-			throw new AlignmentException( "edoal:Apply incorrect operation URI : "+operation );
-		    }
-		} else {
-		    throw new AlignmentException( "edoal:Apply requires an operation" );
-		}
-		// Get all arguments
-		List<ValueExpression> valexpr = new LinkedList<ValueExpression>();
-		if ( ((Resource)node).hasProperty( (Property)SyntaxElement.ARGUMENTS.resource ) ) {
-		    Statement stmt = ((Resource)node).getProperty( (Property)SyntaxElement.ARGUMENTS.resource );
-		    Resource coll = stmt.getResource(); // MUSTCHECK
-		    while ( !RDF.nil.getURI().equals( coll.getURI() ) ) {
-			valexpr.add( parseValue( coll.getProperty( RDF.first ).getResource() ) );
-			coll = coll.getProperty( RDF.rest ).getResource();
-		    }
-		}
-		return new Apply( op, valexpr );
-	    } else { // Check that pe is a Path??
-		return parsePathExpression( (Resource)node );
-	    }
-	} else {
-	    throw new AlignmentException( "Bad edoal:value value" );
-	}
+    protected ValueExpression parseValue(final RDFNode node) throws AlignmentException {
+        if (node.isLiteral()) { // should not appear anymore
+            return new Value(((Literal) node).getString());
+        } else if (node.isResource()) {
+            Resource nodeType = ((Resource) node).getProperty(RDF.type).getResource();
+            if (nodeType.equals(SyntaxElement.INSTANCE_EXPR.resource)) {
+                return parseInstance((Resource) node);
+            } else if (nodeType.equals(SyntaxElement.LITERAL.resource)) {
+                if (((Resource) node).hasProperty((Property) SyntaxElement.STRING.resource)) {
+                    URI u = null;
+                    if (((Resource) node).hasProperty((Property) SyntaxElement.ETYPE.resource)) {
+                        try {
+                            u = new URI(((Resource) node).getProperty((Property) SyntaxElement.ETYPE.resource).getLiteral().getString());
+                        } catch (URISyntaxException urisex) {
+                            //throw new AlignmentException( "Incorect URI for edoal:type : "+ ((Resource)node).getProperty( (Property)SyntaxElement.TYPE.resource ).getLiteral().getString() );
+                            logger.debug("IGNORED Exception", urisex);
+                        }
+                    }
+                    if (u != null) {
+                        return new Value(((Resource) node).getProperty((Property) SyntaxElement.STRING.resource).getLiteral().getString(), u);
+                    } else {
+                        return new Value(((Resource) node).getProperty((Property) SyntaxElement.STRING.resource).getLiteral().getString());
+                    }
+                } else {
+                    throw new AlignmentException("edoal:Literal requires a edoal:value");
+                }
+            } else if (nodeType.equals(SyntaxElement.APPLY.resource)) {
+                // Get the operation
+                URI op;
+                if (((Resource) node).hasProperty((Property) SyntaxElement.OPERATOR.resource)) {
+                    String operation = ((Resource) node).getProperty((Property) SyntaxElement.OPERATOR.resource).getLiteral().getString();
+                    try {
+                        op = new URI(operation);
+                    } catch (URISyntaxException e) {
+                        throw new AlignmentException("edoal:Apply incorrect operation URI : " + operation);
+                    }
+                } else {
+                    throw new AlignmentException("edoal:Apply requires an operation");
+                }
+                // Get all arguments
+                List<ValueExpression> valexpr = new LinkedList<ValueExpression>();
+                if (((Resource) node).hasProperty((Property) SyntaxElement.ARGUMENTS.resource)) {
+                    Statement stmt = ((Resource) node).getProperty((Property) SyntaxElement.ARGUMENTS.resource);
+                    Resource coll = stmt.getResource(); // MUSTCHECK
+                    while (!RDF.nil.getURI().equals(coll.getURI())) {
+                        valexpr.add(parseValue(coll.getProperty(RDF.first).getResource()));
+                        coll = coll.getProperty(RDF.rest).getResource();
+                    }
+                }
+                return new Apply(op, valexpr);
+            } else { // Check that pe is a Path??
+                return parsePathExpression((Resource) node);
+            }
+        } else {
+            throw new AlignmentException("Bad edoal:value value");
+        }
     }
 
-    protected URI getNodeId( final Resource node ) throws AlignmentException {
-	final String idS = node.getURI();
-	if ((idS != null) && (idS.length() > 0)) {
-	    try {
-		return new URI(idS);
-	    } catch ( URISyntaxException usex ) {
-		throw new AlignmentException( "Incorrect URI: "+idS );
-	    }
-	} else {
-	    return null;
-	}
+    protected URI getNodeId(final Resource node) throws AlignmentException {
+        final String idS = node.getURI();
+        if ((idS != null) && (idS.length() > 0)) {
+            try {
+                return new URI(idS);
+            } catch (URISyntaxException usex) {
+                throw new AlignmentException("Incorrect URI: " + idS);
+            }
+        } else {
+            return null;
+        }
     }
 
     /**
      * Parses a given annotaion in the the given node.
-     * 
-     * @param stmt
-     *            the annotation statement
-     * @param al
-     *            the alignment in which the annotation is
-     * @throws NullPointerException
-     *             if the node or the element is null
+     *
+     * @param stmt the annotation statement
+     * @param al the alignment in which the annotation is
+     * @throws NullPointerException if the node or the element is null
      */
-    protected void parseAnnotation( final Statement stmt, EDOALAlignment al ) throws AlignmentException {
-	try {
-	    final String anno = stmt.getString();
-	    if ((anno != null) && (anno.length() > 0)) {
-		URI uri = new URI ( stmt.getPredicate().getURI() );
-		String name = uri.getFragment();
-		String prefix = uri.getScheme()+":"+uri.getSchemeSpecificPart();
-		if ( name == null ) {
-		    int pos = prefix.lastIndexOf('/');
-		    name = prefix.substring( pos+1 );
-		    prefix = prefix.substring( 0, pos+1 );
-		} else { prefix += "#"; }
-		// This will not work for stuff like dc:creator which has no fragment!
-		al.setExtension( prefix, name, anno );
-	    }
-	} catch (Exception e1) {
-	    // It would be better to silently ignore annotations
-	    // Or report them in a bunch
-	    throw new AlignmentException("The annotation is not correct", e1);
-	}
+    protected void parseAnnotation(final Statement stmt, EDOALAlignment al) throws AlignmentException {
+        try {
+            final String anno = stmt.getString();
+            if ((anno != null) && (anno.length() > 0)) {
+                URI uri = new URI(stmt.getPredicate().getURI());
+                String name = uri.getFragment();
+                String prefix = uri.getScheme() + ":" + uri.getSchemeSpecificPart();
+                if (name == null) {
+                    int pos = prefix.lastIndexOf('/');
+                    name = prefix.substring(pos + 1);
+                    prefix = prefix.substring(0, pos + 1);
+                } else {
+                    prefix += "#";
+                }
+                // This will not work for stuff like dc:creator which has no fragment!
+                al.setExtension(prefix, name, anno);
+            }
+        } catch (Exception e1) {
+            // It would be better to silently ignore annotations
+            // Or report them in a bunch
+            throw new AlignmentException("The annotation is not correct", e1);
+        }
     }
-    
 
 }
diff --git a/src/fr/inrialpes/exmo/align/parser/SyntaxElement.java b/src/fr/inrialpes/exmo/align/parser/SyntaxElement.java
index 1b8d1face9148bb2fbfc978a654a73431472f1c5..0aebc1f62475d34be58d28679f7d0c1561b7e9b2 100644
--- a/src/fr/inrialpes/exmo/align/parser/SyntaxElement.java
+++ b/src/fr/inrialpes/exmo/align/parser/SyntaxElement.java
@@ -46,6 +46,7 @@ import org.semanticweb.owl.align.AlignmentException;
 public enum SyntaxElement {
 
     // RDF NAMESPACE
+// RDF NAMESPACE
     RDF(                Namespace.RDF, "RDF", true), // This is not a resource, nor a property
 	RDF_ID(         Namespace.RDF, "ID"),
 	RDF_ABOUT(      Namespace.RDF, "about"),
@@ -132,6 +133,13 @@ public enum SyntaxElement {
 	TRANSF(         Namespace.EDOAL, "Transformation", true),
 	TRDIR(          Namespace.EDOAL, "direction"),
 	TRANSFORMATION( Namespace.EDOAL, "transformation"),
+	LINKKEYS( Namespace.EDOAL, "linkkey", true),
+	LINKKEY( Namespace.EDOAL, "Linkkey"),
+	LINKKEY_BINDING( Namespace.EDOAL, "binding"),
+	CORRESP( Namespace.EDOAL, "Corresp"),
+	CORRESP_PROPERTY1( Namespace.EDOAL, "property1"),
+	CORRESP_PROPERTY2( Namespace.EDOAL, "property2"),
+	EDOAL_TYPE(           Namespace.EDOAL, "type"),
 	TRANSITIVE(     Namespace.EDOAL, "transitive", Constructor.TRANSITIVE),
 	TYPE_COND(Namespace.EDOAL, "AttributeTypeRestriction", true), // undocumented
 	VALUE(          Namespace.EDOAL, "value"),
diff --git a/src/fr/inrialpes/exmo/align/parser/TypeCheckingVisitor.java b/src/fr/inrialpes/exmo/align/parser/TypeCheckingVisitor.java
index 3a416e5833f9e1f3150422edd80c59789405544f..2e7225387b02764848f28c5595dd0cda3828392f 100644
--- a/src/fr/inrialpes/exmo/align/parser/TypeCheckingVisitor.java
+++ b/src/fr/inrialpes/exmo/align/parser/TypeCheckingVisitor.java
@@ -21,17 +21,13 @@
 package fr.inrialpes.exmo.align.parser;
 
 import java.util.Hashtable;
-import java.util.Properties;
 import java.net.URI;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.semanticweb.owl.align.Alignment;
-import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Relation;
-import org.semanticweb.owl.align.Visitable;
 import org.semanticweb.owl.align.AlignmentException;
 
 import fr.inrialpes.exmo.align.impl.Namespace;
@@ -65,7 +61,8 @@ import fr.inrialpes.exmo.align.impl.edoal.Value;
 import fr.inrialpes.exmo.align.impl.edoal.ValueExpression;
 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.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
 
 /**
  * Checks if an EDOALAlignment is well-typed
@@ -158,6 +155,15 @@ public class TypeCheckingVisitor {
 	if ( !compatible( tp2, TYPE.VALUE ) ) return raiseError( null, tp2, TYPE.VALUE );
 	return TYPE.ANY;
     }
+    
+    public TYPE visit( final Linkkey linkkey ) throws AlignmentException {
+	return TYPE.ERROR;
+    }
+    
+    public TYPE visit( final LinkkeyBinding linkkeyBinding ) throws AlignmentException {
+	return TYPE.ERROR;
+    }
+    
     /*
     public TYPE visit( final PathExpression p ) throws AlignmentException {
 	throw new AlignmentException( "Cannot dispatch PathExpression "+p );
diff --git a/test/input/alignment2.rdf b/test/input/alignment2.rdf
index 0e5c341db1282d649b6b2219e526b14c8666b3e8..fb633067e2e9459078b29b03f98310faafad9569 100644
--- a/test/input/alignment2.rdf
+++ b/test/input/alignment2.rdf
@@ -43,20 +43,30 @@
                 </entity2>
                 <relation>=</relation>
                 <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
-                <linkkey> 
-                    <Linkkey edoal:type="weak">
-                        <bindings rdf:parseType="Collection">
-                            <Corresp edoal:type="eq">
-                                <property1>
+                <edoal:linkkey> 
+                    <edoal:Linkkey edoal:type="weak">
+                        <edoal:binding>
+                            <edoal:Corresp edoal:type="eq">
+                                <edoal:property1>
                                     <edoal:Property rdf:about="http://purl.org/ontology/mo/opus" />
-                                </property1>
-                                <property2>
+                                </edoal:property1>
+                                <edoal:property2>
                                     <edoal:Property rdf:about="http://exmo.inrialpes.fr/connectors#number" />
-                                </property2>
-                            </Corresp>
-                        </bindings>
-                    </Linkkey>
-                </linkkey>
+                                </edoal:property2>
+                            </edoal:Corresp>
+                        </edoal:binding>
+                        <edoal:binding>
+                            <edoal:Corresp edoal:type="in">
+                                <edoal:property1>
+                                    <edoal:Property rdf:about="http://purl.org/ontology/mo/name" />
+                                </edoal:property1>
+                                <edoal:property2>
+                                    <edoal:Property rdf:about="http://exmo.inrialpes.fr/connectors#nom" />
+                                </edoal:property2>
+                            </edoal:Corresp>
+                        </edoal:binding>
+                    </edoal:Linkkey>
+                </edoal:linkkey>
             </Cell>
         </map>
     </Alignment>
diff --git a/test/src/AlgTest.java b/test/src/AlgTest.java
index 4b7edd8c473288de68bd5b7ec77106969e6f7edd..51e201cd7752142583b5cc07e0bec2f3d81457cd 100644
--- a/test/src/AlgTest.java
+++ b/test/src/AlgTest.java
@@ -20,40 +20,20 @@
 
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 //import org.testng.annotations.*;
 
 import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Alignment;
-import org.semanticweb.owl.align.Evaluator;
-
-import fr.inrialpes.exmo.align.impl.Annotations;
 import fr.inrialpes.exmo.align.impl.Namespace;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
-import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.ObjectAlignment;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
 import fr.inrialpes.exmo.align.impl.method.NameAndPropertyAlignment;
 
-import fr.inrialpes.exmo.ontowrap.Ontology;
-import fr.inrialpes.exmo.ontowrap.BasicOntology;
-import fr.inrialpes.exmo.ontowrap.LoadedOntology;
-import fr.inrialpes.exmo.ontowrap.HeavyLoadedOntology;
-import fr.inrialpes.exmo.ontowrap.OntologyFactory;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Properties;
 
 /**
diff --git a/test/src/EDOALExportTest.java b/test/src/EDOALExportTest.java
index 858b3bbb3c05c39d42a1083048c45246e16f3bd7..e5f52371636ea02e66663b2ce1fa3159c3daa842 100644
--- a/test/src/EDOALExportTest.java
+++ b/test/src/EDOALExportTest.java
@@ -22,9 +22,6 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import org.semanticweb.owl.align.AlignmentVisitor;
@@ -54,7 +51,6 @@ import java.net.URI;
 
 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;
@@ -67,7 +63,6 @@ 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.PropertyRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.PropertyDomainRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.PropertyTypeRestriction;
 import fr.inrialpes.exmo.align.impl.edoal.PropertyValueRestriction;
@@ -79,472 +74,559 @@ 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.TransfService;
 import fr.inrialpes.exmo.align.impl.edoal.Value;
 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.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
+import fr.inrialpes.exmo.align.impl.rel.EquivRelation;
+import org.semanticweb.owl.align.Relation;
+import org.testng.Assert;
 
 /**
  * These tests corresponds to the tests presented in the examples/omwg directory
  */
-
 public class EDOALExportTest {
 
     private RDFRendererVisitor renderer;
     private PrintWriter writer;
     private ByteArrayOutputStream stream;
 
-    @Test(groups = { "full", "omwg", "raw" })
+    @Test(groups = {"full", "omwg", "raw"})
     //@BeforeClass(groups = { "full", "omwg", "raw" })
     public void setUp() throws Exception {
     }
 
-    private String render( Expression v ) throws Exception {
-	// JE2009: This can only be improved if we can change the stream
-	stream = new ByteArrayOutputStream(); 
-	writer = new PrintWriter ( new BufferedWriter(
-				                 new OutputStreamWriter( stream, "UTF-8" )), true);
-	renderer = new RDFRendererVisitor( writer );
-	renderer.setIndentString("");	// Indent should be empty
-	renderer.setNewLineString("");
-	v.accept( renderer );
-	writer.flush();
-	writer.close();
-	stream.close();
-	return stream.toString();
+    private String render(Expression v) throws Exception {
+        // JE2009: This can only be improved if we can change the stream
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(new BufferedWriter(
+                new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        renderer.setIndentString("");	// Indent should be empty
+        renderer.setNewLineString("");
+        v.accept(renderer);
+        writer.flush();
+        writer.close();
+        stream.close();
+        return stream.toString();
+    }
+
+    private String render(LinkkeyBinding v) throws Exception {
+        // JE2009: This can only be improved if we can change the stream
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(new BufferedWriter(
+                new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        renderer.setIndentString("");	// Indent should be empty
+        renderer.setNewLineString("");
+        v.accept(renderer);
+        writer.flush();
+        writer.close();
+        stream.close();
+        return stream.toString();
+    }
+
+    private String render(Linkkey v) throws Exception {
+        // JE2009: This can only be improved if we can change the stream
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(new BufferedWriter(
+                new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        renderer.setIndentString("");	// Indent should be empty
+        renderer.setNewLineString("");
+        v.accept(renderer);
+        writer.flush();
+        writer.close();
+        stream.close();
+        return stream.toString();
     }
 
     // Load the full test ==> break because not all can be rendered
-    @Test(expectedExceptions = AlignmentException.class, groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(expectedExceptions = AlignmentException.class, groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testOWLRendering0() throws Exception {
-	AlignmentParser aparser = new AlignmentParser( 0 );
-	aparser.initAlignment( null );
-	Alignment alignment = aparser.parse( "file:examples/omwg/total.xml" );
-	assertNotNull( alignment );
-	// Print it in a string
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new OWLAxiomsRendererVisitor( writer );
-	alignment.render( renderer );
+        AlignmentParser aparser = new AlignmentParser(0);
+        aparser.initAlignment(null);
+        Alignment alignment = aparser.parse("file:examples/omwg/total.xml");
+        assertNotNull(alignment);
+        // Print it in a string
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new OWLAxiomsRendererVisitor(writer);
+        alignment.render(renderer);
     }
 
     // Load the stripped down test ==> it loads
     // This cannot be passed to an OWL parser because no typechecking has been done
     // This is only a syntactic test
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"testOWLRendering0"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"testOWLRendering0"})
     public void testOWLRendering1() throws Exception {
-	AlignmentParser aparser = new AlignmentParser( 0 );
-	aparser.initAlignment( null );
-	Alignment alignment = aparser.parse( "file:examples/omwg/total-owlable.xml" );
-	assertNotNull( alignment );
-	// Print it in a string
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			      new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	/*
-	OutputStream stream = new FileOutputStream( "/tmp/total.owl" );
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	*/
-	AlignmentVisitor renderer = new OWLAxiomsRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
-	String str1 = stream.toString();
-	//System.err.println(str1);
-	assertEquals( str1.length(), 11623 );
+        AlignmentParser aparser = new AlignmentParser(0);
+        aparser.initAlignment(null);
+        Alignment alignment = aparser.parse("file:examples/omwg/total-owlable.xml");
+        assertNotNull(alignment);
+        // Print it in a string
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        /*
+         OutputStream stream = new FileOutputStream( "/tmp/total.owl" );
+         PrintWriter writer = new PrintWriter (
+         new BufferedWriter(
+         new OutputStreamWriter( stream, "UTF-8" )), true);
+         */
+        AlignmentVisitor renderer = new OWLAxiomsRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
+        String str1 = stream.toString();
+        //System.err.println(str1);
+        assertEquals(str1.length(), 11623);
     }
 
     // Use an alignment converted from URI
     // This should be make working
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"testOWLRendering0"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"testOWLRendering0"})
     public void testOWLRendering2() throws Exception {
-	AlignmentParser aparser = new AlignmentParser( 0 );
-	aparser.initAlignment( null );
-	Alignment alignment = aparser.parse( "file:examples/rdf/newsample.rdf" );
-	assertNotNull( alignment );
-	EDOALAlignment edoal = EDOALAlignment.toEDOALAlignment( (URIAlignment)alignment );
-	assertEquals( alignment.nbCells(), edoal.nbCells() );
-	// Print it in a string
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			      new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new OWLAxiomsRendererVisitor( writer );
-	edoal.render( renderer );
-	writer.flush();
-	writer.close();
-	String str1 = stream.toString();
-	//System.err.println(str1);
-	assertEquals( str1.length(), 1315 );
+        AlignmentParser aparser = new AlignmentParser(0);
+        aparser.initAlignment(null);
+        Alignment alignment = aparser.parse("file:examples/rdf/newsample.rdf");
+        assertNotNull(alignment);
+        EDOALAlignment edoal = EDOALAlignment.toEDOALAlignment((URIAlignment) alignment);
+        assertEquals(alignment.nbCells(), edoal.nbCells());
+        // Print it in a string
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new OWLAxiomsRendererVisitor(writer);
+        edoal.render(renderer);
+        writer.flush();
+        writer.close();
+        String str1 = stream.toString();
+        //System.err.println(str1);
+        assertEquals(str1.length(), 1315);
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"testOWLRendering0"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"testOWLRendering0"})
     public void testJSONRendering() throws Exception {
-	AlignmentParser aparser = new AlignmentParser( 0 );
-	aparser.initAlignment( null );
-	Alignment alignment = aparser.parse( "file:examples/omwg/total.xml" );
-	assertNotNull( alignment );
-	// Print it in a string
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new JSONRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
-	String str1 = stream.toString();
-	//System.err.println(str1);
-	assertEquals( str1.length(), 36024 );
+        AlignmentParser aparser = new AlignmentParser(0);
+        aparser.initAlignment(null);
+        Alignment alignment = aparser.parse("file:examples/omwg/total.xml");
+        assertNotNull(alignment);
+        // Print it in a string
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new JSONRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
+        String str1 = stream.toString();
+        //System.err.println(str1);
+        assertEquals(str1.length(), 36024);
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportPath() throws Exception {
-	/*
-        assertEquals( render( new Path(new PropertyId(new URI("http://my.beauty.url")))),
-		     "<edoal:Property rdf:about=\"http://my.beauty.url\"/>");
-	assertEquals( render( Path.EMPTY ),"<edoal:Path rdf:resource=\"http://ns.inria.fr/edoal#emptyPath\"/>");
-	*/
-	final LinkedHashSet<PathExpression> expressions = new LinkedHashSet<PathExpression>(3);
-	expressions.add( new RelationId(new URI("http://my.beauty.url")) );
-	expressions.add( new RelationId(new URI("http://my.nasty.url")) );
-	expressions.add( new RelationId(new URI("http://my.richi.url")) );
-	assertEquals( render( new RelationConstruction( Constructor.COMP, expressions ) ),
-		      "<edoal:Relation><edoal:compose rdf:parseType=\"Collection\">" +
-		      "<edoal:Relation rdf:about=\"http://my.beauty.url\"/>" +
-		      "<edoal:Relation rdf:about=\"http://my.nasty.url\"/>" +
-		      "<edoal:Relation rdf:about=\"http://my.richi.url\"/>" +
-		      "</edoal:compose></edoal:Relation>" );
-
-	expressions.add( new PropertyId(new URI("http://my.final.url")) );
-	assertEquals( render( new PropertyConstruction( Constructor.COMP, expressions ) ),
-		      "<edoal:Property><edoal:compose rdf:parseType=\"Collection\">" +
-		      "<edoal:Relation rdf:about=\"http://my.beauty.url\"/>" +
-		      "<edoal:Relation rdf:about=\"http://my.nasty.url\"/>" +
-		      "<edoal:Relation rdf:about=\"http://my.richi.url\"/>" +
-		      "<edoal:Property rdf:about=\"http://my.final.url\"/>" +
-		      "</edoal:compose></edoal:Property>" );
+        /*
+         assertEquals( render( new Path(new PropertyId(new URI("http://my.beauty.url")))),
+         "<edoal:Property rdf:about=\"http://my.beauty.url\"/>");
+         assertEquals( render( Path.EMPTY ),"<edoal:Path rdf:resource=\"http://ns.inria.fr/edoal#emptyPath\"/>");
+         */
+        final LinkedHashSet<PathExpression> expressions = new LinkedHashSet<PathExpression>(3);
+        expressions.add(new RelationId(new URI("http://my.beauty.url")));
+        expressions.add(new RelationId(new URI("http://my.nasty.url")));
+        expressions.add(new RelationId(new URI("http://my.richi.url")));
+        assertEquals(render(new RelationConstruction(Constructor.COMP, expressions)),
+                "<edoal:Relation><edoal:compose rdf:parseType=\"Collection\">"
+                + "<edoal:Relation rdf:about=\"http://my.beauty.url\"/>"
+                + "<edoal:Relation rdf:about=\"http://my.nasty.url\"/>"
+                + "<edoal:Relation rdf:about=\"http://my.richi.url\"/>"
+                + "</edoal:compose></edoal:Relation>");
+
+        expressions.add(new PropertyId(new URI("http://my.final.url")));
+        assertEquals(render(new PropertyConstruction(Constructor.COMP, expressions)),
+                "<edoal:Property><edoal:compose rdf:parseType=\"Collection\">"
+                + "<edoal:Relation rdf:about=\"http://my.beauty.url\"/>"
+                + "<edoal:Relation rdf:about=\"http://my.nasty.url\"/>"
+                + "<edoal:Relation rdf:about=\"http://my.richi.url\"/>"
+                + "<edoal:Property rdf:about=\"http://my.final.url\"/>"
+                + "</edoal:compose></edoal:Property>");
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportInstanceExpression() throws Exception {
-	final InstanceExpression toExport = new InstanceId(new URI("http://meine.tolle/instance#blah"));
-	assertEquals( render( toExport ),
-		      "<edoal:Instance rdf:about=\"http://meine.tolle/instance#blah\"/>" );
+        final InstanceExpression toExport = new InstanceId(new URI("http://meine.tolle/instance#blah"));
+        assertEquals(render(toExport),
+                "<edoal:Instance rdf:about=\"http://meine.tolle/instance#blah\"/>");
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprSimple() throws Exception {
-	final ClassExpression ce = new ClassId("Amertume");
-	final String ref = "<edoal:Class rdf:about=\"Amertume\"/>";
-	assertEquals( render( ce ), ref );
+        final ClassExpression ce = new ClassId("Amertume");
+        final String ref = "<edoal:Class rdf:about=\"Amertume\"/>";
+        assertEquals(render(ce), ref);
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprSimpleError() throws Exception {
-	// Should raise an error
-	final ClassExpression ce = new ClassId("Amertume");
-	final String ref = "<edoal:Class rdf:about=\"Amertume\"/>";
-	assertEquals( render( ce ), ref );
+        // Should raise an error
+        final ClassExpression ce = new ClassId("Amertume");
+        final String ref = "<edoal:Class rdf:about=\"Amertume\"/>";
+        assertEquals(render(ce), ref);
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassCond() throws Exception {
-	ClassRestriction toExport = null;
-	toExport = new ClassValueRestriction(new PropertyId(new URI("http://my.sister#age")),Comparator.GREATER,new Value("18"));
-	assertEquals( render( toExport ), "<edoal:AttributeValueRestriction>"
-	    + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
-	    + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
-	    + "<edoal:value><edoal:Literal edoal:string=\"18\"/></edoal:value>"
-			  + "</edoal:AttributeValueRestriction>" );
-	toExport = new ClassTypeRestriction( new PropertyId(new URI("http://my.sister#age")), new Datatype("integer-under-100"));
-	assertEquals( render( toExport ), "<edoal:AttributeTypeRestriction>"
-	    + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
-	    //+ "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
-	    + "<edoal:datatype><edoal:Datatype rdf:about=\"integer-under-100\"/></edoal:datatype>"
-		+ "</edoal:AttributeTypeRestriction>" );
-	toExport = new ClassOccurenceRestriction( new PropertyId(new URI("http://my.sister#age")), Comparator.GREATER, 18);
-	assertEquals( render( toExport ), "<edoal:AttributeOccurenceRestriction>"
-	    + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
-	    + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
-	    + "<edoal:value>18</edoal:value>"
-		      + "</edoal:AttributeOccurenceRestriction>" );
+        ClassRestriction toExport = null;
+        toExport = new ClassValueRestriction(new PropertyId(new URI("http://my.sister#age")), Comparator.GREATER, new Value("18"));
+        assertEquals(render(toExport), "<edoal:AttributeValueRestriction>"
+                + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
+                + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
+                + "<edoal:value><edoal:Literal edoal:string=\"18\"/></edoal:value>"
+                + "</edoal:AttributeValueRestriction>");
+        toExport = new ClassTypeRestriction(new PropertyId(new URI("http://my.sister#age")), new Datatype("integer-under-100"));
+        assertEquals(render(toExport), "<edoal:AttributeTypeRestriction>"
+                + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
+                //+ "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
+                + "<edoal:datatype><edoal:Datatype rdf:about=\"integer-under-100\"/></edoal:datatype>"
+                + "</edoal:AttributeTypeRestriction>");
+        toExport = new ClassOccurenceRestriction(new PropertyId(new URI("http://my.sister#age")), Comparator.GREATER, 18);
+        assertEquals(render(toExport), "<edoal:AttributeOccurenceRestriction>"
+                + "<edoal:onAttribute><edoal:Property rdf:about=\"http://my.sister#age\"/></edoal:onAttribute>"
+                + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
+                + "<edoal:value>18</edoal:value>"
+                + "</edoal:AttributeOccurenceRestriction>");
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprOr() throws Exception {
-	final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
-	expressions.add( new ClassId("Acidite") );
-	expressions.add( new ClassId("Amertume") );
-	expressions.add( new ClassId("Astreinngence") );
-	final ClassExpression ce = new ClassConstruction( Constructor.OR, expressions );
-	final String ref = "<edoal:Class>" + "<edoal:or rdf:parseType=\"Collection\">"
-	    + "<edoal:Class rdf:about=\"Acidite\"/>"
-	    + "<edoal:Class rdf:about=\"Amertume\"/>"
-	    + "<edoal:Class rdf:about=\"Astreinngence\"/>" 
-	    + "</edoal:or>"+"</edoal:Class>";
-	assertEquals( render( ce ), ref );
+        final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
+        expressions.add(new ClassId("Acidite"));
+        expressions.add(new ClassId("Amertume"));
+        expressions.add(new ClassId("Astreinngence"));
+        final ClassExpression ce = new ClassConstruction(Constructor.OR, expressions);
+        final String ref = "<edoal:Class>" + "<edoal:or rdf:parseType=\"Collection\">"
+                + "<edoal:Class rdf:about=\"Acidite\"/>"
+                + "<edoal:Class rdf:about=\"Amertume\"/>"
+                + "<edoal:Class rdf:about=\"Astreinngence\"/>"
+                + "</edoal:or>" + "</edoal:Class>";
+        assertEquals(render(ce), ref);
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprAnd() throws Exception {
-	final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
-	expressions.add(new ClassId("Acidite"));
-	expressions.add(new ClassId("Amertume"));
-	expressions.add(new ClassId("Astreinngence"));
-	final ClassExpression ce = new ClassConstruction( Constructor.AND, expressions );
-	final String ref = "<edoal:Class>" + "<edoal:and rdf:parseType=\"Collection\">"
-	    + "<edoal:Class rdf:about=\"Acidite\"/>"
-	    + "<edoal:Class rdf:about=\"Amertume\"/>"
-	    + "<edoal:Class rdf:about=\"Astreinngence\"/>" 
-	    + "</edoal:and>"+"</edoal:Class>";
-	assertEquals( render( ce ), ref );
+        final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
+        expressions.add(new ClassId("Acidite"));
+        expressions.add(new ClassId("Amertume"));
+        expressions.add(new ClassId("Astreinngence"));
+        final ClassExpression ce = new ClassConstruction(Constructor.AND, expressions);
+        final String ref = "<edoal:Class>" + "<edoal:and rdf:parseType=\"Collection\">"
+                + "<edoal:Class rdf:about=\"Acidite\"/>"
+                + "<edoal:Class rdf:about=\"Amertume\"/>"
+                + "<edoal:Class rdf:about=\"Astreinngence\"/>"
+                + "</edoal:and>" + "</edoal:Class>";
+        assertEquals(render(ce), ref);
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprNot() throws Exception {
-	final ClassExpression ce = new ClassConstruction(Constructor.NOT, 
-					 Collections.singleton((ClassExpression)new ClassId("Acidite")));
-	final String ref = "<edoal:Class>" + "<edoal:not>"
-	    + "<edoal:Class rdf:about=\"Acidite\"/>" + "</edoal:not>"
-	    + "</edoal:Class>";
-	assertEquals( render( ce ), ref );
+        final ClassExpression ce = new ClassConstruction(Constructor.NOT,
+                Collections.singleton((ClassExpression) new ClassId("Acidite")));
+        final String ref = "<edoal:Class>" + "<edoal:not>"
+                + "<edoal:Class rdf:about=\"Acidite\"/>" + "</edoal:not>"
+                + "</edoal:Class>";
+        assertEquals(render(ce), ref);
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportClassExprOrCond() throws Exception {
-	final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
-	expressions.add(new ClassId("Acidite"));
-	expressions.add(new ClassId("Amertume"));
-	expressions.add(new ClassId("Astreinngence"));
-	expressions.add(new ClassValueRestriction( new PropertyId(new URI("http://vinum#age")), Comparator.GREATER, new Value("20")));
-	final ClassExpression ce = new ClassConstruction( Constructor.OR, expressions );
-	assertEquals( render( ce ), "<edoal:Class>" + "<edoal:or rdf:parseType=\"Collection\">"
-	    + "<edoal:Class rdf:about=\"Acidite\"/>"
-	    + "<edoal:Class rdf:about=\"Amertume\"/>"
-	    + "<edoal:Class rdf:about=\"Astreinngence\"/>"
-	    + "<edoal:AttributeValueRestriction>"
-	    + "<edoal:onAttribute>"
-	    + "<edoal:Property rdf:about=\"http://vinum#age\"/>"
-	    + "</edoal:onAttribute>"
-	    + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
-	    + "<edoal:value><edoal:Literal edoal:string=\"20\"/></edoal:value>"
-	    + "</edoal:AttributeValueRestriction>"
-	    + "</edoal:or>"+ "</edoal:Class>" );
+        final Set<ClassExpression> expressions = new LinkedHashSet<ClassExpression>(3);
+        expressions.add(new ClassId("Acidite"));
+        expressions.add(new ClassId("Amertume"));
+        expressions.add(new ClassId("Astreinngence"));
+        expressions.add(new ClassValueRestriction(new PropertyId(new URI("http://vinum#age")), Comparator.GREATER, new Value("20")));
+        final ClassExpression ce = new ClassConstruction(Constructor.OR, expressions);
+        assertEquals(render(ce), "<edoal:Class>" + "<edoal:or rdf:parseType=\"Collection\">"
+                + "<edoal:Class rdf:about=\"Acidite\"/>"
+                + "<edoal:Class rdf:about=\"Amertume\"/>"
+                + "<edoal:Class rdf:about=\"Astreinngence\"/>"
+                + "<edoal:AttributeValueRestriction>"
+                + "<edoal:onAttribute>"
+                + "<edoal:Property rdf:about=\"http://vinum#age\"/>"
+                + "</edoal:onAttribute>"
+                + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#greater-than\"/>"
+                + "<edoal:value><edoal:Literal edoal:string=\"20\"/></edoal:value>"
+                + "</edoal:AttributeValueRestriction>"
+                + "</edoal:or>" + "</edoal:Class>");
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportPropertyCond() throws Exception {
-	assertEquals( render( new PropertyDomainRestriction(new ClassId("http://meine/tolle/restriction")) ),
-		      "<edoal:PropertyDomainRestriction><edoal:class>"
-		      + "<edoal:Class rdf:about=\"http://meine/tolle/restriction\"/>"
-		      + "</edoal:class></edoal:PropertyDomainRestriction>" );
-	assertEquals( render( new PropertyValueRestriction( Comparator.EQUAL, new Value("18"))),
-		      "<edoal:PropertyValueRestriction>"
-		      + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
-		      + "<edoal:value><edoal:Literal edoal:string=\"18\"/></edoal:value>"
-		      + "</edoal:PropertyValueRestriction>" );
-	assertEquals( render( new PropertyTypeRestriction(new Datatype("int"))),
-		      "<edoal:PropertyTypeRestriction><edoal:datatype><edoal:Datatype rdf:about=\"int\"/></edoal:datatype></edoal:PropertyTypeRestriction>" );
+        assertEquals(render(new PropertyDomainRestriction(new ClassId("http://meine/tolle/restriction"))),
+                "<edoal:PropertyDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://meine/tolle/restriction\"/>"
+                + "</edoal:class></edoal:PropertyDomainRestriction>");
+        assertEquals(render(new PropertyValueRestriction(Comparator.EQUAL, new Value("18"))),
+                "<edoal:PropertyValueRestriction>"
+                + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
+                + "<edoal:value><edoal:Literal edoal:string=\"18\"/></edoal:value>"
+                + "</edoal:PropertyValueRestriction>");
+        assertEquals(render(new PropertyTypeRestriction(new Datatype("int"))),
+                "<edoal:PropertyTypeRestriction><edoal:datatype><edoal:Datatype rdf:about=\"int\"/></edoal:datatype></edoal:PropertyTypeRestriction>");
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportPropertyExpr() throws Exception {
-	final Set<PathExpression> expressions = new LinkedHashSet<PathExpression>(2);
-	expressions.add(new PropertyId(new URI("http://mein/super/property0")));
-	expressions.add(new PropertyId(new URI("http://mein/super/property1")));
-	final PropertyId single = new PropertyId(new URI("http://mein/super/property"));
-	
-	PropertyExpression toExport = single;
-	assertEquals( render( toExport), "<edoal:Property rdf:about=\"http://mein/super/property\"/>");
-	toExport = new PropertyConstruction( Constructor.AND, expressions );
-	assertEquals( render( toExport), "<edoal:Property><edoal:and rdf:parseType=\"Collection\">"
-		     + "<edoal:Property rdf:about=\"http://mein/super/property0\"/>"
-		     + "<edoal:Property rdf:about=\"http://mein/super/property1\"/>"
-		     + "</edoal:and></edoal:Property>");
-
-	final Set<PathExpression> expressions2 = new LinkedHashSet<PathExpression>(2);
-	expressions2.add( new PropertyConstruction( Constructor.OR, expressions ));
-	expressions2.add( new PropertyValueRestriction(Comparator.EQUAL,new Value("5")));
-	toExport = new PropertyConstruction( Constructor.AND, expressions2 );
-	assertEquals( render( toExport),  "<edoal:Property><edoal:and rdf:parseType=\"Collection\"><edoal:Property><edoal:or rdf:parseType=\"Collection\">"
-		      + "<edoal:Property rdf:about=\"http://mein/super/property0\"/>"
-		      + "<edoal:Property rdf:about=\"http://mein/super/property1\"/>"
-		      + "</edoal:or></edoal:Property>"
-		      + "<edoal:PropertyValueRestriction>"
-		      + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
-		      + "<edoal:value><edoal:Literal edoal:string=\"5\"/></edoal:value></edoal:PropertyValueRestriction>"
-		      + "</edoal:and></edoal:Property>");
-	toExport = new PropertyConstruction( Constructor.NOT, Collections.singleton((PathExpression)new PropertyId(new URI("http://mein/super/property"))));
+        final Set<PathExpression> expressions = new LinkedHashSet<PathExpression>(2);
+        expressions.add(new PropertyId(new URI("http://mein/super/property0")));
+        expressions.add(new PropertyId(new URI("http://mein/super/property1")));
+        final PropertyId single = new PropertyId(new URI("http://mein/super/property"));
+
+        PropertyExpression toExport = single;
+        assertEquals(render(toExport), "<edoal:Property rdf:about=\"http://mein/super/property\"/>");
+        toExport = new PropertyConstruction(Constructor.AND, expressions);
+        assertEquals(render(toExport), "<edoal:Property><edoal:and rdf:parseType=\"Collection\">"
+                + "<edoal:Property rdf:about=\"http://mein/super/property0\"/>"
+                + "<edoal:Property rdf:about=\"http://mein/super/property1\"/>"
+                + "</edoal:and></edoal:Property>");
+
+        final Set<PathExpression> expressions2 = new LinkedHashSet<PathExpression>(2);
+        expressions2.add(new PropertyConstruction(Constructor.OR, expressions));
+        expressions2.add(new PropertyValueRestriction(Comparator.EQUAL, new Value("5")));
+        toExport = new PropertyConstruction(Constructor.AND, expressions2);
+        assertEquals(render(toExport), "<edoal:Property><edoal:and rdf:parseType=\"Collection\"><edoal:Property><edoal:or rdf:parseType=\"Collection\">"
+                + "<edoal:Property rdf:about=\"http://mein/super/property0\"/>"
+                + "<edoal:Property rdf:about=\"http://mein/super/property1\"/>"
+                + "</edoal:or></edoal:Property>"
+                + "<edoal:PropertyValueRestriction>"
+                + "<edoal:comparator rdf:resource=\"http://ns.inria.org/edoal/1.0/#equals\"/>"
+                + "<edoal:value><edoal:Literal edoal:string=\"5\"/></edoal:value></edoal:PropertyValueRestriction>"
+                + "</edoal:and></edoal:Property>");
+        toExport = new PropertyConstruction(Constructor.NOT, Collections.singleton((PathExpression) new PropertyId(new URI("http://mein/super/property"))));
     }
 
     // ------
-
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testExportRelationCondCond() throws Exception {
-	RelationRestriction toExport = new RelationDomainRestriction(new ClassId("http://my/super/class"));
-	assertEquals( render( toExport), "<edoal:RelationDomainRestriction><edoal:class>"
-		      + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
-		      + "</edoal:class></edoal:RelationDomainRestriction>");
-    toExport = new RelationCoDomainRestriction(new ClassId("http://my/super/class"));
-	assertEquals( render( toExport), "<edoal:RelationCoDomainRestriction><edoal:class>"
-	    + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
-		      + "</edoal:class></edoal:RelationCoDomainRestriction>");
+        RelationRestriction toExport = new RelationDomainRestriction(new ClassId("http://my/super/class"));
+        assertEquals(render(toExport), "<edoal:RelationDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
+                + "</edoal:class></edoal:RelationDomainRestriction>");
+        toExport = new RelationCoDomainRestriction(new ClassId("http://my/super/class"));
+        assertEquals(render(toExport), "<edoal:RelationCoDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
+                + "</edoal:class></edoal:RelationCoDomainRestriction>");
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void testParseRelationExpr() throws Exception {
-	
-	RelationExpression toExport = new RelationId("http://my/super/relation");
-	assertEquals( render(toExport), 
-		      "<edoal:Relation rdf:about=\"http://my/super/relation\"/>");
-
-	// JE 2010: I could export it as well
-	RelationExpression relexp = new RelationDomainRestriction(							  new ClassId("http://my/super/class"));
-
-	final Set<PathExpression> expressions = new LinkedHashSet<PathExpression>(2);
-	expressions.add(new RelationId("http://my/super/relation0"));
-	expressions.add(new RelationId("http://my/super/relation1"));
-	expressions.add( relexp );
-
-	toExport = new RelationConstruction( Constructor.AND, expressions );
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:and rdf:parseType=\"Collection\">"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation0\"/>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation1\"/>"
-	    + "<edoal:RelationDomainRestriction><edoal:class>"
-	    + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
-	    + "</edoal:class></edoal:RelationDomainRestriction>" 
-	    + "</edoal:and>" + "</edoal:Relation>");
-	toExport = new RelationConstruction( Constructor.OR, expressions );
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:or rdf:parseType=\"Collection\">"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation0\"/>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation1\"/>"
-	    + "<edoal:RelationDomainRestriction><edoal:class>"
-	    + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
-	    + "</edoal:class></edoal:RelationDomainRestriction>" 
-		      + "</edoal:or>" + "</edoal:Relation>");
-
-	final Set<PathExpression> expressions2 = new LinkedHashSet<PathExpression>();
-	expressions2.add(new RelationConstruction(Constructor.NOT,Collections.singleton((PathExpression)new RelationId("http://my/super/relation"))));
-	expressions2.add(new RelationCoDomainRestriction(new ClassId("http://my/super/class")));
-
-	toExport = new RelationConstruction( Constructor.AND, expressions2 );
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:and rdf:parseType=\"Collection\">"
-	    + "<edoal:Relation><edoal:not>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
-	    + "</edoal:not></edoal:Relation>" 
-	    + "<edoal:RelationCoDomainRestriction><edoal:class>"
-	    + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
-	    + "</edoal:class></edoal:RelationCoDomainRestriction>" 
-	    + "</edoal:and>" + "</edoal:Relation>");
-	toExport = new RelationConstruction( Constructor.INVERSE, Collections.singleton((PathExpression)new RelationId("http://my/super/relation")));
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:inverse>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
-	    + "</edoal:inverse>" + "</edoal:Relation>");
-	toExport = new RelationConstruction(Constructor.SYMMETRIC, Collections.singleton((PathExpression)new RelationId("http://my/super/relation")));
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:symmetric>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
-			  + "</edoal:symmetric>" + "</edoal:Relation>");
-	toExport = new RelationConstruction(Constructor.TRANSITIVE, Collections.singleton((PathExpression)new RelationId("http://my/super/relation")));
-	assertEquals( render( toExport ), 
-	    "<edoal:Relation>"
-	    + "<edoal:transitive>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
-			  + "</edoal:transitive>" + "</edoal:Relation>");
-	toExport = new RelationConstruction( Constructor.REFLEXIVE, Collections.singleton((PathExpression)new RelationId("http://my/super/relation")));
-	assertEquals( render(toExport), 
-	    "<edoal:Relation>"
-	    + "<edoal:reflexive>"
-	    + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
-			  + "</edoal:reflexive>" + "</edoal:Relation>" );
-	
+
+        RelationExpression toExport = new RelationId("http://my/super/relation");
+        assertEquals(render(toExport),
+                "<edoal:Relation rdf:about=\"http://my/super/relation\"/>");
+
+        // JE 2010: I could export it as well
+        RelationExpression relexp = new RelationDomainRestriction(new ClassId("http://my/super/class"));
+
+        final Set<PathExpression> expressions = new LinkedHashSet<PathExpression>(2);
+        expressions.add(new RelationId("http://my/super/relation0"));
+        expressions.add(new RelationId("http://my/super/relation1"));
+        expressions.add(relexp);
+
+        toExport = new RelationConstruction(Constructor.AND, expressions);
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:and rdf:parseType=\"Collection\">"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation0\"/>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation1\"/>"
+                + "<edoal:RelationDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
+                + "</edoal:class></edoal:RelationDomainRestriction>"
+                + "</edoal:and>" + "</edoal:Relation>");
+        toExport = new RelationConstruction(Constructor.OR, expressions);
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:or rdf:parseType=\"Collection\">"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation0\"/>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation1\"/>"
+                + "<edoal:RelationDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
+                + "</edoal:class></edoal:RelationDomainRestriction>"
+                + "</edoal:or>" + "</edoal:Relation>");
+
+        final Set<PathExpression> expressions2 = new LinkedHashSet<PathExpression>();
+        expressions2.add(new RelationConstruction(Constructor.NOT, Collections.singleton((PathExpression) new RelationId("http://my/super/relation"))));
+        expressions2.add(new RelationCoDomainRestriction(new ClassId("http://my/super/class")));
+
+        toExport = new RelationConstruction(Constructor.AND, expressions2);
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:and rdf:parseType=\"Collection\">"
+                + "<edoal:Relation><edoal:not>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
+                + "</edoal:not></edoal:Relation>"
+                + "<edoal:RelationCoDomainRestriction><edoal:class>"
+                + "<edoal:Class rdf:about=\"http://my/super/class\"/>"
+                + "</edoal:class></edoal:RelationCoDomainRestriction>"
+                + "</edoal:and>" + "</edoal:Relation>");
+        toExport = new RelationConstruction(Constructor.INVERSE, Collections.singleton((PathExpression) new RelationId("http://my/super/relation")));
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:inverse>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
+                + "</edoal:inverse>" + "</edoal:Relation>");
+        toExport = new RelationConstruction(Constructor.SYMMETRIC, Collections.singleton((PathExpression) new RelationId("http://my/super/relation")));
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:symmetric>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
+                + "</edoal:symmetric>" + "</edoal:Relation>");
+        toExport = new RelationConstruction(Constructor.TRANSITIVE, Collections.singleton((PathExpression) new RelationId("http://my/super/relation")));
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:transitive>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
+                + "</edoal:transitive>" + "</edoal:Relation>");
+        toExport = new RelationConstruction(Constructor.REFLEXIVE, Collections.singleton((PathExpression) new RelationId("http://my/super/relation")));
+        assertEquals(render(toExport),
+                "<edoal:Relation>"
+                + "<edoal:reflexive>"
+                + "<edoal:Relation rdf:about=\"http://my/super/relation\"/>"
+                + "</edoal:reflexive>" + "</edoal:Relation>");
+
     }
-    
-    @Test(groups = { "full", "omwg" }, dependsOnMethods = {"setUp"})
+
+    @Test(groups = {"full", "omwg"}, dependsOnMethods = {"setUp"})
     public void testExportCell() throws Exception {
+//        Assert.fail("HAVE TODO");
     }
-    
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"setUp"})
-	public void testExportAlignment() throws Exception {
-	
-	Ontology o1 = new BasicOntology();
-	o1.setURI( new URI("http://source") );
-	o1.setFormalism( "wsml" );
-	o1.setFormURI( new URI("http://wsml") );
-	Ontology o2 = new BasicOntology();
-	o2.setURI( new URI("http://target") );
-	o2.setFormalism( "wsml" );
-	o2.setFormURI( new URI("http://wsml") );
-	final EDOALAlignment doc = new EDOALAlignment();
-	doc.setExtension( Namespace.ALIGNMENT.uri, Annotations.ID, "http://asdf" );
-	doc.init( o1, o2 );
-
-	stream = new ByteArrayOutputStream(); 
-	writer = new PrintWriter ( new BufferedWriter(
-				                 new OutputStreamWriter( stream, "UTF-8" )), true);
-	renderer = new RDFRendererVisitor( writer );
-	renderer.setIndentString("");	// Indent should be empty
-	renderer.setNewLineString("");
-	doc.accept( renderer );//doc.render( renderer );
-	writer.flush();
-	writer.close();
-	stream.close();
-	assertEquals( stream.toString(), 
-"<?xml version='1.0' encoding='utf-8' standalone='no'?><rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"+
-         " xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'"+
-         " xmlns:xsd='http://www.w3.org/2001/XMLSchema#'"+
-         " xmlns:align='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"+
-         " xmlns:edoal='http://ns.inria.org/edoal/1.0/#'>"+
-		      "<Alignment rdf:about=\"http://asdf\"><xml>yes</xml><level>2EDOAL</level><type>**</type><id>http://asdf</id>"
-	    + "<onto1>"
-	    + "<Ontology rdf:about=\"http://source\"><location>http://source</location>"
-	    + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
-	    + "</Ontology>" + "</onto1>" + "<onto2>"
-	    + "<Ontology rdf:about=\"http://target\"><location>http://target</location>"
-	    + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
-	    + "</Ontology>" + "</onto2>"
-		      + "</Alignment>" +"</rdf:RDF>" );
-	doc.setType( "1*" );
-	stream = new ByteArrayOutputStream(); 
-	writer = new PrintWriter ( new BufferedWriter(
-				                 new OutputStreamWriter( stream, "UTF-8" )), true);
-	renderer = new RDFRendererVisitor( writer );
-	renderer.setIndentString("");	// Indent should be empty
-	renderer.setNewLineString("");
-	doc.accept( renderer );//doc.render( renderer );
-	writer.flush();
-	writer.close();
-	stream.close();
-	assertEquals( stream.toString(), 
-"<?xml version='1.0' encoding='utf-8' standalone='no'?><rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"+
-         " xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'"+
-         " xmlns:xsd='http://www.w3.org/2001/XMLSchema#'"+
-         " xmlns:align='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"+
-         " xmlns:edoal='http://ns.inria.org/edoal/1.0/#'>"+
-		      "<Alignment rdf:about=\"http://asdf\"><xml>yes</xml><level>2EDOAL</level><type>1*</type><id>http://asdf</id>"
-	    + "<onto1>"
-	    + "<Ontology rdf:about=\"http://source\"><location>http://source</location>"
-	    + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
-	    + "</Ontology>" + "</onto1>" + "<onto2>"
-	    + "<Ontology rdf:about=\"http://target\"><location>http://target</location>"
-	    + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
-	    + "</Ontology>" + "</onto2>"
-	    + "</Alignment>" +"</rdf:RDF>" );
+
+    @Test(groups = {"full", "omwg"}, dependsOnMethods = {"setUp"})
+    public void testExportLinkkeyBinding() throws Exception {
+        LinkkeyBinding linkkeyBinding = new LinkkeyBinding(new PropertyId(new URI("http://exmo.inrialpes.fr/binding1")), new PropertyId(new URI("http://exmo.inrialpes.fr/binding2")), LinkkeyBinding.EQ);
+        assertEquals(render(linkkeyBinding),
+                "<edoal:binding>"
+                + "<edoal:Corresp edoal:type=\"eq\">"
+                + "<edoal:property1>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding1\"/>"
+                + "</edoal:property1>"
+                + "<edoal:property2>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding2\"/>"
+                + "</edoal:property2>"
+                + "</edoal:Corresp>"
+                + "</edoal:binding>"
+        );
+        linkkeyBinding = new LinkkeyBinding(new PropertyId(new URI("http://exmo.inrialpes.fr/binding1")), new PropertyId(new URI("http://exmo.inrialpes.fr/binding2")), LinkkeyBinding.IN);
+        assertEquals(render(linkkeyBinding),
+                "<edoal:binding>"
+                + "<edoal:Corresp edoal:type=\"in\">"
+                + "<edoal:property1>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding1\"/>"
+                + "</edoal:property1>"
+                + "<edoal:property2>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding2\"/>"
+                + "</edoal:property2>"
+                + "</edoal:Corresp>"
+                + "</edoal:binding>"
+        );
+    }
+
+    @Test(groups = {"full", "omwg"}, dependsOnMethods = {"testExportLinkkeyBinding"})
+    public void testExportLinkkey() throws Exception {
+        Linkkey linkkey = new Linkkey();
+        LinkkeyBinding linkkeyBinding1 = new LinkkeyBinding(new PropertyId(new URI("http://exmo.inrialpes.fr/binding1")), new PropertyId(new URI("http://exmo.inrialpes.fr/binding2")), LinkkeyBinding.EQ);
+        linkkey.addBinding(linkkeyBinding1);
+        assertEquals(render(linkkey),
+                "<edoal:linkkey>"
+                + "<edoal:Linkkey edoal:type=\"plain\">"
+                + "<edoal:binding>"
+                + "<edoal:Corresp edoal:type=\"eq\">"
+                + "<edoal:property1>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding1\"/>"
+                + "</edoal:property1>"
+                + "<edoal:property2>"
+                + "<edoal:Property rdf:about=\"http://exmo.inrialpes.fr/binding2\"/>"
+                + "</edoal:property2>"
+                + "</edoal:Corresp>"
+                + "</edoal:binding>"
+                + "</edoal:Linkkey>"
+                + "</edoal:linkkey>"
+        );
+    }
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
+    public void testExportAlignment() throws Exception {
+
+        Ontology o1 = new BasicOntology();
+        o1.setURI(new URI("http://source"));
+        o1.setFormalism("wsml");
+        o1.setFormURI(new URI("http://wsml"));
+        Ontology o2 = new BasicOntology();
+        o2.setURI(new URI("http://target"));
+        o2.setFormalism("wsml");
+        o2.setFormURI(new URI("http://wsml"));
+        final EDOALAlignment doc = new EDOALAlignment();
+        doc.setExtension(Namespace.ALIGNMENT.uri, Annotations.ID, "http://asdf");
+        doc.init(o1, o2);
+
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(new BufferedWriter(
+                new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        renderer.setIndentString("");	// Indent should be empty
+        renderer.setNewLineString("");
+        doc.accept(renderer);//doc.render( renderer );
+        writer.flush();
+        writer.close();
+        stream.close();
+        assertEquals(stream.toString(),
+                "<?xml version='1.0' encoding='utf-8' standalone='no'?><rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"
+                + " xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'"
+                + " xmlns:xsd='http://www.w3.org/2001/XMLSchema#'"
+                + " xmlns:align='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"
+                + " xmlns:edoal='http://ns.inria.org/edoal/1.0/#'>"
+                + "<Alignment rdf:about=\"http://asdf\"><xml>yes</xml><level>2EDOAL</level><type>**</type><id>http://asdf</id>"
+                + "<onto1>"
+                + "<Ontology rdf:about=\"http://source\"><location>http://source</location>"
+                + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
+                + "</Ontology>" + "</onto1>" + "<onto2>"
+                + "<Ontology rdf:about=\"http://target\"><location>http://target</location>"
+                + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
+                + "</Ontology>" + "</onto2>"
+                + "</Alignment>" + "</rdf:RDF>");
+        doc.setType("1*");
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(new BufferedWriter(
+                new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        renderer.setIndentString("");	// Indent should be empty
+        renderer.setNewLineString("");
+        doc.accept(renderer);//doc.render( renderer );
+        writer.flush();
+        writer.close();
+        stream.close();
+        assertEquals(stream.toString(),
+                "<?xml version='1.0' encoding='utf-8' standalone='no'?><rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"
+                + " xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'"
+                + " xmlns:xsd='http://www.w3.org/2001/XMLSchema#'"
+                + " xmlns:align='http://knowledgeweb.semanticweb.org/heterogeneity/alignment#'"
+                + " xmlns:edoal='http://ns.inria.org/edoal/1.0/#'>"
+                + "<Alignment rdf:about=\"http://asdf\"><xml>yes</xml><level>2EDOAL</level><type>1*</type><id>http://asdf</id>"
+                + "<onto1>"
+                + "<Ontology rdf:about=\"http://source\"><location>http://source</location>"
+                + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
+                + "</Ontology>" + "</onto1>" + "<onto2>"
+                + "<Ontology rdf:about=\"http://target\"><location>http://target</location>"
+                + "<formalism><Formalism align:name=\"wsml\" align:uri=\"http://wsml\"/></formalism>"
+                + "</Ontology>" + "</onto2>"
+                + "</Alignment>" + "</rdf:RDF>");
     }
 
 }
diff --git a/test/src/EDOALParserTest.java b/test/src/EDOALParserTest.java
index 402189be5e1014ae47c389835db904ce68e3e59a..866a274c69a775666d9c5edd587b26d597cd8b7b 100644
--- a/test/src/EDOALParserTest.java
+++ b/test/src/EDOALParserTest.java
@@ -18,102 +18,135 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
+import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
+import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyId;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import org.semanticweb.owl.align.AlignmentVisitor;
-import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Alignment;
 
 import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
-import fr.inrialpes.exmo.align.parser.RDFParser;
 import fr.inrialpes.exmo.align.util.NullStream;
 
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
 import java.io.BufferedWriter;
 import java.io.OutputStreamWriter;
-import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
-
-import java.util.Collections;
-import java.util.HashSet;
+import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.Set;
-import java.net.URI;
-
+import org.semanticweb.owl.align.Cell;
+import static org.testng.Assert.assertFalse;
 
 /**
  * These tests corresponds to the tests presented in the examples/omwg directory
  */
-
 public class EDOALParserTest {
 
     private AlignmentParser aparser1 = null;
+    
 
-    @Test(groups = { "full", "omwg", "raw" })
+    @Test(groups = {"full", "omwg", "raw"})
     public void setUp() throws Exception {
-	aparser1 = new AlignmentParser( 0 );
-	assertNotNull( aparser1 );
+        aparser1 = new AlignmentParser(0);
+        assertNotNull(aparser1);
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods={ "setUp" })
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"setUp"})
     public void typedParsingTest() throws Exception {
-	AlignmentParser aparser2 = new AlignmentParser( 2 );
-	aparser2.initAlignment( null );
-	// Would be good to close System.err at that point...
-	OutputStream serr = System.err;
-	System.setErr( new PrintStream( new NullStream() ) );
-	Alignment al = aparser2.parse( "file:examples/omwg/total.xml" );
-	System.setErr( new PrintStream( serr ) );
-	assertNotNull( al );
+        AlignmentParser aparser2 = new AlignmentParser(2);
+        aparser2.initAlignment(null);
+        // Would be good to close System.err at that point...
+        OutputStream serr = System.err;
+        System.setErr(new PrintStream(new NullStream()));
+        Alignment al = aparser2.parse("file:examples/omwg/total.xml");
+        System.setErr(new PrintStream(serr));
+        assertNotNull(al);
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods={ "typedParsingTest" })
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"typedParsingTest"})
+    public void linkeyParsingTest() throws Exception {
+        // Load the full test
+        aparser1.initAlignment(null);
+        EDOALAlignment alignment = (EDOALAlignment) aparser1.parse("file:test/input/alignment2.rdf");
+        assertNotNull(alignment);
+        Enumeration<Cell> cells = alignment.getElements();
+        EDOALCell cell = (EDOALCell) cells.nextElement();
+        assertFalse(cells.hasMoreElements());
+
+        Set<Linkkey> linkkeys = cell.linkkeys();
+        assertEquals(linkkeys.size(), 1);
+        Linkkey linkkey = linkkeys.iterator().next();
+        assertEquals(linkkey.getType(), "weak");
+
+        Set<LinkkeyBinding> bindings = linkkey.bindings();
+        assertEquals(bindings.size(), 2);
+        Iterator<LinkkeyBinding> bindingIter = bindings.iterator();
+        LinkkeyBinding binding = bindingIter.next();
+        LinkkeyBinding firstBinding = null;
+        LinkkeyBinding secondBinding = null;
+        if(binding.getType().equals("eq")){
+            firstBinding = binding;
+            secondBinding =  bindingIter.next();
+        }
+        else{
+            firstBinding = bindingIter.next();
+            secondBinding =  binding;
+            
+        }
+        assertEquals(firstBinding.getType(), "eq");
+        assertEquals(((PropertyId)firstBinding.getExpression1()).getURI().toString(), "http://purl.org/ontology/mo/opus");
+        assertEquals(((PropertyId)firstBinding.getExpression2()).getURI().toString(), "http://exmo.inrialpes.fr/connectors#number");
+        
+        assertEquals(secondBinding.getType(), "in");
+        assertEquals(((PropertyId)secondBinding.getExpression1()).getURI().toString(), "http://purl.org/ontology/mo/name");
+        assertEquals(((PropertyId)secondBinding.getExpression2()).getURI().toString(), "http://exmo.inrialpes.fr/connectors#nom");
+    }
+    
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"linkeyParsingTest"})
     public void roundTripTest() throws Exception {
-	// Load the full test
-	aparser1.initAlignment( null );
-	Alignment alignment = aparser1.parse( "file:examples/omwg/total.xml" );
-	assertNotNull( alignment );
-	// Print it in a string
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new RDFRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
-	String str1 = stream.toString();
-	// Read it again
-	aparser1 = new AlignmentParser( 0 );
-	aparser1.initAlignment( null );
-	//System.err.println( str1 );
-	Alignment al = aparser1.parseString( str1 );
-	assertEquals( alignment.nbCells(), al.nbCells() );
-	// Print it in another string
-	stream = new ByteArrayOutputStream(); 
-	writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	renderer = new RDFRendererVisitor( writer );
-	al.render( renderer );
-	writer.flush();
-	writer.close();
-	String str2 = stream.toString();
+        // Load the full test
+        aparser1.initAlignment(null);
+        Alignment alignment = aparser1.parse("file:examples/omwg/total.xml");
+        assertNotNull(alignment);
+        // Print it in a string
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new RDFRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
+        String str1 = stream.toString();
+        // Read it again
+        aparser1 = new AlignmentParser(0);
+        aparser1.initAlignment(null);
+        //System.err.println( str1 );
+        Alignment al = aparser1.parseString(str1);
+        assertEquals(alignment.nbCells(), al.nbCells());
+        // Print it in another string
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        al.render(renderer);
+        writer.flush();
+        writer.close();
+        String str2 = stream.toString();
 	// They should be the same... (no because of invertion...)
-	//assertEquals( str1, str2 );
-	// But have the same length
-	assertEquals( str1.length(), str2.length() );
+        //assertEquals( str1, str2 );
+        // But have the same length
+        assertEquals(str1.length(), str2.length());
     }
+
 }
diff --git a/test/src/EDOALTest.java b/test/src/EDOALTest.java
index 02a75c3ce81eda903c33518455a6bee0c437c164..76956a2d93cf720a9891d846a24a4f7dafa6d2f9 100644
--- a/test/src/EDOALTest.java
+++ b/test/src/EDOALTest.java
@@ -18,19 +18,23 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
+import fr.inrialpes.exmo.align.impl.edoal.ClassId;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import org.semanticweb.owl.align.AlignmentVisitor;
-import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Alignment;
 
-import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.edoal.EDOALAlignment;
+import fr.inrialpes.exmo.align.impl.edoal.EDOALCell;
+import fr.inrialpes.exmo.align.impl.edoal.Expression;
+import fr.inrialpes.exmo.align.impl.edoal.Linkkey;
+import fr.inrialpes.exmo.align.impl.edoal.LinkkeyBinding;
+import fr.inrialpes.exmo.align.impl.edoal.PathExpression;
+import fr.inrialpes.exmo.align.impl.edoal.PropertyId;
+import fr.inrialpes.exmo.align.impl.rel.EquivRelation;
 import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 
@@ -39,105 +43,167 @@ import java.io.PrintWriter;
 import java.io.BufferedWriter;
 import java.io.OutputStreamWriter;
 import java.io.FileOutputStream;
-
+import java.net.URI;
+import java.util.Set;
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Relation;
+import static org.testng.Assert.fail;
 
 // JE2010: THIS SHOULD TEST ALL ERRORS RAISED BY CONSTRUCTORS
-
 /**
  * These tests corresponds to the tests presented in the examples/omwg directory
  */
-
 public class EDOALTest {
 
     private Alignment alignment = null;
     private AlignmentParser aparser1 = null;
 
-    @Test(groups = { "full", "omwg", "raw" })
+    @Test(groups = {"full", "omwg", "raw"})
     public void loadPrintTest() throws Exception {
-	/*
-java -cp ../../lib/procalign.jar fr.inrialpes.exmo.align.cli.ParserPrinter wine.xml > wine2.xml
-	*/
-	aparser1 = new AlignmentParser( 0 );
-	assertNotNull( aparser1 );
-	alignment = aparser1.parse( "file:examples/omwg/wine.xml" );
-	assertNotNull( alignment );
-	assertTrue( alignment instanceof EDOALAlignment );
-	FileOutputStream stream = new FileOutputStream("test/output/wine2.xml");
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new RDFRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
+        /*
+         java -cp ../../lib/procalign.jar fr.inrialpes.exmo.align.cli.ParserPrinter wine.xml > wine2.xml
+         */
+        aparser1 = new AlignmentParser(0);
+        assertNotNull(aparser1);
+        alignment = aparser1.parse("file:examples/omwg/wine.xml");
+        assertNotNull(alignment);
+        assertTrue(alignment instanceof EDOALAlignment);
+        FileOutputStream stream = new FileOutputStream("test/output/wine2.xml");
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new RDFRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
     }
 
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"loadPrintTest"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"loadPrintTest"})
     public void roundTripTest() throws Exception {
-	/*
-java -cp ../../lib/procalign.jar fr.inrialpes.exmo.align.cli.ParserPrinter wine2.xml > wine3.xml
-	*/
-	aparser1.initAlignment( null );
-	alignment = aparser1.parse( "file:test/output/wine2.xml" );
-	assertNotNull( alignment );
-	FileOutputStream stream = new FileOutputStream("test/output/wine3.xml");
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new RDFRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
+        /*
+         java -cp ../../lib/procalign.jar fr.inrialpes.exmo.align.cli.ParserPrinter wine2.xml > wine3.xml
+         */
+        aparser1.initAlignment(null);
+        alignment = aparser1.parse("file:test/output/wine2.xml");
+        assertNotNull(alignment);
+        FileOutputStream stream = new FileOutputStream("test/output/wine3.xml");
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new RDFRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
     }
 
     /* diff wine2.xml wine3.xml */
-    @Test(groups = { "full", "omwg", "raw" }, dependsOnMethods = {"roundTripTest"})
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"roundTripTest"})
     public void diffTest() throws Exception {
-	aparser1.initAlignment( null );
-	Alignment oldal = aparser1.parse( "file:test/output/wine2.xml" );
-	aparser1.initAlignment( null );
-	alignment = aparser1.parse( "file:test/output/wine3.xml" );
-	assertNotNull( alignment );
-	ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
-	PrintWriter writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	AlignmentVisitor renderer = new RDFRendererVisitor( writer );
-	oldal.render( renderer );
-	writer.flush();
-	writer.close();
-	String wine2 = stream.toString();
-	stream = new ByteArrayOutputStream(); 
-	writer = new PrintWriter (
-			  new BufferedWriter(
-			       new OutputStreamWriter( stream, "UTF-8" )), true);
-	renderer = new RDFRendererVisitor( writer );
-	alignment.render( renderer );
-	writer.flush();
-	writer.close();
-	assertEquals( "".equals( wine2 ), false );
-	// This tests the round triping
-	assertEquals( wine2.length(), stream.toString().length() );
-	// This provides an absolute value
-	assertEquals( wine2.length(), 4669 );
-	// This does not work because (at least) the order of correspondences is never the same...
-	//assertEquals( wine2, stream.toString() );
+        aparser1.initAlignment(null);
+        Alignment oldal = aparser1.parse("file:test/output/wine2.xml");
+        aparser1.initAlignment(null);
+        alignment = aparser1.parse("file:test/output/wine3.xml");
+        assertNotNull(alignment);
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        PrintWriter writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        AlignmentVisitor renderer = new RDFRendererVisitor(writer);
+        oldal.render(renderer);
+        writer.flush();
+        writer.close();
+        String wine2 = stream.toString();
+        stream = new ByteArrayOutputStream();
+        writer = new PrintWriter(
+                new BufferedWriter(
+                        new OutputStreamWriter(stream, "UTF-8")), true);
+        renderer = new RDFRendererVisitor(writer);
+        alignment.render(renderer);
+        writer.flush();
+        writer.close();
+        assertEquals("".equals(wine2), false);
+        // This tests the round triping
+        assertEquals(wine2.length(), stream.toString().length());
+        // This provides an absolute value
+        assertEquals(wine2.length(), 4669);
+        // This does not work because (at least) the order of correspondences is never the same...
+        //assertEquals( wine2, stream.toString() );
     }
 
     /* This is round triping wrt converting to URIALignment...
-       // Does not work anymore, because now it would try to parse an OMWG file... which goes to loop
-    @Test(expectedExceptions = AlignmentException.class, groups = { "full", "omwg", "raw" }, dependsOnMethods = {"roundTripTest"})
-    public void anotherRoundTripTest() throws Exception {
-	aparser1.initAlignment( null );
-	EDOALAlignment eal = (EDOALAlignment)aparser1.parse( "file:test/output/wine2.xml" );
-	assertNotNull( eal );
-	assertEquals( eal.nbCells(), 5 ); 
-	URIAlignment al = eal.toURIAlignment();
-	assertNotNull( al );
-	assertEquals( al.nbCells(), 3 );
-	eal = EDOALAlignment.toEDOALAlignment( al ); // does not work because the ontology cannot be loaded!
-	assertNotNull( eal );
-	assertEquals( eal.nbCells(), 3 );
-   } */
+     // Does not work anymore, because now it would try to parse an OMWG file... which goes to loop
+     @Test(expectedExceptions = AlignmentException.class, groups = { "full", "omwg", "raw" }, dependsOnMethods = {"roundTripTest"})
+     public void anotherRoundTripTest() throws Exception {
+     aparser1.initAlignment( null );
+     EDOALAlignment eal = (EDOALAlignment)aparser1.parse( "file:test/output/wine2.xml" );
+     assertNotNull( eal );
+     assertEquals( eal.nbCells(), 5 ); 
+     URIAlignment al = eal.toURIAlignment();
+     assertNotNull( al );
+     assertEquals( al.nbCells(), 3 );
+     eal = EDOALAlignment.toEDOALAlignment( al ); // does not work because the ontology cannot be loaded!
+     assertNotNull( eal );
+     assertEquals( eal.nbCells(), 3 );
+     } */
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"roundTripTest"})
+    public void linkkeyBindingTest() throws Exception {
+        String[] types = {"eq", "in"};
+        PathExpression expression1 = new PropertyId(new URI("http://exmo.inria.fr/RootElement1"));
+        PathExpression expression2 = new PropertyId(new URI("http://exmo.inria.fr/RootElement2"));
+
+        LinkkeyBinding linkkeyBinding = null;
+        for (String type : types) {
+            linkkeyBinding = new LinkkeyBinding(expression1, expression2, type);
+            assertEquals(linkkeyBinding.getExpression1(), expression1);
+            assertEquals(linkkeyBinding.getExpression2(), expression2);
+            assertEquals(type, linkkeyBinding.getType());
+        }
 
+        try {
+            new LinkkeyBinding(expression1, expression2, "toto");
+            fail("AlignmentException should be raised !");
+        } catch (AlignmentException aex) {
+            ;//OK
+        }
+    }
+
+    @Test(groups = {"full", "omwg", "raw"}, dependsOnMethods = {"linkkeyBindingTest"})
+    public void linkkeyTest() throws Exception {
+        Relation relation = new EquivRelation();
+        Expression expression1 = new ClassId("http://exmo.inria.fr/RootElement1");
+        Expression expression2 = new ClassId("http://exmo.inria.fr/RootElement2");
+        EDOALCell cell = new EDOALCell("1", expression1, expression2, relation, 1.0);
+
+        //Testing type
+        assertEquals("weak", Linkkey.WEAK);
+        assertEquals("plain", Linkkey.PLAIN);
+        assertEquals("strong", Linkkey.STRONG);
+        String[] types = {"weak", "plain", "strong"};
+        Linkkey linkkey = null;
+        for (String type : types) {
+            linkkey = new Linkkey(type);
+            assertEquals(type, linkkey.getType());
+            cell.addLinkkey(linkkey);
+        }
+        assertEquals(3, cell.linkkeys().size());
+
+        linkkey = new Linkkey();
+        assertEquals(Linkkey.PLAIN, linkkey.getType());
+        try {
+            new Linkkey("toto");
+            fail("AlignmentException should be raised !");
+        } catch (AlignmentException aex) {
+            ;//OK
+        }
+        
+        //Tests on bindings
+        LinkkeyBinding linkkeyBinding1 = new LinkkeyBinding(new PropertyId(), new PropertyId(), LinkkeyBinding.IN);
+        LinkkeyBinding linkkeyBinding2 = new LinkkeyBinding(new PropertyId(), new PropertyId(), LinkkeyBinding.EQ);
+        linkkey.addBinding(linkkeyBinding1);
+        linkkey.addBinding(linkkeyBinding2);
+        Set<LinkkeyBinding> bindings = linkkey.bindings();
+        assertEquals(2, bindings.size());
+        assertTrue(bindings.contains(linkkeyBinding1));
+        assertTrue(bindings.contains(linkkeyBinding2));
+    }
 }
diff --git a/test/src/IOTest.java b/test/src/IOTest.java
index 1a249d41cdd7572d078c8b5dabc4a732424a862d..19dcf38d9f4ad76ba46d4b3435978491f1084e6e 100644
--- a/test/src/IOTest.java
+++ b/test/src/IOTest.java
@@ -20,25 +20,15 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.Cell;
 
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
-import fr.inrialpes.exmo.ontowrap.Ontology;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.io.FileOutputStream;
 import java.io.File;
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
diff --git a/test/src/JWNLTest.java b/test/src/JWNLTest.java
index a328e545340a392f7ec512f40d1868b2479a58a2..262a73a1efb97218137bf0a41e3e47ac7d381362 100644
--- a/test/src/JWNLTest.java
+++ b/test/src/JWNLTest.java
@@ -20,14 +20,10 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 import org.testng.annotations.BeforeSuite;
 
 import org.semanticweb.owl.align.AlignmentVisitor;
-import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
 
@@ -40,8 +36,6 @@ import java.io.PrintWriter;
 import java.io.BufferedWriter;
 import java.io.OutputStreamWriter;
 import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Vector;
 import java.util.Properties;
 
 /**
diff --git a/test/src/MatcherTest.java b/test/src/MatcherTest.java
index 439f8384570fa049321ddd61268d9f8cc0194f97..d6f9fd1700676ea862de31934fde95de11091400 100644
--- a/test/src/MatcherTest.java
+++ b/test/src/MatcherTest.java
@@ -22,9 +22,6 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 //import org.testng.annotations.*;
 
@@ -32,30 +29,16 @@ import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Alignment;
-import org.semanticweb.owl.align.Evaluator;
 import org.semanticweb.owl.align.Cell;
 
 import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
 import fr.inrialpes.exmo.align.impl.MatrixMeasure;
-import fr.inrialpes.exmo.ontosim.string.StringDistances;
-import fr.inrialpes.exmo.align.impl.eval.PRecEvaluator;
-import fr.inrialpes.exmo.align.impl.URIAlignment;
-
-import fr.inrialpes.exmo.ontowrap.OntologyCache;
-
-import fr.inrialpes.exmo.align.parser.AlignmentParser;
-import fr.inrialpes.exmo.align.util.NullStream;
-
-import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
 import java.io.BufferedWriter;
 import java.io.OutputStreamWriter;
 import java.io.FileOutputStream;
-import java.io.OutputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Vector;
 import java.util.Properties;
 
 /**
diff --git a/test/src/OntoTest.java b/test/src/OntoTest.java
index e560693e2809b140d59460694ed26c8946962c0e..b74aec9e9036d719327a2c0270ab54f222af8028 100644
--- a/test/src/OntoTest.java
+++ b/test/src/OntoTest.java
@@ -20,9 +20,7 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
@@ -33,23 +31,12 @@ import fr.inrialpes.exmo.ontowrap.HeavyLoadedOntology;
 import fr.inrialpes.exmo.ontowrap.OntologyFactory;
 import fr.inrialpes.exmo.ontowrap.OntowrapException;
 
-import fr.inrialpes.exmo.ontowrap.owlapi10.OWLAPIOntology;
-import fr.inrialpes.exmo.ontowrap.owlapi10.OWLAPIOntologyFactory;
 import fr.inrialpes.exmo.ontowrap.owlapi30.OWLAPI3Ontology;
 import fr.inrialpes.exmo.ontowrap.owlapi30.OWLAPI3OntologyFactory;
 import fr.inrialpes.exmo.ontowrap.jena25.JENAOntologyFactory;
 import fr.inrialpes.exmo.ontowrap.jena25.JENAOntology;
 
-import org.semanticweb.owl.align.AlignmentException;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
 
 import java.util.Set;
 
diff --git a/test/src/READMETest.java b/test/src/READMETest.java
index 2a2a94f076fda5ed44b855798d50113f3a153727..f67ebfd1db7a868881669e40da59eccc09517238 100644
--- a/test/src/READMETest.java
+++ b/test/src/READMETest.java
@@ -20,17 +20,13 @@
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Alignment;
-import org.semanticweb.owl.align.Cell;
-import org.semanticweb.owl.align.Evaluator;
 
 import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
@@ -49,7 +45,6 @@ import java.io.OutputStreamWriter;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Properties;
 
 /**
diff --git a/test/src/SPARQLSelectRendererVisitorTest.java b/test/src/SPARQLSelectRendererVisitorTest.java
index 13a9da951981178d853f2d23615148b7f9f2ce37..d268d42b35d8ef1fb94e99dacd9c4c95d2816362 100644
--- a/test/src/SPARQLSelectRendererVisitorTest.java
+++ b/test/src/SPARQLSelectRendererVisitorTest.java
@@ -18,55 +18,55 @@ import org.testng.annotations.Test;
  */
 public class SPARQLSelectRendererVisitorTest {
 
-    @Test(groups = {"full", "impl", "raw"})
-    public void QueryFromSimpleLinkkey() throws Exception {
-        String alignmentFileName = "alignment2.rdf";
-        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
-        StringWriter stringWriter = new StringWriter();
-        PrintWriter writer = new PrintWriter(stringWriter);
-        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
-        Properties properties = new Properties();
-        renderer.init(properties);
-        alignment.render(renderer);
-        assertEquals(alignment.nbCells(), 1);
-        Enumeration<Cell> cells = alignment.getElements();
-        Cell cell = cells.nextElement();
-        URI remoteURI = new URI("http://example.org/data.rdf");
-	// THIS DOES THE edoal:type="in" How to do equal?
-        String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
-                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-	    //+ "CONSTRUCT { ?s1 owl:sameAs ?s2 }"
-	        + "SELECT ?s1 ?s2"
-                + "WHERE {\n"
-                + "?s1 rdf:type ns0:RootElement .\n"
-                + "?s1 ns0:number ?o1 ."
-                + "SERVICE <http://example.org/data.rdf> {"
-                + "?s2 rdf:type ns1:MusicalWork . \n"
-                + "?s2 ns1:opus ?o1"
-                + "}\n"
-                + "}\n";
-
-        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
-                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
-                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
-                + "CONSTRUCT ?s1 ?s2"
-                + "WHERE {\n"
-                + "?s2 rdf:type ns1:MusicalWork . \n"
-                + "?s2 ns1:opus ?o1"
-                + "SERVICE <http://example.org/data.rdf> {"
-                + "?s1 rdf:type ns0:RootElement .\n"
-                + "?s1 ns0:number ?o1 ."
-                + "}\n"
-                + "}\n";
-        assertEquals(renderer.getQuery(cell, 0, remoteURI), expectedQuery1, "FOR alignment file " + alignmentFileName);
-        assertEquals(renderer.getQuery(cell, 1, remoteURI), expectedQuery2, "FOR alignment file " + alignmentFileName);
-        fail("HAVE TODO");
-    }
-
-    @Test(groups = {"full", "impl", "raw"})
-    public void HaveTodo() throws Exception {
-        fail("HAVE TODO : with (in + eq) => OPTIONAL (with SERVICE call on remote) / many correspondances / With transformations / On local (FROM ...) or remote sparql endpoint (SERVICE) ");
-    }
+//    @Test(groups = {"full", "impl", "raw"})
+//    public void QueryFromSimpleLinkkey() throws Exception {
+//        String alignmentFileName = "alignment2.rdf";
+//        EDOALAlignment alignment = Utils.loadAlignement(alignmentFileName);
+//        StringWriter stringWriter = new StringWriter();
+//        PrintWriter writer = new PrintWriter(stringWriter);
+//        SPARQLSelectRendererVisitor renderer = new SPARQLSelectRendererVisitor(writer);
+//        Properties properties = new Properties();
+//        renderer.init(properties);
+//        alignment.render(renderer);
+//        assertEquals(alignment.nbCells(), 1);
+//        Enumeration<Cell> cells = alignment.getElements();
+//        Cell cell = cells.nextElement();
+//        URI remoteURI = new URI("http://example.org/data.rdf");
+//	// THIS DOES THE edoal:type="in" How to do equal?
+//        String expectedQuery1 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
+//	    //+ "CONSTRUCT { ?s1 owl:sameAs ?s2 }"
+//	        + "SELECT ?s1 ?s2"
+//                + "WHERE {\n"
+//                + "?s1 rdf:type ns0:RootElement .\n"
+//                + "?s1 ns0:number ?o1 ."
+//                + "SERVICE <http://example.org/data.rdf> {"
+//                + "?s2 rdf:type ns1:MusicalWork . \n"
+//                + "?s2 ns1:opus ?o1"
+//                + "}\n"
+//                + "}\n";
+//
+//        String expectedQuery2 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
+//                + "PREFIX ns0:<http://exmo.inria.fr/connectors#>\n"
+//                + "PREFIX ns1:<http://purl.org/ontology/mo/>\n"
+//                + "CONSTRUCT ?s1 ?s2"
+//                + "WHERE {\n"
+//                + "?s2 rdf:type ns1:MusicalWork . \n"
+//                + "?s2 ns1:opus ?o1"
+//                + "SERVICE <http://example.org/data.rdf> {"
+//                + "?s1 rdf:type ns0:RootElement .\n"
+//                + "?s1 ns0:number ?o1 ."
+//                + "}\n"
+//                + "}\n";
+//        assertEquals(renderer.getQuery(cell, 0, remoteURI), expectedQuery1, "FOR alignment file " + alignmentFileName);
+//        assertEquals(renderer.getQuery(cell, 1, remoteURI), expectedQuery2, "FOR alignment file " + alignmentFileName);
+//        fail("HAVE TODO");
+//    }
+//
+//    @Test(groups = {"full", "impl", "raw"})
+//    public void HaveTodo() throws Exception {
+//        fail("HAVE TODO : with (in + eq) => OPTIONAL (with SERVICE call on remote) / many correspondances / With transformations / On local (FROM ...) or remote sparql endpoint (SERVICE) ");
+//    }
 
 }