Remove support for current_input and current_output

The current input and output is mostly useful for interactive programs
running from the command line, but Prolog Cafe is never used that way
by Gerrit Code Review.

Change-Id: Id9163384e960f9c39cd9e0169b25b9cf0b9e95a2
diff --git a/BUCK b/BUCK
index f170833..03a0c9a 100644
--- a/BUCK
+++ b/BUCK
@@ -1,5 +1,18 @@
 SRC = 'java/com/googlecode/prolog_cafe/'
 
+REPL = [
+  SRC + 'builtin/PRED_$write_toString_2.java',
+  SRC + 'lang/PrologMain.java',
+]
+
+IO = [
+  SRC + 'builtin/PRED_close_2.java',
+  SRC + 'builtin/PRED_flush_output_1.java',
+  SRC + 'builtin/PRED_open_4.java',
+  SRC + 'builtin/PRED_read_line_2.java',
+  SRC + 'builtin/PRED_tab_2.java',
+]
+
 genrule(
   name = 'all',
   cmd = ':>all',
@@ -21,15 +34,12 @@
 
 java_library(
   name = 'lang',
-  srcs = glob(
-    [SRC + 'lang/*.java'],
-    excludes = [SRC + 'lang/PrologMain.java'],
-  ),
+  srcs = glob([SRC + 'lang/*.java'], excludes = REPL),
 )
 
 java_library(
   name = 'builtin',
-  srcs = glob([SRC + 'builtin/*.java']) + [
+  srcs = glob([SRC + 'builtin/*.java'], excludes = REPL + IO) + [
     ':builtin_srcs',
     ':system_srcs',
   ],
@@ -49,6 +59,21 @@
 )
 
 java_library(
+  name = 'io',
+  srcs = IO + [':io_srcs'],
+  deps = [
+    ':builtin',
+    ':lang',
+  ],
+)
+
+pl2j(
+  name = 'io_srcs',
+  src = 'src/builtin/io.pl',
+  out = 'io.src.zip',
+)
+
+java_library(
   name = 'compiler',
   srcs = glob([SRC + 'compiler/**/*.java']) + [
     ':pl2am_srcs',
@@ -56,6 +81,7 @@
   ],
   deps = [
     ':builtin',
+    ':io',
     ':lang',
   ],
 )
@@ -80,12 +106,10 @@
 
 java_library(
   name = 'cafeteria_lib',
-  srcs = [
-    SRC + 'lang/PrologMain.java',
-    ':cafeteria_srcs',
-  ],
+  srcs = REPL + [':cafeteria_srcs'],
   deps = [
     ':builtin',
+    ':io',
     ':lang',
   ],
 )
diff --git a/src/builtin/PRED_$fast_write_1.java b/src/builtin/PRED_$fast_write_1.java
deleted file mode 100644
index d64aafa..0000000
--- a/src/builtin/PRED_$fast_write_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import  com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>'$fast_write'/1</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
- */
-public class PRED_$fast_write_1 extends Predicate.P1 {
-    public PRED_$fast_write_1(Term a1, Operation cont) {
-	arg1 = a1;
-	this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-	Term a1;
-	a1 = arg1.dereference();
-	engine.getCurrentOutput().print(a1.toString());
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_$fast_writeq_1.java b/src/builtin/PRED_$fast_writeq_1.java
deleted file mode 100644
index 8a47802..0000000
--- a/src/builtin/PRED_$fast_writeq_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import  com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>'$fast_writeq'/1</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
- */
-public class PRED_$fast_writeq_1 extends Predicate.P1 {
-    public PRED_$fast_writeq_1(Term a1, Operation cont) {
-	arg1 = a1;
-	this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-	Term a1;
-	a1 = arg1.dereference();
-	engine.getCurrentOutput().print(a1.toQuotedString());
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_$get_prolog_impl_flag_2.java b/src/builtin/PRED_$get_prolog_impl_flag_2.java
index f8306f2..8b314e9 100644
--- a/src/builtin/PRED_$get_prolog_impl_flag_2.java
+++ b/src/builtin/PRED_$get_prolog_impl_flag_2.java
@@ -18,7 +18,6 @@
     private static final SymbolTerm MAX_ARITY                 = SymbolTerm.intern("max_arity");
     private static final SymbolTerm UNKNOWN                   = SymbolTerm.intern("unknown");
     private static final SymbolTerm DOUBLE_QUOTES             = SymbolTerm.intern("double_quotes");
-    private static final SymbolTerm PRINT_STACK_TRACE         = SymbolTerm.intern("print_stack_trace");
 
     public PRED_$get_prolog_impl_flag_2(Term a1, Term a2, Operation cont) {
         arg1 = a1;
@@ -66,9 +65,6 @@
 	} else if (a1.equals(DOUBLE_QUOTES)) {
 	    if (! a2.unify(SymbolTerm.intern(engine.getDoubleQuotes()), engine.trail))
 		return engine.fail();
-	} else if (a1.equals(PRINT_STACK_TRACE)) {
-	    if (! a2.unify(SymbolTerm.intern(engine.getPrintStackTrace()), engine.trail))
-		return engine.fail();
 	} else {
 	    return engine.fail();
 	}
diff --git a/src/builtin/PRED_$get_stream_manager_1.java b/src/builtin/PRED_$get_stream_manager_1.java
deleted file mode 100644
index 5628b34..0000000
--- a/src/builtin/PRED_$get_stream_manager_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-/**
-   <code>'$get_stream_manager'/1</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-class PRED_$get_stream_manager_1 extends Predicate.P1 {
-    public PRED_$get_stream_manager_1(Term a1, Operation cont) {
-        arg1 = a1;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1;
-        a1 = arg1;
-
-	a1 = a1.dereference();
-	if (! a1.isVariable())
-	    throw new IllegalTypeException(this, 1, "variable", a1);
-	if (! a1.unify(new JavaObjectTerm(engine.getStreamManager()), engine.trail))
-	    return engine.fail();
-        return cont;
-    }
-}
diff --git a/src/builtin/PRED_$print_stack_trace_1.java b/src/builtin/PRED_$print_stack_trace_1.java
deleted file mode 100644
index d91a16e..0000000
--- a/src/builtin/PRED_$print_stack_trace_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>'$print_stack_trace'/1</code>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
-*/
-class PRED_$print_stack_trace_1 extends Predicate.P1 {
-    public PRED_$print_stack_trace_1(Term a1, Operation cont) {
-        arg1 = a1;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1;
-        a1 = arg1;
-
-	a1 = a1.dereference();
-	if (a1.isVariable())
-	    throw new PInstantiationException(this, 1);
-	if (! a1.isJavaObject())
-	    throw new IllegalTypeException(this, 1, "java", a1);
-	Object obj = ((JavaObjectTerm) a1).object();
-	if (obj instanceof InterruptedException)
-	    throw new JavaInterruptedException((InterruptedException) obj);
-	if (engine.getPrintStackTrace().equals("on"))
-	    engine.control.printStackTrace((Throwable) obj);
-        return cont;
-    }
-}
diff --git a/src/builtin/PRED_$set_prolog_impl_flag_2.java b/src/builtin/PRED_$set_prolog_impl_flag_2.java
index b7994b1..222f656 100644
--- a/src/builtin/PRED_$set_prolog_impl_flag_2.java
+++ b/src/builtin/PRED_$set_prolog_impl_flag_2.java
@@ -11,7 +11,6 @@
     private static final SymbolTerm DEBUG             = SymbolTerm.intern("debug");
     private static final SymbolTerm UNKNOWN           = SymbolTerm.intern("unknown");
     private static final SymbolTerm DOUBLE_QUOTES     = SymbolTerm.intern("double_quotes");
-    private static final SymbolTerm PRINT_STACK_TRACE = SymbolTerm.intern("print_stack_trace");
 
     public PRED_$set_prolog_impl_flag_2(Term a1, Term a2, Operation cont) {
         arg1 = a1;
@@ -43,10 +42,6 @@
 	    if (! a2.isSymbol())
 		return engine.fail();
 	    engine.setDoubleQuotes(((SymbolTerm)a2).name());
-	} else if (a1.equals(PRINT_STACK_TRACE)) {
-	    if (! a2.isSymbol())
-		return engine.fail();
-	    engine.setPrintStackTrace(((SymbolTerm)a2).name());
 	} else {
 	    return engine.fail();
 	}
diff --git a/src/builtin/PRED_close_2.java b/src/builtin/PRED_close_2.java
index 9d9ddbb..855d9e3 100644
--- a/src/builtin/PRED_close_2.java
+++ b/src/builtin/PRED_close_2.java
@@ -1,6 +1,23 @@
 package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.PushbackReader;
+
+import com.googlecode.prolog_cafe.lang.ExistenceException;
+import com.googlecode.prolog_cafe.lang.HashtableOfTerm;
+import com.googlecode.prolog_cafe.lang.IllegalDomainException;
+import com.googlecode.prolog_cafe.lang.IllegalTypeException;
+import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.PInstantiationException;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.SystemException;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.TermException;
 /**
  * <code>close/2</code><br>
  * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
@@ -74,10 +91,6 @@
 	}
 	if (stream instanceof PushbackReader) {
 	    PushbackReader in = (PushbackReader) stream;
-	    if (in.equals(engine.getUserInput()))
-		return cont;
-	    if (in.equals(engine.getCurrentInput()))
-		engine.setCurrentInput(engine.getUserInput());
 	    try {
 		in.close();
 	    } catch (IOException e) {
@@ -90,10 +103,6 @@
 		    throw new SystemException("output stream error");
 	    }
 	    out.flush();
-	    if (out.equals(engine.getUserOutput()) || out.equals(engine.getUserError()))
-		return cont;
-	    if (out.equals(engine.getCurrentOutput()))
-		engine.setCurrentOutput(engine.getUserOutput());
 	    out.close();
 	} else {
 	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
diff --git a/src/builtin/PRED_current_input_1.java b/src/builtin/PRED_current_input_1.java
deleted file mode 100644
index fc4a0b9..0000000
--- a/src/builtin/PRED_current_input_1.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import  com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>current_input/1</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
- */
-public class PRED_current_input_1 extends Predicate.P1 {
-    public PRED_current_input_1(Term a1, Operation cont) {
-	arg1 = a1;
-	this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.requireFeature(Prolog.Feature.IO, this, arg1);
-        engine.setB0();
-	Term a1;
-	a1 = arg1;
-	a1 = a1.dereference();
-	if (a1.isVariable()) {
-	    ((VariableTerm)a1).bind(new JavaObjectTerm(engine.getCurrentInput()), engine.trail);
-	} else if (a1.isJavaObject()) {
-	    if (! a1.unify(new JavaObjectTerm(engine.getCurrentInput()), engine.trail)) 
-		return engine.fail();
-	} else {
-	    throw new IllegalDomainException(this,1,"stream",a1);
-	}
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_current_output_1.java b/src/builtin/PRED_current_output_1.java
deleted file mode 100644
index 4638118..0000000
--- a/src/builtin/PRED_current_output_1.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import  com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>current_output/1</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
- */
-public class PRED_current_output_1 extends Predicate.P1 {
-    public PRED_current_output_1(Term a1, Operation cont) {
-	arg1 = a1;
-	this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.requireFeature(Prolog.Feature.IO, this, arg1);
-        engine.setB0();
-	Term a1;
-	a1 = arg1;
-	a1 = a1.dereference();
-	if (a1.isVariable()) {
-	    ((VariableTerm)a1).bind(new JavaObjectTerm(engine.getCurrentOutput()), engine.trail);
-	} else if (a1.isJavaObject()) {
-	    if (! a1.unify(new JavaObjectTerm(engine.getCurrentOutput()), engine.trail)) 
-		return engine.fail();
-	} else {
-	    throw new IllegalDomainException(this,1,"stream",a1);
-	}
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_get_byte_2.java b/src/builtin/PRED_get_byte_2.java
deleted file mode 100644
index eab2506..0000000
--- a/src/builtin/PRED_get_byte_2.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
- * <code>get_byte/2</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.1
- * @since 1.1
-*/
-public class PRED_get_byte_2 extends Predicate.P2 {
-    private static final IntegerTerm INT_EOF = new IntegerTerm(-1);
-
-    public PRED_get_byte_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	Object stream = null;
-
-	// InByte
-	a2 = a2.dereference(); 
-	if (! a2.isVariable()) {
-	    if (! a2.isInteger())
-		throw new IllegalTypeException(this, 2, "in_byte", a2);
-	    int n = ((IntegerTerm)a2).intValue();
-	    if (n != -1 && (n < 0 || n > 255))
-		throw new RepresentationException(this, 2, "in_byte");
-	}
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// read single byte
-	try {
-	    int c = ((PushbackReader)stream).read();
-	    if (c < 0) { // EOF
-		if (! a2.unify(INT_EOF, engine.trail))
-		    return engine.fail();
-		return cont;
-	    } 
-	    if (c > 255)
-		throw new RepresentationException(this, 0, "byte");
-	    if (! a2.unify(new IntegerTerm(c), engine.trail))
-		return engine.fail();
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/PRED_get_code_2.java b/src/builtin/PRED_get_code_2.java
deleted file mode 100644
index da9f515..0000000
--- a/src/builtin/PRED_get_code_2.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
- * <code>get_code/2</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
-*/
-public class PRED_get_code_2 extends Predicate.P2 {
-    private static final IntegerTerm INT_EOF = new IntegerTerm(-1);
-
-    public PRED_get_code_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	Object stream = null;
-
-	// Char
-	a2 = a2.dereference(); 
-	if (! a2.isVariable()) {
-	    if (! a2.isInteger())
-		throw new IllegalTypeException(this, 2, "integer", a2);
-	    int n = ((IntegerTerm)a2).intValue();
-	    if (n != -1 && ! Character.isDefined(n))
-		throw new RepresentationException(this, 2, "in_character_code");
-	}
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// read single character
-	try {
-	    int c = ((PushbackReader)stream).read();
-	    if (c < 0) { // EOF
-		if (! a2.unify(INT_EOF, engine.trail))
-		    return engine.fail();
-		return cont;
-	    } 
-	    if (! Character.isDefined(c))
-		throw new RepresentationException(this, 0, "character");
-	    if (! a2.unify(new IntegerTerm(c), engine.trail))
-		return engine.fail();
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/PRED_nl_0.java b/src/builtin/PRED_nl_0.java
deleted file mode 100644
index 5d58fd8..0000000
--- a/src/builtin/PRED_nl_0.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import  com.googlecode.prolog_cafe.lang.*;
-/**
- * <code>nl/0</code><br>
- * @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
- * @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
- * @version 1.0
- */
-public class PRED_nl_0 extends Predicate {
-
-    public PRED_nl_0(Operation cont) {
-	this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-	engine.getCurrentOutput().println();
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_peek_byte_2.java b/src/builtin/PRED_peek_byte_2.java
deleted file mode 100644
index b8fcde6..0000000
--- a/src/builtin/PRED_peek_byte_2.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
-   <code>peek_byte/2</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.1
-   @since 1.1
-*/
-public class PRED_peek_byte_2 extends Predicate.P2 {
-    private static final IntegerTerm INT_EOF = new IntegerTerm(-1);
-
-    public PRED_peek_byte_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	Object stream = null;
-
-	// InByte
-	a2 = a2.dereference(); 
-	if (! a2.isVariable()) {
-	    if (! a2.isInteger())
-		throw new IllegalTypeException(this, 2, "in_byte", a2);
-	    int n = ((IntegerTerm)a2).intValue();
-	    if (n != -1 && (n < 0 || n > 255))
-		throw new RepresentationException(this, 2, "in_byte");
-	}
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// read single byte
-	try {
-	    int c = ((PushbackReader)stream).read();
-	    if (c < 0) { // EOF
-		if (! a2.unify(INT_EOF, engine.trail))
-		    return engine.fail();
-		return cont;
-	    } 
-	    if (c > 255)
-		throw new RepresentationException(this, 0, "byte");
-	    ((PushbackReader)stream).unread(c);
-	    if (! a2.unify(new IntegerTerm(c), engine.trail))
-		return engine.fail();
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/PRED_peek_char_2.java b/src/builtin/PRED_peek_char_2.java
deleted file mode 100644
index cb7330c..0000000
--- a/src/builtin/PRED_peek_char_2.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
-   <code>peek_char/2</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-public class PRED_peek_char_2 extends Predicate.P2 {
-    private static final SymbolTerm SYM_EOF = SymbolTerm.intern("end_of_file");
-
-    public PRED_peek_char_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    boolean inCharacter(Term t) {
-	if (! t.isSymbol())
-	    return false;
-	if (t.equals(SYM_EOF))
-	    return true;
-	return ((SymbolTerm)t).name().length() == 1;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	Object stream = null;
-
-	// Char
-	a2 = a2.dereference(); 
-	if (! a2.isVariable() && ! inCharacter(a2))
-	    throw new IllegalTypeException(this, 2, "in_character", a2);
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// read single character
-	try {
-	    int c = ((PushbackReader)stream).read();
-	    if (c < 0) { // EOF
-		if (! a2.unify(SYM_EOF, engine.trail))
-		    return engine.fail();
-		return cont;
-	    } 
-	    if (! Character.isDefined(c))
-		throw new RepresentationException(this, 0, "character");
-	    ((PushbackReader)stream).unread(c);
-	    if (! a2.unify(SymbolTerm.create((char)c), engine.trail))
-		return engine.fail();
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/PRED_peek_code_2.java b/src/builtin/PRED_peek_code_2.java
deleted file mode 100644
index c19676f..0000000
--- a/src/builtin/PRED_peek_code_2.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
-   <code>peek_code/2</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-public class PRED_peek_code_2 extends Predicate.P2 {
-    private static final IntegerTerm INT_EOF = new IntegerTerm(-1);
-
-    public PRED_peek_code_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	Object stream = null;
-
-	// Char
-	a2 = a2.dereference(); 
-	if (! a2.isVariable()) {
-	    if (! a2.isInteger())
-		throw new IllegalTypeException(this, 2, "integer", a2);
-	    int n = ((IntegerTerm)a2).intValue();
-	    if (n != -1 && ! Character.isDefined(n))
-		throw new RepresentationException(this, 2, "in_character_code");
-	}
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// read single character
-	try {
-	    int c = ((PushbackReader)stream).read();
-	    if (c < 0) { // EOF
-		if (! a2.unify(INT_EOF, engine.trail))
-		    return engine.fail();
-		return cont;
-	    } 
-	    if (! Character.isDefined(c))
-		throw new RepresentationException(this, 0, "character");
-	    ((PushbackReader)stream).unread(c);
-	    if (! a2.unify(new IntegerTerm(c), engine.trail))
-		return engine.fail();
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/PRED_put_byte_2.java b/src/builtin/PRED_put_byte_2.java
deleted file mode 100644
index 7b9dee8..0000000
--- a/src/builtin/PRED_put_byte_2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
-   <code>put_byte/2</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.1
-   @since 1.1
-*/
-public class PRED_put_byte_2 extends Predicate.P2 {
-    public PRED_put_byte_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	int c;
-	Object stream = null;
-
-	// Byte
-	a2 = a2.dereference(); 
-	if (a2.isVariable())
-	    throw new PInstantiationException(this, 2);
-	if (! a2.isInteger())
-	    throw new IllegalTypeException(this, 2, "byte", a2);
-	c = ((IntegerTerm)a2).intValue();
-	if (c < 0 || c > 255)
-	    throw new IllegalTypeException(this, 2, "byte", a2);
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PrintWriter))
-	    throw new PermissionException(this, "output", "stream", a1, "");
-	// print single byte
-	((PrintWriter) stream).print((char)c);
-	return cont;
-    }
-}
diff --git a/src/builtin/PRED_set_input_1.java b/src/builtin/PRED_set_input_1.java
deleted file mode 100644
index 6a215aa..0000000
--- a/src/builtin/PRED_set_input_1.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.PushbackReader;
-/**
-   <code>set_input/1</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-public class PRED_set_input_1 extends Predicate.P1 {
-    public PRED_set_input_1(Term a1, Operation cont) {
-        arg1 = a1;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1;
-        a1 = arg1;
-	Object stream = null;
-
-	a1 = a1.dereference();
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	engine.setCurrentInput((PushbackReader)stream);
-        return cont;
-    }
-}
diff --git a/src/builtin/PRED_set_output_1.java b/src/builtin/PRED_set_output_1.java
deleted file mode 100644
index 656861b..0000000
--- a/src/builtin/PRED_set_output_1.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.PrintWriter;
-/**
-   <code>set_output/1</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-public class PRED_set_output_1 extends Predicate.P1 {
-    public PRED_set_output_1(Term a1, Operation cont) {
-        arg1 = a1;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1;
-        a1 = arg1;
-	Object stream = null;
-
-	a1 = a1.dereference();
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PrintWriter))
-	    throw new PermissionException(this, "output", "stream", a1, "");
-	engine.setCurrentOutput((PrintWriter)stream);
-        return cont;
-    }
-}
diff --git a/src/builtin/PRED_skip_2.java b/src/builtin/PRED_skip_2.java
deleted file mode 100644
index cded854..0000000
--- a/src/builtin/PRED_skip_2.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.googlecode.prolog_cafe.builtin;
-import com.googlecode.prolog_cafe.lang.*;
-import java.io.*;
-/**
-   <code>skip/2</code><br>
-   @author Mutsunori Banbara (banbara@kobe-u.ac.jp)
-   @author Naoyuki Tamura (tamura@kobe-u.ac.jp)
-   @version 1.0
-*/
-public class PRED_skip_2 extends Predicate.P2 {
-    private static final IntegerTerm INT_EOF = new IntegerTerm(-1);
-
-    public PRED_skip_2(Term a1, Term a2, Operation cont) {
-        arg1 = a1;
-        arg2 = a2;
-        this.cont = cont;
-    }
-
-    public Operation exec(Prolog engine) {
-        engine.setB0();
-        Term a1, a2;
-        a1 = arg1;
-        a2 = arg2;
-	int n;
-	Object stream = null;
-	
-	// Char
-	a2 = a2.dereference(); 
-	if (a2.isVariable())
-	    throw new PInstantiationException(this, 2);
-	if (! a2.isInteger()) {
-	    try {
-		a2 = Arithmetic.evaluate(a2);
-	    } catch (BuiltinException e) {
-		e.goal = this;
-		e.argNo = 2;
-		throw e;
-	    }
-	}
-	n = ((NumberTerm)a2).intValue();
-	if (! Character.isDefined(n))
-	    throw new RepresentationException(this, 2, "character_code");
-	// S_or_a
-	a1 = a1.dereference(); 
-	if (a1.isVariable()) {
-	    throw new PInstantiationException(this, 1);
-	} else if (a1.isSymbol()) {
-	    if (! engine.getStreamManager().containsKey(a1))
-		throw new ExistenceException(this, 1, "stream", a1, "");
-	    stream = ((JavaObjectTerm) engine.getStreamManager().get(a1)).object();
-	} else if (a1.isJavaObject()) {
-	    stream = ((JavaObjectTerm) a1).object();
-	} else {
-	    throw new IllegalDomainException(this, 1, "stream_or_alias", a1);
-	}
-	if (! (stream instanceof PushbackReader))
-	    throw new PermissionException(this, "input", "stream", a1, "");
-	// skip
-	try {
-	    PushbackReader in = (PushbackReader) stream;
-	    int c = in.read();
-	    while(c != n) {
-		c = in.read();
-		if (c == -1) // EOF
-		    return cont;
-		if (! Character.isDefined(c))
-		    throw new RepresentationException(this, 0, "character");
-	    } 
-	    return cont;
-	} catch (IOException e) {
-	    throw new TermException(new JavaObjectTerm(e));
-	}
-    }
-}
diff --git a/src/builtin/builtins.pl b/src/builtin/builtins.pl
index 3349f93..8e116cb 100644
--- a/src/builtin/builtins.pl
+++ b/src/builtin/builtins.pl
@@ -385,10 +385,6 @@
 	hash_contains_key(P, PI),
 	'$get_indices'(P, PI, H, RevRefs),
 	'$get_instances'(RevRefs, Cls_Refs),
-	% ???
-	%length(Cls_Refs,N),
-	%'$fast_write'([clause_internal,N,for,P,PI]),nl,
-	%
 	'$clause_internal0'(Cls_Refs, Cl, Ref).
 
 '$clause_internal0'([], _, _) :- fail.
@@ -462,7 +458,6 @@
 	'$check_procedure_permission'(P:PI, modify, static_procedure, assertz(T)),
 	copy_term(Cl, NewCl),
 	'$insert'(NewCl, Ref),
-	%'$fast_write'([intert,NewCl,Ref]), nl, %???
 	'$update_indexing'(P, PI, Cl, Ref, 'z'),
 	fail.
 assertz(_).
@@ -473,7 +468,6 @@
 	'$check_procedure_permission'(P:PI, modify, static_procedure, asserta(T)),
 	copy_term(Cl, NewCl),
 	'$insert'(NewCl, Ref),
-	%'$fast_write'([insert,NewCl,Ref]), nl, %???
 	'$update_indexing'(P, PI, Cl, Ref, 'a'),
 	fail.
 asserta(_).
@@ -484,7 +478,6 @@
 	'$check_procedure_permission'(P:PI, modify, static_procedure, abolish(T)),
 	'$new_indexing_hash'(P, PI, IH),
 	hash_get(IH, all, Refs),
-	%'$fast_write'([erase_all,Refs]), nl, %???
 	'$erase_all'(Refs),
 	hash_remove(P, PI),
 	fail.
@@ -497,7 +490,6 @@
 	T = (H :- _),
 	'$clause_internal'(P, PI, H, Cl0, Ref),
 	copy_term(Cl0, T),
-	%'$fast_write'([erase,Cl0,Ref]), nl, %???
 	'$erase'(Ref),
 	'$rehash_indexing'(P, PI, Ref).
 
@@ -507,7 +499,6 @@
 	'$check_procedure_permission'(P:PI, access, static_procedure, retractall(Head)),
 	'$clause_internal'(P, PI, H, Cl, Ref),
 	copy_term(Cl, (H :- _)),
-	%'$fast_write'([erase,Cl,Ref]), nl, %???
 	'$erase'(Ref),
 	'$rehash_indexing'(P, PI, Ref),
 	fail.
@@ -626,7 +617,6 @@
 '$update_indexing'(P, PI, Cl, Ref, A_or_Z) :-
 	'$new_indexing_hash'(P, PI, IH),
 	'$gen_indexing_keys'(Cl, IH, Keys),
-	%'$fast_write'([update_indexing,P,PI,Cl,Ref,Keys]), nl, %???
 	'$update_indexing_hash'(A_or_Z, Keys, IH, Ref).
 
 '$gen_indexing_keys'((H :- _), _, [all]) :- atom(H), !.
@@ -665,7 +655,6 @@
 '$rehash_indexing'(P, PI, Ref) :-
 	'$new_indexing_hash'(P, PI, IH),
 	hash_keys(IH, Keys),
-	%'$fast_write'([rehash_indexing,P,PI,Keys]), nl, %???
 	'$remove_index_all'(Keys, IH, Ref).
 
 '$remove_index_all'([], _, _) :- !.
@@ -829,154 +818,23 @@
 	'$builtin_set_diff0'([X|Xs], Ys, [Y|L]).
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Stream selection and control
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%:- public current_input/1  (written in Java)
-%:- public current_output/1 (written in Java)
-%:- public set_input/1, set_output/1. (written in Java)
-%:- public open/4 (written in Java)
-:- public open/3.
-%:- public close/2 (written in Java)
-:- public close/1.
-%:- public flush_output/1.(written in Java)
-:- public flush_output/0.
-:- public stream_property/2.
-
-open(Source_sink, Mode, Stream) :- open(Source_sink, Mode, Stream, []).
-
-close(S_or_a) :- close(S_or_a, []).
-
-flush_output :- 
-    current_output(S),
-    flush_output(S).
-
-stream_property(Stream, Stream_property) :- 
-	var(Stream_property), 
-	!,
-	'$stream_property'(Stream, Stream_property).
-stream_property(Stream, Stream_property) :- 
-	'$stream_property_specifier'(Stream_property), 
-	!,
-	'$stream_property'(Stream, Stream_property).
-stream_property(Stream, Stream_property) :- 
-	illarg(domain(term,stream_property), stream_property(Stream, Stream_property), 2).
-
-'$stream_property'(Stream, Stream_property) :- 
-	var(Stream),
-	!,
-	'$get_stream_manager'(SM),
-	hash_map(SM, Map),
-	'$builtin_member'((Stream,Vs), Map),
-	java(Stream),
-	'$builtin_member'(Stream_property, Vs).
-'$stream_property'(Stream, Stream_property) :- 
-	java(Stream),
-	!,
-	'$get_stream_manager'(SM),
-	hash_get(SM, Stream, Vs),
-	'$builtin_member'(Stream_property, Vs).
-'$stream_property'(Stream, Stream_property) :- 
-	illarg(domain(stream,stream), stream_property(Stream, Stream_property), 1).
-
-'$stream_property_specifier'(input).
-'$stream_property_specifier'(output).
-'$stream_property_specifier'(alias(_)).
-'$stream_property_specifier'(mode(_)).
-'$stream_property_specifier'(type(_)).
-'$stream_property_specifier'(file_name(_)).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Character input/output
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%:- public get_char/2, get_code/2.   (written in Java)
-%:- public peek_char/2, peek_code/2. (written in Java)
-%:- public put_char/2, put_code/2.   (written in Java)
-%:- public nl/0.                     (written in Java)
-
-:- public get_char/1, get_code/1.
-:- public peek_char/1, peek_code/1.
-:- public put_char/1, put_code/1.
-:- public nl/1.
-
-get_char(Char)  :- current_input(S), get_char(S, Char).
-get_code(Code)  :- current_input(S), get_code(S, Code).
-
-peek_char(Char) :- current_input(S), peek_char(S, Char).
-peek_code(Code) :- current_input(S), peek_code(S, Code).
-
-put_char(Char)  :- current_output(S), put_char(S, Char).
-put_code(Code)  :- current_output(S), put_code(S, Code).
-
-nl(S) :- put_char(S, '\n').
-
-:- public get0/1, get0/2.
-:- public get/1.
-%:- public get/2.  (written in Java)
-:- public put/1, put/2.
-:- public tab/1.
-%:- public tab/2.  (written in Java)
-:- public skip/1.
-%:- public skip/2. (written in Java)
-
-get0(Code)  :- current_input(S), get_code(S, Code).
-get0(S_or_a, Code)  :- get_code(S_or_a, Code).
-
-get(Code)  :- current_input(S), get(S, Code).
-
-put(Exp)  :- current_output(S), put(S, Exp).
-put(S_or_a, Exp)  :- Code is Exp, put_code(S_or_a, Code).
-
-tab(N) :- current_output(S), tab(S, N).
-
-skip(N) :- current_input(S), skip(S, N).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Byte input/output
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-:- public get_byte/1, peek_byte/1, put_byte/1.
-%:- public get_byte/2.  % written in java
-%:- public peek_byte/2. % written in java
-%:- public put_byte/2.  % written in java
-
-get_byte(Byte) :-
-    current_input(S),
-    get_byte(S, Byte).
-
-peek_byte(Byte) :-
-    current_input(S),
-    peek_byte(S, Byte).
-
-put_byte(Byte) :-
-    current_output(S),
-    put_byte(S, Byte).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Term input/output (read)
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-:- public read/1, read/2.
-:- public read_with_variables/2, read_with_variables/3.
-:- public read_line/1.
+:- public read/2.
+:- public read_with_variables/3.
 %:- public read_line/2. (written in Java)
 :- dynamic '$tokens'/1. 
 
-read(X) :- current_input(S), read(S, X).
-
 read(S_or_a, X) :-
 	read_tokens(S_or_a, Tokens, _),
 	parse_tokens(X, Tokens),
 	!.
 
-read_with_variables(X, Vs) :- 
-	current_input(S), 
-	read_with_variables(S, X, Vs).
-
 read_with_variables(S_or_a, X, Vs) :-
 	read_tokens(S_or_a, Tokens, Vs),
 	parse_tokens(X, Tokens),
 	!.
 
-read_line(X) :- current_input(S), read_line(S, X).
-
 % read_token(S_or_a, Token) reads one token from the input, 
 % and unifies Token with:
 %   error(Atom), 
@@ -987,8 +845,6 @@
 %   var(Atom), 
 %   string(CharCodeList)
 
-%read_token(Token) :- current_input(S), read_token(S, Token).
-
 read_token(S_or_a, Token) :-
 	'$read_token0'(S_or_a, Type, Token0),
 	'$read_token1'([Type], Token0, Token).
@@ -1007,11 +863,6 @@
 % Token for a variable has a form of var(Name,Variable).
 % Vs is a list of Name=Variable pairs.
 
-%read_tokens(Tokens, Vs) :-
-%	current_input(Stream),
-%	'$read_tokens'(Stream, Tokens, Vs, []),
-%	!.
-
 read_tokens(Stream, Tokens, Vs) :-
 	'$read_tokens'(Stream, Tokens, Vs, []),
 	!.
@@ -1021,9 +872,8 @@
 	'$read_tokens1'(Stream, Token, Tokens, Vs, VI).
 
 '$read_tokens1'(Stream, error(Message), [], _, _) :-  !,
-	write('{SYNTAX ERROR}'), nl, 
-	write('** '), write(Message), write(' **'), nl,
 	'$read_tokens_until_fullstop'(Stream),
+	raise_exception(syntax_error(Message)),
 	fail.
 '$read_tokens1'(_Stream, end_of_file, [end_of_file,'.'], [], _) :- !.
 '$read_tokens1'(_Stream, '.', ['.'], [], _) :- !.
@@ -1267,71 +1117,27 @@
 '$parse_tokens_peep_next'(Next, S, S) :- S = [Next|_].
 
 '$parse_tokens_error'(Message, S0, _S) :-
-	write('{SYNTAX ERROR}'), nl, write('** '),
-	'$parse_tokens_write_message'(Message), write(' **'), nl,
-	'$parse_tokens_error1'([], S0),
 	clause('$tokens'(Tokens), _),
-	'$parse_tokens_error1'(Tokens, S0),
+	raise_exception(syntax_error(Message, at(Tokens))),
 	fail.
 
-'$parse_tokens_error1'([], _) :- !.
-'$parse_tokens_error1'(Tokens, S0) :- Tokens == S0, !,
-	nl, write('** here **'), nl,
-	'$parse_tokens_error1'(Tokens, []), nl.
-'$parse_tokens_error1'([Token|Tokens], S0) :-
-	'$parse_tokens_error2'(Token),
-	'$parse_tokens_error1'(Tokens, S0).
-
-'$parse_tokens_error2'(number(X)) :- !, write(X).
-'$parse_tokens_error2'(atom(X)) :- !, writeq(X).
-'$parse_tokens_error2'(var(X,_)) :- !, write(X).
-'$parse_tokens_error2'(string(X)) :- !,
-	write('"'), '$parse_tokens_write_string'(X), write('"').
-'$parse_tokens_error2'(X) :- write(X).
-
-'$parse_tokens_write_string'([]).
-'$parse_tokens_write_string'([C|Cs]) :- [C] = """", !,
-	put_code(C), put_code(C), '$parse_tokens_write_string'(Cs).
-'$parse_tokens_write_string'([C|Cs]) :- 
-	put_code(C), '$parse_tokens_write_string'(Cs).
-
-'$parse_tokens_write_message'([]).
-'$parse_tokens_write_message'([X|Xs]) :-
-	write(X), write(' '), '$parse_tokens_write_message'(Xs).
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Term input/output (write)
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-:- public write/1, write/2.
-:- public writeq/1, writeq/2.
-:- public write_canonical/1, write_canonical/2.
-:- public write_term/2, write_term/3.
-
-write(Term) :-
-	current_output(S),
-	write_term(S, Term, [numbervars(true)]).
+:- public write/2.
+:- public writeq/2.
+:- public write_canonical/2.
+:- public write_term/3.
 
 write(S_or_a, Term) :-
 	write_term(S_or_a, Term, [numbervars(true)]).
 
-writeq(Term) :-
-	current_output(S),
-	write_term(S, Term, [quoted(true),numbervars(true)]).
-
 writeq(S_or_a, Term) :-
 	write_term(S_or_a, Term, [quoted(true),numbervars(true)]).
 
-write_canonical(Term) :-
-	current_output(S),
-	write_term(S, Term, [quoted(true),ignore_ops(true)]).
-
 write_canonical(S_or_a, Term) :-
 	write_term(S_or_a, Term, [quoted(true),ignore_ops(true)]).
 
-write_term(Term, Options) :-
-	current_output(S),
-	write_term(S, Term, Options).
-
 write_term(S_or_a, Term, Options) :-
 	'$write_term'(S_or_a, Term, Options),
 	fail.
@@ -1763,16 +1569,12 @@
 current_prolog_flag(Flag, Term) :- 
 	illarg(type(atom), current_prolog_flag(Flag,Term), 1).
 
-% '$prolog_impl_flag'(bounded,     _, changeable(no)). 
 '$prolog_impl_flag'(max_integer, _, changeable(no)).
 '$prolog_impl_flag'(min_integer, _, changeable(no)).
-% '$prolog_impl_flag'(integer_rounding_function, [down,toward_zero], changeable(no)).
-% '$prolog_impl_flag'(char_conversion, [on,off], changeable(no)).
 '$prolog_impl_flag'(debug, [on,off], changeable(yes)).
 '$prolog_impl_flag'(max_arity, _, changeable(no)).
 '$prolog_impl_flag'(unknown, [error,fail,warning], changeable(yes)).
 '$prolog_impl_flag'(double_quotes, [chars,codes,atom], changeable(no)).
-'$prolog_impl_flag'(print_stack_trace, [on,off], changeable(yes)).
 
 :- public halt/0.
 :- public abort/0.
@@ -2018,97 +1820,6 @@
 '$statistics_mode'(trail).
 '$statistics_mode'(choice).
 
-print_message(Type, Message) :- var(Type), !,
-	illarg(var, print_message(Type,Message), 1).
-print_message(error, Message) :- !, 
-	'$error_message'(Message).
-print_message(info,  Message) :- !,
-	'$fast_write'('{'), 
-	'$builtin_message'(Message), 
-	'$fast_write'('}'), nl.
-print_message(warning, Message) :- !,
-	'$fast_write'('{WARNING: '), 
-	'$builtin_message'(Message), 
-	'$fast_write'('}'), nl.
-
-'$error_message'(instantiation_error(Goal,0)) :- !,
-	'$fast_write'('{INSTANTIATION ERROR: '), 
-	'$write_goal'(Goal), 
-	'$fast_write'('}'), nl.
-'$error_message'(instantiation_error(Goal,ArgNo)) :- !,
-	'$fast_write'('{INSTANTIATION ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo), 
-	'$fast_write'('}'), nl.
-'$error_message'(type_error(Goal,ArgNo,Type,Culprit)) :- !,
-	'$fast_write'('{TYPE ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo), 
-	'$fast_write'(': expected '), '$fast_write'(Type),
-	'$fast_write'(', found '), write(Culprit),
-	'$fast_write'('}'), nl.
-'$error_message'(domain_error(Goal,ArgNo,Domain,Culprit)) :- !,
-	'$fast_write'('{DOMAIN ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
-	'$fast_write'(': expected '), '$fast_write'(Domain),
-	'$fast_write'(', found '), write(Culprit),
-	'$fast_write'('}'), nl.
-'$error_message'(existence_error(_Goal,0,ObjType,Culprit,_Message)) :- !,
-	'$fast_write'('{EXISTENCE ERROR: '),
-	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit), '$fast_write'(' does not exist'),
-	'$fast_write'('}'), nl.
-'$error_message'(existence_error(Goal,ArgNo,ObjType,Culprit,_Message)) :- !,
-	'$fast_write'('{EXISTENCE ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
-	'$fast_write'(': '), 
-	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit), '$fast_write'(' does not exist'),
-	'$fast_write'('}'), nl.
-'$error_message'(permission_error(Goal,Operation,ObjType,Culprit,Message)) :- !, 
-	'$fast_write'('{PERMISSION ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - can not '), '$fast_write'(Operation), '$fast_write'(' '), 
-	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit), 
-	'$fast_write'(': '), '$fast_write'(Message),
-	'$fast_write'('}'), nl.
-'$error_message'(representation_error(Goal,ArgNo,Flag)) :- !, 
-	'$fast_write'('{REPRESENTATION ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo), 
-	'$fast_write'(': limit of '), '$fast_write'(Flag), '$fast_write'(' is breached'),
-	'$fast_write'('}'), nl.
-'$error_message'(evaluation_error(Goal,ArgNo,Type)) :- !, 
-	'$fast_write'('{EVALUATION ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo), 
-	'$fast_write'(', found '), '$fast_write'(Type),
-	'$fast_write'('}'), nl.
-'$error_message'(syntax_error(Goal,ArgNo,Type,Culprit,_Message)) :- !,
-	'$fast_write'('{SYNTAX ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo), 
-	'$fast_write'(': expected '), '$fast_write'(Type),
-	'$fast_write'(', found '), write(Culprit),
-	'$fast_write'('}'), nl.
-'$error_message'(system_error(Message)) :- !,
-	'$fast_write'('{SYSTEM ERROR: '), write(Message), '$fast_write'('}'), nl.
-'$error_message'(internal_error(Message)) :- !,
-	'$fast_write'('{INTERNAL ERROR: '), write(Message), '$fast_write'('}'), nl.
-'$error_message'(java_error(Goal,ArgNo,Exception)) :- !,
-	'$fast_write'('{JAVA ERROR: '),
-	'$write_goal'(Goal), 
-	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
-	'$fast_write'(', found '), '$write_goal'(Exception),
-	'$fast_write'('}'), nl,
-	'$print_stack_trace'(Exception).
-'$error_message'(Message) :- 
-	'$fast_write'('{'), write(Message), '$fast_write'('}'), nl.
-
-'$write_goal'(Goal) :- java(Goal), !, 
-	current_output(S), '$write_toString'(S, Goal).
-'$write_goal'(Goal) :- write(Goal).
-
 illarg(Msg, Goal, ArgNo) :- var(Msg), !,
 	illarg(var, Goal, ArgNo).
 illarg(var, Goal, ArgNo) :-
@@ -2183,10 +1894,6 @@
 '$builtin_member'(X, [X|_]).
 '$builtin_member'(X, [_|L]) :- '$builtin_member'(X, L).	
 
-'$builtin_message'([]) :- !.
-'$builtin_message'([M]) :- !, write(M).
-'$builtin_message'([M|Ms]) :- write(M), '$fast_write'(' '), '$builtin_message'(Ms).
-
 '$member_in_reverse'(X, [_|L]) :- '$member_in_reverse'(X, L).
 '$member_in_reverse'(X, [X|_]).
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/src/builtin/cafeteria.pl b/src/builtin/cafeteria.pl
index cb63123..7bb5f33 100644
--- a/src/builtin/cafeteria.pl
+++ b/src/builtin/cafeteria.pl
@@ -43,7 +43,7 @@
 	flush_output.
 
 '$cafeteria'(Goal) :-
-	read_with_variables(Goal, Vars),
+	read_with_variables('user_input', Goal, Vars),
 	'$process_order'(Goal, Vars).
 
 '$process_order'(G,               _) :- var(G), !, illarg(var, (?- G), 1).
@@ -68,7 +68,7 @@
 '$give_answers_with_prompt'(Vs) :-
 	'$give_an_answer'(Vs),
 	'$fast_write'(' ? '), flush_output,
-	read_line(Str),
+	read_line('user_input', Str),
 	Str \== ";",
 	nl.
 
@@ -92,7 +92,6 @@
 '$consult'(F) :-
 	'$prolog_file_name'(F, PF),
 	open(PF, read, In),
-	stream_property(In, file_name(File)),
 	print_message(info, [consulting,File,'...']),
 	statistics(runtime, _),
 	consult_stream(File, In),
@@ -176,7 +175,7 @@
 '$read_blocked'(G) :-
 	'$fast_write'(' ? '),
 	flush_output,
-	read_line(C),
+	read_line('user_input', C),
 	(C == [] -> DOP = 99 ; C = [DOP|_]),
 	'$debug_option'(DOP, G).
 
@@ -339,3 +338,108 @@
 	tab(N), write(')').
 '$write_dynamic_body'(B, N) :-
 	tab(N), writeq(B).
+
+
+print_message(Type, Message) :- var(Type), !,
+	illarg(var, print_message(Type,Message), 1).
+print_message(error, Message) :- !,
+	'$error_message'(Message).
+print_message(info,  Message) :- !,
+	'$fast_write'('{'),
+	'$builtin_message'(Message),
+	'$fast_write'('}'), nl.
+print_message(warning, Message) :- !,
+	'$fast_write'('{WARNING: '),
+	'$builtin_message'(Message),
+	'$fast_write'('}'), nl.
+
+write(M)  :- write('user_output', M).
+writeq(M) :- writeq('user_output', M).
+tab(S)    :- tab('user_output', S).
+nl        :- nl('user_output').
+flush_output :- flush_output('user_output').
+'$fast_write'(M) :- '$fast_write'('user_output', M).
+
+'$builtin_message'([]) :- !.
+'$builtin_message'([M]) :- !, write(M).
+'$builtin_message'([M|Ms]) :-
+	write(M),
+	'$fast_write'(' '),
+	'$builtin_message'(Ms).
+
+'$error_message'(instantiation_error(Goal,0)) :- !,
+	'$fast_write'('{INSTANTIATION ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'('}'), nl.
+'$error_message'(instantiation_error(Goal,ArgNo)) :- !,
+	'$fast_write'('{INSTANTIATION ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'('}'), nl.
+'$error_message'(type_error(Goal,ArgNo,Type,Culprit)) :- !,
+	'$fast_write'('{TYPE ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(': expected '), '$fast_write'(Type),
+	'$fast_write'(', found '), write(Culprit),
+	'$fast_write'('}'), nl.
+'$error_message'(domain_error(Goal,ArgNo,Domain,Culprit)) :- !,
+	'$fast_write'('{DOMAIN ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(': expected '), '$fast_write'(Domain),
+	'$fast_write'(', found '), write(Culprit),
+	'$fast_write'('}'), nl.
+'$error_message'(existence_error(_Goal,0,ObjType,Culprit,_Message)) :- !,
+	'$fast_write'('{EXISTENCE ERROR: '),
+	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit), '$fast_write'(' does not exist'),
+	'$fast_write'('}'), nl.
+'$error_message'(existence_error(Goal,ArgNo,ObjType,Culprit,_Message)) :- !,
+	'$fast_write'('{EXISTENCE ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(': '),
+	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit), '$fast_write'(' does not exist'),
+	'$fast_write'('}'), nl.
+'$error_message'(permission_error(Goal,Operation,ObjType,Culprit,Message)) :- !,
+	'$fast_write'('{PERMISSION ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - can not '), '$fast_write'(Operation), '$fast_write'(' '),
+	'$fast_write'(ObjType), '$fast_write'(' '), write(Culprit),
+	'$fast_write'(': '), '$fast_write'(Message),
+	'$fast_write'('}'), nl.
+'$error_message'(representation_error(Goal,ArgNo,Flag)) :- !,
+	'$fast_write'('{REPRESENTATION ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(': limit of '), '$fast_write'(Flag), '$fast_write'(' is breached'),
+	'$fast_write'('}'), nl.
+'$error_message'(evaluation_error(Goal,ArgNo,Type)) :- !,
+	'$fast_write'('{EVALUATION ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(', found '), '$fast_write'(Type),
+	'$fast_write'('}'), nl.
+'$error_message'(syntax_error(Goal,ArgNo,Type,Culprit,_Message)) :- !,
+	'$fast_write'('{SYNTAX ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(': expected '), '$fast_write'(Type),
+	'$fast_write'(', found '), write(Culprit),
+	'$fast_write'('}'), nl.
+'$error_message'(system_error(Message)) :- !,
+	'$fast_write'('{SYSTEM ERROR: '), write(Message), '$fast_write'('}'), nl.
+'$error_message'(internal_error(Message)) :- !,
+	'$fast_write'('{INTERNAL ERROR: '), write(Message), '$fast_write'('}'), nl.
+'$error_message'(java_error(Goal,ArgNo,Exception)) :- !,
+	'$fast_write'('{JAVA ERROR: '),
+	'$write_goal'(Goal),
+	'$fast_write'(' - arg '), '$fast_write'(ArgNo),
+	'$fast_write'(', found '), '$write_goal'(Exception),
+	'$fast_write'('}'), nl.
+'$error_message'(Message) :-
+	'$fast_write'('{'), write(Message), '$fast_write'('}'), nl.
+
+'$write_goal'(Goal) :- java(Goal), !,
+	'$write_toString'('user_error', Goal).
+'$write_goal'(Goal) :- write(Goal).
diff --git a/src/builtin/io.pl b/src/builtin/io.pl
new file mode 100644
index 0000000..16a1220
--- /dev/null
+++ b/src/builtin/io.pl
@@ -0,0 +1,26 @@
+:- package 'com.googlecode.prolog_cafe.builtin'.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Stream selection and control
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%:- public open/4 (written in Java)
+:- public open/3.
+%:- public close/2 (written in Java)
+:- public close/1.
+
+open(Source_sink, Mode, Stream) :- open(Source_sink, Mode, Stream, []).
+
+close(S_or_a) :- close(S_or_a, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Character input/output
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%:- public get_char/2.   (written in Java)
+%:- public put_char/2, put_code/2.   (written in Java)
+:- public nl/1.
+
+nl(S) :- put_char(S, '\n').
+
+%:- public get/2.  (written in Java)
+%:- public tab/2.  (written in Java)
+%:- public skip/2. (written in Java)
diff --git a/src/builtin/system.pl b/src/builtin/system.pl
index 2d80aff..101ff35 100644
--- a/src/builtin/system.pl
+++ b/src/builtin/system.pl
@@ -133,61 +133,27 @@
 system_predicate(bagof(_,_,_)).
 system_predicate(setof(_,_,_)).
 % Stream selection and control
-system_predicate(current_input(_)).
-system_predicate(current_output(_)).
-system_predicate(set_input(_)).
-system_predicate(set_output(_)).
 system_predicate(open(_,_,_)).
 system_predicate(open(_,_,_,_)).
 system_predicate(close(_)).
 system_predicate(close(_,_)).
 system_predicate(flush_output(_)).
-system_predicate(flush_output).
-system_predicate(stream_property(_,_)).
 % Character input/output
-system_predicate(get_char(_)).
 system_predicate(get_char(_,_)).
-system_predicate(get_code(_)).
 system_predicate(get_code(_,_)).
-system_predicate(peek_char(_)).
-system_predicate(peek_char(_,_)).
-system_predicate(peek_code(_)).
-system_predicate(peek_code(_,_)).
-system_predicate(put_char(_)).
 system_predicate(put_char(_,_)).
-system_predicate(put_code(_)).
 system_predicate(put_code(_,_)).
-system_predicate(nl).
 system_predicate(nl(_)).
-system_predicate(get0(_)).
-system_predicate(get0(_,_)).
-system_predicate(get(_)).
 system_predicate(get(_,_)).
-system_predicate(put(_)).
 system_predicate(put(_,_)).
-system_predicate(tab(_)).
 system_predicate(tab(_,_)).
-system_predicate(skip(_)).
 system_predicate(skip(_,_)).
-% Byte input/output
-system_predicate(get_byte(_)).
-system_predicate(get_byte(_,_)).
-system_predicate(peek_byte(_)).
-system_predicate(peek_byte(_,_)).
-system_predicate(put_byte(_)).
-system_predicate(put_byte(_,_)).
 % Term input/output
-system_predicate(read(_)).
 system_predicate(read(_,_)).
-system_predicate(read_with_variables(_,_)).
 system_predicate(read_with_variables(_,_,_)).
-system_predicate(read_line(_)).
 system_predicate(read_line(_,_)).
-system_predicate(write(_)).
 system_predicate(write(_,_)).
-system_predicate(writeq(_)).
 system_predicate(writeq(_,_)).
-system_predicate(write_canonical(_)).
 system_predicate(write_canonical(_,_)).
 system_predicate(write_term(_,_)).
 system_predicate(write_term(_,_,_)).
diff --git a/src/compiler/am2j.pl b/src/compiler/am2j.pl
index 96354be..8da39a3 100644
--- a/src/compiler/am2j.pl
+++ b/src/compiler/am2j.pl
@@ -49,14 +49,10 @@
 % :- module('com.googlecode.prolog_cafe.compiler.am2j', [main/0,am2j/1]).
 package(_). 
 :- package 'com.googlecode.prolog_cafe.compiler.am2j'.
-:- public main/0, am2j/1.
+:- public am2j/1.
 /*****************************************************************
   Main
 *****************************************************************/
-main :- 
-	read(X), 
-	am2j(X).
-
 am2j([File]) :- !, am2j([File, '.']).
 am2j([File,Dir]) :-
 	retractall(dest_dir(_)),
@@ -1228,11 +1224,7 @@
 for(M, M, N) :- M =< N.
 for(I, M, N) :- M =< N, M1 is M + 1, for(I, M1, N).
 
-%%% print
-am2j_error(M) :- am2j_message(['***','AM2JAVA','ERROR'|M]).
-
-am2j_message([]) :- nl, flush_output(user_output).
-am2j_message([M|Ms]) :- write(M), write(' '), am2j_message(Ms).
+am2j_error(M) :- raise_exception(am2j_error(M)).
 
 %%% list
 am2j_append([], Zs, Zs).
diff --git a/src/compiler/pl2am.pl b/src/compiler/pl2am.pl
index 96cac36..f588822 100644
--- a/src/compiler/pl2am.pl
+++ b/src/compiler/pl2am.pl
@@ -171,14 +171,10 @@
 % :- module('com.googlecode.prolog_cafe.compiler.pl2am', [main/0,pl2am/1]).
 :- package 'com.googlecode.prolog_cafe.compiler.pl2am'.
 
-:- public main/0, pl2am/1.
+:- public pl2am/1.
 /*****************************************************************
   Main
 *****************************************************************/
-main :- 
-	read(X), 
-	pl2am(X).
-
 pl2am([PrologFile, AsmFile, Opts]) :-
 	read_in_program(PrologFile, Opts),
 	open(AsmFile, write, Out),
@@ -287,11 +283,11 @@
 assert_clause((:- import G)) :- !,
 	assert_import(G).
 assert_clause((:- mode _G)) :- !,
-	pl2am_message(['*** WARNING',mode,declaration,is,not,supported,yet]).
+	pl2am_error([mode,declaration,is,not,supported,yet]).
 assert_clause((:- multifile _G)) :- !,
-	pl2am_message(['*** WARNING',multifile,declaration,is,not,supported,yet]).
+	pl2am_error([multifile,declaration,is,not,supported,yet]).
 assert_clause((:- block _G)) :- !,
-	pl2am_message(['*** WARNING',block,declaration,is,not,supported,yet]).
+	pl2am_error([block,declaration,is,not,supported,yet]).
 assert_clause((:- G)) :- !, 
 	call(G),
 	assert_declarations(G).
@@ -1683,11 +1679,7 @@
 /*****************************************************************
   Utilities
 *****************************************************************/
-%%% print
-pl2am_error(M) :- pl2am_message(['***','PL2ASM','ERROR'|M]).
-
-pl2am_message([]) :- nl, flush_output(user_output).
-pl2am_message([M|Ms]) :- write(M), write(' '), pl2am_message(Ms).
+pl2am_error(M) :- raise_exception(pl2am_error(M)).
 
 %%% format
 mode_expr([]).
diff --git a/src/lang/BlockingPrologControl.java b/src/lang/BlockingPrologControl.java
index 33e9219..907997d 100644
--- a/src/lang/BlockingPrologControl.java
+++ b/src/lang/BlockingPrologControl.java
@@ -371,9 +371,6 @@
   } catch (JavaInterruptedException e) {
      System.exit(1);
   } catch (PrologException e){
-      if (engine.getPrintStackTrace().equals("on"))
-      printStackTrace(e);
-      else
       System.out.println(e.toString());
   } catch (Exception e){
       printStackTrace(e);
diff --git a/src/lang/Prolog.java b/src/lang/Prolog.java
index c939c7e..5b62ee8 100644
--- a/src/lang/Prolog.java
+++ b/src/lang/Prolog.java
@@ -73,8 +73,6 @@
     protected String unknown;
     /** <font color="red">Not supported yet</font>. Prolog implementation flag: <code>double_quotes</code>. */
     protected String doubleQuotes;
-    /** Prolog implementation flag: <code>print_stack_trace</code>. */
-    protected String printStackTrace;
 
     /** Holds an exception term for <code>catch/3</code> and <code>throw/1</code>. */
     protected Term exception;
@@ -90,16 +88,6 @@
     /** The size of the pushback buffer used for creating input streams. */
     public static final int PUSHBACK_SIZE = 3;
 
-    /** Standard input stream. */
-    protected transient PushbackReader userInput;
-    /** Standard output stream. */
-    protected transient PrintWriter userOutput;
-    /** Standard error stream. */
-    protected transient PrintWriter userError;
-    /** Current input stream. */
-    protected transient PushbackReader currentInput;
-    /** Current output stream. */
-    protected transient PrintWriter currentOutput;
     /** Hashtable for managing input and output streams. */
     protected HashtableOfTerm streamManager;
 
@@ -121,35 +109,6 @@
     static final SymbolTerm SYM_INPUT      = SymbolTerm.intern("input");
     static final SymbolTerm SYM_OUTPUT     = SymbolTerm.intern("output");
     static final SymbolTerm SYM_TEXT       = SymbolTerm.intern("text");
-    static final SymbolTerm SYM_USERINPUT  = SymbolTerm.intern("user_input");
-    static final SymbolTerm SYM_USEROUTPUT = SymbolTerm.intern("user_output");
-    static final SymbolTerm SYM_USERERROR  = SymbolTerm.intern("user_error");
-
-    private static final PrintWriter NO_OUTPUT = new PrintWriter(new Writer() {
-      @Override
-      public void write(char[] cbuf, int off, int len) throws IOException {
-        throw new IOException("Prolog.Feature.IO disabled");
-      }
-
-      @Override
-      public void flush() throws IOException {
-      }
-
-      @Override
-      public void close() throws IOException {
-      }
-    });
-
-    private static final PushbackReader NO_INPUT = new PushbackReader(new Reader() {
-      @Override
-      public int read(char[] cbuf, int off, int len) throws IOException {
-        return -1;
-      }
-
-      @Override
-      public void close() throws IOException {
-      }
-    });
 
     public static enum Feature {
       /** Access to the local filesystem and console. */
@@ -186,9 +145,6 @@
      * This <code>initOnce</code> method is invoked in the constructor
      * and initializes the following instances:
      * <ul>
-     *   <li><code>userInput</code>
-     *   <li><code>userOutput</code>
-     *   <li><code>userError</code>
      *   <li><code>copyHash</code>
      *   <li><code>streamManager</code>
      * </ul>
@@ -203,28 +159,6 @@
     if (internalDB == null) internalDB = new InternalDatabase();
 
     streamManager = new HashtableOfTerm();
-
-    if (features.contains(Feature.IO)) {
-      userInput = new PushbackReader(new BufferedReader(new InputStreamReader(System.in)), PUSHBACK_SIZE);
-      userOutput = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)), true);
-      userError = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.err)), true);
-
-      streamManager.put(SYM_USERINPUT, new JavaObjectTerm(userInput));
-      streamManager.put(new JavaObjectTerm(userInput),
-        makeStreamProperty(SYM_READ, SYM_INPUT, SYM_USERINPUT, SYM_TEXT));
-
-      streamManager.put(SYM_USEROUTPUT, new JavaObjectTerm(userOutput));
-      streamManager.put(new JavaObjectTerm(userOutput),
-        makeStreamProperty(SYM_APPEND, SYM_OUTPUT, SYM_USEROUTPUT, SYM_TEXT));
-
-      streamManager.put(SYM_USERERROR, new JavaObjectTerm(userError));
-      streamManager.put(new JavaObjectTerm(userError),
-        makeStreamProperty(SYM_APPEND, SYM_OUTPUT, SYM_USERERROR, SYM_TEXT));
-    } else {
-      userInput = NO_INPUT;
-      userOutput = NO_OUTPUT;
-      userError = userOutput;
-    }
   }
 
     /** Initializes this Prolog engine. */
@@ -250,16 +184,12 @@
 	debug           = "off";
 	unknown         = "error";
 	doubleQuotes    = "codes";
-	printStackTrace = "off";
 
 	exception = NONE;
 	startRuntime = features.contains(Feature.STATISTICS_RUNTIME)
 	    ? System.currentTimeMillis()
 	    : 0;
 	previousRuntime = 0;
-
-	currentInput  = userInput;
-	currentOutput = userOutput;
     }
 
     /** Ensure a feature is enabled, throwing if not. */
@@ -415,19 +345,6 @@
 	return p;
     }
 
-    Term makeStreamProperty(SymbolTerm _mode, SymbolTerm io, SymbolTerm _alias, SymbolTerm _type) {
-	Term[] mode  = {_mode};
-	Term[] alias = {_alias};
-	Term[] type  = {_type};
-
-	Term t = Nil;
-	t = new ListTerm(new StructureTerm(SYM_MODE_1,  mode ), t);
-	t = new ListTerm(io, t);
-	t = new ListTerm(new StructureTerm(SYM_ALIAS_1, alias), t);
-	t = new ListTerm(new StructureTerm(SYM_TYPE_1,  type ), t);
-	return t;
-    }
-
     /** Returns the current time stamp of choice point frame. */
     public long    getCPFTimeStamp() { return CPFTimeStamp; }
 
@@ -466,11 +383,6 @@
     /** Sets the value of Prolog implementation flag: <code>double_quotes</code>. */
     public void setDoubleQuotes(String mode) { doubleQuotes = mode;}
 
-    /** Returns the value of Prolog implementation flag: <code>print_stack_trace</code>. */
-    public String getPrintStackTrace() { return printStackTrace; }
-    /** Sets the value of Prolog implementation flag: <code>print_stack_trace</code>. */
-    public void setPrintStackTrace(String mode) { printStackTrace = mode;}
-
     /** Returns the value of <code>exception</code>. This is used in <code>catch/3</code>. */
     public Term getException() { return exception; }
     /** Sets the value of <code>exception</code>. This is used in <code>throw/1</code>. */
@@ -484,23 +396,6 @@
     /** Sets the value of <code>previousRuntime</code>. This is used in <code>statistics/2</code>. */
     public void setPreviousRuntime(long t) { previousRuntime = t; }
 
-    /** Returns the standard input stream. */
-    public PushbackReader  getUserInput() { return userInput; }
-    /** Returns the standard output stream. */
-    public PrintWriter     getUserOutput() { return userOutput; }
-    /** Returns the standard error stream. */
-    public PrintWriter     getUserError() { return userError; }
-
-    /** Returns the current input stream. */
-    public PushbackReader  getCurrentInput() { return currentInput; }
-    /** Sets the current input stream to <code>in</code>. */
-    public void            setCurrentInput(PushbackReader in) { currentInput = in; }
-
-    /** Returns the current output stream. */
-    public PrintWriter     getCurrentOutput() { return currentOutput; }
-    /** Sets the current output stream to <code>out</code>. */
-    public void            setCurrentOutput(PrintWriter out) { currentOutput = out; }
-
     /** Returns the stream manager. */
     public HashtableOfTerm getStreamManager() { return streamManager; }
 
diff --git a/src/lang/PrologMain.java b/src/lang/PrologMain.java
index 1e41c38..956248e 100644
--- a/src/lang/PrologMain.java
+++ b/src/lang/PrologMain.java
@@ -1,4 +1,10 @@
 package com.googlecode.prolog_cafe.lang;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.PushbackReader;
 import java.util.StringTokenizer;
 /**
  * Prolog Cafe launcher.
@@ -47,7 +53,23 @@
 		usage();
 		System.exit(1);
 	    }
+
 	    p = new BlockingPrologControl();
+	    p.engine.init();
+		p.engine.getStreamManager().put(
+			SymbolTerm.intern("user_input"),
+			new JavaObjectTerm(new PushbackReader(new BufferedReader(
+				new InputStreamReader(System.in)),
+				Prolog.PUSHBACK_SIZE)));
+		p.engine.getStreamManager().put(
+			SymbolTerm.intern("user_output"),
+			new JavaObjectTerm(new PrintWriter(new BufferedWriter(
+				new OutputStreamWriter(System.out)), true)));
+		p.engine.getStreamManager().put(
+			SymbolTerm.intern("user_error"),
+			new JavaObjectTerm(new PrintWriter(new BufferedWriter(
+				new OutputStreamWriter(System.err)), true)));
+
 	    p.setPredicate(Prolog.BUILTIN, "initialization", arg1, arg2);
 	    for (boolean r = p.call(); r; r = p.redo()) {}
 	    System.exit(0);