diff --git a/src/fr/inrialpes/exmo/align/util/EvalAlign.java b/src/fr/inrialpes/exmo/align/util/EvalAlign.java
index 8035e7c5bfc3a8340595982ef651c944a554aedb..3d176fcbdbca456ddd8124d52f65a7fb3ae6e84a 100644
--- a/src/fr/inrialpes/exmo/align/util/EvalAlign.java
+++ b/src/fr/inrialpes/exmo/align/util/EvalAlign.java
@@ -55,8 +55,11 @@ import fr.inrialpes.exmo.align.impl.BasicEvaluator;
 import fr.inrialpes.exmo.align.impl.eval.PRecEvaluator;
 import fr.inrialpes.exmo.align.impl.BasicParameters;
 
-import java.io.PrintStream;
+import java.io.OutputStream;
 import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
 import java.net.URI;
 import java.util.Hashtable;
 
@@ -110,7 +113,7 @@ public class EvalAlign {
 	String alignName2 = null;
 	String filename = null;
 	String classname = null;
-	PrintStream writer = null;
+	PrintWriter writer = null;
 	LongOpt[] longopts = new LongOpt[7];
 	int debug = 0;
 	
@@ -188,14 +191,20 @@ public class EvalAlign {
 	    // Compare
 	    eval.eval(params) ;
 
-	    // Print result
-	    if ( filename == null ) {
-		writer = (PrintStream)System.out;
+	    // Set output file
+	    OutputStream stream;
+	    if (filename == null) {
+		//writer = (PrintStream) System.out;
+		stream = System.out;
 	    } else {
-		writer = new PrintStream(new FileOutputStream( filename ));
+		//writer = new PrintStream(new FileOutputStream(filename));
+		stream = new FileOutputStream(filename);
 	    }
-	    
+	    writer = new PrintWriter (
+			  new BufferedWriter(
+			       new OutputStreamWriter( stream, "UTF-8" )), true);
 	    eval.write( writer );
+	    writer.flush();
 	    
 	} catch (Exception ex) {
 	    ex.printStackTrace();
diff --git a/src/fr/inrialpes/exmo/align/util/ParserPrinter.java b/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
index 3c89e17bb7c8fb0323889bb92501a5cac9f1f1b7..3265ed42de3ad1081a523c006d522f827f057d15 100644
--- a/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
+++ b/src/fr/inrialpes/exmo/align/util/ParserPrinter.java
@@ -50,8 +50,11 @@ import org.semanticweb.owl.align.AlignmentVisitor;
 
 import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor;
 
-import java.io.PrintStream;
+import java.io.OutputStream;
 import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
 import java.net.URI;
 import java.util.Hashtable;
 
@@ -104,19 +107,24 @@ public class ParserPrinter {
 	Alignment result = null;
 	String initName = null;
 	String filename = null;
-	PrintStream writer = null;
+	PrintWriter writer = null;
 	AlignmentVisitor renderer = null;
 	LongOpt[] longopts = new LongOpt[7];
 	int debug = 0;
-	boolean inverse = false;
-	
+	String rendererClass = null;
+	boolean inverse = false;	
+	double threshold = 0;
+	String cutMethod = "hard";
+
 	longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
 	longopts[1] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null, 'o');
 	longopts[2] = new LongOpt("debug", LongOpt.OPTIONAL_ARGUMENT, null, 'd');
 	longopts[3] = new LongOpt("renderer", LongOpt.REQUIRED_ARGUMENT, null, 'r');
 	longopts[4] = new LongOpt("inverse", LongOpt.NO_ARGUMENT, null, 'i');
+	longopts[5] = new LongOpt("threshold", LongOpt.REQUIRED_ARGUMENT, null, 't');
+	longopts[6] = new LongOpt("cutmethod", LongOpt.REQUIRED_ARGUMENT, null, 'T');
 	
-	Getopt g = new Getopt("", args, "hio:d::r:", longopts);
+	Getopt g = new Getopt("", args, "hio:t:T:d::r:", longopts);
 	int c;
 	String arg;
 
@@ -134,15 +142,15 @@ public class ParserPrinter {
 		break;
 	    case 'r':
 		/* Use the given class for rendernig */
-		String renderingClass = g.getOptarg();
-		try {
-		    renderer = (AlignmentVisitor) ClassLoader.getSystemClassLoader().loadClass(renderingClass).newInstance();
-		} catch (Exception ex) {
-		    System.err.println("Cannot create renderer " + 
-				       renderingClass + "\n" + ex.getMessage() );
-		    usage();
-		    return;
-		}
+		rendererClass = g.getOptarg();
+		break;
+	    case 't' :
+		/* Threshold */
+		threshold = Double.parseDouble(g.getOptarg());
+		break;
+	    case 'T' :
+		/* Cut method */
+		cutMethod = g.getOptarg();
 		break;
 	    case 'd':
 		/* Debug level  */
@@ -169,17 +177,43 @@ public class ParserPrinter {
 	    AlignmentParser aparser = new AlignmentParser( debug );
 	    result = aparser.parse( initName, new Hashtable() );
 	    if ( debug > 0 ) System.err.println(" Alignment structure parsed");
-	    if ( filename == null ) {
-		writer = (PrintStream)System.out;
+	    // Set output file
+	    OutputStream stream;
+	    if (filename == null) {
+		//writer = (PrintStream) System.out;
+		stream = System.out;
 	    } else {
-		writer = new PrintStream(new FileOutputStream( filename ));
+		//writer = new PrintStream(new FileOutputStream(filename));
+		stream = new FileOutputStream(filename);
 	    }
+	    writer = new PrintWriter (
+			  new BufferedWriter(
+			       new OutputStreamWriter( stream, "UTF-8" )), true);
 
 	    if ( inverse ) result.inverse();
 	    
+	    // Thresholding
+	    if (threshold != 0) result.cut( cutMethod, threshold );
+
 	    //result.write( writer );
-	    if ( renderer == null ) renderer = new RDFRendererVisitor( writer );
-	    result.render( writer, renderer );
+	    if ( rendererClass == null ) renderer = new RDFRendererVisitor( writer );
+	    else {
+		try {
+		    //renderer = (AlignmentVisitor) ClassLoader.getSystemClassLoader().loadClass(renderingClass).newInstance();
+		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();
+		    return;
+		}
+	    }
+	    result.render( renderer );
+	    writer.flush();
 	    
 	} catch (Exception ex) {
 	    ex.printStackTrace();
@@ -187,7 +221,7 @@ public class ParserPrinter {
     }
 
     public static void usage() {
-	System.out.println("usage: ParserPrinter [options] URI1 URI2");
+	System.out.println("usage: ParserPrinter [options] URI");
 	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 ,");
diff --git a/src/fr/inrialpes/exmo/align/util/Procalign.java b/src/fr/inrialpes/exmo/align/util/Procalign.java
index 01bf77407350c7e474356ab9ace4b67aa1e5b67c..a049345a85c0cb6c371615a9e67a3f5c849f06f6 100644
--- a/src/fr/inrialpes/exmo/align/util/Procalign.java
+++ b/src/fr/inrialpes/exmo/align/util/Procalign.java
@@ -49,8 +49,11 @@ import org.semanticweb.owl.io.owl_rdf.OWLRDFErrorHandler;
 import org.semanticweb.owl.io.ParserException;
 import org.semanticweb.owl.io.Parser;
 
-import java.io.PrintStream;
+import java.io.OutputStream;
 import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
 import java.net.URI;
 import java.util.Hashtable;
 import java.lang.Double;
@@ -116,12 +119,14 @@ public class Procalign {
 	OWLOntology onto1 = null;
 	OWLOntology onto2 = null;
 	AlignmentProcess result = null;
+	String cutMethod = "hard";
 	String initName = null;
 	Alignment init = null;
 	String alignmentClassName = "fr.inrialpes.exmo.align.impl.method.ClassNameEqAlignment";
 	String filename = null;
 	String rendererClass = "fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor";
-	PrintStream writer = null;
+	//PrintStream writer = null;
+	PrintWriter writer = null;
 	AlignmentVisitor renderer = null;
 	int debug = 0;
 	double threshold = 0;
@@ -134,9 +139,10 @@ public class Procalign {
 	longopts[3] = new LongOpt("renderer", LongOpt.REQUIRED_ARGUMENT, null, 'r');
 	longopts[4] = new LongOpt("debug", LongOpt.OPTIONAL_ARGUMENT, null, 'd');
 	longopts[5] = new LongOpt("impl", LongOpt.REQUIRED_ARGUMENT, null, 'i');
-	longopts[7] = new LongOpt("threshold", LongOpt.REQUIRED_ARGUMENT, null, 't');
+	longopts[6] = new LongOpt("threshold", LongOpt.REQUIRED_ARGUMENT, null, 't');
+	longopts[7] = new LongOpt("cutmethod", LongOpt.REQUIRED_ARGUMENT, null, 'T');
 
-	Getopt g = new Getopt("", args, "ho:a:d::r:t:i:", longopts);
+	Getopt g = new Getopt("", args, "ho:a:d::r:t:T:i:", longopts);
 	int c;
 	String arg;
 
@@ -165,6 +171,10 @@ public class Procalign {
 		/* Threshold */
 		threshold = Double.parseDouble(g.getOptarg());
 		break;
+	    case 'T' :
+		/* Cut method */
+		cutMethod = g.getOptarg();
+		break;
 	    case 'd' :
 		/* Debug level  */
 		arg = g.getOptarg();
@@ -243,18 +253,20 @@ public class Procalign {
 	    result.align(init, params); // add opts
 
 	    // Thresholding
-	    if (threshold != 0) {
-		((BasicAlignment) result).cut(threshold);
-	    };
+	    if (threshold != 0) result.cut( cutMethod, threshold );
 
 	    if (debug > 0) System.err.println(" Alignment performed");
 	    
 	    // Set output file
+	    OutputStream stream;
 	    if (filename == null) {
-		writer = (PrintStream) System.out;
+		stream = System.out;
 	    } else {
-		writer = new PrintStream(new FileOutputStream(filename));
+		stream = new FileOutputStream(filename);
 	    }
+	    writer = new PrintWriter (
+			  new BufferedWriter(
+			       new OutputStreamWriter( stream, "UTF-8" )), true);
 
 	    // Result printing (to be reimplemented with a default value)
 	    try {
@@ -271,7 +283,8 @@ public class Procalign {
 	    }
 
 	    // Output
-	    result.render(writer, renderer);
+	    result.render(renderer);
+	    writer.flush();
 
 	} catch (Exception ex) {
 	    throw ex;
@@ -298,6 +311,7 @@ public class Procalign {
 	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--cutmethod=hard|perc|prop|best|span -T hard|perc|prop|best|span\tmethod for computing the 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");
     }