diff --git a/karaf/gshell/gshell-console/src/main/java/jline/AnsiWindowsTerminal.java b/karaf/gshell/gshell-console/src/main/java/jline/AnsiWindowsTerminal.java
new file mode 100644
index 0000000..5a2df14
--- /dev/null
+++ b/karaf/gshell/gshell-console/src/main/java/jline/AnsiWindowsTerminal.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jline;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+public class AnsiWindowsTerminal extends WindowsTerminal {
+
+    @Override
+    public boolean isANSISupported() {
+        return true;
+    }
+
+    @Override
+    public int readCharacter(InputStream in) throws IOException {
+        return in.read();
+    }
+
+    public int readDirectChar(InputStream in) throws IOException {
+        return super.readCharacter(in);
+    }
+
+}
diff --git a/karaf/gshell/gshell-console/src/main/java/jline/NoInterruptUnixTerminal.java b/karaf/gshell/gshell-console/src/main/java/jline/NoInterruptUnixTerminal.java
new file mode 100644
index 0000000..9093a40
--- /dev/null
+++ b/karaf/gshell/gshell-console/src/main/java/jline/NoInterruptUnixTerminal.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package jline;
+
+import java.io.IOException;
+
+public class NoInterruptUnixTerminal extends UnixTerminal {
+
+    @Override
+    public void initializeTerminal() throws IOException, InterruptedException {
+        super.initializeTerminal();
+        stty("intr undef");
+    }
+
+    @Override
+    public void restoreTerminal() throws Exception {
+        stty("intr ^C");
+        super.restoreTerminal();
+    }
+
+}
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 c1e726b..126c51a 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
@@ -30,6 +30,8 @@
 import jline.ConsoleReader;
 import jline.Terminal;
 import jline.UnsupportedTerminal;
+import jline.WindowsTerminal;
+import jline.AnsiWindowsTerminal;
 import org.apache.felix.karaf.gshell.console.Completer;
 import org.osgi.service.command.CommandProcessor;
 import org.osgi.service.command.CommandSession;
@@ -44,7 +46,7 @@
 
     private CommandSession session;
     private ConsoleReader reader;
-    private BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1024);
+    private BlockingQueue<Integer> queue;
     private boolean interrupt;
     private Thread pipe;
     private boolean running;
@@ -66,11 +68,13 @@
         this.in = in;
         this.out = out;
         this.err = err;
+        this.queue = new ArrayBlockingQueue<Integer>(1024);
+        this.terminal = term == null ? new UnsupportedTerminal() : term;
         this.consoleInput = new ConsoleInputStream();
         this.session = processor.createSession(this.consoleInput, this.out, this.err);
         this.session.put("SCOPE", "shell:osgi:*");
-        this.terminal = term == null ? new UnsupportedTerminal() : term;
         this.closeCallback = closeCallback;
+
         reader = new ConsoleReader(this.consoleInput,
                                    new PrintWriter(this.out),
                                    getClass().getResourceAsStream("keybinding.properties"),
@@ -227,7 +231,12 @@
                 {
                     try
                     {
-                        int c = in.read();
+                        int c;
+                        if (terminal instanceof AnsiWindowsTerminal) {
+                            c = ((AnsiWindowsTerminal) terminal).readDirectChar(in);
+                        } else {
+                            c = terminal.readCharacter(in);
+                        }
                         if (c == -1 || c == 4)
                         {
                             //System.err.println("Received  " + c + " ... closing");
diff --git a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/TerminalFactory.java b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/TerminalFactory.java
index 693a3ea..04da2f5 100644
--- a/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/TerminalFactory.java
+++ b/karaf/gshell/gshell-console/src/main/java/org/apache/felix/karaf/gshell/console/jline/TerminalFactory.java
@@ -1,13 +1,9 @@
 package org.apache.felix.karaf.gshell.console.jline;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-import java.io.IOException;
-
 import jline.Terminal;
-import jline.WindowsTerminal;
-import jline.UnixTerminal;
 import jline.UnsupportedTerminal;
+import jline.AnsiWindowsTerminal;
+import jline.NoInterruptUnixTerminal;
 
 public class TerminalFactory {
 
@@ -34,6 +30,7 @@
                 term = t;
             }
         } catch (Throwable e) {
+            System.out.println("Using an unsupported terminal: " + e.toString());
             term = new UnsupportedTerminal();
         }
     }
@@ -43,26 +40,4 @@
         term = null;
     }
 
-    public static class AnsiWindowsTerminal extends WindowsTerminal {
-        @Override
-        public boolean isANSISupported() {
-            return true;
-        }
-    }
-
-    public static class NoInterruptUnixTerminal extends UnixTerminal {
-        @Override
-        public void initializeTerminal() throws IOException, InterruptedException {
-            super.initializeTerminal();
-            stty("intr undef");
-        }
-
-        @Override
-        public void restoreTerminal() throws Exception {
-            stty("intr ^C");
-            super.restoreTerminal();
-        }
-
-    }
-
 }
