diff --git a/README.TXT b/README.TXT
index ba879e83541f472e25c6145e76c99f2ec350b94b..dfea4a95ac03faebff10f064ae2f6a3a1ddabc1a 100644
--- a/README.TXT
+++ b/README.TXT
@@ -1,10 +1,10 @@
 #######################################################################
 #              Ontology alignment API and implementation              #
-#                      23/02/2012, version 4.3                        #
+#                      01/01/2013, version 4.4                        #
 #                  http://alignapi.gforge.inria.fr                    #
 #######################################################################
 
-Copyright (C) 2003-2012 INRIA.
+Copyright (C) 2003-2013 INRIA.
 Copyright (C) 2004-2005 Universit� de Montr�al.
 Copyright (C) 2005 CNR Pisa.
 Copyright (C) 2005 Konstantinos A. Nedas.
@@ -78,7 +78,7 @@ $ java -jar lib/procalign.jar file://$CWD/examples/rdf/edu.umbc.ebiquity.publica
 Using with JWNL (Wordnet)
 -------------------------
 
-- Wordnet 2.0 (or 3.0) should be installed its directory to be put in $WNDIR
+- Wordnet 3.0 should be installed its directory to be put in $WNDIR
 - jwnl.jar commons-logging.jar must be in lib.
 (file_properties.xml need not anymore to be in current directory)
 
diff --git a/build.xml b/build.xml
index 5644f44c01e91bb79266c0c2b75cd5f366a5e420..f9ca4232f6cff741e2688983c600f5d813658caa 100644
--- a/build.xml
+++ b/build.xml
@@ -45,7 +45,7 @@
 
   <!-- tested -->
   <target name="init" depends="bind">
-    <property name="jarclasspath" value="skosapi/skosapi.jar owlapi30/owlapi-bin.jar ontosim/ontosim.jar getopt/getopt.jar log4j/commons-logging.jar log4j/log4j.jar log4j/slf4j-api.jar log4j/slf4j-log4j.jar jwnl/jwnl.jar lucene/lucene-core.jar jena/jena.jar jena/iri.jar jena/icu4j.jar xerces/xercesImpl.jar xerces/resolver.jar xerces/xml-apis.jar align.jar ontowrap.jar procalign.jar"/>
+    <property name="jarclasspath" value="skosapi/skosapi.jar owlapi30/owlapi-bin.jar ontosim/ontosim.jar getopt/getopt.jar log4j/commons-logging.jar log4j/log4j.jar log4j/slf4j-api.jar log4j/slf4j-log4j.jar jwnl/jwnl.jar lucene/lucene-core.jar jena/jena.jar jena/iri.jar jena/icu4j.jar iddl/iddl.jar xerces/xercesImpl.jar xerces/resolver.jar xerces/xml-apis.jar hermit/HermiT.jar align.jar ontowrap.jar procalign.jar"/>
   </target>
 
   <target name="versionnumber" depends="init" description="Establishes the version number">
@@ -303,7 +303,7 @@
     </javac>
     <!-- possible groups: raw=impl+serv+io+onto+omwg, full=raw+ling+sem -->
     <!-- ling requires WordNet and takes ages initialising it -->
-    <testng groups="raw"
+    <testng groups="full"
 	    sourcedir="test/src"
 	    outputDir="test/html"  verbose="1"
 	    haltOnFailure="false" failureProperty="failed">
diff --git a/html/img/depend.png b/html/img/depend.png
index 1fd3bab8a145e2deb786b9276f9e1b1b8e93d1c2..9dc8620c06387d3eddcb3587f839f5c7db6b7ae1 100644
Binary files a/html/img/depend.png and b/html/img/depend.png differ
diff --git a/html/lib.html b/html/lib.html
index c563ea19684a82226df6746d996b96a280d1cdce..237039140aef40a859737ebc11076bb641253040 100644
--- a/html/lib.html
+++ b/html/lib.html
@@ -58,7 +58,7 @@ Here is a picture of the various dependencies involved:
 <dl>
 <dt><a href="http://jena.sourceforge.net/">Jena</a> 2.6.2:
   jena.jar icu4j.jar iri.jar arq.jar [<a href="http://www.opensource.org/licenses/bsd-license.php">BSD*</a>]</dt>
-<dd>Provides the RDF parser (which is also used by Pellet).</dd>
+<dd>Provides the RDF parser.</dd>
 <dt><a href="http://xerces.apache.org">Xerces</a> 2.9.1: xercesImpl.jar resolver.jar xml-apis.jar [<a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache</a>]</dt>
 <dd>Required by Jena for parsing international characters.</dd-->
 </dl>
@@ -86,14 +86,11 @@ In addition to OntoSim, JWNLAlignment requires JWNL.
 <h3>Required for reasoning with alignments</h3>
 
 <dl>
-<dt><a href="http://iddl.gforge.inria.fr">IDDL</a> 1.3-20100325: iddl.jar [<a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</a>]</dt>
-<dd>In turns it requires Pellet.</dd>
-<dt><a href="http://clarkparsia.com/pellet/">Pellet</a> 2.1:
-  aterm-java-1.6.jar pellet-core.jar pellet-jena.jar
-  pellet-owlapiv3.jar [<a href="http://www.gnu.org/licenses/agpl.html">AGPL</a>]</dt>
-<dd>In turn, it requires Jena, Jetty, etc. <span style="color: red;">Because Pellet is under
-  AGPL we cannot distribute it and you have to download it
-  from <a href="http://clarkparsia.com/pellet/download">Clark&amp;Parsia</a>.</span></dd>
+<dt><a href="http://iddl.gforge.inria.fr">IDDL</a> 1.4: iddl.jar [<a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</a>]</dt>
+<dd>In turns it requires HermiT.</dd>
+<dt><a href="http://www.hermit-reasoner.com/">HermiT</a> 1.3.6:
+   [<a href="http://www.gnu.org/licenses/old-licenses/lgpl-3.0.html">LGPL</a>]</dt>
+<dd>Provides OWL Reasoning. It requires the OWL API.</dd>
 </dl>
 
 <h2>Required for parsing ontologies (ontowrap)</h2>
diff --git a/html/relnotes.html b/html/relnotes.html
index a2934090e0d7dab58224d87c36cbbf16aa6be5e5..89bbeacdb837f0d3fa77504a9f2d3b3aab66aab2 100644
--- a/html/relnotes.html
+++ b/html/relnotes.html
@@ -73,9 +73,11 @@ with a warning:
 
 <h2>Current SVN trunk version</h2>
 
-<!--h2>Version 4.7 (1xxx): ??/??/201x - Al pesto</h2-->
-<!--h2>Version 4.6 (1xxx): ??/??/2012 - Da lec'h all</h2-->
-<!--h2>Version 4.5 (17xx): ??/??/2012 - Metro</h2-->
+<!--h2>Version 4.9 (1xxx): ??/??/201X - Metro</h2-->
+<!--h2>Version 4.8 (1xxx): ??/??/201x - Al pesto</h2-->
+<!--h2>Version 4.7 (1xxx): ??/??/201x - Letraset</h2-->
+<!--h2>Version 4.6 (1xxx): ??/??/201X - Da lec'h all</h2-->
+<!--h2>Version 4.5 (18xx): ??/??/2013 - Building 16</h2-->
 <p><ul compact="1">
 <li>Upgraded to <span style="color: green">OWL API</span> to 3.4.2 (lib)</li>
 <li>Upgraded to <span style="color: green">IDDL</span> to 1.4 (lib)</li>
@@ -83,11 +85,15 @@ with a warning:
 <li>Added <tt>ontowrap</tt> support in database store (server)</li>
 <li>Added several EDOAL-SPARQL renderers (impl)</li>
 <li>Added alignment selection per ontologies in list alignment interface (server)</li>
+<li>Added relation sensitiveness to evaluators (impl)</li>
 <li>Implemented transactions in database store (server)</li>
+<li>Bug in weighted (can be more than 1.) (impl)</li>
+<li>Fixed strong bug in the implementation of relaxed precision and recall (impl)</li>
 <li>Fixed a (non manifested) bug in cache management (server)</li>
 <li>Fixed a bug in displaying evaluation tables (cli)</li>
 <li>Fixed a bug with subsumption statements in <tt>OWLAxiomsRendererVisitor</tt> (impl)</li>
-<li>Simplified <tt>SemPRecEvaluator</tt> when an ontology is inconsistent (impl)</li>
+<li>Simplified and rewritten <tt>SemPRecEvaluator</tt> (impl)</li>
+<li>Fixed all issues but IDDL in tutorial4 (impl)</li>
 </ul></p>
 
 <h2>Version 4.4 (1754): 17/07/2012 - Casa Cirilo</h2>
diff --git a/html/tutorial/tutorial4/MyApp.java b/html/tutorial/tutorial4/MyApp.java
index 184256641f1cf96cd9098af33c16a8611e3a545e..d1d11913bda7391b180f74fbaad65fd5d102ef78 100644
--- a/html/tutorial/tutorial4/MyApp.java
+++ b/html/tutorial/tutorial4/MyApp.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA, 2009-2010
+ * Copyright (C) INRIA, 2009-2010, 2013
  *
  * Modifications to the initial code base are copyright of their
  * respective authors, or their employers as appropriate.  Authorship
@@ -31,13 +31,10 @@ import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.AlignmentVisitor;
 
 // Alignment API implementation classes
-import fr.inrialpes.exmo.align.impl.BasicParameters;
 import fr.inrialpes.exmo.align.impl.ObjectAlignment;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
-import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
 import fr.inrialpes.exmo.align.impl.renderer.OWLAxiomsRendererVisitor;
-import fr.inrialpes.exmo.align.util.NullStream;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 
 // Jena
@@ -63,12 +60,12 @@ import org.semanticweb.owlapi.model.OWLNamedIndividual;
 import org.semanticweb.owlapi.apibinding.OWLManager;
 import org.semanticweb.owlapi.reasoner.OWLReasoner;
 
-// Pellet
-import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
+// HermiT
+import org.semanticweb.HermiT.Reasoner;
 
 // IDDL
-import fr.inrialpes.exmo.iddl.IDDLReasoner;
-import fr.inrialpes.exmo.iddl.conf.Semantics;
+import fr.paris8.iut.info.iddl.IDDLReasoner;
+import fr.paris8.iut.info.iddl.conf.Semantics;
 
 // SAX standard classes
 import org.xml.sax.SAXException;
@@ -97,15 +94,12 @@ import java.util.Properties;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.InputStream;
 import java.io.FileInputStream;
-import java.io.PrintStream;
 import java.io.FileNotFoundException;
 import java.io.ByteArrayInputStream;
-import java.io.StringReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.io.File;
@@ -137,8 +131,7 @@ public class MyApp {
 	String u1 = "file:ontology1.owl";
 	String u2 = "file:ontology2.owl";
 	String method = "fr.inrialpes.exmo.align.impl.method.StringDistAlignment";
-	String tempOntoFileName = "results/myresult.owl";
-	Properties params = new BasicParameters();
+	Properties params = new Properties();
 	try {
 	    uri1 = new URI( u1 );
 	    uri2 = new URI( u2 );
@@ -190,8 +183,6 @@ public class MyApp {
 		AlignmentParser aparser = new AlignmentParser(0);
 		Alignment alu = aparser.parseString( xmlString );
 		al = ObjectAlignment.toObjectAlignment((URIAlignment)alu);
-	    } catch (SAXException saxe) { 
-		saxe.printStackTrace(); 
 	    } catch (AlignmentException ae) { 
 		ae.printStackTrace();
 	    }
@@ -222,8 +213,10 @@ public class MyApp {
 
 	// (Sol1) generate a merged ontology between the ontologies (OWLAxioms)
 	PrintWriter writer = null;
-	File merged = new File( tempOntoFileName );
+	File merged = null;
 	try {
+	    merged = File.createTempFile( "MyApp-results",".owl");
+	    merged.deleteOnExit();
 	    writer = new PrintWriter ( new FileWriter( merged, false ), true );
 	    AlignmentVisitor renderer = new OWLAxiomsRendererVisitor(writer);
 	    al.render(renderer);
@@ -239,6 +232,7 @@ public class MyApp {
 		writer.close();
 	    }
 	}
+	// If merged is empty then destroy the file + exit
 
 	// (Sol2) import the data from one ontology into the other
 
@@ -251,7 +245,7 @@ public class MyApp {
 	    in = new FileInputStream( merged );
 	    //OntModelSpec.OWL_MEM_RDFS_INF or no arguments to see the difference...
 	    Model model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF,null);
-	    model.read( in, "file:"+tempOntoFileName );
+	    model.read( in, "file:"+merged.getPath() );
 	    in.close();
 	
 	    // Create a new query
@@ -287,35 +281,42 @@ public class MyApp {
 	    if ( qe != null ) qe.close();
 	}
 
-	// (Sol2) Use Pellet to answer queries (at the ontology level)
+	// (Sol2) Use the OWLReasoner to answer queries (at the ontology level)
 	OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
 	OWLReasoner reasoner = null;
 
 	// Load the ontology 
 	try {
-	    OWLOntology ontology = manager.loadOntology( IRI.create( "file:"+tempOntoFileName ) );
-	    reasoner = new PelletReasoner( ontology, org.semanticweb.owlapi.reasoner.BufferingMode.NON_BUFFERING );
-	    reasoner.prepareReasoner();
-	} catch (OWLOntologyCreationException ooce) { 
+	    OWLOntology ontology = manager.loadOntology( IRI.create( "file:"+merged.getPath() ) );
+	    reasoner = new Reasoner( ontology );
+	} catch (OWLOntologyCreationException ooce) {
 	    ooce.printStackTrace(); 
 	}
 
+	if ( reasoner.isConsistent() ) {
+	    System.err.println( "The aligned ontologies are consistent" );
+	} else {
+	    System.err.println( "The aligned ontologies are inconsistent" );
+	}
 	// get the instances of a class
 	OWLClass estud = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology1.owl#Estudiante" ) );   
 	OWLClass person = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology2.owl#Person" ) );   
 	OWLClass student = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology2.owl#Student" ) );   
 	Set<OWLNamedIndividual> instances  = reasoner.getInstances( estud, false ).getFlattened();
-	System.err.println("Pellet(Merged): There are "+instances.size()+" students "+clname(estud));
+	System.err.println("OWLReasoner(Merged): There are "+instances.size()+" students "+clname(estud));
 
-	testPelletSubClass( manager, reasoner, estud, person );
-	testPelletSubClass( manager, reasoner, estud, student );
+	testOWLReasonerSubClass( manager, reasoner, estud, person );
+	testOWLReasonerSubClass( manager, reasoner, estud, student );
 
 	// (Sol3) reasoning with distributed semantics (IDDL)
 	// test consistency of aligned ontologies
 	IDDLReasoner dreasoner = new IDDLReasoner( Semantics.DL );
 	dreasoner.addOntology( uri1 );
 	dreasoner.addOntology( uri2 );
+	// Apparently, here, it has correctly loaded ontologies
 	dreasoner.addAlignment( al );
+	// Apparently, here, it bugs (print and error instead of raising it)
+	// becasu it cannot find stuff related by URIs (same below)
 	if ( dreasoner.isConsistent() ) {
 	    System.out.println( "IDDL: the alignment network is consistent");
 	    testIDDLSubClass( dreasoner, uri1, uri2, estud, person );
@@ -323,18 +324,34 @@ public class MyApp {
          } else {
 	    System.out.println( "IDDL: the alignment network is inconsistent");
 	}
+
+	/* ORIGINAL IDDL... IDEAL
+	// (Sol3) reasoning with distributed semantics (IDDL)
+	// test consistency of aligned ontologies
+	IDDLReasoner dreasoner = new IDDLReasoner( Semantics.DL );
+	dreasoner.addOntology( uri1 );
+	dreasoner.addOntology( uri2 );
+	dreasoner.addAlignment( al );
+	if ( dreasoner.isConsistent() ) {
+	    System.out.println( "IDDL: the alignment network is consistent");
+	    testIDDLSubClass( dreasoner, uri1, uri2, estud, person );
+	    testIDDLSubClass( dreasoner, uri1, uri2, estud, student );
+         } else {
+	    System.out.println( "IDDL: the alignment network is inconsistent");
+	    }
+	*/
     }
 
     private String clname( OWLClassExpression cl ) {
 	return cl.asOWLClass().getIRI().getFragment();
     }
 
-    public void testPelletSubClass( OWLOntologyManager manager, OWLReasoner reasoner, OWLClassExpression d1, OWLClassExpression d2 ) {
+    public void testOWLReasonerSubClass( OWLOntologyManager manager, OWLReasoner reasoner, OWLClassExpression d1, OWLClassExpression d2 ) {
 	OWLAxiom axiom = manager.getOWLDataFactory().getOWLSubClassOfAxiom( d1, d2 );
 	if ( reasoner.isEntailed( axiom ) ) {
-	    System.out.println( "Pellet(Merged): "+clname(d1)+" is subclass of "+clname(d2) );
+	    System.out.println( "OWLReasoner(Merged): "+clname(d1)+" is subclass of "+clname(d2) );
 	} else {
-	    System.out.println( "Pellet(Merged): "+clname(d1)+" is not necessarily subclass of "+clname(d2) );
+	    System.out.println( "OWLReasoner(Merged): "+clname(d1)+" is not necessarily subclass of "+clname(d2) );
 	}
     }
 
diff --git a/html/tutorial/tutorial4/Skeleton.java b/html/tutorial/tutorial4/Skeleton.java
index 244e016b77fb21df565c18b2d222c5994b39207a..a4818b042a95f0b3b4a8c52a93b71038c820d298 100644
--- a/html/tutorial/tutorial4/Skeleton.java
+++ b/html/tutorial/tutorial4/Skeleton.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA, 2009-2010
+ * Copyright (C) INRIA, 2009-2010, 2013
  *
  * Modifications to the initial code base are copyright of their
  * respective authors, or their employers as appropriate.  Authorship
@@ -31,13 +31,10 @@ import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.AlignmentVisitor;
 
 // Alignment API implementation classes
-import fr.inrialpes.exmo.align.impl.BasicParameters;
 import fr.inrialpes.exmo.align.impl.ObjectAlignment;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
-import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
 import fr.inrialpes.exmo.align.impl.renderer.OWLAxiomsRendererVisitor;
-import fr.inrialpes.exmo.align.util.NullStream;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
 
 // Jena
@@ -63,12 +60,12 @@ import org.semanticweb.owlapi.model.OWLNamedIndividual;
 import org.semanticweb.owlapi.apibinding.OWLManager;
 import org.semanticweb.owlapi.reasoner.OWLReasoner;
 
-// Pellet
-import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
+// HermiT
+import org.semanticweb.HermiT.Reasoner;
 
 // IDDL
-import fr.inrialpes.exmo.iddl.IDDLReasoner;
-import fr.inrialpes.exmo.iddl.conf.Semantics;
+import fr.paris8.iut.info.iddl.IDDLReasoner;
+import fr.paris8.iut.info.iddl.conf.Semantics;
 
 // SAX standard classes
 import org.xml.sax.SAXException;
@@ -97,15 +94,12 @@ import java.util.Properties;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.BufferedWriter;
-import java.io.OutputStreamWriter;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.io.InputStream;
 import java.io.FileInputStream;
-import java.io.PrintStream;
 import java.io.FileNotFoundException;
 import java.io.ByteArrayInputStream;
-import java.io.StringReader;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.io.File;
@@ -139,7 +133,7 @@ public class Skeleton {
 	String u2 = "file:ontology2.owl";
 	String method = "fr.inrialpes.exmo.align.impl.method.StringDistAlignment";
 	String tempOntoFileName = "results/myresult.owl";
-	Properties params = new BasicParameters();
+	Properties params = new Properties();
 	try {
 	    uri1 = new URI( u1 );
 	    uri2 = new URI( u2 );
diff --git a/html/tutorial/tutorial4/index.html b/html/tutorial/tutorial4/index.html
index 839827825debfff8768358dbaef7b14391850068..14e46c29e08c2e9477063495a2c6c067ad78ebc2 100644
--- a/html/tutorial/tutorial4/index.html
+++ b/html/tutorial/tutorial4/index.html
@@ -62,9 +62,9 @@ related APIs.
 </p>
 <p>
 Other tutorials are <a href="../index.html">available</a>.</p>
-<p  style="border-top: 2px solid #AAAAAA;"><small>This tutorial has
-    been designed for the Alignment API version 4.0. It is currently
-    incomplete due to the upgrade of Pellet to version 2.1 and IDDL.</small></p>
+<p  style="border-top: 2px solid #AAAAAA;">
+<small>This tutorial has been initially designed for the Alignment API 4.0 using Jena, Pellet and IDDL. 
+It has been reengineered in the Alignment API 4.5 to use Jena, HermiT and IDDL 1.4.</small></p>
 	
 <h2>Preparation</h2>
 	
@@ -92,11 +92,11 @@ in order to view participants from boths ontologies under the other
 ontology. This is not a difficult task, the goal here is only to show
 how this could be achieved.
 </p>
-	
+
 <p>For that purpose, you have to develop a program in Java. 
 We first define the CLASSPATH because a lot of external software is required
 <div class="terminal">
-$ setenv CLASSPATH ../../../lib/align.jar:../../../lib/procalign.jar:../../../lib/jena/jena.jar:../../../lib/jena/arq.jar:../../../lib/iddl/iddl.jar:../../../lib/pellet/pellet-core.jar:../../../lib/pellet/pellet-owlapiv3.jar:../../../lib/pellet/pellet-rules.jar:../../../lib/pellet/pellet-datatypes.jar:../../../lib/pellet/aterm-java-1.6.jar:../../../lib/pellet/pellet-query.jar:../../../lib/ontosim/ontosim.jar:../../../lib/pellet/pellet-el.jar:../../../lib/log4j/commons-logging.jar:../../../lib/log4j/log4j.jar:../../../lib/xerces/xercesImpl.jar:../../../lib/jena/iri.jar:../../../lib/jena/icu4j_3_4.jar:../../../lib/jena/concurrent.jar:../../../lib/xsdlib/relaxngDatatype.jar:../../../lib/xsdlib/xsdlib.jar:results
+$ setenv CLASSPATH ../../../lib/align.jar:../../../lib/procalign.jar:../../../lib/jena/jena.jar:../../../lib/jena/arq.jar:../../../lib/iddl/iddl.jar:../../../lib/hermit/HermiT.jar:../../../lib/ontosim/ontosim.jar:../../../lib/log4j/commons-logging.jar:../../../lib/log4j/log4j.jar:../../../lib/xerces/xercesImpl.jar:../../../lib/jena/iri.jar:../../../lib/jena/icu4j_3_4.jar:../../../lib/jena/concurrent.jar:../../../lib/xsdlib/relaxngDatatype.jar:../../../lib/xsdlib/xsdlib.jar:results
 </div>
 The list of jars is long, but at least it is explicit and you
 should be safe with this one.
@@ -255,7 +255,7 @@ writer.close();
 This can be done in three ways:
 <ul>
 <li>using SPARQL</li>
-<li>using a reasonner such as Pellet to answer these queries against
+<li>using an OWLReasoner such as HermiT to answer these queries against
   the merged ontologies.</li>
 <li>using a "distributed" reasoner, in our case IDDL, to answer these
   queries against non merged aligned ontologies.</li>
@@ -267,14 +267,6 @@ and observe what are the differences in this case. You can of course
 run various queries and start by running them in one of the initial
 ontologies instead of the merged one.
 </p>
-<p>
-For using Pellet, which is not bundled with the Alignment API, it will be necessary
-to <a href="http://clarkparsia.com/pellet/download">download
-it</a>  and add in
-the classpath the corresponding aterm-java-1.6.jar, pellet-core.jar, pellet-rules.jar,
-pellet-datatypes.jar, pellet-jena.jar, pellet-query.jar, pellet-owlapiv3.jar and pellet-el.jar jar-files
-which are not shipped with the Alignment API.
-</p>
 </p>
 <div class="button">
   <input type="button" onclick="show('qu7')" value="Show solution 1"/>
@@ -326,8 +318,7 @@ ResultSetFormatter.out(System.out, results, query);
 OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
 // Load the ontology 
 OWLOntology ontology = manager.loadOntology( IRI.create( "file:"+tempOntoFileName ) );
-OWLReasoner reasoner = new PelletReasoner( ontology, org.semanticweb.owlapi.reasoner.BufferingMode.NON_BUFFERING );
-reasoner.prepareReasoner();
+OWLReasoner reasoner = new Reasoner( ontology );
 </div>
 <p>Get the instances of "Estudiantes":</p>
 <div class="java">
@@ -336,12 +327,12 @@ OWLClass estud = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://al
 OWLClass person = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology2.owl#Person" ) );   
 OWLClass student = manager.getOWLDataFactory().getOWLClass( IRI.create( "http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology2.owl#Student" ) );   
 Set&lt;OWLNamedIndividual> instances  = reasoner.getInstances( estud, false ).getFlattened();
-System.err.println("Pellet(Merged): There are "+instances.size()+" students "+clname(estud));
+System.err.println("OWLReasoner(Merged): There are "+instances.size()+" students "+clname(estud));
 </div>
 <p>Some subsumption tests:</p>
 <div class="java">
-testPelletSubClass( manager, reasoner, estud, person );
-testPelletSubClass( manager, reasoner, estud, student );
+testOWLReasonerSubClass( manager, reasoner, estud, person );
+testOWLReasonerSubClass( manager, reasoner, estud, student );
 </div>
 <p>Such that:</p>
 <div class="java">
@@ -349,12 +340,12 @@ private String clname( OWLClassExpression cl ) {
   return cl.asOWLClass().getIRI().getFragment();
 }
 
-public void testPelletSubClass( OWLOntologyManager manager, OWLReasoner reasoner, OWLClassExpression d1, OWLClassExpression d2 ) {
+public void testOWLReasonerSubClass( OWLOntologyManager manager, OWLReasoner reasoner, OWLClassExpression d1, OWLClassExpression d2 ) {
   OWLAxiom axiom = manager.getOWLDataFactory().getOWLSubClassOfAxiom( d1, d2 );
   if ( reasoner.isEntailed( axiom ) ) {
-    System.out.println( "Pellet(Merged): "+clname(d1)+" is subclass of "+clname(d2) );
+    System.out.println( "OWLReasoner(Merged): "+clname(d1)+" is subclass of "+clname(d2) );
   } else {
-    System.out.println( "Pellet(Merged): "+clname(d1)+" is not necessarily subclass of "+clname(d2) );
+    System.out.println( "OWLReasoner(Merged): "+clname(d1)+" is not necessarily subclass of "+clname(d2) );
   }
 }
 </div>
@@ -404,11 +395,11 @@ The results for these execution are, for SPARQL:
 | "McCoy" | "Tyner" | "University of Soupaloignon" | "Dr Nanni Girasole"              |
 ...
 </pre>
-for Pellet:
+for OWLReasoner:
 <pre>
-Pellet(Merged): There are 47 students http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology1.owl#Estudiante
-Pellet(Merged): Estudiante is not necessarily subclass of Person
-Pellet(Merged): Estudiante is subclass of Student
+OWLReasoner(Merged): There are 47 students http://alignapi.gforge.inria.fr/tutorial/tutorial4/ontology1.owl#Estudiante
+OWLReasoner(Merged): Estudiante is not necessarily subclass of Person
+OWLReasoner(Merged): Estudiante is subclass of Student
 </pre>
 and for IDDL:
 <pre>
diff --git a/lib/hermit/hermit.jar b/lib/hermit/hermit.jar
new file mode 100644
index 0000000000000000000000000000000000000000..2043a963a705ae900c0808969199deaf95621a13
Binary files /dev/null and b/lib/hermit/hermit.jar differ
diff --git a/lib/hermit/hermit.pom b/lib/hermit/hermit.pom
new file mode 100644
index 0000000000000000000000000000000000000000..23325fe258cc1a90395d20587083108a7d1dfd88
--- /dev/null
+++ b/lib/hermit/hermit.pom
@@ -0,0 +1,24 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.semanticweb.HermiT</groupId>
+  <artifactId>HermiT</artifactId>
+  <version>1.3.6</version>
+  <!-- This is a stripped down version of HermiT with suppressed:
+       getopt, owl-api, common-loggins -->
+  <name>HermiT</name>
+  <description>HermiT is a conformant OWL 2 DL reasoner that uses the direct semantics. It supports all OWL2 DL constructs and the datatypes required by the OWL 2 specification.</description>
+  <packaging>jar</packaging>
+  <licenses>
+    <license>
+      <name>GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007</name>
+      <url>http://www.gnu.org/licenses/lgpl-3.0.html</url>
+    </license>
+  </licenses>
+ 
+  <url>http://hermit-reasoner.com</url>
+  <distributionManagement>
+    <downloadUrl></downloadUrl>
+  </distributionManagement>
+
+</project>
diff --git a/lib/owlapi30/owlapi-bin.jar b/lib/owlapi30/owlapi-bin.jar
index fc7437c6cd02893b443eab9f64744b4f8d035848..700b27f724d6391dbfbc48043bc8c1fb30aa1062 100644
Binary files a/lib/owlapi30/owlapi-bin.jar and b/lib/owlapi30/owlapi-bin.jar differ
diff --git a/lib/owlapi30/owlapi-bin.pom b/lib/owlapi30/owlapi-bin.pom
index e035e47c94b26bdb8803b076c88eb9a5f1e293b1..8d1035138755c6e7a5fc0f87fbd9f1dd061b0668 100644
--- a/lib/owlapi30/owlapi-bin.pom
+++ b/lib/owlapi30/owlapi-bin.pom
@@ -3,7 +3,7 @@
 
   <groupId>org.semanticweb</groupId>
   <artifactId>owlapi</artifactId>
-  <version>3.0.0</version>
+  <version>3.4.2</version>
   <name>OWL API</name>
   <description>API and implementation for OWL</description>
   <licenses>
diff --git a/src/fr/inrialpes/exmo/align/impl/eval/SemPRecEvaluator.java b/src/fr/inrialpes/exmo/align/impl/eval/SemPRecEvaluator.java
index 0a5f6b8405562d301f5bcf9eb72bc76c2e7cb45a..b854f89a2d3ad706ce758b6723806cb7212a3c0b 100644
--- a/src/fr/inrialpes/exmo/align/impl/eval/SemPRecEvaluator.java
+++ b/src/fr/inrialpes/exmo/align/impl/eval/SemPRecEvaluator.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA, 2009-2012
+ * Copyright (C) INRIA, 2009-2013
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -23,16 +23,58 @@ package fr.inrialpes.exmo.align.impl.eval;
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Cell;
+import org.semanticweb.owl.align.Relation;
 import org.semanticweb.owl.align.Evaluator;
 
 import fr.inrialpes.exmo.align.impl.BasicEvaluator;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 import fr.inrialpes.exmo.align.impl.ObjectAlignment;
+import fr.inrialpes.exmo.align.impl.ObjectCell;
+import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.Annotations;
 import fr.inrialpes.exmo.align.impl.eval.PRecEvaluator;
+import fr.inrialpes.exmo.align.impl.rel.*;
+import fr.inrialpes.exmo.align.impl.renderer.OWLAxiomsRendererVisitor;
 
-import fr.inrialpes.exmo.iddl.IDDLReasoner;
-import fr.inrialpes.exmo.iddl.conf.Semantics;
+import fr.inrialpes.exmo.ontowrap.Ontology;
+import fr.inrialpes.exmo.ontowrap.LoadedOntology;
+import fr.inrialpes.exmo.ontowrap.OntowrapException;
+
+//import fr.paris8.iut.info.iddl.IDDLReasoner;
+//import fr.paris8.iut.info.iddl.conf.Semantics;
+
+// HermiT implementation
+
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLDataFactory;
+import org.semanticweb.owlapi.model.OWLAxiom;
+import org.semanticweb.owlapi.model.OWLClass;
+import org.semanticweb.owlapi.model.OWLObjectProperty;
+import org.semanticweb.owlapi.model.OWLDataProperty;
+import org.semanticweb.owlapi.model.OWLIndividual;
+
+import org.semanticweb.owlapi.apibinding.OWLManager;
+import org.semanticweb.owlapi.util.SimpleIRIMapper;
+import uk.ac.manchester.cs.owl.owlapi.OWLOntologyIRIMapperImpl;
+import org.semanticweb.owlapi.reasoner.OWLReasoner;
+import org.semanticweb.owlapi.reasoner.BufferingMode;
+
+import org.semanticweb.HermiT.Reasoner;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.FileWriter;
+
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.lang.Thread;
+import java.lang.Runnable;
 
 import java.util.Properties;
 import java.util.Enumeration;
@@ -41,7 +83,6 @@ import java.util.Set;
 import java.io.PrintWriter;
 import java.net.URI;
 
-
 /**
  * Evaluate proximity between two alignments.
  * This function implements Precision/Recall. The first alignment
@@ -56,24 +97,39 @@ public class SemPRecEvaluator extends PRecEvaluator implements Evaluator {
     private int nbfoundentailed = 0; // nb of returned cells entailed by the reference alignment
     private int nbexpectedentailed = 0; // nb of reference cells entailed by returned alignment
 
-    private Semantics semantics = Semantics.DL; // the semantics used for interpreting alignments
+    //private Semantics semantics = Semantics.DL; // the semantics used for interpreting alignments
 
     /** Creation
      * Initiate Evaluator for precision and recall
      * @param align1 : the reference alignment
      * @param align2 : the alignment to evaluate
      **/
-    public SemPRecEvaluator(Alignment align1, Alignment align2) throws AlignmentException {
-	super(((BasicAlignment)align1).toURIAlignment(), ((BasicAlignment)align2).toURIAlignment());
+    public SemPRecEvaluator( Alignment al1, Alignment al2) throws AlignmentException {
+	super(((BasicAlignment)al1).toURIAlignment(), ((BasicAlignment)al2).toURIAlignment());
+	try {
+	    if ( al1 instanceof ObjectAlignment ) {
+		align1 = al1;
+	    } else {
+		align1 = ObjectAlignment.toObjectAlignment((URIAlignment)align1);
+	    }
+	    if ( al2 instanceof ObjectAlignment ) {
+		align2 = al2;
+	    } else {
+		align2 = ObjectAlignment.toObjectAlignment((URIAlignment)align2);
+	    }
+	} catch ( AlignmentException aex ) {
+	    throw new AlignmentException( "SemPRecEvaluator can only work on ObjectAlignments", aex );
+	}
     }
 
     public void init( Object sem ){
 	super.init(); // ??
 	nbexpectedentailed = 0;
 	nbfoundentailed = 0;
-	if ( sem instanceof Semantics ) {
-	    semantics = (Semantics)sem;
-	}
+	// Better use Properties
+	//if ( sem instanceof Semantics ) {
+	//    semantics = (Semantics)sem;
+	//}
     }
 
     /**
@@ -90,47 +146,16 @@ public class SemPRecEvaluator extends PRecEvaluator implements Evaluator {
      *
      * In the implementation |B|=nbfound, |A|=nbexpected and |A inter B|=nbcorrect.
      * 
-     * This takes semantivs as a parameter which should be a litteral of fr.inrialpes.exmo.iddl.conf.Semantics
+     * This takes semantivs as a parameter which should be a litteral of fr.paris8.iut.info.iddl.conf.Semantics
      */
-    public double eval( Properties params, Object cache ) throws AlignmentException {
+    public double eval( Properties params ) throws AlignmentException {
 	init( params.getProperty( "semantics" ) );
 	nbfound = align2.nbCells();
 	nbexpected = align1.nbCells();
 
-	IDDLReasoner reasoner = new IDDLReasoner( semantics );
-	reasoner.addOntology( align1.getOntology1URI() );
-	reasoner.addOntology( align1.getOntology2URI() );
-	reasoner.addAlignment( align1 );
-	if ( !reasoner.isConsistent() ) { // everything is entailed
-	    nbfoundentailed = align2.nbCells();
-	} else {
-	    for ( Cell c2 : align2 ) {
-		// create alignment
-		Alignment al = new ObjectAlignment();
-		al.init( align2.getOntology1URI(), align2.getOntology2URI() );
-		// add the cell
-		al.addAlignCell( c2.getObject1(), c2.getObject2(), c2.getRelation().getRelation(), 1. );
-		if ( reasoner.isEntailed( al ) ) nbfoundentailed++;
-	    }
-	}
-
-	reasoner = new IDDLReasoner( semantics );
-	reasoner.addOntology( align2.getOntology1URI() );
-	reasoner.addOntology( align2.getOntology2URI() );
-	reasoner.addAlignment( align2 );
-	if ( !reasoner.isConsistent() ) { // everything is entailed
-	    nbexpectedentailed = align1.nbCells();
-	} else {
-	    for ( Cell c1 : align1 ) {
-		// create alignment
-		Alignment al = new ObjectAlignment();
-		al.init( align2.getOntology1URI(), align2.getOntology2URI() );
-		// add the cell (too bad, addCell is not in the interface)
-		al.addAlignCell( c1.getObject1(), c1.getObject2(), c1.getRelation().getRelation(), 1. );
-		if ( reasoner.isEntailed( al ) ) nbexpectedentailed++;
-	    }
-	}
-
+	nbfoundentailed = nbEntailedCorrespondences( (ObjectAlignment)align1, (ObjectAlignment)align2 );
+	nbexpectedentailed = nbEntailedCorrespondences( (ObjectAlignment)align2, (ObjectAlignment)align1 );
+	
 	precision = (double)nbfoundentailed / (double)nbfound;
 	recall = (double)nbexpectedentailed / (double)nbexpected;
 	return computeDerived();
@@ -145,5 +170,228 @@ public class SemPRecEvaluator extends PRecEvaluator implements Evaluator {
 	results.setProperty( "nbfoundentailed", Integer.toString( nbfoundentailed ) );
 	return results;
     }
+
+    public int nbEntailedCorrespondences( ObjectAlignment al1, ObjectAlignment al2 ) throws AlignmentException {
+	//System.err.println( "Computing correctness" );
+	//IDDLReasoner reasoner = new IDDLReasoner( semantics );
+	//loadOntology( reasoner, ((BasicAlignment)al1).getOntologyObject1() );
+	//loadOntology( reasoner, ((BasicAlignment)al1).getOntologyObject2() );
+	//reasoner.addAlignment( al1 );
+	loadPipedAlignedOntologies( al1 );
+	if ( !reasoner.isConsistent() ) return al2.nbCells(); // everything is entailed
+	//System.err.println( al1+" is consistent" );
+	int entailed = 0;
+	for ( Cell c2 : al2 ) {
+	    // create alignment
+	    //Alignment al = new ObjectAlignment();
+	    //al.init( align2.getOntology1URI(), align2.getOntology2URI() );
+	    // add the cell
+	    //al.addAlignCell( c2.getObject1(), c2.getObject2(), c2.getRelation().getRelation(), 1. );
+	    //System.err.println( c2.getObject1()+" "+c2.getRelation().getRelation()+" "+c2.getObject2() );
+	    //if ( reasoner.isEntailed( al ) ) {
+	    try {
+		if ( reasoner.isEntailed( correspToAxiom( al2, (ObjectCell)c2 ) ) ) {
+		    //System.err.println( "      --> entailed" );
+		    entailed++;
+		}
+	    } catch ( AlignmentException aex ) { // type mismatch -> 0
+		//System.err.println( "Cannot be translated." );
+	    }
+	}
+	return entailed;
+    }
+
+    /**
+     * It would be useful to do better since we have the two ontologies here
+     */
+    protected OWLOntologyManager manager = null;
+    protected OWLReasoner reasoner = null;
+
+    /* 
+     * Loads the Aligned ontologies without intermediate file
+     */
+    public void loadPipedAlignedOntologies( final ObjectAlignment align ) throws AlignmentException {
+	PipedInputStream in = new PipedInputStream();
+	try {
+	final PipedOutputStream out = new PipedOutputStream(in);
+	    new Thread(
+		       new Runnable(){
+			   public void run() {
+			       PrintWriter writer;
+			       try {
+				   writer = new PrintWriter (
+								     new BufferedWriter(
+											new OutputStreamWriter( out, "UTF-8" )), true);
+			       } catch ( Exception ex ) {
+				   return; //throw new AlignmentException( "Cannot load alignments because of I/O errors" );
+			       }
+			       OWLAxiomsRendererVisitor renderer = new OWLAxiomsRendererVisitor( writer );
+			       renderer.init( new Properties() );
+			       // Generate the ontology as OWL Axioms
+			       try {
+				   align.render( renderer );
+			       } catch ( AlignmentException aex ) {
+				   return;
+			       } finally {
+				   writer.flush();
+				   writer.close();
+			       }	    
+			   }
+		       }
+		       ).start();
+	} catch ( Exception ex ) {};//java.io.UnsupportedEncodingException
+
+	manager = OWLManager.createOWLOntologyManager();
+	//System.err.println( al.getOntology1URI()+" ----> "+al.getFile1() );
+	//System.err.println( al.getOntology2URI()+" ----> "+al.getFile2() );
+	manager.addIRIMapper(new SimpleIRIMapper( IRI.create( align.getOntology1URI() ), 
+						  IRI.create( align.getFile1() ) ) );
+	manager.addIRIMapper(new SimpleIRIMapper( IRI.create( align.getOntology2URI() ), 
+						  IRI.create( align.getFile2() ) ) );
+	try {
+	    manager.loadOntologyFromOntologyDocument( IRI.create( align.getFile1() ) );
+	    manager.loadOntologyFromOntologyDocument( IRI.create( align.getFile2() ) );
+	    // Load the ontology stream
+	    OWLOntology ontology = manager.loadOntologyFromOntologyDocument( in );
+	    reasoner = new Reasoner( ontology );
+	} catch ( OWLOntologyCreationException ooce ) { 
+	    ooce.printStackTrace(); 
+	}
+    }
+
+    /* 
+     * Loads the Aligned ontologies through an intermediate file
+     */
+    public void loadFileAlignedOntologies( ObjectAlignment align ) throws AlignmentException {
+	// Render the alignment
+	PrintWriter writer = null;
+	File merged = null;
+	try {
+	    merged = File.createTempFile( "spreval",".owl");
+	    merged.deleteOnExit();
+	    writer = new PrintWriter ( new FileWriter( merged, false ), true );
+	    OWLAxiomsRendererVisitor renderer = new OWLAxiomsRendererVisitor(writer);
+	    //renderer.init( new Properties() );
+	    align.render(renderer);
+	} catch (UnsupportedEncodingException uee) {
+	    uee.printStackTrace();
+	} catch (AlignmentException ae) {
+	    ae.printStackTrace();
+	} catch (IOException ioe) { 
+	    ioe.printStackTrace();
+	} finally {
+	    if ( writer != null ) {
+		writer.flush();
+		writer.close();
+	    }
+	}
+
+	// Load the ontology 
+	manager = OWLManager.createOWLOntologyManager();
+	try {
+	    manager.addIRIMapper(new SimpleIRIMapper( IRI.create( align.getOntology1URI() ), 
+						      IRI.create( align.getFile1() ) ) );
+	    manager.addIRIMapper(new SimpleIRIMapper( IRI.create( align.getOntology2URI() ), 
+						      IRI.create( align.getFile2() ) ) );
+	    manager.loadOntologyFromOntologyDocument( IRI.create( align.getFile1() ) );
+	    manager.loadOntologyFromOntologyDocument( IRI.create( align.getFile2() ) );
+	    OWLOntology ontology = manager.loadOntologyFromOntologyDocument( merged );
+	    reasoner = new Reasoner( ontology );
+	} catch (OWLOntologyCreationException ooce) {
+	    ooce.printStackTrace(); 
+	}
+    }
+
+    // In fact, it should be possible to do all EDOAL
+    public OWLAxiom correspToAxiom( ObjectAlignment al, ObjectCell corresp ) throws AlignmentException {
+	OWLDataFactory owlfactory = manager.getOWLDataFactory();
+
+	LoadedOntology onto1 = al.ontology1();
+	LoadedOntology onto2 = al.ontology2();
+	// retrieve entity1 and entity2
+	// create the axiom in function of their labels
+	Object e1 = corresp.getObject1();
+	Object e2 = corresp.getObject2();
+	Relation r = corresp.getRelation();
+	try {
+	if ( onto1.isClass( e1 ) ) {
+	    if ( onto2.isClass( e2 ) ) {
+		OWLClass entity1 = owlfactory.getOWLClass( IRI.create( onto1.getEntityURI( e1 ) ) );
+		OWLClass entity2 = owlfactory.getOWLClass( IRI.create( onto2.getEntityURI( e2 ) ) );
+		if ( r instanceof EquivRelation ) {
+		    return owlfactory.getOWLEquivalentClassesAxiom( entity1, entity2 );
+		} else if ( r instanceof SubsumeRelation ) {
+		    return owlfactory.getOWLSubClassOfAxiom( entity2, entity1 );
+		} else if ( r instanceof SubsumedRelation ) {
+		    return owlfactory.getOWLSubClassOfAxiom( entity1, entity2 );
+		} else if ( r instanceof IncompatRelation ) {
+		    return owlfactory.getOWLDisjointClassesAxiom( entity1, entity2 );
+		}
+	    } else if ( onto2.isIndividual( e2 ) && ( r instanceof HasInstanceRelation ) ) {
+		return owlfactory.getOWLClassAssertionAxiom( owlfactory.getOWLClass( IRI.create( onto1.getEntityURI( e1 ) ) ),  
+							     owlfactory.getOWLNamedIndividual( IRI.create( onto2.getEntityURI( e2 ) ) ) );
+	    }
+	} else if ( onto1.isDataProperty( e1 ) && onto2.isDataProperty( e2 ) ) {
+		OWLDataProperty entity1 = owlfactory.getOWLDataProperty( IRI.create( onto1.getEntityURI( e1 ) ) );
+		OWLDataProperty entity2 = owlfactory.getOWLDataProperty( IRI.create( onto2.getEntityURI( e2 ) ) );
+		if ( r instanceof EquivRelation ) {
+		    return owlfactory.getOWLEquivalentDataPropertiesAxiom( entity1, entity2 );
+		} else if ( r instanceof SubsumeRelation ) {
+		    return owlfactory.getOWLSubDataPropertyOfAxiom( entity2, entity1 );
+		} else if ( r instanceof SubsumedRelation ) {
+		    return owlfactory.getOWLSubDataPropertyOfAxiom( entity1, entity2 );
+		} else if ( r instanceof IncompatRelation ) {
+		    return owlfactory.getOWLDisjointDataPropertiesAxiom( entity1, entity2 );
+		}
+	} else if ( onto1.isObjectProperty( e1 ) && onto2.isObjectProperty( e2 ) ) {
+		OWLObjectProperty entity1 = owlfactory.getOWLObjectProperty( IRI.create( onto1.getEntityURI( e1 ) ) );
+		OWLObjectProperty entity2 = owlfactory.getOWLObjectProperty( IRI.create( onto2.getEntityURI( e2 ) ) );
+		if ( r instanceof EquivRelation ) {
+		    return owlfactory.getOWLEquivalentObjectPropertiesAxiom( entity1, entity2 );
+		} else if ( r instanceof SubsumeRelation ) {
+		    return owlfactory.getOWLSubObjectPropertyOfAxiom( entity2, entity1 );
+		} else if ( r instanceof SubsumedRelation ) {
+		    return owlfactory.getOWLSubObjectPropertyOfAxiom( entity1, entity2 );
+		} else if ( r instanceof IncompatRelation ) {
+		    return owlfactory.getOWLDisjointObjectPropertiesAxiom( entity1, entity2 );
+		}
+	} else if ( onto1.isIndividual( e1 ) ) {
+	    if ( onto2.isIndividual( e2 ) ) {
+		OWLIndividual entity1 = owlfactory.getOWLNamedIndividual( IRI.create( onto1.getEntityURI( e1 ) ) );
+		OWLIndividual entity2 = owlfactory.getOWLNamedIndividual( IRI.create( onto2.getEntityURI( e2 ) ) );
+		if ( r instanceof EquivRelation ) {
+		    return owlfactory.getOWLSameIndividualAxiom( entity1, entity2 );
+		} else if ( r instanceof IncompatRelation ) {
+		    return owlfactory.getOWLDifferentIndividualsAxiom( entity1, entity2 );
+		}
+	    } else if ( onto2.isClass( e2 ) && ( r instanceof InstanceOfRelation ) ) {
+		return owlfactory.getOWLClassAssertionAxiom( owlfactory.getOWLClass( IRI.create( onto2.getEntityURI( e2 ) ) ), 
+							     owlfactory.getOWLNamedIndividual( IRI.create( onto1.getEntityURI( e1 ) ) ) );
+	    }
+	    }
+	} catch ( OntowrapException owex ) {
+	    throw new AlignmentException( "Error interpreting URI "+owex );
+	}
+	throw new AlignmentException( "Cannot convert correspondence "+corresp );
+    }
+
+    // This method can be suppressed
+    public boolean isConsistent( OWLReasoner reasoner ) {
+	return reasoner.isConsistent();
+    }
+
+    // This method can be suppressed
+    public boolean isEntailed( OWLAxiom axiom ) {
+	return reasoner.isEntailed( axiom );
+    }
+
+    //public void loadOntology( IDDLReasoner reasoner, Object onto ) {
+    //	System.err.println( reasoner +" -- "+onto );
+    //	Ontology oo = (Ontology)onto;
+    //	URI f = oo.getFile();
+    //	if ( f == null ) f = oo.getURI();
+    //	reasoner.addOntology( f );
+    //}
+
 }
 
diff --git a/src/fr/inrialpes/exmo/ontowrap/owlapi30/OWLAPI3Ontology.java b/src/fr/inrialpes/exmo/ontowrap/owlapi30/OWLAPI3Ontology.java
index 6303850100178716d59a6b1ee752490753799b3b..fd3041d87399af46be5ceea7a2f6bcec0e460353 100644
--- a/src/fr/inrialpes/exmo/ontowrap/owlapi30/OWLAPI3Ontology.java
+++ b/src/fr/inrialpes/exmo/ontowrap/owlapi30/OWLAPI3Ontology.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA, 2008-2010
+ * Copyright (C) INRIA, 2008-2010, 2012
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -131,8 +131,8 @@ public class OWLAPI3Ontology extends BasicOntology<OWLOntology> implements Heavy
 	    if ( c instanceof OWLLiteral ) {
 		if ( lang == null || ((OWLLiteral)c).hasLang(lang) ) {
 		    if ( type == null ||
-			 ( type.equals(OWLRDFVocabulary.RDFS_LABEL.getURI()) && p.isLabel() ) ||
-			 ( type.equals(OWLRDFVocabulary.RDFS_COMMENT.getURI()) && p.isComment() ) )
+			 ( type.equals(OWLRDFVocabulary.RDFS_LABEL.getIRI().toURI()) && p.isLabel() ) ||
+			 ( type.equals(OWLRDFVocabulary.RDFS_COMMENT.getIRI().toURI()) && p.isComment() ) )
 			annotations.add( ((OWLLiteral)c).getLiteral() );
 		}
 	    }
@@ -148,8 +148,8 @@ public class OWLAPI3Ontology extends BasicOntology<OWLOntology> implements Heavy
 	    OWLAnnotationProperty p = annot.getProperty();
 	    if ( c instanceof OWLLiteral ) {
 		    if ( type == null ||
-			 ( type.equals(OWLRDFVocabulary.RDFS_LABEL.getURI()) && p.isLabel() ) ||
-			 ( type.equals(OWLRDFVocabulary.RDFS_COMMENT.getURI()) && p.isComment() ) )
+			 ( type.equals(OWLRDFVocabulary.RDFS_LABEL.getIRI().toURI()) && p.isLabel() ) ||
+			 ( type.equals(OWLRDFVocabulary.RDFS_COMMENT.getIRI().toURI()) && p.isComment() ) )
 			annotations.add( new Annotation(((OWLLiteral)c).getLiteral(),  ((OWLLiteral)c).getLang()));
 		}
 	}
@@ -170,11 +170,11 @@ public class OWLAPI3Ontology extends BasicOntology<OWLOntology> implements Heavy
 
     public Set<String> getEntityComments(Object o, String lang)
 	    throws OntowrapException {
-	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_COMMENT.getURI(), lang);
+	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_COMMENT.getIRI().toURI(), lang);
     }
 
     public Set<String> getEntityComments(Object o) throws OntowrapException {
-	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_COMMENT.getURI(), null);
+	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_COMMENT.getIRI().toURI(), null);
     }
 
     public String getEntityName( Object o ) throws OntowrapException {
@@ -192,11 +192,11 @@ public class OWLAPI3Ontology extends BasicOntology<OWLOntology> implements Heavy
     }
 
     public Set<String> getEntityNames(Object o, String lang) throws OntowrapException {
-	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_LABEL.getURI(), lang);
+	return getEntityAnnotations(o, OWLRDFVocabulary.RDFS_LABEL.getIRI().toURI(), lang);
     }
 
     public Set<String> getEntityNames(Object o) throws OntowrapException {
-	Set<String> result = getEntityAnnotations(o, OWLRDFVocabulary.RDFS_LABEL.getURI(), null);
+	Set<String> result = getEntityAnnotations(o, OWLRDFVocabulary.RDFS_LABEL.getIRI().toURI(), null);
 	if ( result == null ) {
 	    String label = getEntityName( o );
 	    if ( label != null ) {
diff --git a/test/src/READMETest.java b/test/src/READMETest.java
index 7f438002e9e96cfe22898b5baae0e5a37ead07d9..b67c33f9eaa5495dcde40a14ff9c564906a80fbe 100644
--- a/test/src/READMETest.java
+++ b/test/src/READMETest.java
@@ -1,7 +1,7 @@
 /*
  * $Id$
  *
- * Copyright (C) INRIA, 2008-2011
+ * Copyright (C) INRIA, 2008-2011, 2013
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -36,6 +36,7 @@ import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 import fr.inrialpes.exmo.align.impl.method.StringDistAlignment;
 import fr.inrialpes.exmo.align.impl.eval.PRecEvaluator;
 import fr.inrialpes.exmo.align.impl.eval.SemPRecEvaluator;
+import fr.inrialpes.exmo.align.impl.eval.WeightedPREvaluator;
 import fr.inrialpes.exmo.align.impl.URIAlignment;
 import fr.inrialpes.exmo.align.impl.ObjectAlignment;
 import fr.inrialpes.exmo.align.parser.AlignmentParser;
@@ -251,12 +252,11 @@ $ java -cp lib/procalign.jar fr.inrialpes.exmo.align.cli.EvalAlign -i fr.inrialp
 	eval.write( writer );
 	writer.flush();
 	writer.close();
-	assertEquals( eval.getPrecision(), 0.7619047619047619);//7272727272727273 );
+	assertEquals( eval.getPrecision(), 0.7619047619047619);
 	assertEquals( eval.getRecall(), 1.0 );
-	assertEquals( eval.getNoise(), 0.23809523809523814);//2727272727272727 );
-	assertEquals( eval.getFmeasure(), 0.8648648648648648);//8421052631578948 );
-	assertEquals( eval.getOverall(), 0.6875);//625 );
-	//assertEquals( eval.getResult(), 1.34375 );
+	assertEquals( eval.getNoise(), 0.23809523809523814);
+	assertEquals( eval.getFmeasure(), 0.8648648648648648);
+	assertEquals( eval.getOverall(), 0.6875);
     }
 
     @Test(groups = { "full", "impl", "raw" }, dependsOnMethods = {"routineTest8"})
@@ -283,7 +283,6 @@ $ java -cp lib/procalign.jar fr.inrialpes.exmo.align.cli.EvalAlign -i fr.inrialp
 	assertEquals( eval.getNoise(), 0.);
 	assertEquals( eval.getFmeasure(), 0.);
 	assertEquals( eval.getOverall(), 0.);
-	//assertEquals( eval.getResult(), 0. );
     }
 
     @Test(expectedExceptions = AlignmentException.class, groups = {"full", "impl", "raw" }, dependsOnMethods = {"routineEvalTest"})
@@ -304,9 +303,8 @@ $ java -cp lib/procalign.jar fr.inrialpes.exmo.align.cli.EvalAlign -i fr.inrialp
 	eval.getFallout(); //4.2: Deprecated raises an error
     }
 
-
     @Test(groups = { "full", "sem" }, dependsOnMethods = {"routineEvalTest"})
-    public void specificEvalTest() throws Exception {
+    public void semanticEvalTest() throws Exception {
 	AlignmentParser aparser1 = new AlignmentParser( 0 );
 	assertNotNull( aparser1 );
 	Alignment align1 = aparser1.parse( "test/output/bibref2.rdf" );
@@ -328,14 +326,15 @@ $ java -cp lib/procalign.jar fr.inrialpes.exmo.align.cli.EvalAlign -i fr.inrialp
 	eval.write( writer );
 	writer.flush();
 	writer.close();
-	// These figures must be checked at least onece!
-	assertEquals( eval.getPrecision(), 0.7619047619047619 ); //0.3181818181818182
-	assertEquals( eval.getRecall(), 1.0 );//0.3939393939393939
-	assertEquals( eval.getNoise(), 0.23809523809523814 );//1.0
-	//assertEquals( eval.getFallout(), 1.0 );
-	assertEquals( eval.getFmeasure(), 0.8648648648648648 );//0.3520309477756286
-	assertEquals( eval.getOverall(), 0.6875 );//-0.4502164502164502
-	//assertEquals( eval.getResult(), 1.34375 );
+	// These figures are different than those of classical PR
+	// only because some correspondences cannot be transcribed
+	// author<->hasAuthor/editor<->hasEditor/firstAuthor/hasAuthor
+	// because Object/DataProperties
+	assertEquals( eval.getPrecision(), 0.6904761904761905 );
+	assertEquals( eval.getRecall(), 0.90625 );
+	assertEquals( eval.getNoise(), 0.30952380952380953 );
+	assertEquals( eval.getFmeasure(), 0.7837837837837837 );
+	assertEquals( eval.getOverall(), 0.5 );
     }
 
     @Test(groups = { "full", "impl", "raw" })