diff --git a/src/fr/inrialpes/exmo/align/impl/DistanceAlignment.java b/src/fr/inrialpes/exmo/align/impl/DistanceAlignment.java
index 870a4d8d89ca3ca39645c5fb821ce62398337e6d..4251e75a314999344d56cd5421fbb74907c70bf0 100644
--- a/src/fr/inrialpes/exmo/align/impl/DistanceAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/DistanceAlignment.java
@@ -39,36 +39,26 @@ import fr.inrialpes.exmo.ontowrap.OntowrapException;
 import fr.inrialpes.exmo.ontosim.util.HungarianAlgorithm;
 
 /**
+ * The mother class for distance or similarity-based alignments.
+ * It is abstract because it does not provide an implemented similarity measure
+ * Otherwise everything is fine.
+ *
+ * This class should work with similarity and distances, as soon as, the used
+ * similarity structure is defined as such.
  *
  * @author Jérôme Euzenat
  * @version $Id$ 
  */
 
-public class DistanceAlignment extends ObjectAlignment implements AlignmentProcess {
+public abstract class DistanceAlignment extends ObjectAlignment implements AlignmentProcess {
     Similarity sim;
 
     /** Creation **/
-    public DistanceAlignment() {}
-
-    // JE: OntoRewr (LoadedOntology -> one step above)
-    //public DistanceAlignment( LoadedOntology onto1, LoadedOntology onto2 ){
-	// Init must now be triggered explicitely
-	//    	init( onto1, onto2 );
-    //};
+    public DistanceAlignment() {};
 
     public void setSimilarity( Similarity s ) { sim = s; }
     public Similarity getSimilarity() { return sim; }
 
-    public void addAlignDistanceCell( Object ob1, Object ob2, String relation, double measure) throws AlignmentException {
-	addAlignCell( ob1, ob2, relation, 1.-measure );
-    }
-    public double getAlignedDistance1( Object ob ) throws AlignmentException {
-	return (1. - getAlignedStrength1(ob));
-    };
-    public double getAlignedDistance2( Object ob ) throws AlignmentException {
-	return (1. - getAlignedStrength2(ob));
-    };
-
     /**
      * Process matching
      * - create distance data structures,
@@ -94,22 +84,26 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
      * Prints the distance matrix
      */
     public void printDistanceMatrix( Properties params ){
+	String algName = params.getProperty("algName");
+	String metric = "distance";
+	if ( sim.getSimilarity() ) metric = "similarity";
+	if ( algName == null ) algName = getClass().toString();
 	System.out.println("\\documentclass{article}\n");
 	System.out.println("\\usepackage{graphics}\n");
 	System.out.println("\\begin{document}\n");
 	System.out.println("\\begin{table}");
 	sim.printClassSimilarityMatrix("tex");
-	System.out.println("\\caption{Class distance with measure "+params.getProperty("stringFunction")+"}");
+	System.out.println("\\caption{Class "+metric+" with measure "+algName+".}" );
 	System.out.println("\\end{table}");
 	System.out.println();
 	System.out.println("\\begin{table}");
 	sim.printPropertySimilarityMatrix("tex");
-	System.out.println("\\caption{Property distance with measure "+params.getProperty("stringFunction")+"}");
+	System.out.println("\\caption{Property "+metric+" with measure "+algName+".}" );
 	System.out.println("\\end{table}");
 	System.out.println();
 	System.out.println("\\begin{table}");
 	sim.printIndividualSimilarityMatrix("tex");
-	System.out.println("\\caption{Individual distance with measure "+params.getProperty("stringFunction")+"}");
+	System.out.println("\\caption{Individual "+metric+" with measure "+algName+".}" );
 	System.out.println("\\end{table}");
 	System.out.println("\n\\end{document}");
     }
@@ -160,7 +154,7 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
     public Alignment extractqs( double threshold, Properties params) {
       double max = 0.;
       boolean found = false;
-      double val = 0;
+      double val = 0.;
 
       try {
 	  // Extract for properties
@@ -168,13 +162,14 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 	      ConcatenatedIterator(ontology1().getObjectProperties().iterator(),
 				   ontology1().getDataProperties().iterator());
 	  for( Object prop1 : pit1 ){
-	      found = false; max = threshold; val = 0;
+	      found = false; max = threshold; val = 0.;
 	      Object prop2 = null;
 	      ConcatenatedIterator pit2 = new 
 		  ConcatenatedIterator(ontology2().getObjectProperties().iterator(),
 				       ontology2().getDataProperties().iterator());
 	      for ( Object current : pit2 ){
-		  val = 1 - sim.getPropertySimilarity(prop1,current);
+		  if ( sim.getSimilarity() ) val = sim.getPropertySimilarity(prop1,current);
+		  else val =  1 - sim.getPropertySimilarity(prop1,current);
 		  if ( val > max) {
 		      found = true; max = val; prop2 = current;
 		  }
@@ -186,7 +181,8 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 	      found = false; max = threshold; val = 0;
 	      Object class2 = null;
 	      for ( Object current : ontology2().getClasses() ) {
-		  val = 1 - sim.getClassSimilarity(class1,current);
+		  if ( sim.getSimilarity() ) val = sim.getClassSimilarity(class1,current);
+		  else val = 1 - sim.getClassSimilarity(class1,current);
 		  if (val > max) {
 		      found = true; max = val; class2 = current;
 		  }
@@ -201,7 +197,8 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		      Object ind2 = null;
 		      for ( Object current : ontology2().getIndividuals() ) {
 			  if ( ontology2().getEntityURI( current ) != null ) {
-			      val = 1 - sim.getIndividualSimilarity( ind1, current );
+			      if ( sim.getSimilarity() ) val = sim.getIndividualSimilarity( ind1, current );
+			      else val = 1 - sim.getIndividualSimilarity( ind1, current );
 			      if (val > max) {
 				  found = true; max = val; ind2 = current;
 			      }
@@ -241,17 +238,23 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 	    for ( Object ob : ontology2().getClasses() ) {
 		class2[j++] = ob;
 	    }
+	    double ival = sim.getClassSimilarity(class1[0],class2[0]);
 	    for( i = 0; i < nbclasses1; i++ ){
 		for( j = 0; j < nbclasses2; j++ ){
-		    matrix[i][j] = 1 - sim.getClassSimilarity(class1[i],class2[j]);
+		    if ( ival != -1. && ival != sim.getClassSimilarity(class1[i],class2[j] ) ) ival = -1.;
+		    if ( sim.getSimilarity() ) matrix[i][j] = sim.getClassSimilarity(class1[i],class2[j]);
+		    else matrix[i][j] = 1 - sim.getClassSimilarity(class1[i],class2[j]);
 		}
 	    }
 	    // Pass it to the algorithm
+	if ( ival == -1. ) {
 	    int[][] result = HungarianAlgorithm.hgAlgorithm( matrix, "max" );
 	    // Extract the result
 	    for( i=0; i < result.length ; i++ ){
 		// The matrix has been destroyed
-		double val = 1 - sim.getClassSimilarity(class1[result[i][0]],class2[result[i][1]]);
+		double val;
+		if ( sim.getSimilarity() ) val = sim.getClassSimilarity(class1[result[i][0]],class2[result[i][1]]);
+		else val = 1 - sim.getClassSimilarity(class1[result[i][0]],class2[result[i][1]]);
 		// JE: here using strict-> is a very good idea.
 		// it means that alignments with 0. similarity
 		// will be excluded from the best match. 
@@ -259,6 +262,7 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		    addCell( new ObjectCell( (String)null, class1[result[i][0]], class2[result[i][1]], BasicRelation.createRelation("="), val ) );
 		}
 	    }
+	}
 	} catch (AlignmentException alex) { alex.printStackTrace(); }
 	catch (OntowrapException owex) { owex.printStackTrace(); }
 	// For properties
@@ -278,17 +282,24 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		ConcatenatedIterator(ontology2().getObjectProperties().iterator(),
 				     ontology2().getDataProperties().iterator());
 	    for ( Object ob: pit2 ) prop2[j++] = ob;
+	    double ival = sim.getPropertySimilarity(prop1[0],prop2[0]);
 	    for( i = 0; i < nbprop1; i++ ){
 		for( j = 0; j < nbprop2; j++ ){
+		    if ( ival != -1. && ival != sim.getPropertySimilarity(prop1[i],prop2[j] ) ) ival = -1.;
+		    if ( sim.getSimilarity() ) matrix[i][j] = sim.getPropertySimilarity(prop1[i],prop2[j]);
+		    else 
 		    matrix[i][j] = 1 - sim.getPropertySimilarity(prop1[i],prop2[j]);
 		}
 	    }
 	    // Pass it to the algorithm
+	if ( ival == -1. ) {
 	    int[][] result = HungarianAlgorithm.hgAlgorithm( matrix, "max" );
 	    // Extract the result
 	    for( i=0; i < result.length ; i++ ){
 		// The matrix has been destroyed
-		double val = 1 - sim.getPropertySimilarity(prop1[result[i][0]],prop2[result[i][1]]);
+		double val;
+		if ( sim.getSimilarity() ) val = sim.getPropertySimilarity(prop1[result[i][0]],prop2[result[i][1]]);
+		else val = 1 - sim.getPropertySimilarity(prop1[result[i][0]],prop2[result[i][1]]);
 		// JE: here using strict-> is a very good idea.
 		// it means that alignments with 0. similarity
 		// will be excluded from the best match. 
@@ -296,6 +307,7 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		    addCell( new ObjectCell( (String)null, prop1[result[i][0]], prop2[result[i][1]], BasicRelation.createRelation("="), val ) );
 		}
 	    }
+	}
 	} catch (AlignmentException alex) { alex.printStackTrace(); }
 	catch (OntowrapException owex) { owex.printStackTrace(); }
 	// For individuals
@@ -320,17 +332,24 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		}
 		double[][] matrix = new double[nbind1][nbind2];
 		int i, j;
+	    double ival = sim.getIndividualSimilarity(ind1[0],ind2[0]);
 		for( i=0; i < nbind1; i++ ){
 		    for( j=0; j < nbind2; j++ ){
+			if ( ival != -1. && ival != sim.getIndividualSimilarity(ind1[i],ind2[j] ) ) ival = -1.;
+			if ( sim.getSimilarity() ) matrix[i][j] = sim.getIndividualSimilarity(ind1[i],ind2[j]);
+			else 
 			matrix[i][j] = 1 - sim.getIndividualSimilarity(ind1[i],ind2[j]);
 		    }
 		}
 		// Pass it to the algorithm
+	if ( ival == -1. ) {
 		int[][] result = HungarianAlgorithm.hgAlgorithm( matrix, "max" );
 		// Extract the result
 		for( i=0; i < result.length ; i++ ){
 		    // The matrix has been destroyed
-		    double val = 1 - sim.getIndividualSimilarity(ind1[result[i][0]],ind2[result[i][1]]);
+		    double val;
+		    if ( sim.getSimilarity() ) val = sim.getIndividualSimilarity(ind1[result[i][0]],ind2[result[i][1]]);
+		    else val = 1 - sim.getIndividualSimilarity(ind1[result[i][0]],ind2[result[i][1]]);
 		    // JE: here using strict-> is a very good idea.
 		    // it means that alignments with 0. similarity
 		    // will be excluded from the best match. 
@@ -338,6 +357,7 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 			addCell( new ObjectCell( (String)null, ind1[result[i][0]], ind2[result[i][1]], BasicRelation.createRelation("="), val ) );
 		    }
 		}
+	}
 	    } catch (AlignmentException alex) { alex.printStackTrace(); //}
 	    } catch (OntowrapException owex) { owex.printStackTrace(); }
 	}
@@ -399,7 +419,8 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 	  // for classes
 	  for ( Object ent1: ontology1().getClasses() ) {
 	      for ( Object ent2: ontology2().getClasses() ) {
-		  val = 1 - sim.getClassSimilarity( ent1, ent2 );
+		  if ( sim.getSimilarity() ) val = sim.getClassSimilarity( ent1, ent2 );
+		  else val = 1 - sim.getClassSimilarity( ent1, ent2 );
 		  if ( val > threshold ){
 		      cellSet.add( new ObjectCell( (String)null, ent1, ent2, BasicRelation.createRelation("="), val ) );
 		  }
@@ -414,7 +435,8 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 		  ConcatenatedIterator(ontology2().getObjectProperties().iterator(),
 					ontology2().getDataProperties().iterator());
 	      for ( Object ent2: pit2 ) {
-		  val = 1 - sim.getPropertySimilarity( ent1, ent2 );
+		  if ( sim.getSimilarity() ) val = sim.getPropertySimilarity( ent1, ent2 );
+		  else val = 1 - sim.getPropertySimilarity( ent1, ent2 );
 		  if ( val > threshold ){
 		      cellSet.add( new ObjectCell( (String)null, ent1, ent2, BasicRelation.createRelation("="), val ) );
 		  }
@@ -427,7 +449,8 @@ public class DistanceAlignment extends ObjectAlignment implements AlignmentProce
 
 		      for( Object ent2: ontology2().getIndividuals() ) {
 			  if ( ontology2().getEntityURI( ent2 ) != null ) {
-			      val = 1 - sim.getIndividualSimilarity( ent1, ent2 );
+			      if ( sim.getSimilarity() ) val = sim.getIndividualSimilarity( ent1, ent2 );
+			      else val = 1 - sim.getIndividualSimilarity( ent1, ent2 );
 			      if ( val > threshold ){
 				  cellSet.add( new ObjectCell( (String)null, ent1, ent2, BasicRelation.createRelation("="), val ) );
 			      }
diff --git a/src/fr/inrialpes/exmo/align/impl/MatrixMeasure.java b/src/fr/inrialpes/exmo/align/impl/MatrixMeasure.java
index 5d65c9db4cd3d0952a496e4b97ce6325d08851f4..04d3002c740c91b4b9776c11ef2fb0efb3d13a74 100644
--- a/src/fr/inrialpes/exmo/align/impl/MatrixMeasure.java
+++ b/src/fr/inrialpes/exmo/align/impl/MatrixMeasure.java
@@ -48,6 +48,8 @@ import fr.inrialpes.exmo.align.impl.ObjectAlignment;
 
 public abstract class MatrixMeasure implements Similarity {
 
+    public boolean similarity = true;
+
     //Momentaneously public
     public LoadedOntology onto1 = null;
     public LoadedOntology onto2 = null;
@@ -84,26 +86,31 @@ public abstract class MatrixMeasure implements Similarity {
 	    } else {
 		throw new AlignmentException(""); 
 	    };
-	    // Beware, I consider that confidence is similarity
 	    for ( Cell c : oalign ){
 		Object o1 = c.getObject1();
 		if ( onto1.isClass( o1 ) ) {
 		    Integer i1 = classlist1.get( o1 );
 		    Integer i2 = classlist2.get( c.getObject2() );
 		    if ( i1 != null && i2 != null ) {
-			clmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			if ( similarity )
+			    clmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			else clmatrix[i1.intValue()][i2.intValue()] = 1.-c.getStrength();
 		    }
 		} else if ( onto1.isProperty( o1 ) ) {
 		    Integer i1 = proplist1.get( o1 );
 		    Integer i2 = proplist2.get( c.getObject2() );
 		    if ( i1 != null && i2 != null ) {
-			prmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			if ( similarity )
+			    prmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			else prmatrix[i1.intValue()][i2.intValue()] = 1.-c.getStrength();
 		    }
 		} else {
 		    Integer i1 = indlist1.get( o1 );
 		    Integer i2 = indlist2.get( c.getObject2() );
 		    if ( i1 != null && i2 != null ) {
-			indmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			if ( similarity )
+			    indmatrix[i1.intValue()][i2.intValue()] = c.getStrength();
+			else indmatrix[i1.intValue()][i2.intValue()] = 1.-c.getStrength();
 		    }
 		}
 	    }
@@ -238,6 +245,9 @@ public abstract class MatrixMeasure implements Similarity {
 	System.out.println("\n\\end{tabular}");
     }
 
+    public boolean getSimilarity() {
+	return similarity;
+    }
     public void printClassSimilarityMatrix( String type ){
 	printMatrix( nbclass1, classlist1, classlist2, clmatrix ); 
     }
diff --git a/src/fr/inrialpes/exmo/align/impl/Similarity.java b/src/fr/inrialpes/exmo/align/impl/Similarity.java
index 74c0f82cf19a4746abcb52f1dc85ebcaab3afa77..c2e26ebb92fd906102e684b686153f29101f6c9f 100644
--- a/src/fr/inrialpes/exmo/align/impl/Similarity.java
+++ b/src/fr/inrialpes/exmo/align/impl/Similarity.java
@@ -37,29 +37,41 @@ public interface Similarity
 {
     // These parameters contains usually:
     // ontology1 and ontology2
-    // It would be better if they where explicit...
-    // Apparently the initialize also compute the similarity
+    /**
+     * Is it a similarity or a distance?
+     */
+    public boolean getSimilarity();
 
     // JE: OntoRewr: This should not be in init
+    /**
+     * Initialize the similarity value with various useful structures
+     */
     public void initialize( LoadedOntology<Object> onto1, LoadedOntology<Object> onto2 );
     public void initialize( LoadedOntology<Object> onto1, LoadedOntology<Object> onto2, Alignment align );
+
+    /**
+     * actually computes the similarity and store it in the adequate structures
+     */
     public void compute( Properties p );
+
+    /**
+     * Accessors to the stored similarity values
+     */
     public double getClassSimilarity( Object c1, Object c2 );
     public double getPropertySimilarity( Object p1, Object p2);
     public double getIndividualSimilarity( Object i1, Object i2 );
 
+    /**
+     * Printers of the obtained similarity values
+     */
     public void printClassSimilarityMatrix( String type );
     public void printPropertySimilarityMatrix( String type );
     public void printIndividualSimilarityMatrix( String type );
 
-    // New implementation
-    // JE: this is better as a new implementation.
-    // however, currently the implementation does not follow it:
-    // the abstract matrix class provides the get- accessors and the 
-    // concrete classes implement measure as their computation function.
-    // This is not clean. What should be done is:
-    // JE: OntoRewr: to be suppressed
-    public double measure( Object c1, Object c2 ) throws Exception;
+    // JE2010: These are used by the generic MatrixMeasure implementation
+    // in which it is sufficient to implement them to solve everything
+    // However, for more flexibility, it possible to just skip these
+    // and implement the measure within compute(p) (see InstanceBasedMatrixMeasure).
     public double classMeasure( Object c1, Object c2 ) throws Exception;
     public double propertyMeasure( Object p1, Object p2) throws Exception;
     public double individualMeasure( Object i1, Object i2 ) throws Exception;
diff --git a/src/fr/inrialpes/exmo/align/impl/method/ClassStructAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/ClassStructAlignment.java
index 5bf292b5f63a880fd837b78406551ef496f3ae0b..294d042d9590678848eb83c2f031f85deecc1193 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/ClassStructAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/ClassStructAlignment.java
@@ -78,6 +78,7 @@ public class ClassStructAlignment extends DistanceAlignment implements Alignment
     }
 
     /** Processing **/
+    // Could better use similarity
     public void align( Alignment alignment, Properties params ) throws AlignmentException {
 	loadInit( alignment );
 	honto1 = (HeavyLoadedOntology<Object>)getOntologyObject1();
diff --git a/src/fr/inrialpes/exmo/align/impl/method/NameAndPropertyAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/NameAndPropertyAlignment.java
index 5616178a8076b53a008e5cd5324c76695e0738f7..d5092eabba7414ec83fe085ecb73192729de8de0 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/NameAndPropertyAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/NameAndPropertyAlignment.java
@@ -76,6 +76,7 @@ public class NameAndPropertyAlignment extends DistanceAlignment implements Align
     }
 
     /** Processing **/
+    // Could better use similarity
     public void align( Alignment alignment, Properties params ) throws AlignmentException {
 	loadInit( alignment );
 	honto1 = (HeavyLoadedOntology<Object>)getOntologyObject1();
@@ -179,7 +180,7 @@ public class NameAndPropertyAlignment extends DistanceAlignment implements Align
 			max = propmatrix[i][j];
 		    }
 		}
-		if ( found && max < 0.5) { addAlignDistanceCell( proplist1.get(i), proplist2.get(best), "=", max ); }
+		if ( found && max < 0.5) { addAlignCell( proplist1.get(i), proplist2.get(best), "=", 1.-max ); }
 	    }
 	    if (debug > 0) System.err.print("Computing class distances\n");
 	    // Compute classes distances
@@ -242,7 +243,7 @@ public class NameAndPropertyAlignment extends DistanceAlignment implements Align
 		    max = classmatrix[i][j];
 		}
 	    }
-	    if ( found && max < 0.5) { addAlignDistanceCell( classlist1.get(i), classlist2.get(best), "=", max ); }
+	    if ( found && max < 0.5) { addAlignCell( classlist1.get(i), classlist2.get(best), "=", 1.-max ); }
 	}
     }
     
diff --git a/src/fr/inrialpes/exmo/align/impl/method/StringDistAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/StringDistAlignment.java
index 013f3cb0bce16950a3d93e4685eadc507435bb86..a60ebfd6cfe006890ba1a5d170fa1599e131a750 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/StringDistAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/StringDistAlignment.java
@@ -49,29 +49,34 @@ public class StringDistAlignment extends DistanceAlignment implements AlignmentP
     Method dissimilarity = null;
     String methodName = "equalDistance";
 
+    protected class StringDistMatrixMeasure extends MatrixMeasure {
+	public StringDistMatrixMeasure() {
+	    similarity = false; // This is a distance matrix
+	}
+	public double measure( Object o1, Object o2 ) throws Exception {
+	    String s1 = ontology1().getEntityName( o1 );
+	    String s2 = ontology2().getEntityName( o2 );
+	    // Unnamed entity = max distance
+	    if ( s1 == null || s2 == null ) return 1.;
+	    Object[] params = { s1.toLowerCase(), s2.toLowerCase() };
+	    if ( debug > 4 ) 
+		System.err.println( "OB:"+s1+" ++ "+s2+" ==> "+dissimilarity.invoke( null, params ));
+	    return ((Double)dissimilarity.invoke( null, params )).doubleValue();
+	}
+	public double classMeasure( Object cl1, Object cl2 ) throws Exception {
+	    return measure( cl1, cl2 );
+	}
+	public double propertyMeasure( Object pr1, Object pr2 ) throws Exception{
+	    return measure( pr1, pr2 );
+	}
+	public double individualMeasure( Object id1, Object id2 ) throws Exception{
+	    return measure( id1, id2 );
+	}
+    }
+
     /** Creation **/
     public StringDistAlignment() {
-	setSimilarity( new MatrixMeasure() {
-		public double measure( Object o1, Object o2 ) throws Exception {
-		    String s1 = ontology1().getEntityName( o1 );
-		    String s2 = ontology2().getEntityName( o2 );
-		    // Unnamed entity = max distance
-		    if ( s1 == null || s2 == null ) return 1.;
-		    Object[] params = { s1.toLowerCase(), s2.toLowerCase() };
-		    if ( debug > 4 ) 
-			System.err.println( "OB:"+s1+" ++ "+s2+" ==> "+dissimilarity.invoke( null, params ));
-		    return ((Double)dissimilarity.invoke( null, params )).doubleValue();
-		}
-		public double classMeasure( Object cl1, Object cl2 ) throws Exception {
-		    return measure( cl1, cl2 );
-		}
-		public double propertyMeasure( Object pr1, Object pr2 ) throws Exception{
-		    return measure( pr1, pr2 );
-		}
-		public double individualMeasure( Object id1, Object id2 ) throws Exception{
-		    return measure( id1, id2 );
-		}
-	    } );
+	setSimilarity( new StringDistMatrixMeasure() );
 	setType("**");
     }
 
@@ -90,7 +95,7 @@ public class StringDistAlignment extends DistanceAlignment implements AlignmentP
 	    throw new AlignmentException( "Unknown method for StringDistAlignment : "+params.getProperty("stringFunction"), e );
 	}
 
-	// JE2010: Strange: why does it is not equivalent to call
+	// JE2010: Strange: why is it not equivalent to call
 	// super.align( alignment, params )
 	// Load initial alignment
 	loadInit( alignment );
@@ -102,6 +107,7 @@ public class StringDistAlignment extends DistanceAlignment implements AlignmentP
 	getSimilarity().compute( params );
 
 	// Print matrix if asked
+	params.setProperty( "algName", getClass()+"/"+methodName );
 	if ( params.getProperty("printMatrix") != null ) printDistanceMatrix( params );
 
 	// Extract alignment
diff --git a/src/fr/inrialpes/exmo/align/impl/method/StrucSubsDistAlignment.java b/src/fr/inrialpes/exmo/align/impl/method/StrucSubsDistAlignment.java
index 39946008a0dd47e3ece4abd011ac5b4167a7910e..05844d7739e8e4e7fae884422b8802a410f0d24d 100644
--- a/src/fr/inrialpes/exmo/align/impl/method/StrucSubsDistAlignment.java
+++ b/src/fr/inrialpes/exmo/align/impl/method/StrucSubsDistAlignment.java
@@ -77,6 +77,7 @@ public class StrucSubsDistAlignment extends DistanceAlignment implements Alignme
     }
 
     /** Processing **/
+    // Could better use similarity
     public void align( Alignment alignment, Properties params ) throws AlignmentException {
 	loadInit( alignment );
 	honto1 = (HeavyLoadedOntology<Object>)getOntologyObject1();
@@ -182,7 +183,7 @@ public class StrucSubsDistAlignment extends DistanceAlignment implements Alignme
 			max = propmatrix[i][j];
 		    }
 		}
-		if ( found ) { addAlignDistanceCell( proplist1.get(i), proplist2.get(best), "=", max ); }
+		if ( found ) { addAlignCell( proplist1.get(i), proplist2.get(best), "=", 1.-max ); }
 	    }
 	    
 	    if (debug > 0) System.err.print("Computing class distances\n");
@@ -254,7 +255,7 @@ public class StrucSubsDistAlignment extends DistanceAlignment implements Alignme
 		    max = classmatrix[i][j];
 		}
 	    }
-	    if ( found ) { addAlignDistanceCell( classlist1.get(i), classlist2.get(best), "=", max ); }
+	    if ( found ) { addAlignCell( classlist1.get(i), classlist2.get(best), "=", 1.-max ); }
 	}
     }
 }