diff --git a/aligns/align.dtd b/aligns/align.dtd
index 901f8f742cfd779e4d3069848be8004d7c0c45d3..5aeafb634da56611e3a9cc029ebcc2a85ff47921 100644
--- a/aligns/align.dtd
+++ b/aligns/align.dtd
@@ -27,7 +27,7 @@
 >
 
 
-<!ELEMENT Alignment (xml?,type?,onto1,onto2,map)*>
+<!ELEMENT Alignment ((xml?,type?,onto1,onto2,uri1?,uri2?)*,map)>
 <!ATTLIST Alignment>
 
 <!ELEMENT xml (#PCDATA)><!-- yes/no -->
@@ -37,6 +37,10 @@
 <!ATTLIST onto1 rdf:resource %uri; #IMPLIED>
 <!ELEMENT onto2 (#PCDATA)><!-- uri -->
 <!ATTLIST onto2 rdf:resource %uri; #IMPLIED>
+<!ELEMENT uri1 (#PCDATA)><!-- uri -->
+<!ATTLIST uri1 rdf:resource %uri; #IMPLIED>
+<!ELEMENT uri2 (#PCDATA)><!-- uri -->
+<!ATTLIST uri2 rdf:resource %uri; #IMPLIED>
 <!ELEMENT map (Cell*)>
 
 <!ELEMENT Cell (entity1|entity2|measure|relation)*>
diff --git a/build.xml b/build.xml
index 64e06c246c7eaef3ac4019191abedf2cb23e08be..52f8a5a47546ca2b068463560805489b1d3e8c54 100644
--- a/build.xml
+++ b/build.xml
@@ -127,6 +127,9 @@
     <copy todir="${WebDir}">
       <fileset dir="html" includes="**/*.html"/>
     </copy>
+    <!--copy todir="${WebDir}">
+      <fileset dir="/Users/euzenat/Papiers/Align\ paper/align.pdf"/>
+    </copy-->
     <!-- zip everything from outside -->
     <zip zipfile="${WebDir}/align.zip">
       <fileset dir="." includes="**/*"/>
diff --git a/html/align.html b/html/align.html
index 7d7d896cee5ea125ad19cc4e69504dba71c5eba6..f0a9714fd59cb7d347391d607b6b1b0e35d710cb 100644
--- a/html/align.html
+++ b/html/align.html
@@ -11,6 +11,8 @@
 <li>Implementing further alignment methods;</li>
 </ul></p>
 
+<p>An extensive presentation of the alignment API can be found <a href="align.pdf">here</a>.</p>
+
 <h1>Getting ontoalign</h1>
 
 <h2>Fetching the ZIP'ed version</h2>
@@ -48,6 +50,8 @@ hour to know how to avoid to be asked your password anytime).</br>
 If you are not familiar with CVS, its is time to document yourself.
 </p>
 
+<h2>Release notes</h2>
+<p>They are provided <a href="relnotes.html">here</a>.</p>
 
 <h1>Installation</h1>
 
@@ -69,6 +73,7 @@ If you are not familiar with CVS, its is time to document yourself.
   <li>distrib: contains a few files for building the distribution</li>
   <li>classes: the compiled classes (in the zip file, the classes are
   included)</li> 
+  <li>samples: </li>
   <li>javadoc: generated javadoc (in the zip file the doc are
   pregenerated);</li> 
 </ul>
@@ -112,6 +117,10 @@ $ ant jar
 </pre></p>
 
 <h1>Using the API</h1>
+
+<p>An extensive presentation of the alignment API can be found 
+<a href="align.pdf">here</a>. It documents use and extension of the API.</p>
+
 <p>For demonstrating the use of the API, we implement it and use it
   through a particular processor
   (<tt>fr.inrialpes.exmo.align.util.Procalign</tt>) which:
diff --git a/html/index.html b/html/index.html
index 67bf33b42b2f87d0241adf5d79c2fa16254ec3a2..05c598f0cee499dabe0aacbc6646fec16dd0af89 100644
--- a/html/index.html
+++ b/html/index.html
@@ -8,19 +8,21 @@
 
 <p>A few pages for providing information about efforts towards
   providing a decent environment for aligning OWL ontologies.</p>
+<p>We proposed an alignment format and API which is presented
+  technically below. A general overview can be found <a href="align.pdf">here</a>.</p>
 
 <p>
 <dl compact="1">
-<dt><a href="owlapi.html">OWL-API</a></dt>
-<dd>Starting quickly with OWL-API.</dd>
 <dt><a href="format.html">Alignment format</a></dt>
 <dd>An alignment format in RDF/XML.</dd>
 <dt><a href="align.html">Alignment API</a></dt>
-<dd>An alignment API and implementation</dd>
+<dd>An alignment API in Java and implementation on top of the OWL API.</dd>
+<dt><a href="owlapi.html">OWL-API</a></dt>
+<dd>Starting quickly with OWL-API.</dd>
 <dt><a href="data.html">Ontologies</a></dt>
-<dd>Some data for aligning</dd>
+<dd>Some data for aligning.</dd>
 <dt><a href="eval.html">Evaluators</a></dt>
-<dd>Evaluating alignments</dd>
+<dd>Evaluating alignments from the format.</dd>
 </dl>
 </p>
 
diff --git a/samples/rdf/bibref.owl b/samples/rdf/bibref.owl
new file mode 100644
index 0000000000000000000000000000000000000000..ee9a56ff32bb680b406577b0fa0ebf6522c9c7b9
--- /dev/null
+++ b/samples/rdf/bibref.owl
@@ -0,0 +1,236 @@
+<?xml version='1.0' encoding='utf-8' standalone='no'?>
+<!DOCTYPE rdf:RDF SYSTEM "../../dtd/align.dtd">
+
+<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#'>
+<Alignment>
+  <xml>yes</xml>
+  <level>0</level>
+  <type>11</type>
+  <onto1>file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.umbc.ebiquity.publication.owl</onto1>
+  <onto2>file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl</onto2>
+  <uri1>file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.umbc.ebiquity.publication.owl</uri1>
+  <uri2>file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl</uri2>
+  <map>
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#Article'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Article'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#TechReport'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Techreport'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#InBook'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Inbook'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#Misc'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Misc'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#Book'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Book'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#InCollection'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Incollection'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#MastersThesis'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Mastersthesis'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#PhdThesis'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Phdthesis'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#InProceedings'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#Inproceedings'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+<!-- HERE ARE THE PROPERTIES -->
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#title'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasTitle'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#editor'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasEditor'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#edition'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasEdition'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#series'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasSeries'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#volume'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasVolume'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#note'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasNote'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#organization'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasOrganization'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#booktitle'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasBooktitle'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#type'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasType'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#keyword'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasKeywords'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#softCopyURI'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasURL'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#softCopySize'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasSize'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#author'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasAuthor'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#publisher'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasPublisher'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#chapter'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasChapter'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#pages'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasPages'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#number'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasNumber'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#address'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasAddress'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#journal'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasJournal'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#school'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasSchool'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#institution'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasInstitution'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+    <Cell>
+      <entity1 rdf:resource='http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#abstract'/>
+      <entity2 rdf:resource='file://localhost/Volumes/Phata/JAVA/ontoalign/sample/rdf/edu.mit.visus.bibtex.owl#hasAbstract'/>
+      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>1.0</measure>
+      <relation>=</relation>
+    </Cell>
+
+  </map>
+</Alignment>
+</rdf:RDF>
diff --git a/samples/rdf/edu.mit.visus.bibtex.owl b/samples/rdf/edu.mit.visus.bibtex.owl
new file mode 100644
index 0000000000000000000000000000000000000000..7dab8eb7b08a09be632ac5e8914fd12d04af7e6f
--- /dev/null
+++ b/samples/rdf/edu.mit.visus.bibtex.owl
@@ -0,0 +1,748 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="http://visus.mit.edu/bibtex/0.1/owl2w3cxml.xsl" type="text/xsl"?>
+<!DOCTYPE rdf:RDF [
+	<!ENTITY xsd		"http://www.w3.org/2001/XMLSchema#" >
+	<!ENTITY rdf		"http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
+	<!ENTITY rdfs		"http://www.w3.org/2000/01/rdf-schema#" >
+	<!ENTITY dc			"http://purl.org/dc/elements/1.1/" > 
+	<!ENTITY owl		"http://www.w3.org/2002/07/owl#" >
+	<!ENTITY units		"http://visus.mit.edu/fontomri/0.01/units.owl#" >
+	<!ENTITY bibtex		"http://purl.org/net/nknouf/ns/bibtex#">
+	<!ENTITY dcterms 	"http://purl.org/dc/terms/">
+    <!ENTITY dctype 	"http://purl.org/dc/dcmitype/"> ]>
+	
+<rdf:RDF
+    xmlns:units		="&units;"
+    xmlns:foaf		="http://xmlns.com/foaf/0.1/"
+    xmlns:rdf		="&rdf;"
+    xmlns:xsd		="&xsd;"
+    xmlns:rdfs		="&rdfs;"
+    xmlns:owl		="http://www.w3.org/2002/07/owl#"
+    xmlns:wot		="http://xmlns.com/wot/0.1/"
+    xmlns:dc		="&dc;"
+    xmlns:dcterms	="&dcterms;"
+    xmlns:dctype	="&dctype;"
+    xmlns:bibtex	="&bibtex;">
+  	
+<owl:Ontology rdf:about="">
+	<dc:creator>Nick Knouf &lt;nknouf@mit.edu&gt;</dc:creator>
+	<dc:description>Transformation of bibTeX into an OWL ontology</dc:description>
+	<dc:date>2003-12-29</dc:date>
+	<dc:subject>fMRI, ontology, fMRI analysis, foo, bar</dc:subject>
+	<rdfs:label>bibtex ontology</rdfs:label>
+	<dc:title>bibtex.owl: an ontology for bibTeX entries</dc:title>
+	<dc:identifier rdf:datatype="&xsd;anyURI">http://visus.mit.edu/bibtex/0.01/bibtex.owl</dc:identifier>
+	<rdfs:comment>Possible ontology to describe bibTeX entries.</rdfs:comment>
+	<owl:versionInfo>0.01</owl:versionInfo>
+</owl:Ontology>
+
+<!-- OTHER ANNOTATION PROPERTIES -->
+<rdf:Description rdf:about="&dc;creator">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+	<dc:title>this is a test title</dc:title>
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;description">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;date">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;subject">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;title">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;source">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dc;identifier">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dcterms;abstract">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+<rdf:Description rdf:about="&dcterms;bibliographicCitation">
+	<rdf:type rdf:resource="&owl;AnnotationProperty" />
+</rdf:Description>
+
+
+<!--
+		********  ENTRIES  ********
+		
+Entries form the basis of a bibTeX database and are categorized by their type, such as a book, journal article, conference proceedings, etc.  Each entry type has a specific set of fields that are required in bibTeX; as a first pass, these fields will also be required in the OWL ontology.
+
+Note: all rdfs:comment values for the entries come from http://newton.ex.ac.uk/tex/pack/bibtex/btxdoc/node6.html.
+-->
+<owl:Class rdf:ID="Entry">
+	<rdfs:label xml:lang="en">Entry</rdfs:label>
+	<rdfs:comment xml:lang="en">Base class for all entries</rdfs:comment>
+</owl:Class>
+
+<owl:Class rdf:ID="Article">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Article</rdfs:label>
+	<rdfs:comment xml:lang="en">An article from a journal or magazine.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasJournal" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Book">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Book</rdfs:label>
+	<rdfs:comment xml:lang="en">A book with an explicit publisher.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#humanCreator" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+			<dc:description>One thing to figure out is whether or not this tells us what we want; that is, does this imply that we must have at least one property of humanCreator, which could be either hasAuthor or hasEditor?</dc:description>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasPublisher" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Booklet">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Booklet</rdfs:label>
+	<rdfs:comment xml:lang="en">A work that is printed and bound, but without a named publisher or sponsoring institution.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Conference">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<owl:equivalentClass rdf:resource="#Inproceedings" />
+	<rdfs:label xml:lang="en">Conference</rdfs:label>
+	<rdfs:comment xml:lang="en">The same as INPROCEEDINGS, included for Scribe compatibility.</rdfs:comment>
+</owl:Class>
+
+<owl:Class rdf:ID="Inbook">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Inbook</rdfs:label>
+	<rdfs:comment xml:lang="en">A part of a book, which may be a chapter (or section or whatever) and/or a range of pages. </rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#humanCreator" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+			<dc:description>One thing to figure out is whether or not this tells us what we want; that is, does this imply that we must have at least one property of humanCreator, which could be either hasAuthor or hasEditor?</dc:description>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#pageChapterData" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasPublisher" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Incollection">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Incollection</rdfs:label>
+	<rdfs:comment xml:lang="en">A part of a book having its own title.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasBooktitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasPublisher" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Inproceedings">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Inproceedings</rdfs:label>
+	<rdfs:comment xml:lang="en">An article in a conference proceedings.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasBooktitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Manual">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Manual</rdfs:label>
+	<rdfs:comment xml:lang="en">Technical documentation.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Mastersthesis">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Mastersthesis</rdfs:label>
+	<rdfs:comment xml:lang="en">A Master's thesis.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasSchool" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Misc">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Misc</rdfs:label>
+	<rdfs:comment xml:lang="en">Use this type when nothing else fits.</rdfs:comment>
+</owl:Class>
+
+<owl:Class rdf:ID="Phdthesis">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Phdthesis</rdfs:label>
+	<rdfs:comment xml:lang="en">A PhD thesis.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasSchool" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Proceedings">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Proceedings</rdfs:label>
+	<rdfs:comment xml:lang="en">The proceedings of a conference.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Techreport">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Techreport</rdfs:label>
+	<rdfs:comment xml:lang="en">A report published by a school or other institution, usually numbered within a series.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasInstitution" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasYear" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+<owl:Class rdf:ID="Unpublished">
+	<rdfs:subClassOf rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">Unpublished</rdfs:label>
+	<rdfs:comment xml:lang="en">A document having an author and title, but not formally published.</rdfs:comment>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasAuthor" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasTitle" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+	<rdfs:subClassOf>
+		<owl:Restriction>
+			<owl:onProperty rdf:resource="#hasNote" />
+			<owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
+		</owl:Restriction>
+	</rdfs:subClassOf>
+</owl:Class>
+
+
+<!--
+		********  FIELDS  ********
+		
+Fields can be considered the properties of a bibTeX entry.  Each entry type (described above) has a different set of required and optional fields.  The fields will all be datatype properties for the time being.
+
+Note: all rdfs:comment values for the entries come from http://newton.ex.ac.uk/tex/pack/bibtex/btxdoc/node7.html
+-->
+
+<owl:DatatypeProperty rdf:ID="hasKey">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has key</rdfs:label>
+	<rdfs:comment xml:lang="en">The key for a particular bibTeX entry.  Note that the rdf:ID for each Entry instance could be the bibTeX key as well, possibly making this property redundant.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasAddress">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has address</rdfs:label>
+	<rdfs:comment xml:lang="en">Usually the address of the publisher or other type of institution. For major publishing houses, van Leunen recommends omitting the information entirely. For small publishers, on the other hand, you can help the reader by giving the complete address.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasAnnotation">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has annotation</rdfs:label>
+	<rdfs:comment xml:lang="en">An annotation. It is not used by the standard bibliography styles, but may be used by others that produce an annotated bibliography.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasAuthor">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:subPropertyOf rdf:resource="#humanCreator" />
+	<rdfs:label xml:lang="en">has author</rdfs:label>
+	<rdfs:comment xml:lang="en">The name(s) of the author(s), in the format described in the LaTeX book.</rdfs:comment>
+	<dc:description>This is tricky due to the fact that order is not (generally) preserved in RDF documents.  The problem arises when you want to have an author list where the order is _extremely_ important.  How shall we do that?  Perhaps we want to define "hasPrimaryAuthor", "hasSecondaryAuthor", "hasTertiaryAuthor", and "hasRemainingAuthors", or something of that sort.  This will be have to given more thought.</dc:description>
+</owl:DatatypeProperty>
+
+<!--
+<owl:ObjectProperty rdf:ID="hasAuthorTest">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&rdf;seq" />
+	<rdfs:label xml:lang="en">has author</rdfs:label>
+	<rdfs:comment xml:lang="en">The name(s) of the author(s), in the format described in the LaTeX book.</rdfs:comment>
+	<dc:description>This is tricky due to the fact that order is not (generally) preserved in RDF documents.  The problem arises when you want to have an author list where the order is _extremely_ important.  How shall we do that?  Perhaps we want to define "hasPrimaryAuthor", "hasSecondaryAuthor", "hasTertiaryAuthor", and "hasRemainingAuthors", or something of that sort.  This will be have to given more thought.</dc:description>
+</owl:ObjectProperty>
+
+<bibtex:Article rdf:ID="test">
+	<bibtex:hasTitle>test</bibtex:hasTitle>
+	<bibtex:hasYear>2215</bibtex:hasYear>
+	<bibtex:hasJournal>The Journal of Stuff</bibtex:hasJournal>
+	<bibtex:hasAuthorTest>
+		<rdf:seq rdf:ID="temp">
+			<rdf:li rdf:resource="http://visus.mit.edu/webdav/www/KanwisherLab.rdf#LiuJia" />
+			<rdf:li rdf:resource="http://visus.mit.edu/webdav/www/KanwisherLab.rdf#ChrisBaker" />
+			<rdf:li rdf:resource="http://visus.mit.edu/webdav/www/KanwisherLab.rdf#NancyKanwisher" />
+		</rdf:seq>
+	</bibtex:hasAuthorTest>
+</bibtex:Article>
+-->
+
+<owl:DatatypeProperty rdf:ID="hasBooktitle">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has booktitle</rdfs:label>
+	<rdfs:comment xml:lang="en">Title of a book, part of which is being cited. See the LaTeX book for how to type titles. For book entries, use the title field instead.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasChapter">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;nonNegativeInteger" />
+	<rdfs:subPropertyOf rdf:resource="#pageChapterData" />
+	<rdfs:label xml:lang="en">has chapter</rdfs:label>
+	<rdfs:comment xml:lang="en">A chapter (or section or whatever) number.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasCrossref">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has crossref</rdfs:label>
+	<rdfs:comment xml:lang="en">The database key of the entry being cross referenced.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasEdition">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has edition</rdfs:label>
+	<rdfs:comment xml:lang="en">The edition of a book--for example, "Second". This should be an ordinal, and should have the first letter capitalized, as shown here; the standard styles convert to lower case when necessary.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasEditor">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:subPropertyOf rdf:resource="#humanCreator" />
+	<rdfs:label xml:lang="en">has editor</rdfs:label>
+	<rdfs:comment xml:lang="en">Name(s) of editor(s), typed as indicated in the LaTeX book. If there is also an author field, then the editor field gives the editor of the book or collection in which the reference appears.</rdfs:comment>
+	<dc:description>Again, the same issues that arose with the "hasAuthor" property apply here.</dc:description>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="howPublished">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">how published</rdfs:label>
+	<rdfs:comment xml:lang="en">How something strange has been published. The first word should be capitalized.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasInstitution">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has institution</rdfs:label>
+	<rdfs:comment xml:lang="en">The sponsoring institution of a technical report.</rdfs:comment>
+	<dc:description>This could be an object property that refers to an external set of institution instances.</dc:description>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasJournal">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has journal</rdfs:label>
+	<rdfs:comment xml:lang="en">A journal name. Abbreviations are provided for many journals; see the Local Guide</rdfs:comment>
+	<dc:description>This could optionally be an object property, whereby the range would refer to an external set of journal instances, thus providing standardized abbreviations for different bibliographic styles.</dc:description>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasMonth">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has month</rdfs:label>
+	<rdfs:comment xml:lang="en">The month in which the work was published or, for an unpublished work, in which it was written. You should use the standard three-letter abbreviation, as described in Appendix B.1.3 of the LaTeX book.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasNote">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has note</rdfs:label>
+	<rdfs:comment xml:lang="en">Any additional information that can help the reader. The first word should be capitalized.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasNumber">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has number</rdfs:label>
+	<rdfs:comment xml:lang="en">The number of a journal, magazine, technical report, or of a work in a series. An issue of a journal or magazine is usually identified by its volume and number; the organization that issues a technical report usually gives it a number; and sometimes books are given numbers in a named series.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasOrganization">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has organization</rdfs:label>
+	<rdfs:comment xml:lang="en">The organization that sponsors a conference or that publishes a manual.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasPages">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:subPropertyOf rdf:resource="#pageChapterData" />
+	<rdfs:label xml:lang="en">has pages</rdfs:label>
+	<rdfs:comment xml:lang="en">One or more page numbers or range of numbers, such as 42-111 or 7,41,73-97 or 43+ (the `+' in this last example indicates pages following that don't form a simple range). To make it easier to maintain Scribe-compatible databases, the standard styles convert a single dash (as in 7-33) to the double dash used in TeX to denote number ranges (as in 7-33).</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasPublisher">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has publisher</rdfs:label>
+	<rdfs:comment xml:lang="en">The publisher's name.</rdfs:comment>
+	<dc:description>This is a case where an ObjectProperty might be a better choice, where the range is some set of publisher names defined in another ontology.  That would allow all of the metadata for the publisher to be incorporated as needed.</dc:description>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasSchool">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has school</rdfs:label>
+	<rdfs:comment xml:lang="en">The name of the school where a thesis was written.</rdfs:comment>
+	<dc:description>As with "hasPublisher", this could be an ObjectProperty that refers to an external set of school instances.</dc:description>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasSeries">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has series</rdfs:label>
+	<rdfs:comment xml:lang="en">The name of a series or set of books. When citing an entire book, the the title field gives its title and an optional series field gives the name of a series or multi-volume set in which the book is published.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasTitle">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has title</rdfs:label>
+	<rdfs:comment xml:lang="en">The work's title, typed as explained in the LaTeX book.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasType">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has type</rdfs:label>
+	<rdfs:comment xml:lang="en">The type of a technical report--for example, "Research Note".</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasVolume">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;nonNegativeInteger" />
+	<rdfs:label xml:lang="en">has volume</rdfs:label>
+	<rdfs:comment xml:lang="en">The volume of a journal or multivolume book.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasYear">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;nonNegativeInteger" />
+	<rdfs:label xml:lang="en">has year</rdfs:label>
+	<rdfs:comment xml:lang="en">The year of publication or, for an unpublished work, the year it was written. Generally it should consist of four numerals, such as 1984, although the standard styles can handle any year whose last four nonpunctuation characters are numerals, such as '(about 1984)'.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasAffiliation">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has affiliation</rdfs:label>
+	<rdfs:comment xml:lang="en">The authors affiliation.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasAbstract">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has abstract</rdfs:label>
+	<rdfs:comment xml:lang="en">An abstract of the work.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasContents">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has contents</rdfs:label>
+	<rdfs:comment xml:lang="en">A Table of Contents.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasCopyright">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has copyright</rdfs:label>
+	<rdfs:comment xml:lang="en">Copyright information.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasISBN">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has ISBN</rdfs:label>
+	<rdfs:comment xml:lang="en">The International Standard Book Number.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasISSN">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has ISSN</rdfs:label>
+	<rdfs:comment xml:lang="en">The International Standard Serial Number. Used to identify a journal.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasKeywords">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has keywords</rdfs:label>
+	<rdfs:comment xml:lang="en">Key words used for searching or possibly for annotation.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasLanguage">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has language</rdfs:label>
+	<rdfs:comment xml:lang="en">The language the document is in.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasLocation">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has location</rdfs:label>
+	<rdfs:comment xml:lang="en">A location associated with the entry, such as the city in which a conference took place.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasLCCN">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has LCCN</rdfs:label>
+	<rdfs:comment xml:lang="en">The Library of Congress Call Number.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasMrnumber">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has mrnumber</rdfs:label>
+	<rdfs:comment xml:lang="en">The Mathematical Reviews number.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasPrice">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has price</rdfs:label>
+	<rdfs:comment xml:lang="en">The price of the document.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasSize">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has size</rdfs:label>
+	<rdfs:comment xml:lang="en">The physical dimensions of a work.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="hasURL">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">has URL</rdfs:label>
+	<rdfs:comment xml:lang="en">The WWW Universal Resource Locator that points to the item being referenced. This often is used for technical reports to point to the ftp or web site where the postscript source of the report is located.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<!--
+		********  "META" PROPERTIES  ********
+		
+We define here some meta properties that the fields above may use as superproperties.  This is necessary in order to define cardinality constraints properly.
+-->
+<owl:DatatypeProperty rdf:ID="humanCreator">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:range rdf:resource="&xsd;string" />
+	<rdfs:label xml:lang="en">human creator</rdfs:label>
+	<rdfs:comment xml:lang="en">A generic human creator category, necessary in order to contain both author and editor.</rdfs:comment>
+</owl:DatatypeProperty>
+
+<owl:DatatypeProperty rdf:ID="pageChapterData">
+	<rdfs:domain rdf:resource="#Entry" />
+	<rdfs:label xml:lang="en">page and/or chapter data</rdfs:label>
+	<rdfs:comment xml:lang="en">A generic property to hold page and/or chapter data.</rdfs:comment>
+</owl:DatatypeProperty>
+</rdf:RDF>
diff --git a/samples/rdf/edu.umbc.ebiquity.publication.owl b/samples/rdf/edu.umbc.ebiquity.publication.owl
new file mode 100644
index 0000000000000000000000000000000000000000..e951beaf987d4f086d931782b0076d2ad3c9c375
--- /dev/null
+++ b/samples/rdf/edu.umbc.ebiquity.publication.owl
@@ -0,0 +1,310 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE owl [
+  <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+  <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
+  <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
+  <!ENTITY owl "http://www.w3.org/2002/07/owl#">
+  <!ENTITY person "http://ebiquity.umbc.edu/v2.1/ontology/person.owl#">
+  <!ENTITY project "http://ebiquity.umbc.edu/v2.1/ontology/project.owl#">
+  <!ENTITY pub "http://ebiquity.umbc.edu/v2.1/ontology/publication.owl#">]>
+<rdf:RDF 
+  xmlns:rdf = "&rdf;"
+  xmlns:rdfs = "&rdfs;"
+  xmlns:xsd = "&xsd;"
+  xmlns:owl = "&owl;"
+  xmlns:person = "&person;"
+  xmlns:project = "&project;"
+  xmlns:pub = "&pub;"
+  xmlns = "&pub;"
+  xml:base = "&pub;">
+  
+  <owl:Ontology rdf:about="&pub;publication">
+    <owl:versionInfo>0.1</owl:versionInfo>
+    <rdfs:label>eBiquity Publication Ontology</rdfs:label>
+  </owl:Ontology>
+
+  <owl:Class rdf:ID="Resource">
+    <rdfs:label>Resource</rdfs:label>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#title"/><owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#publishedOn"/><owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#description"/><owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#version"/><owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#author"/><owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#firstAuthor"/><owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+  </owl:Class>
+
+  <owl:DatatypeProperty rdf:ID="title">
+    <rdfs:label>Publication Title</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="publishedOn">
+    <rdfs:label>Resource Published On Date and Time</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;dateTime"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="description">
+    <rdfs:label>Resource Description</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="keyword">
+    <rdfs:label>Resource Keyword</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="version">
+    <rdfs:label>Resource Version</rdfs:label>    
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:ObjectProperty rdf:ID="author">
+    <rdfs:label>Resource Author</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&person;Person"/>
+  </owl:ObjectProperty>
+
+  <owl:ObjectProperty rdf:ID="firstAuthor">
+    <rdfs:label>Resource First Author</rdfs:label>       
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&person;Person"/>
+  </owl:ObjectProperty>        
+
+  <owl:ObjectProperty rdf:ID="softCopy">
+    <rdfs:label>Resource Soft Copy</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="#SoftCopy"/>
+  </owl:ObjectProperty>
+
+  <owl:DatatypeProperty rdf:ID="type">
+    <rdfs:label>Resource Type</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+<!-- JE: external resource
+  <owl:ObjectProperty rdf:ID="relatedProject">
+    <rdfs:label>Related Project</rdfs:label>
+    <owl:inverseOf rdf:resource="&project;relatedResource" />
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&project;Project"/>
+  </owl:ObjectProperty>
+-->
+
+<!-- ... -->
+
+  <owl:Class rdf:ID="SoftCopy">
+    <rdfs:label>Soft Copy</rdfs:label>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#softCopyFormat"/><owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#softCopyURI"/><owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#softCopySize"/><owl:cardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:cardinality></owl:Restriction>
+    </rdfs:subClassOf>
+  </owl:Class>
+
+  <owl:DatatypeProperty rdf:ID="softCopyFormat">
+    <rdfs:label>Soft Copy Format</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="softCopyURI">
+    <rdfs:label>Soft Copy URI</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;anyURI"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="softCopySize">
+    <rdfs:label>Soft Copy File Size</rdfs:label>
+    <rdfs:domain rdf:resource="#Resource"/>
+    <rdfs:range rdf:resource="&xsd;nonNegativeInteger"/>
+  </owl:DatatypeProperty>
+
+<!-- ... -->
+
+  <owl:Class rdf:ID="Publication">
+    <rdfs:label>Publication</rdfs:label>
+    <rdfs:subClassOf rdf:resource="#Resource"/>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#editor"/><owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+    <rdfs:subClassOf>
+      <owl:Restriction><owl:onProperty rdf:resource="#abstract"/><owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:maxCardinality></owl:Restriction>
+    </rdfs:subClassOf>
+  </owl:Class>
+
+  <owl:ObjectProperty rdf:ID="editor">
+    <rdfs:label>Publication Editor</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&person;Person"/>
+  </owl:ObjectProperty>
+
+  <owl:DatatypeProperty rdf:ID="abstract">
+    <rdfs:label>Publication Abstract</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="edition">
+    <rdfs:label>Publication Edition</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="chapter">
+    <rdfs:label>Publication Chapter</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="series">
+    <rdfs:label>Publication Series</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="pages">
+    <rdfs:label>Publication Pages</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="volume">
+    <rdfs:label>Publication Volume</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="number">
+    <rdfs:label>Publication Number</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="note">
+    <rdfs:label>Publication Note</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="address">
+    <rdfs:label>Publication Address</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="organization">
+    <rdfs:label>Publication Organization</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="journal">
+    <rdfs:label>Publication Journal</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="booktitle">
+    <rdfs:label>Publication Book Title</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="school">
+    <rdfs:label>Publication School</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="institution">
+    <rdfs:label>Publication Institution</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="publisher">
+    <rdfs:label>Publication Publisher</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;string"/>
+  </owl:DatatypeProperty>
+
+  <owl:DatatypeProperty rdf:ID="counter">
+    <rdfs:label>Publication Counter</rdfs:label>
+    <rdfs:domain rdf:resource="#Publication"/>
+    <rdfs:range rdf:resource="&xsd;nonNegativeInteger"/>
+  </owl:DatatypeProperty>
+
+  <owl:Class rdf:ID="Article">
+    <rdfs:label>Article</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="Book">
+    <rdfs:label>Book</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="InBook">
+    <rdfs:label>InBook</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="InCollection">
+    <rdfs:label>InCollection</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="InProceedings">
+    <rdfs:label>InProceedings</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="MastersThesis">
+    <rdfs:label>MastersThesis</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="Misc">
+    <rdfs:label>Misc</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="PhdThesis">
+    <rdfs:label>PhdThesis</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="Proceedings">
+    <rdfs:label>Proceedings</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+  <owl:Class rdf:ID="TechReport">
+    <rdfs:label>TechReport</rdfs:label>
+    <rdfs:subClassOf rdf:resource="&pub;Publication" />
+  </owl:Class>
+
+</rdf:RDF>
diff --git a/samples/rdf/onto1.owl b/samples/rdf/onto1.owl
new file mode 100644
index 0000000000000000000000000000000000000000..ca5a8a204f7ade349b72f9d03f3b379c428fc3b2
--- /dev/null
+++ b/samples/rdf/onto1.owl
@@ -0,0 +1,24 @@
+<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns:owl="http://www.w3.org/2002/07/owl#"
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+    xml:base="http://www.example.org/ontology1"
+    xmlns="http://www.example.org/ontology1#">
+
+<owl:Ontology rdf:about="">
+  <rdfs:comment>The most basic alignment test</rdfs:comment>
+</owl:Ontology>
+
+<owl:Class rdf:ID="publication">
+</owl:Class>
+
+<owl:Class rdf:ID="reviewedarticle">
+  <rdfs:subClassOf rdf:about="#publication"/>
+</owl:Class>
+
+<owl:Class rdf:ID="journalarticle">
+  <rdfs:subClassOf rdf:about="#reviewedarticle"/>
+</owl:Class>
+
+</rdf:RDF>
diff --git a/samples/rdf/onto2.owl b/samples/rdf/onto2.owl
new file mode 100644
index 0000000000000000000000000000000000000000..ca7ce38bbaa70464a982376e87556efb32d74cf8
--- /dev/null
+++ b/samples/rdf/onto2.owl
@@ -0,0 +1,24 @@
+<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns:owl="http://www.w3.org/2002/07/owl#"
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+    xml:base="http://www.example.org/ontology2"
+    xmlns="http://www.example.org/ontology2#">
+
+<owl:Ontology rdf:about="">
+  <rdfs:comment>The second part of this basic alignment test</rdfs:comment>
+</owl:Ontology>
+
+<owl:Class rdf:ID="reference">
+</owl:Class>
+
+<owl:Class rdf:ID="article">
+  <rdfs:subClassOf rdf:about="#reference"/>
+</owl:Class>
+
+<owl:Class rdf:ID="journalarticle">
+  <rdfs:subClassOf rdf:about="#article"/>
+</owl:Class>
+
+</rdf:RDF>
diff --git a/samples/tests.sh b/samples/tests.sh
new file mode 100644
index 0000000000000000000000000000000000000000..8c08ab44daae6ad84f7ac0a5eef587e625a9e652
--- /dev/null
+++ b/samples/tests.sh
@@ -0,0 +1,81 @@
+#!/bin/csh
+# This is a serie of tests made for the presentation of the API.
+# All these tests can be automatically run
+
+# Context
+echo "Cleaning up."
+setenv CWD `pwd`
+
+# Clean up
+/bin/rm aligns/*.owl
+
+# Display parameters
+echo "Basic..."
+java -jar ../lib/procalign.jar
+
+# Simple basic example
+java -jar ../lib/procalign.jar -i fr.inrialpes.exmo.align.impl.SubsDistNameAlignment file://localhost$CWD/rdf/onto1.owl file://localhost$CWD/rdf/onto2.owl -o aligns/sample.owl
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/onto1.owl file://localhost$CWD/rdf/onto2.owl -i fr.inrialpes.exmo.align.impl.SubsDistNameAlignment -t .6 -r fr.inrialpes.exmo.align.impl.OWLAxiomsRendererVisitor
+
+# Test a number of methods
+echo "Aligning..."
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.NameEqAlignment -o aligns/NameEq.owl
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.EditDistNameAlignment -o aligns/EditDistName.owl
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.SubsDistNameAlignment -o aligns/SubsDistName.owl
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.StrucSubsDistAlignment -o aligns/StrucSubsDist.owl
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.StrucSubsDistAlignment -o aligns/StrucSubsDist4.owl -t .4
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.StrucSubsDistAlignment -o aligns/StrucSubsDist7.owl -t .7
+
+# Evaluate their performances
+echo "Comparing..."
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/NameEq.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/EditDistName.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/SubsDistName.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist4.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist7.owl
+
+# Other evaluations
+echo "Comparing again..."
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/NameEq.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/EditDistName.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/SubsDistName.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist4.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.SymMeanEvaluator file://localhost$CWD/rdf/bibref.owl file://localhost$CWD/aligns/StrucSubsDist7.owl
+# Pipelining
+echo "Pipelining..."
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.PropSubsDistAlignment -o aligns/PropSubsDist.owl 
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/edu.umbc.ebiquity.publication.owl file://localhost$CWD/rdf/edu.mit.visus.bibtex.owl -i fr.inrialpes.exmo.align.impl.ClassStructAlignment -a aligns/PropSubsDist.owl -o aligns/Piped.owl
+
+java -cp ../lib/procalign.jar fr.inrialpes.exmo.align.util.EvalAlign -i fr.inrialpes.exmo.align.impl.PRecEvaluator file://localhost$CWD/aligns/StrucSubsDist.owl file://localhost$CWD/aligns/Piped.owl
+
+# Rendering
+echo "Rendering..."
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/onto1.owl file://localhost$CWD/rdf/onto2.owl -i fr.inrialpes.exmo.align.impl.EditDistNameAlignment -r fr.inrialpes.exmo.align.impl.OWLAxiomsRendererVisitor -t 0.4
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/onto1.owl file://localhost$CWD/rdf/onto2.owl -i fr.inrialpes.exmo.align.impl.EditDistNameAlignment -r fr.inrialpes.exmo.align.impl.XSLTRendererVisitor -t 0.4
+
+java -jar ../lib/procalign.jar file://localhost$CWD/rdf/onto1.owl file://localhost$CWD/rdf/onto2.owl -i fr.inrialpes.exmo.align.impl.EditDistNameAlignment -r fr.inrialpes.exmo.align.impl.SWRLRendererVisitor -t 0.4
+
diff --git a/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java b/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
index 68dcd1f060a3dd4f7e95f819fd160606afc51c09..db81e0667f37f4f146424e41fd98e434bd5ad660 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicAlignment.java
@@ -20,10 +20,12 @@
 
 package fr.inrialpes.exmo.align.impl; 
 
+import java.lang.ClassNotFoundException;
 import java.util.Hashtable;
 import java.util.Enumeration;
 import java.io.PrintStream;
 import java.io.IOException;
+import java.net.URI;
 
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -33,6 +35,8 @@ import org.semanticweb.owl.model.OWLEntity;
 import org.semanticweb.owl.model.OWLException;
 
 import org.semanticweb.owl.align.Alignment;
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Relation;
 
@@ -49,12 +53,19 @@ import org.semanticweb.owl.align.Relation;
 
 public class BasicAlignment implements Alignment
 {
+    public void accept( AlignmentVisitor visitor) throws AlignmentException {
+        visitor.visit( this );
+    }
+
+    protected int debug = 0;
     protected String level = "0";
-    protected String type = "11";
+    protected String type = "**";
     protected OWLOntology onto1 = null;
     protected OWLOntology onto2 = null;
     protected Hashtable hash1 = null;
     protected Hashtable hash2 = null;
+    protected URI uri1 = null;
+    protected URI uri2 = null;
 
     public BasicAlignment() {
 	hash1 = new Hashtable();
@@ -73,16 +84,28 @@ public class BasicAlignment implements Alignment
     }
 
     /** Alignment methods **/
-    public OWLOntology getOntology1(){ return onto1; };
-    public OWLOntology getOntology2(){ return onto2; };
-    public void setOntology1(OWLOntology ontology)
-      { onto1 = ontology; };
-    public void setOntology2(OWLOntology ontology)
-      { onto2 = ontology; };
+    public Object getOntology1(){ return onto1; };
+    public Object getOntology2(){ return onto2; };
+    public void setOntology1(Object ontology) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLOntology").isInstance(ontology) )
+		throw new AlignmentException( "setOntollogy1: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	onto1 = (OWLOntology)ontology; };
+    public void setOntology2(Object ontology) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLOntology").isInstance(ontology) )
+		throw new AlignmentException( "setOntollogy2: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	onto2 = (OWLOntology)ontology; };
     public void setType( String type ){ this.type = type; };
     public String getType(){ return type; };
     public void setLevel( String level ){ this.level = level; };
     public String getLevel(){ return level; };
+    public URI getFile1(){ return uri1; };
+    public void setFile1(URI u){ uri1 = u; };
+    public URI getFile2(){ return uri2; };
+    public void setFile2(URI u){ uri2 = u; };
 
     public Enumeration getElements(){
 	return hash1.elements();
@@ -90,50 +113,93 @@ public class BasicAlignment implements Alignment
     /* Please note that all the following methods must be changed because
 	they consider that only ONE Entity can be aligned with another !! */
     /** Cell methods **/
-    public void addAlignCell( OWLEntity ob1, OWLEntity ob2, String relation, double measure) throws OWLException {
-	Cell cell = (Cell)new BasicCell( ob1, ob2, relation, measure );
-	hash1.put((Object)(ob1.getURI()),cell);
-	hash2.put((Object)(ob2.getURI()),cell);
+    public void addAlignCell( Object ob1, Object ob2, String relation, double measure) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob1) ||
+		 !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob2) )
+		throw new AlignmentException( "addAlignCell: arguments must be OWLEntities");
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	try {
+	    Cell cell = (Cell)new BasicCell( (OWLEntity)ob1, (OWLEntity)ob2, relation, measure );
+	    hash1.put((Object)(((OWLEntity)ob1).getURI()),cell);
+	    hash2.put((Object)(((OWLEntity)ob2).getURI()),cell);
+	} catch (OWLException e) { throw new AlignmentException( "getURI problem", e); }
     };
-    public void addAlignCell( OWLEntity ob1, OWLEntity ob2) throws OWLException {
-	addAlignCell( ob1, ob2, "=", 0);
+    public void addAlignCell( Object ob1, Object ob2) throws AlignmentException {
+	addAlignCell( ob1, ob2, "=", 1.);
     };
 
-    public Cell getAlignCell1( OWLEntity ob ) throws OWLException{
-	return (Cell)hash1.get((Object)ob.getURI());
+    public Cell getAlignCell1( Object ob ) throws AlignmentException{
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignCell1: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	try {
+	    return (Cell)hash1.get(((OWLEntity)ob).getURI());
+	} catch (OWLException e) { throw new AlignmentException( "getURI problem", e); }
     }
-    public Cell getAlignCell2( OWLEntity ob ) throws OWLException{
-	return (Cell)hash2.get((Object)ob.getURI());
+    public Cell getAlignCell2( Object ob ) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignCell2: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	try {
+	    return (Cell)hash2.get(((OWLEntity)ob).getURI());
+	} catch (OWLException e) { throw new AlignmentException( "getURI problem", e); }
     }
 
-    public OWLEntity getAlignedObject1( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash1.get((Object)ob.getURI()));
+    public Object getAlignedObject1( Object ob ) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedObject1: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell1(ob);
 	if ( c != null ) return c.getObject2();
-	else return (OWLEntity)null;
+	else return null;
     };
-    public OWLEntity getAlignedObject2( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash2.get((Object)ob.getURI()));
+    public Object getAlignedObject2( Object ob ) throws AlignmentException {
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedObject2: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell2(ob);
 	if ( c != null ) return c.getObject1();
-	else return (OWLEntity)null;
+	else return null;
     };
-    public Relation getAlignedRelation1( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash1.get((Object)ob.getURI()));
+    public Relation getAlignedRelation1( Object ob ) throws AlignmentException {
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedRelation1: argument must be OWLEntity" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell1(ob);
 	if ( c != null ) return c.getRelation();
 	else return (Relation)null;
     };
-    public Relation getAlignedRelation2( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash2.get((Object)ob.getURI()));
+    public Relation getAlignedRelation2( Object ob ) throws AlignmentException {
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedRelation2: argument must be OWLEntity" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell2(ob);
 	if ( c != null ) return c.getRelation();
 	else return (Relation)null;
     };
-    public double getAlignedMeasure1( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash1.get((Object)ob.getURI()));
-	if ( c != null ) return c.getMeasure();
+    public double getAlignedStrength1( Object ob ) throws AlignmentException{
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedStrength1: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell1(ob);
+	if ( c != null ) return c.getStrength();
 	else return 0;
     };
-    public double getAlignedMeasure2( OWLEntity ob ) throws OWLException{
-	Cell c = ((Cell)hash2.get((Object)ob.getURI()));
-	if ( c != null ) return c.getMeasure();
+    public double getAlignedStrength2( Object ob ) throws AlignmentException{
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException( "getAlignedStrength2: arguments must be OWLEntities" );
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	Cell c = getAlignCell2(ob);
+	if ( c != null ) return c.getStrength();
 	else return 0;
     };
 
@@ -142,68 +208,57 @@ public class BasicAlignment implements Alignment
 
     /** The cut function suppresses from an alignment all the cell
 	over a particulat threshold **/
-    public void cut( double threshold ) throws OWLException {
+    public void cut( double threshold ) throws AlignmentException {
 	for( Enumeration e = hash1.keys() ; e.hasMoreElements(); ){
 	    Cell c = (Cell)hash1.get(e.nextElement());
-	    if ( c.getMeasure() > threshold ) {
+	    if ( c.getStrength() < threshold ) {
 		// Beware, this suppresses all cells with these keys 
 		// There is only one of them
-		hash1.remove((Object)c.getObject1().getURI());
-		hash2.remove((Object)c.getObject2().getURI());
+		try {
+		    hash1.remove(((OWLEntity)c.getObject1()).getURI());
+		    hash2.remove(((OWLEntity)c.getObject2()).getURI());
+		} catch (OWLException ex) { throw new AlignmentException( "getURI problem", ex); }
 	    }
 	} //end for
     };
 
-    /** New version corresponding to the RDF/XML/OWL DTD **/
-   public void write( PrintStream writer ) throws IOException, OWLException {
-	writer.print("<?xml version='1.0' encoding='utf-8");
-	//	writer.print(writer.getEncoding().toString());
-	writer.print("' standalone='no'?>\n");
-	writer.print("<!DOCTYPE rdf:RDF SYSTEM \"align.dtd\">\n\n");
-	// add date, etc.
-	writer.print("<rdf:RDF xmlns='http://knowledgeweb.semanticweb.org/heterogeneity/alignment'\n         xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'\n         xmlns:xsd='http://www.w3.org/2001/XMLSchema#'>\n");
-	writer.print("<Alignment>\n  <xml>yes</xml>\n");
-	writer.print("  <level>");
-	writer.print(level);
-	writer.print("</level>\n  <type>");
-	writer.print(type);
-	writer.print("</type>\n  <onto1>");
-	writer.print(onto1.getLogicalURI().toString());
-	writer.print("</onto1>\n  <onto2>");
-	writer.print(onto2.getLogicalURI().toString());
-	writer.print("</onto2>\n  <map>\n");
-	
+    /** The harden function acts like threshold but put all weights at 
+	1. **/
+    public void harden( double threshold ) throws AlignmentException {
 	for( Enumeration e = hash1.keys() ; e.hasMoreElements(); ){
 	    Cell c = (Cell)hash1.get(e.nextElement());
-	    if ( c != null ) c.write( writer );
+	    if ( c.getStrength() < threshold ) {
+		// Beware, this suppresses all cells with these keys 
+		// There is only one of them
+		try {
+		    hash1.remove(((OWLEntity)c.getObject1()).getURI());
+		    hash2.remove(((OWLEntity)c.getObject2()).getURI());
+		} catch (OWLException ex) { throw new AlignmentException( "getURI problem", ex); }
+	    } else { c.setStrength( 1. ); }
 	} //end for
-	writer.print("  </map>\n</Alignment>\n");
-	writer.print("</rdf:RDF>\n");
     };
 
+    /**
+     * Incorporate the cell of the alignment into it own alignment.
+     * Note: for the moment, this does not copy but really incorporates.
+     * So, if hardening or cutting, are applied, then the ingested alignmment
+     * will be modified as well.
+     */
+    protected void ingest( Alignment alignment ) throws AlignmentException {
+	for( Enumeration e = alignment.getElements() ; e.hasMoreElements(); ){
+	    Cell c = (Cell)e.nextElement();
+	    try {
+		hash1.put((Object)((OWLEntity)c.getObject1()).getURI(),c);
+		hash2.put((Object)((OWLEntity)c.getObject2()).getURI(),c);
+	    } catch (OWLException ex) { throw new AlignmentException( "getURI problem", ex); }
+	}
+    };
+
+
     /** This should be rewritten in order to generate the axiom ontology instead of
        printing it! And then use ontology serialization for getting it printed.
     **/
-    public void printAsAxiom( PrintStream writer ) throws OWLException {
-	writer.print("<rdf:RDF\n");
-	writer.print("    xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n");
-	writer.print("    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n");
-	writer.print("    xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" \n");
-	writer.print("    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\">\n\n");
-	
-	writer.print("  <owl:Ontology rdf:about=\"\">\n");
-	writer.print("    <rdfs:comment>Aligned ontollogies</rdfs:comment>\n");
-	writer.print("    <owl:imports rdf:resource=\""+onto1.getLogicalURI().toString()+"\"/>\n");
-	writer.print("    <owl:imports rdf:resource=\""+onto2.getLogicalURI().toString()+"\"/>\n");
-	writer.print("  </owl:Ontology>\n\n");
-
-	for( Enumeration e = getElements() ; e.hasMoreElements(); ){
-	    Cell c = (Cell)e.nextElement();
-	    c.getRelation().printAsAxiom( writer, onto1, c );
-	} //end for
-	
-	writer.print("</rdf:RDF>\n");
-
+    public void render( PrintStream writer, AlignmentVisitor renderer ) throws AlignmentException {
+	    accept( renderer );
     }
-
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/BasicCell.java b/src/fr/inrialpes/exmo/align/impl/BasicCell.java
index 4560b16ab5381c5ca5a07b2c946cbf9cec2f5245..a0674f913c0ffe5d74017fca9a22cb026dcf5eee 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicCell.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicCell.java
@@ -1,7 +1,8 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2003-2004
-  *
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
  * as published by the Free Software Foundation; either version 2.1 of
@@ -22,14 +23,19 @@ package fr.inrialpes.exmo.align.impl;
 
 import java.io.PrintStream;
 import java.io.IOException;
+import java.lang.ClassNotFoundException;
 
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
+import org.semanticweb.owl.model.OWLException;
 import org.semanticweb.owl.model.OWLEntity;
+
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Relation;
-import org.semanticweb.owl.model.OWLException;
+
 /**
  * Represents an OWL ontology alignment. An ontology comprises a number of
  * collections. Each ontology has a number of classes, properties and
@@ -42,48 +48,66 @@ import org.semanticweb.owl.model.OWLException;
 
 public class BasicCell implements Cell
 {
+    public void accept( AlignmentVisitor visitor) throws AlignmentException {
+        visitor.visit( this );
+    }
+
     OWLEntity object1 = null;
     OWLEntity object2 = null;
     Relation relation = null;
-    double measure = 0;
+    double strength = 0;
 
     /** Creation **/
-    public BasicCell( OWLEntity ob1, OWLEntity ob2 ){
+    public BasicCell( Object ob1, Object ob2 ) throws AlignmentException {
 	new BasicCell( ob1, ob2, "=", 0 );
     };
 
-    public BasicCell( OWLEntity ob1, OWLEntity ob2, String rel, double m ){
-	object1 = ob1;
-	object2 = ob2;
-	relation = new BasicRelation( rel );
+    public BasicCell( Object ob1, Object ob2, String rel, double m ) throws AlignmentException {
+	try {
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob1) ||
+		 !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob2) )
+		throw new AlignmentException("BasicCell: must take two OWLEntity as argument");
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	object1 = (OWLEntity)ob1;
+	object2 = (OWLEntity)ob2;
+	if ( rel.equals("=") ) {
+	    relation = new EquivRelation();
+	} else if ( rel.equals("<") ) {
+	    relation = new SubsumeRelation();
+	} else if ( rel.equals("%") ) {
+	    relation = new IncompatRelation();
+	} else {
+	    // I could use the class name for relation, 
+	    // this would be more extensible...
+	    relation = new BasicRelation("=");
+	};
 	// No exception, just keep 0?
-	if ( m >= 0 && m <= 1 ) measure = m;
+	if ( m >= 0 && m <= 1 ) strength = m;
     };
 
-    public OWLEntity getObject1(){ return object1; };
-    public OWLEntity getObject2(){ return object2; };
-    public void setObject1( OWLEntity ob ){ object1 = ob; };
-    public void setObject2( OWLEntity ob ){ object2 = ob; };
+    public Object getObject1(){ return object1; };
+    public Object getObject2(){ return object2; };
+    public void setObject1( Object ob ) throws AlignmentException {
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException("BasicCell.setObject1: must have an OWLEntity as argument");
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	object1 = (OWLEntity)ob;
+    }
+    public void setObject2( Object ob ) throws AlignmentException {
+	try { 
+	    if ( !Class.forName("org.semanticweb.owl.model.OWLEntity").isInstance(ob) )
+		throw new AlignmentException("BasicCell.setObject2: must have an OWLEntity as argument");
+	} catch (ClassNotFoundException e) { e.printStackTrace(); }
+	object2 = (OWLEntity)ob;
+    };
     public Relation getRelation(){ return relation; };
     public void setRelation( Relation rel ){ relation = rel; };
-    public double getMeasure(){ return measure; };
-    public void setMeasure( double m ){ measure = m; };
+    public double getStrength(){ return strength; };
+    public void setStrength( double m ){ strength = m; };
 
     /** Housekeeping **/
     public void dump( ContentHandler h ){};
 
-    public void write( PrintStream writer ) throws java.io.IOException, org.semanticweb.owl.model.OWLException {
-
-	writer.print("    <Cell>\n      <entity1 rdf:resource='");
-	writer.print( object1.getURI().toString() );
-	writer.print("'/>\n      <entity2 rdf:resource='");
-	writer.print( object2.getURI().toString() );
-	writer.print("'/>\n      <measure rdf:datatype='http://www.w3.org/2001/XMLSchema#float'>");
-	writer.print( measure );
-	writer.print("</measure>\n      <relation>");
-	relation.write( writer );
-	writer.print("</relation>\n    </Cell>\n");
-    };
-
 }
 
diff --git a/src/fr/inrialpes/exmo/align/impl/BasicEvaluator.java b/src/fr/inrialpes/exmo/align/impl/BasicEvaluator.java
index 69cca13c1d96af2043d74b14044d65dfaac64a06..bf2051882f23baadf0ba72d3fd78f9e2f738c8b8 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicEvaluator.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicEvaluator.java
@@ -20,23 +20,14 @@
 package fr.inrialpes.exmo.align.impl; 
 
 import org.semanticweb.owl.align.Alignment;
-import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Evaluator;
 
 import org.semanticweb.owl.model.OWLOntology;
-import org.semanticweb.owl.model.OWLEntity;
 import org.semanticweb.owl.model.OWLException;
 
-import java.lang.Math;
-import java.util.Enumeration;
 import java.io.PrintStream;
 import java.io.IOException;
 
-import java.net.URI;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-
 /**
  * Evaluate proximity between two alignments.
  * This function implements a simple weighted symetric difference.
@@ -47,15 +38,9 @@ import org.xml.sax.SAXException;
  * @version $Id$ 
  */
 
-public class BasicEvaluator implements Evaluator
+public abstract class BasicEvaluator implements Evaluator
 {
-    // NOTE(JE): It will be very easy to compute the score on:
-    // - Classes, Properties, Individuals separately
-    // And to aggregate them in the final value...
-    private double classScore = 0.;
-    private double propertyScore = 0.;
-    private double individualScore = 0.;
-    protected double result = 0.;
+    protected double result = 1.;
     protected Alignment align1;
     protected Alignment align2;
 
@@ -65,34 +50,6 @@ public class BasicEvaluator implements Evaluator
 	this.align2 = align2;
     }
 
-    public double evaluate () throws OWLException {
-	int n1 = align1.nbCells();
-	int n2 = align2.nbCells();
-	int d1 = n1; // nb of cells with no counterpart in align1
-	int d2 = n2; // nb of cells with no counterpart in align2
-	result = 0.;
-
-	for (Enumeration e = align1.getElements() ; e.hasMoreElements() ;) {
-	    Cell c1 = (Cell)e.nextElement();
-	    Cell c2 = (Cell)align2.getAlignCell1((OWLEntity)c1.getObject1());
-	    if ( c2 != null ){
-		if ( c1.getObject2() == c2.getObject2() ) {
-		    result = result + Math.abs(c2.getMeasure() - c1.getMeasure());
-		    d1--;}}
-	}
-	for (Enumeration e = align2.getElements() ; e.hasMoreElements() ;) {
-	    Cell c2 = (Cell)e.nextElement();
-	    Cell c1 = (Cell)align1.getAlignCell1((OWLEntity)c2.getObject1());
-	    if ( c1 != null ){
-		if ( c2.getObject2().equals(c1.getObject2()) ) {
-		    result = result + Math.abs(c1.getMeasure() - c2.getMeasure());
-		    d2--;}}
-	}
-	
-	result = (d1 + d2 + result) / (n1 + n2);
-	return(result);
-    }
-
     public void write( PrintStream writer ) throws java.io.IOException {
 	writer.print("<rdf:RDF>\n  <Evaluation class=\"BasicEvaluator\">\n    <result>");
  	writer.print(result);
diff --git a/src/fr/inrialpes/exmo/align/impl/BasicRelation.java b/src/fr/inrialpes/exmo/align/impl/BasicRelation.java
index 11576327357dfb07cd73c929cad8b7640579904b..65c236d2991b7d9b4797e374a644fbb27bfec89d 100644
--- a/src/fr/inrialpes/exmo/align/impl/BasicRelation.java
+++ b/src/fr/inrialpes/exmo/align/impl/BasicRelation.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2003-2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -19,6 +20,8 @@
 
 package fr.inrialpes.exmo.align.impl; 
 
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.AlignmentVisitor;
 import org.semanticweb.owl.align.Relation;
 import org.semanticweb.owl.align.Cell;
 
@@ -46,11 +49,14 @@ import org.xml.sax.SAXException;
 
 public class BasicRelation implements Relation
 {
+    public void accept( AlignmentVisitor visitor) throws AlignmentException {
+        visitor.visit( this );
+    }
     /**
      * It is intended that the value of the relation is =, < or >.
      * But this can be any string in other applications.
      */
-    private String relation = null;
+    protected String relation = null;
 
     /** Creation **/
     public BasicRelation( String rel ){
@@ -60,48 +66,10 @@ public class BasicRelation implements Relation
     /** Housekeeping **/
     public void dump( ContentHandler h ){};
 
-    public void write( PrintStream writer ) throws java.io.IOException {
+    /** This is kept for displayig more correctly the result **/
+    public void write( PrintStream writer ) {
 	writer.print(relation);
     }
-
-    public void printAsAxiom( PrintStream writer, OWLOntology ontology, Cell c ) throws OWLException {
-	URI entity1URI = c.getObject1().getURI();
-	if ( (OWLEntity)ontology.getClass( entity1URI ) != null ) { // A class
-	    writer.print("  <owl:Class rdf:about=\""+entity1URI.toString()+"\">\n");
-	    if ( relation.equals("=") ){
-		writer.print("    <owl:equivalentClass rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    } else if ( relation.equals("<") ){
-		writer.print("    <rdfs:subClassOf rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    }
-	    writer.print("  </owl:Class>\n");
-	} else if ( (OWLEntity)ontology.getDataProperty( entity1URI ) != null ) { // A Dataproperty
-	    writer.print("  <owl:DatatypeProperty rdf:about=\""+entity1URI.toString()+"\">\n");
-	    if ( relation.equals("=") ){
-		writer.print("    <owl:equivalentProperty rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    } else if ( relation.equals("<") ){
-		writer.print("    <rdfs:subPropertyOf rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    }
-	    writer.print("  </owl:DatatypeProperty>\n");
-	} else if ( (OWLEntity)ontology.getObjectProperty( entity1URI ) != null ) { // An ObjectProperty
-	    writer.print("  <owl:ObjectProperty rdf:about=\""+entity1URI.toString()+"\">\n");
-	    if ( relation.equals("=") ){
-		writer.print("    <owl:equivalentProperty rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    } else if ( relation.equals("<") ){
-		writer.print("    <rdfs:subPropertyOf rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    } else if ( relation.equals("%") ){
-		writer.print("    <owl:inverseOf rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    }
-	    writer.print("  </owl:ObjectProperty>\n");
-	} else if ( (OWLEntity)ontology.getIndividual( entity1URI ) != null ) { // An individual (but check this)
-	    writer.print("  <owl:Thing rdf:about=\""+entity1URI.toString()+"\">\n");
-	    if ( relation.equals("=") ){
-		writer.print("    <owl:sameAs rdf:resource=\""+c.getObject2().getURI().toString()+"\"/>\n");
-	    }
-	    writer.print("  </owl:Thing>\n");
-	}
-	writer.print("\n");
-    }
-
 }
 
 
diff --git a/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java b/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
index 0df38c4ed4010774afe974493c3be7acb98b0465..ee64dfa0047f73f8168cb599215647c30b8f3547 100644
--- a/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
+++ b/src/fr/inrialpes/exmo/align/impl/eval/PRecEvaluator.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -20,8 +21,10 @@
 package fr.inrialpes.exmo.align.impl; 
 
 import org.semanticweb.owl.align.Alignment;
+import org.semanticweb.owl.align.AlignmentException;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.Evaluator;
+import org.semanticweb.owl.align.Parameters;
 
 import org.semanticweb.owl.model.OWLOntology;
 import org.semanticweb.owl.model.OWLEntity;
@@ -39,7 +42,7 @@ import org.xml.sax.SAXException;
 
 /**
  * Evaluate proximity between two alignments.
- * This function implements Precision/Recall. The first alignment
+ * This function implements Precision/Recall/Fallout. The first alignment
  * is thus the expected one.
  *
  * @author Jerome Euzenat
@@ -47,17 +50,15 @@ import org.xml.sax.SAXException;
  */
 
 public class PRecEvaluator extends BasicEvaluator {
-    // NOTE(JE): It will be very easy to compute the score on:
-    // - Classes, Properties, Individuals separately
-    // And to aggregate them in the final value...
     private double precision = 0.;
     private double recall = 0.;
+    private double fallout = 0.;
+    private double overall = 0.;
+    private double fmeasure = 0.;
 
     /** Creation **/
     public PRecEvaluator( Alignment align1, Alignment align2 ){
 	super(align1,align2);
-    //	this.align1 = align1;
-    //	this.align2 = align2;
     }
 
     // Presision: nbfound - nbexpected / nbexpected
@@ -65,7 +66,7 @@ public class PRecEvaluator extends BasicEvaluator {
     // ----
     // Signal: 
     // Noise: 
-    public double evaluate () throws OWLException {
+    public double eval( Parameters params ) throws AlignmentException {
 	int nbexpected = align1.nbCells();
 	int nbfound = align2.nbCells();
 	int nbcorrect = 0; // nb of cells correctly identified
@@ -77,14 +78,21 @@ public class PRecEvaluator extends BasicEvaluator {
 	    Cell c2 = (Cell)align2.getAlignCell1((OWLEntity)c1.getObject1());
 	    if ( c2 != null ){
 		if ( c1.getObject2() == c2.getObject2() ) {
-		    //result = result + Math.abs(c2.getMeasure() - c1.getMeasure());
 		    nbcorrect++;
 		}
 	    }
 	}
-
-	precision = (nbfound - nbcorrect) / nbexpected;
-	recall = nbcorrect / nbexpected;
+	
+	// What is the definition if:
+	// nbfound is 0 (p, r are 0)
+	// nbexpected is 0 [=> nbcorrect is 0] (r=100, p=0[if nbfound>0, 100 otherwise])
+	// precision+recall is 0 [= nbcorrect is 0]
+	// precision is 0 [= nbcorrect is 0]
+	precision = (double)nbcorrect / (double)nbfound;
+	recall = (double)nbcorrect / (double)nbexpected;
+	fallout = (double)(nbfound - nbcorrect) / (double)nbfound;
+	fmeasure = 2*precision*recall / (precision+recall);
+	overall = recall*(2-(1/precision));
 	result = recall / precision;
 	return(result);
     }
@@ -94,7 +102,13 @@ public class PRecEvaluator extends BasicEvaluator {
  	writer.print(precision);
  	writer.print("</precision>\n    <recall>");
  	writer.print(recall);
- 	writer.print("</recall>\n    <result>");
+ 	writer.print("</recall>\n    <fallout>");
+ 	writer.print(fallout);
+ 	writer.print("</fallout>\n    <fmeasure>");
+ 	writer.print(fmeasure);
+ 	writer.print("</fmeasure>\n    <overall>");
+ 	writer.print(overall);
+ 	writer.print("</overall>\n    <result>");
  	writer.print(result);
  	writer.print("</result>\n  </Evaluation>\n</rdf:RDF>\n");
     }
diff --git a/src/fr/inrialpes/exmo/align/impl/method/ClassNameEqAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/ClassNameEqAlignment.java
index 15f5fee88d44e89d42c7039e34cdee2de791bf07..93bc7c2d53c338df6e38dc8df74f100a76f076b5 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/ClassNameEqAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/ClassNameEqAlignment.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2003-2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -30,6 +31,7 @@ import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Parameters;
 
 /**
  * Represents an OWL ontology alignment. An ontology comprises a number of
@@ -48,28 +50,27 @@ public class ClassNameEqAlignment extends BasicAlignment implements AlignmentPro
     /** Creation **/
     public ClassNameEqAlignment( OWLOntology onto1, OWLOntology onto2 ){
     	init( onto1, onto2 );
+	setType("11");
     };
 
     /** Processing **/
     /** This is not exactly equal, this uses toLowerCase() */
-    public void align( Alignment alignment ) throws AlignmentException, OWLException {
+    public void align( Alignment alignment, Parameters params ) throws AlignmentException, OWLException {
 	Hashtable table = new Hashtable();
 	OWLClass cl = null;
 	//ignore alignment;
 	// This is a stupid O(2n) algorithm:
 	// Put each class of onto1 in a hashtable indexed by its name (not qualified)
 	// For each class of onto2 whose name is found in the hash table
-	try {
-	    for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); ){
-		cl = (OWLClass)it.next();
-		table.put((Object)cl.getURI().getFragment().toLowerCase(), cl);
-	    }
-	    for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); ){
-		OWLClass cl2 = (OWLClass)it.next();
-		cl = (OWLClass)table.get((Object)cl2.getURI().getFragment().toLowerCase());
-		if( cl != null ){ addAlignCell( cl, cl2 ); }
-	    }
-	} catch (Exception e) { throw new AlignmentException ( "Problem getting URI"); }
+	for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); ){
+	    cl = (OWLClass)it.next();
+	    table.put((Object)cl.getURI().getFragment().toLowerCase(), cl);
+	}
+	for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); ){
+	    OWLClass cl2 = (OWLClass)it.next();
+	    cl = (OWLClass)table.get((Object)cl2.getURI().getFragment().toLowerCase());
+	    if( cl != null ){ addAlignCell( cl, cl2 ); }
+	}
     }
 
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/method/EditDistNameAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/EditDistNameAlignment.java
index 46dd26e0345f425fd09c1e52e7eb7d4c205d1778..6dbde78382524dd5c066e890e0162a9fe91b84f8 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/EditDistNameAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/EditDistNameAlignment.java
@@ -27,12 +27,14 @@ import java.util.Vector;
 
 import org.semanticweb.owl.model.OWLOntology;
 import org.semanticweb.owl.model.OWLClass;
+import org.semanticweb.owl.model.OWLProperty;
 import org.semanticweb.owl.model.OWLException;
 
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Parameters;
 
 /**
  * This class aligns ontology with regard to the editing distance between 
@@ -44,164 +46,122 @@ import org.semanticweb.owl.align.AlignmentException;
  */
 
 
-public class EditDistNameAlignment extends BasicAlignment implements AlignmentProcess
+public class EditDistNameAlignment extends DistanceAlignment implements AlignmentProcess
 {
 	
     /** Creation **/
     public EditDistNameAlignment( OWLOntology onto1, OWLOntology onto2 ){
-    	init( onto1, onto2 );
+	super( onto1, onto2 );
+	setType("**");
     };
 
     private double max( double i, double j) { if ( i>j ) return i; else return j; }
     /** Processing **/
     /** This is not exactly equal, this uses toLowerCase() */
-    public void align( Alignment alignment ) throws AlignmentException, OWLException {
+    public void align( Alignment alignment, Parameters params ) throws AlignmentException, OWLException {
 	//ignore alignment;
-	double threshold = 0.6; // threshold above which distances are to high
+	double threshold = 1.; // threshold above which distances are to high
 	int nbclass1 = 0; // number of classes in onto1
 	int nbclass2 = 0; // number of classes in onto2
+	int nbprop1 = 0; // number of classes in onto1
+	int nbprop2 = 0; // number of classes in onto2
 	int i, j = 0;     // index for onto1 and onto2 classes
 	int l1, l2 = 0;   // length of strings (for normalizing)
 	Vector classlist2 = new Vector(10); // onto2 classes
 	Vector classlist1 = new Vector(10); // onto1 classes
-	double matrix[][];   // distance matrix
+	Vector proplist2 = new Vector(10); // onto2 classes
+	Vector proplist1 = new Vector(10); // onto1 classes
+	double clmatrix[][];   // distance matrix
+	double prmatrix[][];   // distance matrix
+
+	// Create class lists
+	for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); nbclass2++ ){
+	    classlist2.add( it.next() );
+	}
+	for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); nbclass1++ ){
+	    classlist1.add( it.next() );
+	}
+	clmatrix = new double[nbclass1+1][nbclass2+1];
+	// Create property lists
+	for ( Iterator it = onto2.getObjectProperties().iterator(); it.hasNext(); nbprop2++ ){
+	    proplist2.add( it.next() );
+	}
+	for ( Iterator it = onto2.getDataProperties().iterator(); it.hasNext(); nbprop2++ ){
+	    proplist2.add( it.next() );
+	}
+	for ( Iterator it = onto1.getObjectProperties().iterator(); it.hasNext(); nbprop1++ ){
+	    proplist1.add( it.next() );
+	}
+	for ( Iterator it = onto1.getDataProperties().iterator(); it.hasNext(); nbprop1++ ){
+	    proplist1.add( it.next() );
+	}
+	prmatrix = new double[nbprop1+1][nbprop2+1];
 
-	try {
-	    // Create class lists
-	    for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); nbclass2++ ){
-		classlist2.add( it.next() );
-	    }
-	    for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); nbclass1++ ){
-		classlist1.add( it.next() );
-	    }
-	    matrix = new double[nbclass1+1][nbclass2+1];
+	// Create class lists
+	for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); nbclass2++ ){
+	    classlist2.add( it.next() );
+	}
+	for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); nbclass1++ ){
+	    classlist1.add( it.next() );
+	}
+	clmatrix = new double[nbclass1+1][nbclass2+1];
 	    
-	    // Compute distances
-	    for ( i=0; i<nbclass1; i++ ){
-		OWLClass cl = (OWLClass)classlist1.get(i);
-		l1 = cl.getURI().getFragment().length();
-		for ( j=0; j<nbclass2; j++ ){
-		    //System.err.print(cl.getURI().getFragment().toLowerCase());
-		    //System.err.print(" - ");
-		    //System.err.print(((OWLClass)classlist2.get(j)).getURI().getFragment().toLowerCase());
-		    l2 = ((OWLClass)classlist2.get(j)).getURI().getFragment().length();
-		    matrix[i][j] = Levenshtein.getDistance(
-//StringEditDistance.editDistance(
+	// Compute distances on classes
+	for ( i=0; i<nbclass1; i++ ){
+	    OWLClass cl = (OWLClass)classlist1.get(i);
+	    l1 = cl.getURI().getFragment().length();
+	    for ( j=0; j<nbclass2; j++ ){
+		l2 = ((OWLClass)classlist2.get(j)).getURI().getFragment().length();
+		clmatrix[i][j] = StringDistances.levenshteinDistance(
 						    cl.getURI().getFragment().toLowerCase(),
 						    ((OWLClass)classlist2.get(j)).getURI().getFragment().toLowerCase()) / max(l1,l2);
-		    //System.err.print(" = ");
-		    //System.err.println(matrix[i][j]);
-		}
 	    }
+	}
+	// Compute distances on properties
+	for ( i=0; i<nbprop1; i++ ){
+	    OWLProperty pr = (OWLProperty)proplist1.get(i);
+	    l1 = pr.getURI().getFragment().length();
+	    for ( j=0; j<nbprop2; j++ ){
+		l2 = ((OWLProperty)proplist2.get(j)).getURI().getFragment().length();
+		prmatrix[i][j] = StringDistances.levenshteinDistance(
+						    pr.getURI().getFragment().toLowerCase(),
+						    ((OWLProperty)proplist2.get(j)).getURI().getFragment().toLowerCase()) / max(l1,l2);
+	    }
+	}
 
-	    // This mechanism should be parametric!
-	    // Select the best match
-	    // There can be many algorithm for these:
-	    // n:m: get all of those above a threshold
-	    // 1:1: get the best discard lines and columns and iterate
-	    // Here we basically implement ?:* because the algorithm
-	    // picks up the best matching object above threshold for i.
-	    for ( i=0; i<nbclass1; i++ ){
-		boolean found = false;
-		int best = 0;
-		double max = threshold;
-		for ( j=0; j<nbclass2; j++ ){
-		    if ( matrix[i][j] < max) {
-			found = true;
-			best = j;
-			max = matrix[i][j];
-		    }
+	// This mechanism should be parametric!
+	// Select the best match
+	// There can be many algorithm for these:
+	// n:m: get all of those above a threshold
+	// 1:1: get the best discard lines and columns and iterate
+	// Here we basically implement ?:* because the algorithm
+	// picks up the best matching object above threshold for i.
+	for ( i=0; i<nbclass1; i++ ){
+	    boolean found = false;
+	    int best = 0;
+	    double max = threshold;
+	    for ( j=0; j<nbclass2; j++ ){
+		if ( clmatrix[i][j] < max) {
+		    found = true;
+		    best = j;
+		    max = clmatrix[i][j];
 		}
-		if ( found ) { addAlignCell( (OWLClass)classlist1.get(i), (OWLClass)classlist2.get(best), "=", max ); }
 	    }
-	} catch (Exception e) { throw new AlignmentException ( "Problem getting URI"); }
-
-    }
-
-}
-
-/* Pointer was provided in Todd Hugues (Lockheed)
-   Taken from http://www.merriampark.com/ldjava.htm
-   Initial algorithm by Michael Gilleland
-   Integrated in Apache Jakarta Commons
-   Improved by Chas Emerick
-   This algorithm should be taken appart of this file and reset in the
-   context of a proper package name with an acceptable license terms.
-   Hopefully, Jakarta Commons will provide this.
- */
-
-class Levenshtein {
-
-  //*****************************
-  // Compute Levenshtein distance
-  //*****************************
-
-    public static int getDistance (String s, String t) {
-	if (s == null || t == null) {
-	    throw new IllegalArgumentException("Strings must not be null");
+	    if ( found ) { addAlignDistanceCell( (OWLClass)classlist1.get(i), (OWLClass)classlist2.get(best), "=", max ); }
 	}
-		
-	/*
-	  The difference between this impl. and the previous is that, rather 
-	  than creating and retaining a matrix of size s.length()+1 by 
-	  t.length()+1,
-	  we maintain two single-dimensional arrays of length s.length()+1.
-	  The first, d, is the 'current working' distance array that maintains
-	  the newest distance cost counts as we iterate through the characters
-	  of String s.  Each time we increment the index of String t we are 
-	  comparing, d is copied to p, the second int[]. Doing so allows us
-	  to retain the previous cost counts as required by the algorithm
-	  (taking the minimum of the cost count to the left, up one, and
-	  diagonally up and to the left of the current cost count being
-	  calculated).
-	  (Note that the arrays aren't really copied anymore, just switched...
-	  this is clearly much better than cloning an array or doing a
-	  System.arraycopy() each time  through the outer loop.)
-	  
-	  Effectively, the difference between the two implementations is this
-	  one does not cause an out of memory condition when calculating the LD
-	  over two very large strings.  		
-	*/		
-		
-	int n = s.length(); // length of s
-	int m = t.length(); // length of t
-		
-	if (n == 0) return m;
-	else if (m == 0) return n;
-
-	int p[] = new int[n+1]; //'previous' cost array, horizontally
-	int d[] = new int[n+1]; // cost array, horizontally
-	int _d[]; //placeholder to assist in swapping p and d
-
-	// indexes into strings s and t
-	int i; // iterates through s
-	int j; // iterates through t
-
-	char t_j; // jth character of t
-
-	int cost; // cost
-
-	for (i = 0; i<=n; i++) p[i] = i;
-	
-	for (j = 1; j<=m; j++) {
-	    t_j = t.charAt(j-1);
-	    d[0] = j;
-	    
-	    for (i=1; i<=n; i++) {
-		cost = s.charAt(i-1)==t_j ? 0 : 1;
-		// minimum of cell to the left+1, to the top+1,
-		// diagonally left and up +cost				
-		d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1),  p[i-1]+cost);  
+	for ( i=0; i<nbprop1; i++ ){
+	    boolean found = false;
+	    int best = 0;
+	    double max = threshold;
+	    for ( j=0; j<nbprop2; j++ ){
+		if ( prmatrix[i][j] < max) {
+		    found = true;
+		    best = j;
+		    max = prmatrix[i][j];
+		}
 	    }
-	    
-	    // copy current distance counts to 'previous row' distance counts
-	    _d = p;
-	    p = d;
-	    d = _d;
-	} 
-
-	// our last action in the above loop was to switch d and p, so p now 
-	// actually has the most recent cost counts
-	return p[n];
+	    if ( found ) { addAlignDistanceCell( (OWLProperty)proplist1.get(i), (OWLProperty)proplist2.get(best), "=", max ); }
+	}
     }
+
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/method/NameEqAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/NameEqAlignment.java
index 3ed11d95541f877527cd5e7f44f246c0318ed3ae..cd786664a33f80b80fdfce3e84dda7d8e66330ec 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/NameEqAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/NameEqAlignment.java
@@ -1,5 +1,7 @@
 /*
- * Copyright (C) INRIA Rhône-Alpes, 2003
+ * $Id$
+ *
+ * Copyright (C) INRIA Rhône-Alpes, 2003-2004
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,6 +23,7 @@ package fr.inrialpes.exmo.align.impl;
 import java.util.Iterator;
 import java.util.Hashtable;
 
+import org.semanticweb.owl.model.OWLEntity;
 import org.semanticweb.owl.model.OWLOntology;
 import org.semanticweb.owl.model.OWLClass;
 import org.semanticweb.owl.model.OWLProperty;
@@ -31,6 +34,7 @@ import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Parameters;
 
 /**
  * Represents an OWL ontology alignment. An ontology comprises a number of
@@ -49,11 +53,12 @@ public class NameEqAlignment extends BasicAlignment implements AlignmentProcess
     /** Creation **/
     public NameEqAlignment( OWLOntology onto1, OWLOntology onto2 ){
     	init( onto1, onto2 );
+	setType("11");
     };
 
     /** Processing **/
     /** This is not exactly equal, this uses toLowerCase() */
-    public void align( Alignment alignment ) throws AlignmentException, OWLException {
+    public void align( Alignment alignment, Parameters params ) throws AlignmentException, OWLException {
 	Hashtable table = new Hashtable();
 	OWLClass cl = null;
 	OWLProperty pr = null;
@@ -62,44 +67,42 @@ public class NameEqAlignment extends BasicAlignment implements AlignmentProcess
 	// This is a stupid O(2n) algorithm:
 	// Put each class of onto1 in a hashtable indexed by its name (not qualified)
 	// For each class of onto2 whose name is found in the hash table
-	try {
-	    for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); ){
-		cl = (OWLClass)it.next();
-		table.put((Object)cl.getURI().getFragment().toLowerCase(), cl);
-	    }
-	    for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); ){
-		OWLClass cl2 = (OWLClass)it.next();
-		cl = (OWLClass)table.get((Object)cl2.getURI().getFragment().toLowerCase());
-		if( cl != null ){ addAlignCell( cl, cl2 ); }
-	    }
-	    for ( Iterator it = onto1.getObjectProperties().iterator(); it.hasNext(); ){
-		pr = (OWLProperty)it.next();
-		table.put((Object)pr.getURI().getFragment().toLowerCase(), pr);
-	    }
-	    for ( Iterator it = onto2.getObjectProperties().iterator(); it.hasNext(); ){
-		OWLProperty pr2 = (OWLProperty)it.next();
-		pr = (OWLProperty)table.get((Object)pr2.getURI().getFragment().toLowerCase());
-		if( cl != null ){ addAlignCell( pr, pr2 ); }
-	    }
-	    for ( Iterator it = onto1.getDataProperties().iterator(); it.hasNext(); ){
-		pr = (OWLProperty)it.next();
-		table.put((Object)pr.getURI().getFragment().toLowerCase(), pr);
-	    }
-	    for ( Iterator it = onto2.getDataProperties().iterator(); it.hasNext(); ){
-		OWLProperty pr2 = (OWLProperty)it.next();
-		pr = (OWLProperty)table.get((Object)pr2.getURI().getFragment().toLowerCase());
-		if( cl != null ){ addAlignCell( pr, pr2 ); }
-	    }
-	    for ( Iterator it = onto1.getIndividuals().iterator(); it.hasNext(); ){
-		id = (OWLIndividual)it.next();
-		table.put((Object)pr.getURI().getFragment().toLowerCase(), id);
-	    }
-	    for ( Iterator it = onto2.getIndividuals().iterator(); it.hasNext(); ){
-		OWLIndividual id2 = (OWLIndividual)it.next();
-		id = (OWLIndividual)table.get((Object)id2.getURI().getFragment().toLowerCase());
-		if( id != null ){ addAlignCell( id, id2 ); }
-	    }
-	} catch (Exception e) { throw new AlignmentException ( "Problem getting URI"); }
+	for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); ){
+	    cl = (OWLClass)it.next();
+	    table.put((Object)cl.getURI().getFragment().toLowerCase(), cl);
+	}
+	for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); ){
+	    OWLClass cl2 = (OWLClass)it.next();
+	    cl = (OWLClass)table.get((Object)cl2.getURI().getFragment().toLowerCase());
+	    if( cl != null ){ addAlignCell( cl, cl2 ); }
+	}
+	for ( Iterator it = onto1.getObjectProperties().iterator(); it.hasNext(); ){
+	    pr = (OWLProperty)it.next();
+	    table.put((Object)pr.getURI().getFragment().toLowerCase(), pr);
+	}
+	for ( Iterator it = onto2.getObjectProperties().iterator(); it.hasNext(); ){
+	    OWLProperty pr2 = (OWLProperty)it.next();
+	    pr = (OWLProperty)table.get((Object)pr2.getURI().getFragment().toLowerCase());
+	    if( pr != null ){ addAlignCell( pr, pr2 ); }
+	}
+	for ( Iterator it = onto1.getDataProperties().iterator(); it.hasNext(); ){
+	    pr = (OWLProperty)it.next();
+	    table.put((Object)pr.getURI().getFragment().toLowerCase(), pr);
+	}
+	for ( Iterator it = onto2.getDataProperties().iterator(); it.hasNext(); ){
+	    OWLProperty pr2 = (OWLProperty)it.next();
+	    pr = (OWLProperty)table.get((Object)pr2.getURI().getFragment().toLowerCase());
+	    if( pr != null ){ addAlignCell( pr, pr2 ); }
+	}
+	//for ( Iterator it = onto1.getIndividuals().iterator(); it.hasNext(); ){
+	//	id = (OWLIndividual)it.next();
+	//	table.put((Object)pr.getURI().getFragment().toLowerCase(), id);
+	//}
+	//for ( Iterator it = onto2.getIndividuals().iterator(); it.hasNext(); ){
+	//	OWLIndividual id2 = (OWLIndividual)it.next();
+	//	id = (OWLIndividual)table.get((Object)id2.getURI().getFragment().toLowerCase());
+	//	if( id != null ){ addAlignCell( id, id2 ); }
+	//  }
     }
 
 }
diff --git a/src/fr/inrialpes/exmo/align/impl/method/SubsDistNameAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/SubsDistNameAlignment.java
index 1902607d251fe050981f102bcbf114e002e26593..fb5af56346a58b98d6fc9c4418a9693e1bec9cd1 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/SubsDistNameAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/SubsDistNameAlignment.java
@@ -40,6 +40,7 @@ import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
 import org.semanticweb.owl.align.Cell;
 import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Parameters;
 
 /** This class has been built for ISWC experiments with bibliography.
  * It implements a non iterative (one step) OLA algorithms based on
@@ -47,32 +48,28 @@ import org.semanticweb.owl.align.AlignmentException;
  *  just adding range/domain on properties...
  *  The parameters are:
  *  - threshold: above what do we select for the alignment;
- *  - epsillon [ignored]: for convergence
- *  - pic1: weigth for class name
- *  - pic2: weight for class attributes
- *  - pia1 [ignored=1]: weigth for property name
- *  - pia3 [ignored=0]: weigth for property domain
- *  - pia4 [ignored=0]: weigth for property range
  *
  * @author Jérôme Euzenat
  * @version $Id$ 
  */
 
 
-public class SubsDistNameAlignment extends BasicAlignment implements AlignmentProcess
+public class SubsDistNameAlignment extends DistanceAlignment implements AlignmentProcess
 {
-	
+
     /** Creation **/
     public SubsDistNameAlignment( OWLOntology onto1, OWLOntology onto2 ){
-    	init( onto1, onto2 );
+    	super( onto1, onto2 );
+	setType("**");
     };
 
     private double max( double i, double j) { if ( i>j ) return i; else return j; }
 
     /** Processing **/
-    public void align( Alignment alignment ) throws AlignmentException, OWLException {
+    public void align( Alignment alignment, Parameters params ) throws AlignmentException, OWLException {
+	// The first parameter to get should be debug
 	//ignore alignment;
-	double threshold = 0.6; // threshold above which distances are to high
+	double threshold = 1.; // threshold above which distances are to high
 	int i, j = 0;     // index for onto1 and onto2 classes
 	int l1, l2 = 0;   // length of strings (for normalizing)
 	int nbclass1 = 0; // number of classes in onto1
@@ -85,129 +82,76 @@ public class SubsDistNameAlignment extends BasicAlignment implements AlignmentPr
 	Vector proplist2 = new Vector(10); // onto2 properties
 	Vector proplist1 = new Vector(10); // onto1 properties
 	double propmatrix[][];   // properties distance matrix
-	double pic1 = 0.5; // class weigth for name
-	double pic2 = 0.5; // class weight for properties
-	double pia1 = 0.5; // relation weight for name
-	double pia2 = 0.25; // relation weight for domain
-	double pia3 = 0.25; // relation weight for range
-	double epsillon = 0.05; // stoping condition
-
-	    // Create property lists and matrix
-	    for ( Iterator it = onto1.getObjectProperties().iterator(); it.hasNext(); nbprop1++ ){
-		proplist1.add( it.next() );
-	    }
-	    for ( Iterator it = onto1.getDataProperties().iterator(); it.hasNext(); nbprop1++ ){
-		proplist1.add( it.next() );
-	    }
-	    for ( Iterator it = onto2.getObjectProperties().iterator(); it.hasNext(); nbprop2++ ){
-		proplist2.add( it.next() );
-	    }
-	    for ( Iterator it = onto2.getDataProperties().iterator(); it.hasNext(); nbprop2++ ){
-		proplist2.add( it.next() );
-	    }
-	    propmatrix = new double[nbprop1+1][nbprop2+1];
 
-	    // Create class lists
-	    for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); nbclass2++ ){
-		classlist2.add( it.next() );
-	    }
-	    for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); nbclass1++ ){
-		classlist1.add( it.next() );
-	    }
-	    classmatrix = new double[nbclass1+1][nbclass2+1];
+	// Create property lists and matrix
+	for ( Iterator it = onto1.getObjectProperties().iterator(); it.hasNext(); nbprop1++ ){
+	    proplist1.add( it.next() );
+	}
+	for ( Iterator it = onto1.getDataProperties().iterator(); it.hasNext(); nbprop1++ ){
+	    proplist1.add( it.next() );
+	}
+	for ( Iterator it = onto2.getObjectProperties().iterator(); it.hasNext(); nbprop2++ ){
+	    proplist2.add( it.next() );
+	}
+	for ( Iterator it = onto2.getDataProperties().iterator(); it.hasNext(); nbprop2++ ){
+	    proplist2.add( it.next() );
+	}
+	propmatrix = new double[nbprop1+1][nbprop2+1];
 
-	try {
-	    System.err.println("Initializing property distances");
-	    for ( i=0; i<nbprop1-1; i++ ){
-		OWLProperty cl = (OWLProperty)proplist1.get(i);
-		String s1 = cl.getURI().getFragment().toLowerCase();
-		for ( j=0; j<nbprop2-1; j++ ){
-		    cl = (OWLProperty)proplist2.get(j);
-		    String s2 = cl.getURI().getFragment().toLowerCase();
-		    propmatrix[i][j] = pia1 * SubStringDistance.getDistance( s1, s2 );
-		}
+	// Create class lists
+	for ( Iterator it = onto2.getClasses().iterator(); it.hasNext(); nbclass2++ ){
+	    classlist2.add( it.next() );
+	}
+	for ( Iterator it = onto1.getClasses().iterator(); it.hasNext(); nbclass1++ ){
+	    classlist1.add( it.next() );
+	}
+	classmatrix = new double[nbclass1+1][nbclass2+1];
+	
+	if (debug > 0) System.err.println("Initializing property distances");
+	for ( i=0; i<nbprop1; i++ ){
+	    OWLProperty cl = (OWLProperty)proplist1.get(i);
+	    String s1 = cl.getURI().getFragment().toLowerCase();
+	    for ( j=0; j<nbprop2; j++ ){
+		cl = (OWLProperty)proplist2.get(j);
+		String s2 = cl.getURI().getFragment().toLowerCase();
+		propmatrix[i][j] = StringDistances.subStringDistance( s1, s2 );
 	    }
-
-	    System.err.println("Initializing class distances");
-	    // Initialize class distances
-	    for ( i=0; i<nbclass1-1; i++ ){
-		OWLClass cl = (OWLClass)classlist1.get(i);
-		for ( j=0; j<nbclass2-1; j++ ){
-		    classmatrix[i][j] = pic1 * SubStringDistance.getDistance(
+	}
+	
+	if (debug > 0) System.err.println("Initializing class distances");
+	// Initialize class distances
+	for ( i=0; i<nbclass1; i++ ){
+	    OWLClass cl = (OWLClass)classlist1.get(i);
+	    for ( j=0; j<nbclass2; j++ ){
+		classmatrix[i][j] = StringDistances.subStringDistance(
 						    cl.getURI().getFragment().toLowerCase(),
 						    ((OWLClass)classlist2.get(j)).getURI().getFragment().toLowerCase());
-		}
 	    }
-
-	    // Iterate until completion
-	    double factor = 1.0;
-	    while ( factor > epsillon ){
-		// Compute property distances
-		// -- FirstExp: nothing to be done: one pass
-		// Here create the best matches for property distance already
-		// -- FirstExp: goes directly in the alignment structure
-		//    since it will never be refined anymore...
-		System.err.print("Storing property alignment\n");
-		for ( i=0; i<nbprop1-1; i++ ){
-		    boolean found = false;
-		    int best = 0;
-		    double max = threshold;
-		    for ( j=0; j<nbprop2-1; j++ ){
-			if ( propmatrix[i][j] < max) {
-			    found = true;
-			    best = j;
-			    max = propmatrix[i][j];
-			}
-		    }
-		    if ( found ) { addAlignCell( (OWLProperty)proplist1.get(i), (OWLProperty)proplist2.get(best), "=", max ); }
-		}
-		
-		System.err.print("Computing class distances\n");
-		// Compute classes distances
-		// -- for all of its attribute, find the best match if possible... easy
-		// -- simply replace in the matrix the value by the value plus the 
-		// classmatrix[i][j] =
-		// pic1 * classmatrix[i][j]
-		// + pic2 * 2 *
-		//  (sigma (att in c[i]) getAllignCell... )
-		//  / nbatts of c[i] + nbatts of c[j]
-		for ( i=0; i<nbclass1-1; i++ ){
-		    Set properties1 = getProperties( (OWLClass)classlist1.get(i), onto1 );
-		    int nba1 = properties1.size();
-		    if ( nba1 > 0 ) { // if not, keep old values...
-			Set correspondences = new HashSet();
-			for ( j=0; j<nbclass2-1; j++ ){
-			    Set properties2 = getProperties( (OWLClass)classlist2.get(j), onto2 );
-			    int nba2 = properties1.size();
-			    double attsum = 0.;
-			    // check that there is a correspondance
-			    // in list of class2 atts and add their weights
-			    for ( Iterator prp = properties1.iterator(); prp.hasNext(); ){
-				Cell cell = getAlignCell1( (OWLEntity)prp.next() );
-				if ( cell != null ) {
-				    if ( properties2.contains((Object)cell.getObject2() ) ) {
-					attsum = attsum + cell.getMeasure();
-				    }
-				}
-			    }
-			    classmatrix[i][j] = pic1 * classmatrix[i][j]
-				+ pic2 * (2 * attsum / (nba1 + nba2));
-			}
+	}
+	
+	// This mechanism should be parametric!
+	// Select the best match
+	// There can be many algorithm for these:
+	// n:m: get all of those above a threshold
+	// 1:1: get the best discard lines and columns and iterate
+	// Here we basically implement ?:* because the algorithm
+	// picks up the best matching object above threshold for i.
+	if (debug > 0) System.err.print("Storing property alignment\n");
+	for ( i=0; i<nbprop1; i++ ){
+	    boolean found = false;
+		int best = 0;
+		double max = threshold;
+		for ( j=0; j<nbprop2; j++ ){
+		    if ( propmatrix[i][j] < max) {
+			found = true;
+			best = j;
+			max = propmatrix[i][j];
 		    }
 		}
-		// Assess factor
-		// -- FirstExp: nothing to be done: one pass
-		factor = 0.;
+		if ( found ) { addAlignDistanceCell( (OWLProperty)proplist1.get(i), (OWLProperty)proplist2.get(best), "=", max ); }
 	    }
-
-	    // This mechanism should be parametric!
-	    // Select the best match
-	    // There can be many algorithm for these:
-	    // n:m: get all of those above a threshold
-	    // 1:1: get the best discard lines and columns and iterate
-	    // Here we basically implement ?:* because the algorithm
-	    // picks up the best matching object above threshold for i.
-	    System.err.print("Storing class alignment\n");
+		
+	    if (debug > 0) System.err.print("Storing class alignment\n");
 
 	    for ( i=0; i<nbclass1; i++ ){
 		boolean found = false;
@@ -220,104 +164,8 @@ public class SubsDistNameAlignment extends BasicAlignment implements AlignmentPr
 			max = classmatrix[i][j];
 		    }
 		}
-		if ( found ) { addAlignCell( (OWLClass)classlist1.get(i), (OWLClass)classlist2.get(best), "=", max ); }
-	    }
-	} catch (Exception e) { throw new AlignmentException ( "Problem getting URI"); }
-    }
-
-    private void getProperties( OWLDescription desc, OWLOntology o, Set list){
-    }
-    private void getProperties( OWLRestriction rest, OWLOntology o, Set list) throws OWLException {
-	list.add( (Object)rest.getProperty() );
-    }
-    private void getProperties( OWLNaryBooleanDescription d, OWLOntology o, Set list) throws OWLException {
-	for ( Iterator it = d.getOperands().iterator(); it.hasNext() ;){
-	    getProperties( (OWLDescription)it.next(), o, list );
-	}
-    }
-    private void getProperties( OWLClass cl, OWLOntology o, Set list) throws OWLException {
-	for ( Iterator it = cl.getSuperClasses(o).iterator(); it.hasNext(); ){
-	    getProperties( (OWLDescription)it.next(), o, list );
-	}
-	// JE: I suspect that this can be a cause for looping!!
-	for ( Iterator it = cl.getEquivalentClasses(o).iterator(); it.hasNext(); ){
-	    getProperties( (OWLDescription)it.next(), o, list );
-	}
-    }
-
-    private Set getProperties( OWLClass cl, OWLOntology o ) throws OWLException {
-	Set resultSet = new HashSet(); 
-	getProperties( cl, o, resultSet );
-	return resultSet;
-    }
-    private Set getPropertyCorrespondences( OWLClass cl, OWLOntology o ) throws OWLException {
-	// Set(OWLFrame) getEquivalentClass|getSuperClasses( OWLOntology o)
-	// Set(OWLRestriction) getRestrictions()
-	// getProperty()
-	Set resultSet = new HashSet(); 
-	Set frSet = cl.getSuperClasses( o );
-	OWLFrame fr;
-	/// JE: certainly here I should implement inheritance...
-	for ( Iterator frit = frSet.iterator(); frit.hasNext(); ){
-	    fr = (OWLFrame)frit.next();
-	    Set rstSet = fr.getRestrictions();
-	    OWLRestriction rst;
-	    for( Iterator rstit = rstSet.iterator(); rstit.hasNext(); ){
-		rst = (OWLRestriction)rstit.next();
-		//resultSet.add( (Object)rst.getProperty() );
-		resultSet.add( getAlignCell1( (OWLEntity)rst.getProperty() ) );
+		if ( found ) { addAlignDistanceCell( (OWLClass)classlist1.get(i), (OWLClass)classlist2.get(best), "=", max ); }
 	    }
-	}
-	return resultSet;
-    }
-
-    private double getCorrespondence( OWLProperty p, Set crsp ){
-	// find the correspondence on onto2 in the alignment for the property
-	// if it is in the set, then return its strength else return 0.
-	return (double)0.;
-    }
-
-}
-
-class SubStringDistance {
-
-  //*****************************
-  // Compute substring distance
-  // = 1 - (2 | length of longest common substring | / |s1|+|s2|)
-  //*****************************
-
-    public static double getDistance (String s1, String s2) {
-	if (s1 == null || s2 == null) {
-	    throw new IllegalArgumentException("Strings must not be null");
-	}
-		
-	int l1 = s1.length(); // length of s
-	int l2 = s2.length(); // length of t
-		
-	if ((l1 == 0) && ( l2 == 0 )) return 0;
-	if ((l1 == 0) || ( l2 == 0 )) return 1;
-
-	int max = Math.min( l1, l2 ); // the maximal length of a subs
-	int best = 0; // the best subs length so far
-	    
-	int i = 0; // iterates through s1
-	int j = 0; // iterates through s2
-
-	for( i=0; (i < l1) && (l1-i > best); i++ ){
-	    j = 0;
-	    while( l2-j > best ){
-		int k = i;
-		for( ; (j < l2 )
-			 && (s1.charAt(k) != s2.charAt(j) ); j++) {};
-		if ( j != l2 ) {// we have found a starting point
-		    for( j++, k++; (j < l2) && (k < l1) && (s1.charAt(k) == s2.charAt(j)); j++, k++);
-		    best = Math.max( best, k-i );
-		}
-	    }
-	}
-	//	    System.err.print(" = ");
-	//  System.err.println((double)2*best / (l1+l2));
-	    return (1.0 - ((double)2*best / (l1+l2)));
     }
 
 }
diff --git a/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java b/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
index db47e65929b75bb2ef43fbb463f3a3c76178647c..adeaf0d471a84aba94e728a084a1df86ec7c6a03 100644
--- a/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
+++ b/src/fr/inrialpes/exmo/align/parser/AlignmentParser.java
@@ -59,6 +59,7 @@ import org.semanticweb.owl.io.owl_rdf.OWLRDFParser;
 import org.semanticweb.owl.io.owl_rdf.OWLRDFErrorHandler;
 
 import org.semanticweb.owl.align.Alignment;
+import org.semanticweb.owl.align.AlignmentException;
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
 
 /**
@@ -196,13 +197,32 @@ public class AlignmentParser extends DefaultHandler {
 		    cl1 = null;
 		    cl2 = null;
 		} else if (pName.equals("map")) {
-		    if ( onto1 == null || onto2 == null) {
-			throw new SAXException("Some ontologies are not available"); 
-		    } else {
-			//(BasicAlignment)alignment.init( onto1, onto2 );
+		    try {
+			if ( onto2 == null ){
+			    onto2 = loadOntology( alignment.getFile2().toString() );
+			    if ( onto2 == null ) {
+				throw new SAXException("Cannot find ontology"+alignment.getFile2());
+			    } else {
+				ontologies.put( onto2.getLogicalURI().toString(), onto2 );
+			    }
+			}
+			alignment.setOntology2( (OWLOntology)onto2 );
+			if ( onto1 == null ){
+			    onto1 = loadOntology( alignment.getFile1().toString() );
+			    if ( onto1 == null ) {
+				throw new SAXException("Cannot find ontology"+alignment.getFile1());
+			    } else {
+				ontologies.put( onto1.getLogicalURI().toString(), onto1 );
+			    }
+			}
+			alignment.setOntology1( (OWLOntology)onto1 );
+		    } catch ( AlignmentException e ) {
+			throw new SAXException("Catched alignment exception", e );
 		    }
 		} else if (pName.equals("onto2")) {
 		} else if (pName.equals("onto1")) {
+		} else if (pName.equals("uri2")) {
+		} else if (pName.equals("uri1")) {
 		} else if (pName.equals("type")) {
 		} else if (pName.equals("level")) {
 		} else if (pName.equals("xml")) {
@@ -266,38 +286,41 @@ public class AlignmentParser extends DefaultHandler {
 			System.err.print(" " + relation);
 			System.err.println(" " + Double.parseDouble(measure));
 		    }
+		    if ( cl1 == null || cl2 == null ) {
+			throw new SAXException( "Missing entity "+cl1+" "+cl2 ); }
 		    if ( measure == null || relation == null ){
 			alignment.addAlignCell( cl1, cl2);
 		    } else {
 			alignment.addAlignCell( cl1, cl2, relation, Double.parseDouble(measure) );}
 		} else if (pName.equals("map")) {
+		} else if (pName.equals("uri1")) {
+		    try { alignment.setFile1( new URI( content ) );
+		    } catch (Exception e) {e.printStackTrace();};
+		} else if (pName.equals("uri2")) {
+		    try { alignment.setFile2( new URI( content ) );
+		    } catch (Exception e) {e.printStackTrace();};
 		} else if (pName.equals("onto2")) {
+		    // If the ontology is already loaded.
 		    onto2 = (OWLOntology)ontologies.get( content );
-		    if ( onto2 == null ){
-			try {
-			    onto2 = loadOntology( content );
-			    if ( onto2 == null ) {
-				throw new SAXException("Cannot find ontology");
-			    } else {
-				ontologies.put( content, onto2 );
-			    }
-			} catch (Exception e) {e.printStackTrace();}
-		    }
-		    
-			alignment.setOntology2( onto2 );
+		    //JE: these are URI, I do not try to locate!
+		    //if ( onto2 == null ){
+		    //	try {
+		    //	    onto2 = loadOntology( content );
+		    //	    if ( onto2 != null ) {
+		    //		ontologies.put( content, onto2 );
+		    //	    }
+		    //	} catch (Exception e) {e.printStackTrace();}
+		    // }
 		} else if (pName.equals("onto1")) {
 		    onto1 = (OWLOntology)ontologies.get( content );
-		    if ( onto1 == null ) {
-			try {
-			    onto1 = loadOntology( content );
-			    if ( onto1 == null ) {
-				throw new SAXException("Cannot find ontology"); 
-			    } else {
-				ontologies.put( content, onto1 );
-			    }
-			} catch (Exception e) {e.printStackTrace();}
-		    }
-		    alignment.setOntology1( onto1 );
+		    //if ( onto1 == null ) {
+		    //	try {
+		    //	    onto1 = loadOntology( content );
+		    //	    if ( onto1 != null ) {
+		    //		ontologies.put( content, onto1 );
+		    //	    }
+		    //	} catch (Exception e) {e.printStackTrace();}
+		    // }
 		} else if (pName.equals("type")) {
 		    alignment.setType( content );
 		} else if (pName.equals("level")) {
@@ -308,7 +331,7 @@ public class AlignmentParser extends DefaultHandler {
 		} else if (pName.equals("Alignment")) {
 		} else {
 		    throw new SAXException("[AlignmentParser] Unknown element name : "+pName);};
-	    } catch ( OWLException e ) { throw new SAXException("[AlignmentParser] OWLException raised"); };
+	    } catch ( AlignmentException e ) { throw new SAXException("[AlignmentParser] OWLException raised"); };
 	} else if(namespaceURI.equals("http://www.w3.org/RDF"))  {
 	    if ( !pName.equals("RDF") ) {
 		throw new SAXException("[AlignmentParser] unknown element name: "+pName); };
@@ -318,7 +341,7 @@ public class AlignmentParser extends DefaultHandler {
     } //end endElement
     
     /** Can be used for loading the ontology if it is not available **/
-    private OWLOntology loadOntology( String ref ) throws SAXException, OWLException {
+    private OWLOntology loadOntology( URI ref ) throws SAXException, OWLException {
 	OWLOntology parsedOnt = null;
 	OWLRDFParser parser = new OWLRDFParser();
 	OWLRDFErrorHandler handler = new OWLRDFErrorHandler(){
@@ -334,14 +357,18 @@ public class AlignmentParser extends DefaultHandler {
 	    };
 	parser.setOWLRDFErrorHandler( handler );
 	parser.setConnection( OWLManager.getOWLConnection() );
-	try {
-	    return parser.parseOntology( new URI( ref ) );
-	} catch ( URISyntaxException e ) {
-	    throw new SAXException("[AlignmentParser] Malformed URI : "+ref);
+	try { return parser.parseOntology( ref );
 	} catch ( Exception e ) {
 	    throw new SAXException("[AlignmentParser] Error during parsing : "+ref);
 	}
     }
+ 
+    private OWLOntology loadOntology( String ref ) throws SAXException, OWLException  {
+	try { return loadOntology( new URI( ref ) );
+	} catch ( URISyntaxException e ) {
+	    throw new SAXException("[AlignmentParser] Malformed URI : "+ref);
+	}
+    }
 
 }//end class
     
diff --git a/src/fr/inrialpes/exmo/align/util/EvalAlign.java b/src/fr/inrialpes/exmo/align/util/EvalAlign.java
index 40ae00bc8078efcd68dc49a6676da26919738af1..5a8fd2c06de887f75d0ebf9339127b37285b5910 100644
--- a/src/fr/inrialpes/exmo/align/util/EvalAlign.java
+++ b/src/fr/inrialpes/exmo/align/util/EvalAlign.java
@@ -48,6 +48,12 @@ import org.semanticweb.owl.io.Parser;
 
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.Evaluator;
+import org.semanticweb.owl.align.Parameters;
+
+import fr.inrialpes.exmo.align.parser.AlignmentParser;
+import fr.inrialpes.exmo.align.impl.BasicEvaluator;
+import fr.inrialpes.exmo.align.impl.PRecEvaluator;
+import fr.inrialpes.exmo.align.impl.BasicParameters;
 
 import java.io.PrintStream;
 import java.io.FileOutputStream;
@@ -61,9 +67,6 @@ import org.apache.log4j.BasicConfigurator;
 import gnu.getopt.LongOpt;
 import gnu.getopt.Getopt;
 
-import fr.inrialpes.exmo.align.parser.AlignmentParser;
-import fr.inrialpes.exmo.align.impl.BasicEvaluator;
-
 /** A really simple utility that loads and alignment and prints it.
     A basic class for an OWL ontology alignment processing. The processor
     will parse ontologies, align them and renderings the resulting alignment.
@@ -95,7 +98,7 @@ $Id$
 public class EvalAlign {
 
     public static void main(String[] args) {
-	
+	Parameters params = new BasicParameters();
 	Evaluator eval = null;
 	String alignName1 = null;
 	String alignName2 = null;
@@ -132,6 +135,8 @@ public class EvalAlign {
 		arg = g.getOptarg();
 		if ( arg != null ) debug = 2;
 		else debug = 4;
+		params.setParameter("debug",new Integer(debug));
+		// debug = ((Integer)params.getParameter("debug")).intValue();
 		break;
 	    }
 	}
@@ -161,20 +166,20 @@ public class EvalAlign {
 	    // Create evaluator object
 	    if ( classname != null ) {
 		try {
-		    Object [] params = {(Object)align1, (Object)align2};
+		    Object [] mparams = {(Object)align1, (Object)align2};
 		    Class evaluatorClass =  Class.forName(classname);
 		    java.lang.reflect.Constructor[] evaluatorConstructors = evaluatorClass.getConstructors();
-		    eval = (Evaluator)evaluatorConstructors[0].newInstance(params);
+		    eval = (Evaluator)evaluatorConstructors[0].newInstance(mparams);
 		} catch (Exception ex) {
 		    System.err.println("Cannot create alignment " + 
 				       classname + "\n" + ex.getMessage() );
 		    usage();
 		    System.exit(0);
 		}
-	    } else { eval = new BasicEvaluator( align1, align2 ); };
+	    } else { eval = new PRecEvaluator( align1, align2 ); };
 
 	    // Compare
-	    System.err.println( eval.evaluate() );
+	    eval.eval(params) ;
 
 	    // Print result
 	    if ( filename == null ) {
@@ -193,6 +198,9 @@ public class EvalAlign {
     public static void usage() {
 	System.out.println("usage: EvalAlign [options] file1 file2");
 	System.out.println("options are:");
+	System.out.println("\t--debug[=n] -d [n]\t\tReport debug info at level n");
+	System.out.println("\t--impl=className -i classname\t\tUse the given evaluator implementation.");
+	System.out.println("\t--output=filename -o filename\tOutput the result in filename");
 	System.out.println("\t--help -h\t\t\tPrint this message");
 
     }
diff --git a/src/fr/inrialpes/exmo/align/util/ParserPrinter.java b/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
index 7fb74ec3beb19665fece85e3acfe3a2f7d253a52..adbb91d7c365a7dc6b9d709ff8efcea9ec967247 100644
--- a/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
+++ b/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
@@ -43,10 +43,12 @@ import org.semanticweb.owl.util.OWLManager;
 import org.semanticweb.owl.model.OWLOntology;
 import org.semanticweb.owl.io.owl_rdf.OWLRDFParser;
 import org.semanticweb.owl.io.owl_rdf.OWLRDFErrorHandler;
-import org.semanticweb.owl.io.Renderer;
 import org.semanticweb.owl.io.Parser;
 
 import org.semanticweb.owl.align.Alignment;
+import org.semanticweb.owl.align.AlignmentVisitor;
+
+import fr.inrialpes.exmo.align.impl.RDFRendererVisitor;
 
 import java.io.PrintStream;
 import java.io.FileOutputStream;
@@ -98,7 +100,7 @@ public class ParserPrinter {
 	String initName = null;
 	String filename = null;
 	PrintStream writer = null;
-	Renderer renderer = null;
+	AlignmentVisitor renderer = null;
 	LongOpt[] longopts = new LongOpt[7];
 	int debug = 0;
 	
@@ -125,7 +127,7 @@ public class ParserPrinter {
 		/* Use the given class for rendernig */
 		String renderingClass = g.getOptarg();
 		try {
-		    renderer = (Renderer) ClassLoader.getSystemClassLoader().loadClass(renderingClass).newInstance();
+		    renderer = (AlignmentVisitor) ClassLoader.getSystemClassLoader().loadClass(renderingClass).newInstance();
 		} catch (Exception ex) {
 		    System.err.println("Cannot create renderer " + 
 				       renderingClass + "\n" + ex.getMessage() );
@@ -165,7 +167,9 @@ public class ParserPrinter {
 		writer = new PrintStream(new FileOutputStream( filename ));
 	    }
 	    
-	    result.write( writer );
+	    //result.write( writer );
+	    if ( renderer == null ) renderer = new RDFRendererVisitor( writer );
+	    result.render( writer, renderer );
 	    
 	} catch (Exception ex) {
 	    ex.printStackTrace();
diff --git a/src/fr/inrialpes/exmo/align/util/Procalign.java b/src/fr/inrialpes/exmo/align/util/Procalign.java
index 5f49df5b38255839c1cbe6b7f181ca83d082b932..ed4059a91e22a6a4d74ac59cbf15ea4b75d1e591 100644
--- a/src/fr/inrialpes/exmo/align/util/Procalign.java
+++ b/src/fr/inrialpes/exmo/align/util/Procalign.java
@@ -1,4 +1,6 @@
 /*
+ * $Id$
+ *
  * Copyright (C) 2003 The University of Manchester
  * Copyright (C) 2003 The University of Karlsruhe
  * Copyright (C) 2003-2004, INRIA Rhône-Alpes
@@ -31,8 +33,11 @@ package fr.inrialpes.exmo.align.util;
 
 import org.semanticweb.owl.align.Alignment;
 import org.semanticweb.owl.align.AlignmentProcess;
+import org.semanticweb.owl.align.AlignmentVisitor;
+import org.semanticweb.owl.align.Parameters;
 
 import fr.inrialpes.exmo.align.impl.BasicAlignment;
+import fr.inrialpes.exmo.align.impl.BasicParameters;
 
 import org.semanticweb.owl.util.OWLConnection;
 import org.semanticweb.owl.util.OWLManager;
@@ -41,7 +46,6 @@ import org.semanticweb.owl.model.OWLException;
 import org.semanticweb.owl.io.owl_rdf.OWLRDFParser;
 import org.semanticweb.owl.io.owl_rdf.OWLRDFErrorHandler;
 import org.semanticweb.owl.io.ParserException;
-import org.semanticweb.owl.io.Renderer;
 import org.semanticweb.owl.io.Parser;
 
 import java.io.PrintStream;
@@ -49,6 +53,7 @@ import java.io.FileOutputStream;
 import java.net.URI;
 import java.util.Hashtable;
 import java.lang.Double;
+import java.lang.Integer;
 
 import org.xml.sax.SAXException;
 
@@ -77,7 +82,7 @@ import fr.inrialpes.exmo.align.parser.AlignmentParser;
         --alignment=filename -a filename Start from an XML alignment file
         --debug[=n] -d [n]              Report debug info at level n,
         --output=filename -o filename Output the alignment in filename
-	--format=format -f format
+	--renderer=renderer -r renderer
         --help -h                       Print this message
     </pre>
 
@@ -100,7 +105,7 @@ public class Procalign {
     static OWLRDFErrorHandler handler = null;
 
     public static void main(String[] args) {
-	
+	Parameters params = null;
 	OWLOntology onto1 = null;
 	OWLOntology onto2 = null;
 	AlignmentProcess result = null;
@@ -108,9 +113,9 @@ public class Procalign {
 	Alignment init = null;
 	String alignmentClassName = "fr.inrialpes.exmo.align.impl.ClassNameEqAlignment";
 	String filename = null;
-	String format = "";
+	String rendererClass = "fr.inrialpes.exmo.align.impl.RDFRendererVisitor";
 	PrintStream writer = null;
-	Renderer renderer = null;
+	AlignmentVisitor renderer = null;
 	int debug = 0;
 	double threshold = 0;
 	
@@ -119,12 +124,12 @@ public class Procalign {
 	longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
 	longopts[1] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null, 'o');
 	longopts[2] = new LongOpt("alignment", LongOpt.REQUIRED_ARGUMENT, null, 'a');
-	longopts[3] = new LongOpt("format", LongOpt.REQUIRED_ARGUMENT, null, 'f');
+	longopts[3] = new LongOpt("renderer", LongOpt.REQUIRED_ARGUMENT, null, 'r');
 	longopts[4] = new LongOpt("debug", LongOpt.OPTIONAL_ARGUMENT, null, 'd');
-	//longopts[5] = new LongOpt("renderer", LongOpt.REQUIRED_ARGUMENT, null, 'r');
-	longopts[6] = new LongOpt("impl", LongOpt.REQUIRED_ARGUMENT, null, 'i');	longopts[7] = new LongOpt("threshold", LongOpt.REQUIRED_ARGUMENT, null, 't');
+	longopts[5] = new LongOpt("impl", LongOpt.REQUIRED_ARGUMENT, null, 'i');
+	longopts[7] = new LongOpt("threshold", LongOpt.REQUIRED_ARGUMENT, null, 't');
 	
-	Getopt g = new Getopt("", args, "ho:a:f:d::r:t:i:", longopts);
+	Getopt g = new Getopt("", args, "ho:a:d::r:t:i:", longopts);
 	int c;
 	String arg;
 
@@ -138,16 +143,8 @@ public class Procalign {
 		filename = g.getOptarg();
 		break;
 	    case 'r':
-		/* Use the given class for rendernig */
-		String renderingClass = g.getOptarg();
-		try {
-		    renderer = (Renderer) ClassLoader.getSystemClassLoader().loadClass(renderingClass).newInstance();
-		} catch (Exception ex) {
-		    System.err.println("Cannot create renderer " + 
-				       renderingClass + "\n" + ex.getMessage() );
-		    usage();
-		    System.exit(0);
-		}
+		/* Use the given class for rendering */
+		rendererClass = g.getOptarg();
 		break;
 	    case 'i':
 		/* Use the given class for the alignment */
@@ -157,13 +154,6 @@ public class Procalign {
 		/* Use the given file as a partial alignment */
 		initName = g.getOptarg();
 		break;
-	    case 'f':
-		/* Output format */
-		format = g.getOptarg();
-		if ( format.equals("xslt") ) {
-		    System.err.println("XSLT output not implemented\n");
-		}
-		break;
 	    case 't':
 		/* Threshold */
 		threshold = Double.parseDouble(g.getOptarg());
@@ -181,6 +171,9 @@ public class Procalign {
 	int i = g.getOptind();
 	
 	loadedOntologies = new Hashtable();
+	params = new BasicParameters();
+	if ( debug > 0 ) params.setParameter("debug",new Integer(debug));
+	// debug = ((Integer)params.getParameter("debug")).intValue();
 
 	try {
 	    
@@ -219,16 +212,18 @@ public class Procalign {
 		if ( initName != null ){
 		    AlignmentParser aparser = new AlignmentParser( debug );
 		    init = aparser.parse( initName, loadedOntologies );
-		    onto1 = init.getOntology1();
-		    onto2 = init.getOntology2();
+		    onto1 = (OWLOntology)init.getOntology1();
+		    onto2 = (OWLOntology)init.getOntology2();
 		    if ( debug > 0 ) System.err.println(" Init parsed");
 		}
 
 		// Create alignment object
-		Object [] params = {(Object)onto1, (Object)onto2};
+		Object [] mparams = {(Object)onto1, (Object)onto2};
 		Class alignmentClass =  Class.forName(alignmentClassName);
 		java.lang.reflect.Constructor[] alignmentConstructors = alignmentClass.getConstructors();
-                result = (AlignmentProcess)alignmentConstructors[0].newInstance(params);
+                result = (AlignmentProcess)alignmentConstructors[0].newInstance(mparams);
+		result.setFile1( uri1 );
+		result.setFile2( uri2 );
 	    } catch (Exception ex) {
 		System.err.println("Cannot create alignment " + 
 				   alignmentClassName + "\n" + ex.getMessage() );
@@ -238,7 +233,11 @@ public class Procalign {
 
 	    if ( debug > 0 ) System.err.println(" Alignment structure created");
 	    // Compute alignment
-	    result.align(init); // add opts
+	    result.align(init,params); // add opts
+
+	    // Thresholding
+	    if ( threshold != 0 ) 
+		{ ((BasicAlignment)result).cut( threshold ); };
 
 	    if ( debug > 0 ) System.err.println(" Alignment performed");
 
@@ -249,19 +248,21 @@ public class Procalign {
 		writer = new PrintStream(new FileOutputStream( filename ));
 	    }
 
-	    // Thresholding
-	    if ( threshold != 0 ) 
-		{ ((BasicAlignment)result).cut( threshold ); };
+	    // Result printing (to be reimplemented with a default value)
+	    try {
+		Object [] mparams = {(Object)writer};
+		java.lang.reflect.Constructor[] rendererConstructors = Class.forName(rendererClass).getConstructors();
+		renderer = (AlignmentVisitor)rendererConstructors[0].newInstance(mparams);
+	    } catch (Exception ex) {
+		System.err.println("Cannot create renderer " + 
+				   rendererClass + "\n" + ex.getMessage() );
+		usage();
+		System.exit(0);
+	    }
 
-	    // Result printing
-	    if ( format.equals("axioms") ) {
-		result.printAsAxiom( writer );
-	    } else result.write( writer );
+	    // Output
+	    result.render( writer, renderer );
 	    
-	    // File closing
-	    //writer.close();
-	    //System.out.println( writer.toString() );
-
 	} catch (Exception ex) {
 	    ex.printStackTrace();
 	}
@@ -280,13 +281,12 @@ public class Procalign {
     public static void usage() {
 	System.out.println("usage: Procalign [options] URI1 URI2");
 	System.out.println("options are:");
-	//System.out.println("\t--alignment=filename -a filename Start from an XML alignment file");
-	System.out.println("\t--debug[=n] -d [n]\t\tReport debug info at level ,");
-	//System.out.println("\t--renderer=className -r\t\tUse the given class for output.");
 	System.out.println("\t--impl=className -i classname\t\tUse the given alignment implementation.");
-	System.out.println("\t--format=axioms|xslt -f axioms|xslt\tSpecifies tha alignment format");
+	System.out.println("\t--renderer=className -r className\tSpecifies the alignment renderer");
 	System.out.println("\t--output=filename -o filename\tOutput the alignment in filename");
+	System.out.println("\t--alignment=filename -a filename Start from an XML alignment file");
 	System.out.println("\t--threshold=double -t double\tFilters the similarities under threshold");
+	System.out.println("\t--debug[=n] -d [n]\t\tReport debug info at level n");
 	System.out.println("\t--help -h\t\t\tPrint this message");
 
     }
diff --git a/src/org/semanticweb/owl/align/Alignment.java b/src/org/semanticweb/owl/align/Alignment.java
index 9c2715c54890bef151e1968c75e8957459ec0f1e..a16193be51d42d962e88f77b406dcd440a13de10 100644
--- a/src/org/semanticweb/owl/align/Alignment.java
+++ b/src/org/semanticweb/owl/align/Alignment.java
@@ -23,13 +23,13 @@ package org.semanticweb.owl.align;
 import java.io.PrintStream;
 import java.io.IOException;
 import java.util.Enumeration;
+import java.net.URI;
 
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
-import org.semanticweb.owl.model.OWLOntology;
-import org.semanticweb.owl.model.OWLEntity;
-import org.semanticweb.owl.model.OWLException;
+//import org.semanticweb.owl.model.OWLOntology;
+//import org.semanticweb.owl.model.OWLEntity;
 
 /**
  * Represents an OWL ontology alignment.
@@ -44,15 +44,16 @@ public interface Alignment
 
     /** Alignment methods **/
 
+    public void accept( AlignmentVisitor visitor ) throws AlignmentException;
     /**
      * The alignment has reference to the two aligned ontology.
      * All Alignment cells contain firts the entity from the first ontology
      * The alignment is from the first ontology to the second.
      */
-    public OWLOntology getOntology1();
-    public OWLOntology getOntology2();
-    public void setOntology1(OWLOntology ontology);
-    public void setOntology2(OWLOntology ontology);
+    public Object getOntology1();
+    public Object getOntology2();
+    public void setOntology1(Object ontology) throws AlignmentException;
+    public void setOntology2(Object ontology) throws AlignmentException;
     /**
      * Alignment type:
      * Currently defined a sa String.
@@ -70,6 +71,17 @@ public interface Alignment
     public void setType( String type );
     public String getType();
 
+    /**
+     * Alignment type:
+     * Currently defined a sa String.
+     * This string is supposed to contain two characters: among ?, 1, *, +
+     * Can be implemented otherwise
+     */
+    public void setFile1( URI type );
+    public void setFile2( URI type );
+    public URI getFile1();
+    public URI getFile2();
+
     /** Cell methods **/
     /**
      * The alignment itself is a set of Alignment cells relating one
@@ -84,24 +96,27 @@ public interface Alignment
     /**
      * Cells are created and indexed at once
      */
-    public void addAlignCell( OWLEntity ob1, OWLEntity ob, String relation, double measure) throws OWLException;
-    public void addAlignCell( OWLEntity ob1, OWLEntity ob2) throws OWLException;
-    public Cell getAlignCell1( OWLEntity ob ) throws OWLException;
-    public Cell getAlignCell2( OWLEntity ob ) throws OWLException;
+    public void addAlignCell( Object ob1, Object ob, String relation, double measure) throws AlignmentException;
+    public void addAlignCell( Object ob1, Object ob2) throws AlignmentException;
+    public Cell getAlignCell1( Object ob ) throws AlignmentException;
+    public Cell getAlignCell2( Object ob ) throws AlignmentException;
     /**
      * Each part of the cell can be queried independently.
      * There is not cell access out of the alignment objects.
      */
-    public OWLEntity getAlignedObject1( OWLEntity ob ) throws OWLException;
-    public OWLEntity getAlignedObject2( OWLEntity ob ) throws OWLException;
-    public Relation getAlignedRelation1( OWLEntity ob ) throws OWLException;
-    public Relation getAlignedRelation2( OWLEntity ob ) throws OWLException;
-    public double getAlignedMeasure1( OWLEntity ob ) throws OWLException;
-    public double getAlignedMeasure2( OWLEntity ob ) throws OWLException;
+    public Object getAlignedObject1( Object ob ) throws AlignmentException;
+    public Object getAlignedObject2( Object ob ) throws AlignmentException;
+    public Relation getAlignedRelation1( Object ob ) throws AlignmentException;
+    public Relation getAlignedRelation2( Object ob ) throws AlignmentException;
+    public double getAlignedStrength1( Object ob ) throws AlignmentException;
+    public double getAlignedStrength2( Object ob ) throws AlignmentException;
 
     public Enumeration getElements();
     public int nbCells();
 
+    public void cut( double threshold ) throws AlignmentException;
+    public void harden( double threshold ) throws AlignmentException;
+
     /** Housekeeping **/
     /**
      * The methods for outputing and dispalying alignments are common to
@@ -113,12 +128,12 @@ public interface Alignment
      * for a SAXHandler provided as input 
      */
     public void dump(ContentHandler h);
-    public void write( PrintStream writer ) throws java.io.IOException, org.semanticweb.owl.model.OWLException;
+    //    public void write( PrintStream writer ) throws IOException, AlignmentException;
 
     /** Exporting
 	The alignments are exported for other purposes.
     */
-    public void printAsAxiom( PrintStream writer ) throws OWLException;
+    public void render( PrintStream writer, AlignmentVisitor renderer ) throws AlignmentException;
 
 }
 
diff --git a/src/org/semanticweb/owl/align/AlignmentProcess.java b/src/org/semanticweb/owl/align/AlignmentProcess.java
index 2beba31960e31553d92c30ff98e6daf58ad24b5b..6cea147adaaa84d2939f4430331309fe2174234f 100644
--- a/src/org/semanticweb/owl/align/AlignmentProcess.java
+++ b/src/org/semanticweb/owl/align/AlignmentProcess.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2003-2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -46,7 +47,7 @@ public interface AlignmentProcess extends Alignment
      * TODO: a set of parameters should better be passed to the alignment
      * method.
      */
-    public void align( Alignment alignment ) throws AlignmentException, OWLException;
+    public void align( Alignment alignment, Parameters param ) throws AlignmentException, OWLException;
 
 }
 
diff --git a/src/org/semanticweb/owl/align/Cell.java b/src/org/semanticweb/owl/align/Cell.java
index 284ea660ffa1d26d479baa73b5b18fe6c4ffbda0..a4641da5fda6fe07bf507073c04b2b4659afb580 100644
--- a/src/org/semanticweb/owl/align/Cell.java
+++ b/src/org/semanticweb/owl/align/Cell.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2003-2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -25,8 +26,7 @@ import java.io.IOException;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
-import org.semanticweb.owl.model.OWLEntity;
-import org.semanticweb.owl.model.OWLException;
+//import org.semanticweb.owl.model.OWLEntity;
 
 /**
  * Represents an OWL ontology alignment. An ontology comprises a number of
@@ -42,21 +42,22 @@ import org.semanticweb.owl.model.OWLException;
 public interface Cell
 {
 	
+    public void accept( AlignmentVisitor visitor ) throws AlignmentException;
+
     /** Creation **/
-    //public Cell( OWLOntology onto1, OWLOntology onto2 );
 
-    public OWLEntity getObject1();
-    public OWLEntity getObject2();
-    public void setObject1( OWLEntity ob );
-    public void setObject2( OWLEntity ob );
+    public Object getObject1();
+    public Object getObject2();
+    public void setObject1( Object ob ) throws AlignmentException;
+    public void setObject2( Object ob ) throws AlignmentException;
     public Relation getRelation();
     public void setRelation( Relation r );
-    public double getMeasure();
-    public void setMeasure( double m );
+    public double getStrength();
+    public void setStrength( double m );
 
     /** Housekeeping **/
     public void dump(ContentHandler h);
-    public void write( PrintStream writer ) throws java.io.IOException, org.semanticweb.owl.model.OWLException;
+    //    public void write( PrintStream writer ) throws IOException, AlignmentException;
 
 }
 
diff --git a/src/org/semanticweb/owl/align/Evaluator.java b/src/org/semanticweb/owl/align/Evaluator.java
index 907d366e380a0bfce1fa74b824157a77e44f05f4..ade169af88825ee52963512c50406154d51dfc7b 100644
--- a/src/org/semanticweb/owl/align/Evaluator.java
+++ b/src/org/semanticweb/owl/align/Evaluator.java
@@ -1,5 +1,6 @@
 /*
  * $Id$
+ *
  * Copyright (C) INRIA Rhône-Alpes, 2004
  *
  * This program is free software; you can redistribute it and/or modify
@@ -21,7 +22,6 @@ package org.semanticweb.owl.align;
 
 import java.io.PrintStream;
 import java.io.IOException;
-import org.semanticweb.owl.model.OWLException;
 
 /**
  * Assess the closeness between two ontology alignments.
@@ -41,7 +41,7 @@ public interface Evaluator
      * Returns a double (between 0 and 1) providing an idea of the
      * proximity
      */
-    public double evaluate() throws OWLException;
+    public double eval( Parameters param ) throws AlignmentException;
 
     /** Housekeeping **/
     /**
diff --git a/src/org/semanticweb/owl/align/Relation.java b/src/org/semanticweb/owl/align/Relation.java
index 2db6cdc9e46fdf79c9e7426708e1d8206c07ddee..dbc3edc349782aa05e83c4b6a00f01dcc0a8360a 100644
--- a/src/org/semanticweb/owl/align/Relation.java
+++ b/src/org/semanticweb/owl/align/Relation.java
@@ -22,17 +22,10 @@ package org.semanticweb.owl.align;
 import java.io.PrintStream;
 import java.io.IOException;
 
-import org.semanticweb.owl.model.OWLOntology;
-import org.semanticweb.owl.model.OWLException;
-
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
 /**
- * Represents an OWL ontology alignment. An ontology comprises a number of
- * collections. Each ontology has a number of classes, properties and
- * individuals, along with a number of axioms asserting information
- * about those objects.
  *
  * @author Jérôme Euzenat
  * @version $Id$ 
@@ -42,13 +35,11 @@ import org.xml.sax.SAXException;
 public interface Relation
 {
     /** Creation **/
-    //public Relation( OWLOntology onto1, OWLOntology onto2 );
+    public void accept( AlignmentVisitor visitor ) throws AlignmentException;
 
     /** Housekeeping **/
     public void dump(ContentHandler h);
-    public void write( PrintStream writer ) throws java.io.IOException ;
-    /** Exporting */
-    public void printAsAxiom(  PrintStream writer, OWLOntology ontology, Cell c ) throws OWLException;
+    public void write( PrintStream writer );
 
 }