diff --git a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/Console.java b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/Console.java
index 24b5716..22bc4dd 100644
--- a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/Console.java
+++ b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/Console.java
@@ -21,6 +21,7 @@
 import jline.*;
 import org.osgi.service.command.CommandSession;
 import org.osgi.service.command.Converter;
+import org.osgi.service.command.CommandProcessor;
 import org.apache.felix.karaf.gshell.console.ansi.AnsiOutputStream;
 import org.apache.felix.karaf.gshell.console.Completer;
 
@@ -28,6 +29,7 @@
 import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.io.PrintWriter;
+import java.io.PrintStream;
 import java.lang.reflect.Method;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
@@ -47,26 +49,30 @@
     private boolean running;
     private Runnable closeCallback;
     private Terminal terminal;
+    private InputStream consoleInput;
+    private InputStream in;
+    private PrintStream out;
+    private PrintStream err;
 
-    public Console(CommandSession session, Terminal term) throws Exception
+    public Console(CommandProcessor processor,
+                   InputStream in,
+                   PrintStream out,
+                   PrintStream err,
+                   Terminal term,
+                   Completer completer,
+                   Runnable closeCallback) throws Exception
     {
-        this(session, term, null);
-    }
-
-    public Console(CommandSession session, Terminal term, Completer completer) throws Exception
-    {
-        this(session, term, completer, null);
-    }
-
-    public Console(CommandSession session, Terminal term, Completer completer, Runnable closeCallback) throws Exception
-    {
-        this.session = session;
+        this.in = in;
+        this.out = out;
+        this.err = err;
+        this.consoleInput = new ConsoleInputStream();
+        this.session = processor.createSession(this.consoleInput, this.out, this.err);
         this.terminal = term == null ? new UnsupportedTerminal() : term;
         this.closeCallback = closeCallback;
-        reader = new ConsoleReader(new ConsoleInputStream(),
-                                   new PrintWriter(session.getConsole()),
+        reader = new ConsoleReader(this.consoleInput,
+                                   new PrintWriter(this.out),
                                    getClass().getResourceAsStream("keybinding.properties"),
-                                   terminal);
+                                   this.terminal);
         if (completer != null) {
             reader.addCompletor(new CompleterAsCompletor(completer));
         }
@@ -75,6 +81,10 @@
         pipe.setDaemon(true);
     }
 
+    public CommandSession getSession() {
+        return session;
+    }
+
     public void close() {
         //System.err.println("Closing");
         running = false;
@@ -217,7 +227,6 @@
         public void run()
         {
             try {
-                InputStream in = session.getKeyboard();
                 while (running)
                 {
                     try
@@ -226,13 +235,13 @@
                         if (c == -1 || c == 4)
                         {
                             //System.err.println("Received  " + c + " ... closing");
-                            session.getConsole().println("^D");
+                            err.println("^D");
                             queue.put(c);
                             return;
                         }
                         else if (c == 3)
                         {
-                            session.getConsole().println("^C");
+                            err.println("^C");
                             reader.getCursorBuffer().clearBuffer();
                             interrupt();
                             queue.put(c);
diff --git a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/ConsoleFactory.java b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/ConsoleFactory.java
index fcce928..81373eb 100644
--- a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/ConsoleFactory.java
+++ b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/ConsoleFactory.java
@@ -71,10 +71,6 @@
             InputStream in = unwrap(System.in);
             PrintStream out = unwrap(System.out);
             PrintStream err = unwrap(System.err);
-            CommandSession session = this.commandProcessor.createSession(
-                    in, new PrintStream(new AnsiOutputStream(out)), new PrintStream(new AnsiOutputStream(err)));
-            session.put("USER", "karaf");
-            session.put("APPLICATION", System.getProperty("karaf.name", "root"));
             Runnable callback = new Runnable() {
                 public void run() {
                     try {
@@ -84,7 +80,10 @@
                     }
                 }
             };
-            this.console = new Console(session, terminal, new AggregateCompleter(completers), callback);
+            this.console = new Console(commandProcessor, in, out, err, terminal, new AggregateCompleter(completers), callback);
+            CommandSession session = console.getSession();
+            session.put("USER", "karaf");
+            session.put("APPLICATION", System.getProperty("karaf.name", "root"));
             new Thread(console, "Karaf Shell Console Thread").start();
         }
     }
diff --git a/karaf/gshell/gshell-ssh/src/main/java/org/apache/felix/karaf/gshell/ssh/ShellFactoryImpl.java b/karaf/gshell/gshell-ssh/src/main/java/org/apache/felix/karaf/gshell/ssh/ShellFactoryImpl.java
index 5c4ff98..a4a2820 100644
--- a/karaf/gshell/gshell-ssh/src/main/java/org/apache/felix/karaf/gshell/ssh/ShellFactoryImpl.java
+++ b/karaf/gshell/gshell-ssh/src/main/java/org/apache/felix/karaf/gshell/ssh/ShellFactoryImpl.java
@@ -86,12 +86,10 @@
 
         public void start(final Environment env) throws IOException {
             try {
-                CommandSession session = commandProcessor.createSession(in, new PrintStream(out), new PrintStream(err));
-                session.put("APPLICATION", System.getProperty("karaf.name", "root"));
-                for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
-                    session.put(e.getKey(), e.getValue());
-                }
-                Console console = new Console(session,
+                Console console = new Console(commandProcessor,
+                                              in,
+                                              new PrintStream(out),
+                                              new PrintStream(err),
                                               new SshTerminal(env),
                                               new AggregateCompleter(completers),
                                               new Runnable() {
@@ -99,6 +97,11 @@
                                                       destroy();
                                                   }
                                               });
+                CommandSession session = console.getSession();
+                session.put("APPLICATION", System.getProperty("karaf.name", "root"));
+                for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
+                    session.put(e.getKey(), e.getValue());
+                }
                 new Thread(console).start();
             } catch (Exception e) {
                 throw (IOException) new IOException("Unable to start shell").initCause(e);
