diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java
new file mode 100644
index 0000000000000000000000000000000000000000..0453115f0495577d03554ea22bc24a64ea812b17
--- /dev/null
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/COWLMappingRendererVisitor.java
@@ -0,0 +1,162 @@
+/*
+ * $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 the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ */
+
+package fr.inrialpes.exmo.align.impl.renderer; 
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.io.PrintWriter;
+import java.io.IOException;
+import java.lang.reflect.Method;
+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.align.Alignment;
+import org.semanticweb.owl.align.AlignmentVisitor;
+import org.semanticweb.owl.align.AlignmentException;
+import org.semanticweb.owl.align.Cell;
+import org.semanticweb.owl.align.Relation;
+
+import fr.inrialpes.exmo.align.impl.rel.*;
+
+/**
+ * Renders an alignment as a new ontology merging these.
+ *
+ * @author Jérôme Euzenat
+ * @version $Id$ 
+ */
+
+
+public class COWLMappingRendererVisitor implements AlignmentVisitor
+{
+    PrintWriter writer = null;
+    Alignment alignment = null;
+    Cell cell = null;
+
+    public COWLMappingRendererVisitor( PrintWriter writer ){
+	this.writer = writer;
+    }
+
+    public void visit( Alignment align ) throws AlignmentException {
+	alignment = align;
+	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:cowl=\"http://www.itc.it/cowl#\" \n");
+	writer.print("    xml:base=\"http://www.itc.it/cowl#\" \n");
+	writer.print("    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\">\n\n");	
+	writer.print("  <cowl:Mapping rdf:ID=\"\">\n");
+	try {
+	    writer.print("    <cowl:sourceOntology>\n");
+	    writer.print("      <owl:Ontology rdf:about=\""+((OWLOntology)align.getOntology1()).getURI()+"\"/>\n");
+	    writer.print("    </cowl:sourceOntology>\n");
+	    writer.print("    <cowl:targetOntology>\n");
+	    writer.print("      <owl:Ontology rdf:about=\""+((OWLOntology)align.getOntology2()).getURI()+"\"/>\n");
+	    writer.print("    </cowl:targetOntology>\n");
+	    for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){
+		Cell c = (Cell)e.nextElement();
+		c.accept( this );
+	    } //end for
+	} catch (OWLException e) { throw new AlignmentException("getURI problem", e); };
+	writer.print("  </cowl:Mapping>\n");
+	writer.print("</rdf:RDF>\n");
+    }
+    public void visit( Cell cell ) throws AlignmentException {
+	this.cell = cell;
+	OWLOntology onto1 = (OWLOntology)alignment.getOntology1();
+	writer.print("    <cowl:bridgeRule>\n");
+	cell.getRelation().accept( this );
+	writer.print("    </cowl:bridgeRule>\n");
+    }
+    public void visit( EquivRelation rel ) throws AlignmentException {
+	try {
+	    writer.print("     <cowl:Equivalent>\n");
+	    writer.print("       <cowl:source>\n");
+	    printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1());
+	    writer.print("       </cowl:source>\n");
+	    writer.print("       <cowl:target>\n");
+	    printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2());
+	    writer.print("       </cowl:target>\n");
+	    writer.print("     </cowl:Equivalent>\n");
+	} catch (OWLException e) { throw new AlignmentException("getURI problem", e); };
+    }
+
+    public void visit( SubsumeRelation rel ) throws AlignmentException {
+	try {
+	    writer.print("     <cowl:Into>\n");
+	    writer.print("       <cowl:source>\n");
+	    printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1());
+	    writer.print("       </cowl:source>\n");
+	    writer.print("       <cowl:target>\n");
+	    printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2());
+	    writer.print("       </cowl:target>\n");
+	    writer.print("     </cowl:Into>\n");
+	} catch (OWLException e) { throw new AlignmentException("getURI problem", e); };
+    }
+    public void visit( IncompatRelation rel ) throws AlignmentException {
+	try {
+	    writer.print("     <cowl:INCOMPATIBLE>\n");
+	    writer.print("       <cowl:source>\n");
+	    printObject(((OWLEntity)cell.getObject1()).getURI(),(OWLOntology)alignment.getOntology1());
+	    writer.print("       </cowl:source>\n");
+	    writer.print("       <cowl:target>\n");
+	    printObject(((OWLEntity)cell.getObject2()).getURI(),(OWLOntology)alignment.getOntology2());
+	    writer.print("       </cowl:target>\n");
+	    writer.print("     </cowl:INCOMPATIBLE>\n");
+	} catch (OWLException e) { throw new AlignmentException("getURI problem", e); };
+    }
+    public void visit( Relation rel ) throws AlignmentException {
+	// JE: I do not understand why I need this,
+	// but this seems to be the case...
+	try {
+	    Method mm = null;
+	    if ( Class.forName("fr.inrialpes.exmo.align.impl.rel.EquivRelation").isInstance(rel) ){
+		mm = this.getClass().getMethod("visit",
+					       new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.EquivRelation")});
+	    } else if (Class.forName("fr.inrialpes.exmo.align.impl.rel.SubsumeRelation").isInstance(rel) ) {
+		mm = this.getClass().getMethod("visit",
+					       new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.SubsumeRelation")});
+	    } else if (Class.forName("fr.inrialpes.exmo.align.impl.rel.IncompatRelation").isInstance(rel) ) {
+		mm = this.getClass().getMethod("visit",
+					       new Class [] {Class.forName("fr.inrialpes.exmo.align.impl.rel.IncompatRelation")});
+	    }
+	    if ( mm != null ) mm.invoke(this,new Object[] {rel});
+	} catch (Exception e) { throw new AlignmentException("Dispatching problem ", e); };
+    }
+
+    public void printObject( URI uri, OWLOntology onto ) throws OWLException {
+	if ( (OWLEntity)onto.getClass( uri ) != null ) { // A class
+	    writer.print("         <owl:Class rdf:about=\""+uri.toString()+"\"/>\n");
+	} else if ( (OWLEntity)onto.getDataProperty( uri ) != null ) { // A Dataproperty
+	    writer.print("         <owl:DataProperty rdf:about=\""+uri.toString()+"\"/>\n");
+	} else if ( (OWLEntity)onto.getObjectProperty( uri ) != null ) { // An ObjectProperty
+	    writer.print("         <owl:ObjectProperty rdf:about=\""+uri.toString()+"\"/>\n");
+	} else if ( (OWLEntity)onto.getIndividual( uri ) != null ) { // An individual (but check this)
+	    writer.print("         <owl:Individual rdf:about=\""+uri.toString()+"\"/>\n");
+	}
+    }
+}
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
index 94546a5ec9068308a11418bbbd983eb234673847..f71170f96a4902ddb2fc0420a910083854ac0c46 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/OWLAxiomsRendererVisitor.java
@@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer;
 
 import java.util.Hashtable;
 import java.util.Enumeration;
-import java.io.PrintStream;
+import java.io.PrintWriter;
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.URI;
@@ -52,11 +52,11 @@ import fr.inrialpes.exmo.align.impl.rel.*;
 
 public class OWLAxiomsRendererVisitor implements AlignmentVisitor
 {
-    PrintStream writer = null;
+    PrintWriter writer = null;
     Alignment alignment = null;
     Cell cell = null;
 
-    public OWLAxiomsRendererVisitor( PrintStream writer ){
+    public OWLAxiomsRendererVisitor( PrintWriter writer ){
 	this.writer = writer;
     }
 
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
index f65a29a2e92889ad03799b86d50c44afbaffdc6d..320ba3e2c281ddaa84ea549c548dc0be707a9720 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/RDFRendererVisitor.java
@@ -23,6 +23,9 @@ package fr.inrialpes.exmo.align.impl.renderer;
 import java.util.Hashtable;
 import java.util.Enumeration;
 import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.URI;
@@ -52,57 +55,55 @@ import fr.inrialpes.exmo.align.impl.rel.*;
 
 public class RDFRendererVisitor implements AlignmentVisitor
 {
-    PrintStream writer = null;
+    
+    PrintWriter writer = null;
     Alignment alignment = null;
     Cell cell = null;
 
-    public RDFRendererVisitor( PrintStream writer ){
+    public RDFRendererVisitor( PrintWriter writer ){
 	this.writer = writer;
     }
 
     public void visit( Alignment align ) throws AlignmentException {
 	alignment = align;
 	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( align.getLevel() );
 	writer.print("</level>\n  <type>");
 	writer.print( align.getType() );
-	writer.print("</type>\n  <onto1>");
+	writer.print("</type>\n");
 	try {
-	    writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString());
-	    writer.print("</onto1>\n  <onto2>");
-	    writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString());
-	    writer.print("</onto2>\n");
-	    //if ( align.getFile1() != null )
-		//writer.print("  <uri1>"+align.getFile1().toString()+"</uri1>\n");
-	    //if ( align.getFile2() != null )
-		//writer.print("  <uri2>"+align.getFile2().toString()+"</uri2>\n");
+	    //writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString());
+	    //writer.print("</onto1>\n  <onto2>");
+	    //writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString());
+	    //writer.print("</onto2>\n");
+	    if ( align.getFile1() != null )
+		writer.print("  <onto1>"+align.getFile1().toString()+"</onto1>\n");
+	    if ( align.getFile2() != null )
+		writer.print("  <onto2>"+align.getFile2().toString()+"</onto2>\n");
 	    writer.print("  <uri1>");
 	    writer.print( ((OWLOntology)align.getOntology1()).getLogicalURI().toString());
 	    writer.print("</uri1>\n");
 	    writer.print("  <uri2>");
 	    writer.print( ((OWLOntology)align.getOntology2()).getLogicalURI().toString());
 	    writer.print("</uri2>\n");
-	    writer.print("  <map>\n");
 	    
 	    for( Enumeration e = align.getElements() ; e.hasMoreElements(); ){
 		Cell c = (Cell)e.nextElement();
 		c.accept( this );
 	    } //end for
 	} catch (OWLException ex) { throw new AlignmentException( "getURI problem", ex); }
-	writer.print("  </map>\n</Alignment>\n");
+	writer.print("</Alignment>\n");
 	writer.print("</rdf:RDF>\n");
     }
     public void visit( Cell cell ) throws AlignmentException {
 	this.cell = cell;
 	//OWLOntology onto1 = (OWLOntology)alignment.getOntology1();
 	try {
+	    writer.print("  <map>\n");
 	    writer.print("    <Cell");
 	    if ( cell.getId() != null ){
 		writer.print(" rdf:resource=\"#"+cell.getId()+"\"");
@@ -115,7 +116,7 @@ public class RDFRendererVisitor implements AlignmentVisitor
 	    writer.print( cell.getStrength() );
 	    writer.print("</measure>\n      <relation>");
 	    cell.getRelation().accept( this );
-	    writer.print("</relation>\n    </Cell>\n");
+	    writer.print("</relation>\n    </Cell>\n  </map>\n");
 	} catch ( OWLException e) { throw new AlignmentException( "getURI problem", e ); }
     }
     public void visit( Relation rel ) {
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java
index a4c8f05cc2170ee472ca1e83bf2cb76bba53f353..1cbddc4069f1a9a1e2078c5499713506c07e5311 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/SWRLRendererVisitor.java
@@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer;
 
 import java.util.Hashtable;
 import java.util.Enumeration;
-import java.io.PrintStream;
+import java.io.PrintWriter;
 import java.io.IOException;
 
 import java.lang.reflect.Method;
@@ -54,11 +54,11 @@ import fr.inrialpes.exmo.align.impl.rel.*;
 
 public class SWRLRendererVisitor implements AlignmentVisitor
 {
-    PrintStream writer = null;
+    PrintWriter writer = null;
     Alignment alignment = null;
     Cell cell = null;
 
-    public SWRLRendererVisitor( PrintStream writer ){
+    public SWRLRendererVisitor( PrintWriter writer ){
 	this.writer = writer;
     }
 
@@ -93,22 +93,52 @@ public class SWRLRendererVisitor implements AlignmentVisitor
     }
 
     public void visit( EquivRelation rel ) throws AlignmentException {
-	// This is a very partial implementation since the code will depends
-	// on properties and classes.
-	// JE...
+	// JE: It sounds that the alignment and cell variables are taken as global...
+	// But it seems that this is not the case...
+	// JE: We should send warnings when dataproperties are mapped to individual properties and vice versa...
 	try {
 	    writer.println("  <ruleml:imp>");
 	    writer.println("    <ruleml:_body>");
-	    writer.println("      <swrl:classAtom>");
-	    writer.println("        <owllx:Class owllx:name=\""+((OWLEntity)cell.getObject1()).getURI().toString()+"\"/>");
-	    writer.println("        <ruleml:var>x</ruleml:var>");
-	    writer.println("      </swrl:classAtom>");
+	    OWLOntology onto1 = (OWLOntology)alignment.getOntology1();
+	    OWLEntity obj1 = (OWLEntity)cell.getObject1();
+	    URI uri1 = obj1.getURI();
+	    if ( onto1.getClass( uri1 ) != null ){
+		writer.println("      <swrl:classAtom>");
+		writer.println("        <owllx:Class owllx:name=\""+uri1.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("      </swrl:classAtom>");
+	    } else if ( onto1.getDataProperty( uri1 )  != null ){
+		writer.println("      <swrl:datavaluedPropertyAtom swrlx:property=\""+uri1.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("        <ruleml:var>y</ruleml:var>");
+		writer.println("      <swrl:datavaluedPropertyAtom>");
+	    } else {
+		writer.println("      <swrl:individualPropertyAtom swrlx:property=\""+uri1.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("        <ruleml:var>y</ruleml:var>");
+		writer.println("      </swrl:individualPropertyAtom>");
+	    }
 	    writer.println("    </ruleml:_body>");
 	    writer.println("    <ruleml:_head>");
-	    writer.println("      <swrlx:classAtom>");
-	    writer.println("        <owlx:Class owlx:name=\""+((OWLEntity)cell.getObject2()).getURI().toString()+"\"/>");
-	    writer.println("        <ruleml:var>x</ruleml:var>");
-	    writer.println("      </swrlx:classAtom>");
+	    OWLOntology onto2 = (OWLOntology)alignment.getOntology2();
+	    OWLEntity obj2 = (OWLEntity)cell.getObject2();
+	    URI uri2 = obj2.getURI();
+	    if ( onto2.getClass( uri2 ) != null ){
+		writer.println("      <swrlx:classAtom>");
+		writer.println("        <owllx:Class owllx:name=\""+uri2.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("      </swrl:classAtom>");
+	    } else if ( onto2.getDataProperty( uri2 )  != null ){
+		writer.println("      <swrl:datavaluedPropertyAtom swrlx:property=\""+uri2.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("        <ruleml:var>y</ruleml:var>");
+		writer.println("      </swrl:datavaluedPropertyAtom>");
+	    } else {
+		writer.println("      <swrl:individualPropertyAtom swrlx:property=\""+uri2.toString()+"\"/>");
+		writer.println("        <ruleml:var>x</ruleml:var>");
+		writer.println("        <ruleml:var>y</ruleml:var>");
+		writer.println("      </swrl:individualPropertyAtom>");
+	    }
 	    writer.println("    </ruleml:_head>");
 	    writer.println("  </ruleml:imp>\n");
 	} catch (Exception e) { throw new AlignmentException("getURI problem", e); };
diff --git a/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java b/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java
index 84e5a3e828606dadee58d1a2cd83d679f8fda74c..e57acea1906b9bbfc77d4f87ab52474b7b035580 100644
--- a/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java
+++ b/src/fr/inrialpes/exmo/align/impl/renderer/XSLTRendererVisitor.java
@@ -22,7 +22,7 @@ package fr.inrialpes.exmo.align.impl.renderer;
 
 import java.util.Hashtable;
 import java.util.Enumeration;
-import java.io.PrintStream;
+import java.io.PrintWriter;
 import java.io.IOException;
 
 import java.lang.reflect.Method;
@@ -53,11 +53,11 @@ import fr.inrialpes.exmo.align.impl.rel.*;
 
 public class XSLTRendererVisitor implements AlignmentVisitor
 {
-    PrintStream writer = null;
+    PrintWriter writer = null;
     Alignment alignment = null;
     Cell cell = null;
 
-    public XSLTRendererVisitor( PrintStream writer ){
+    public XSLTRendererVisitor( PrintWriter writer ){
 	this.writer = writer;
     }