Upgrade to karaf 4.x
diff --git a/assembly/pom.xml b/assembly/pom.xml
index a1eae0c..6b4ce7e 100644
--- a/assembly/pom.xml
+++ b/assembly/pom.xml
@@ -49,12 +49,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.karaf</groupId>
-      <artifactId>apache-karaf</artifactId>
+      <artifactId>apache-karaf-minimal</artifactId>
       <type>tar.gz</type>
     </dependency>
     <dependency>
       <groupId>org.apache.karaf</groupId>
-      <artifactId>apache-karaf</artifactId>
+      <artifactId>apache-karaf-minimal</artifactId>
       <type>zip</type>
     </dependency>
 
@@ -114,6 +114,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
+        <version>3.0.0</version>
         <executions>
           <execution>
             <id>unpack-unix</id>
@@ -125,9 +126,8 @@
               <artifactItems>
                 <artifactItem>
                   <groupId>org.apache.karaf</groupId>
-                  <artifactId>apache-karaf</artifactId>
+                  <artifactId>apache-karaf-minimal</artifactId>
                   <version>${karaf.version}</version>
-                  <classifier>minimal</classifier>
                   <type>tar.gz</type>
                   <outputDirectory>target/dependencies/unix</outputDirectory>
                 </artifactItem>
@@ -144,9 +144,8 @@
               <artifactItems>
                 <artifactItem>
                   <groupId>org.apache.karaf</groupId>
-                  <artifactId>apache-karaf</artifactId>
+                  <artifactId>apache-karaf-minimal</artifactId>
                   <version>${karaf.version}</version>
-                  <classifier>minimal</classifier>
                   <type>zip</type>
                   <outputDirectory>target/dependencies/win</outputDirectory>
                 </artifactItem>
@@ -157,26 +156,30 @@
       </plugin>
       <plugin>
         <groupId>org.apache.karaf.tooling</groupId>
-        <artifactId>features-maven-plugin</artifactId>
+        <artifactId>karaf-maven-plugin</artifactId>
         <version>${karaf.version}</version>
         <executions>
           <execution>
-            <id>add-features-to-repo</id>
+            <id>features-add-to-repository</id>
             <phase>compile</phase>
             <goals>
-              <goal>add-features-to-repo</goal>
+              <goal>features-add-to-repository</goal>
             </goals>
             <configuration>
               <descriptors>
                 <descriptor>
-                  mvn:org.apache.karaf.assemblies.features/standard/${karaf.version}/xml/features
+                  mvn:org.apache.karaf.features/standard/${karaf.version}/xml/features
                 </descriptor>
                 <descriptor>
                   mvn:org.apache.jclouds.karaf/jclouds-karaf/${jclouds.karaf.version}/xml/features
                 </descriptor>
+                <descriptor>
+                  mvn:org.apache.jclouds.karaf/jclouds-karaf-labs/${jclouds.karaf.version}/xml/features
+                </descriptor>
               </descriptors>
               <features>
                 <feature>config</feature>
+                <feature>shell-compat</feature>
                 <feature>jclouds</feature>
                 <feature>jclouds-commands</feature>
                 <feature>jclouds-compute</feature>
@@ -249,14 +252,14 @@
             <configuration>
               <tasks>
                 <replace token="#!/bin/bash" value="#!/bin/sh"
-                         dir="target/dependencies/unix/apache-karaf-${karaf.version}/bin">
+                         dir="target/dependencies/unix/apache-karaf-minimal-${karaf.version}/bin">
                   <include name="*"/>
                 </replace>
-                <replaceregexp file="target/dependencies/unix/apache-karaf-${karaf.version}/etc/config.properties"
+                <replaceregexp file="target/dependencies/unix/apache-karaf-minimal-${karaf.version}/etc/config.properties"
                                match="karaf.framework.equinox=*"
                                replace="#"
                                byline="true"/>
-                <replaceregexp file="target/dependencies/win/apache-karaf-${karaf.version}/etc/config.properties"
+                <replaceregexp file="target/dependencies/win/apache-karaf-minimal-${karaf.version}/etc/config.properties"
                                match="karaf.framework.equinox=*"
                                replace="#"
                                byline="true"/>
diff --git a/assembly/src/main/assembly/unix.xml b/assembly/src/main/assembly/unix.xml
index 095fe62..7ccf15e 100644
--- a/assembly/src/main/assembly/unix.xml
+++ b/assembly/src/main/assembly/unix.xml
@@ -28,7 +28,7 @@
     <fileSets>
         <!-- Strip the Karaf distribution -->
         <fileSet>
-            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
+            <directory>target/dependencies/unix/apache-karaf-minimal-${karaf.version}</directory>
             <outputDirectory>/</outputDirectory>
             <excludes>
                 <exclude>**/demos/**</exclude>
@@ -59,7 +59,7 @@
 
         <!-- Copy over bin/* scripts separately to get the correct file mode -->
         <fileSet>
-            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
+            <directory>target/dependencies/unix/apache-karaf-minimal-${karaf.version}</directory>
             <outputDirectory>/</outputDirectory>
             <includes>
                 <include>bin/*</include>
@@ -119,7 +119,7 @@
 
     <files>
         <file>
-            <source>${basedir}/target/dependencies/unix/apache-karaf-${karaf.version}/bin/karaf</source>
+            <source>${basedir}/target/dependencies/unix/apache-karaf-minimal-${karaf.version}/bin/karaf</source>
             <outputDirectory>/bin/</outputDirectory>
             <destName>jclouds-cli</destName>
             <fileMode>0755</fileMode>
diff --git a/assembly/src/main/assembly/win.xml b/assembly/src/main/assembly/win.xml
index 88053f2..44a2638 100644
--- a/assembly/src/main/assembly/win.xml
+++ b/assembly/src/main/assembly/win.xml
@@ -28,7 +28,7 @@
     <fileSets>
         <!-- Strip the Karaf distribution -->
         <fileSet>
-            <directory>target/dependencies/win/apache-karaf-${karaf.version}</directory>
+            <directory>target/dependencies/win/apache-karaf-minimal-${karaf.version}</directory>
             <outputDirectory>/</outputDirectory>
             <excludes>
                 <exclude>**/demos/**</exclude>
@@ -58,7 +58,7 @@
 
         <!-- Copy over bin/* scripts separately to get the correct file mode -->
         <fileSet>
-            <directory>target/dependencies/win/apache-karaf-${karaf.version}</directory>
+            <directory>target/dependencies/win/apache-karaf-minimal-${karaf.version}</directory>
             <outputDirectory>/</outputDirectory>
             <includes>
                 <include>bin/*</include>
@@ -117,7 +117,7 @@
 
     <files>
         <file>
-            <source>${basedir}/target/dependencies/win/apache-karaf-${karaf.version}/bin/karaf.bat</source>
+            <source>${basedir}/target/dependencies/win/apache-karaf-minimal-${karaf.version}/bin/karaf.bat</source>
             <outputDirectory>/bin/</outputDirectory>
             <destName>jclouds-cli.bat</destName>
             <lineEnding>dos</lineEnding>
diff --git a/assembly/src/main/filtered-resources/unix/bin/shell b/assembly/src/main/filtered-resources/unix/bin/shell
index d6ee688..4035bc3 100644
--- a/assembly/src/main/filtered-resources/unix/bin/shell
+++ b/assembly/src/main/filtered-resources/unix/bin/shell
@@ -266,6 +266,8 @@
     CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/jclouds/jclouds-core/${jclouds.version}/jclouds-core-${jclouds.version}.jar"
     CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/jclouds/jclouds-blobstore/${jclouds.version}/jclouds-blobstore-${jclouds.version}.jar"
     CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/karaf/shell/org.apache.karaf.shell.console/${karaf.version}/org.apache.karaf.shell.console-${karaf.version}.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/karaf/shell/org.apache.karaf.shell.core/${karaf.version}/org.apache.karaf.shell.core-${karaf.version}.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/jline/jline/2.14.1/jline-2.14.1.jar"
     #We set external libraries for logging.
     CLASSPATH="$CLASSPATH:$KARAF_HOME/lib/other/slf4j-api-${slf4j.version}.jar:$KARAF_HOME/lib/other/slf4j-log4j12-${slf4j.version}.jar:$KARAF_HOME/lib/other/log4j-${log4j.version}.jar"
     CLASSPATH="$CLASSPATH:$KARAF_HOME/etc/log4j.properties"
diff --git a/project/pom.xml b/project/pom.xml
index 4d94f9e..0693eb5 100644
--- a/project/pom.xml
+++ b/project/pom.xml
@@ -66,7 +66,7 @@
 
   <properties>
     <!-- Karaf Version Dependencies -->
-    <karaf.version>2.3.11</karaf.version>
+    <karaf.version>4.0.9</karaf.version>
     <pax.url.version>1.3.7</pax.url.version>
     <pax.logging.version>1.7.4</pax.logging.version>
     <felix.configadmin.version>1.8.0</felix.configadmin.version>
@@ -85,7 +85,7 @@
     <slf4j.version>1.7.7</slf4j.version>
     <!-- Plugin Versions -->
     <maven-antrun-plugin.version>1.7</maven-antrun-plugin.version>
-    <maven-assembly-plugin.version>2.2.1</maven-assembly-plugin.version>
+    <maven-assembly-plugin.version>3.0.0</maven-assembly-plugin.version>
     <maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version>
     <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>
     <maven-release-plugin.version>2.4</maven-release-plugin.version>
@@ -108,13 +108,13 @@
       <!-- NOTE, jclouds dependencies are not managed from here -->
       <dependency>
         <groupId>org.apache.karaf</groupId>
-        <artifactId>apache-karaf</artifactId>
+        <artifactId>apache-karaf-minimal</artifactId>
         <version>${karaf.version}</version>
         <type>tar.gz</type>
       </dependency>
       <dependency>
         <groupId>org.apache.karaf</groupId>
-        <artifactId>apache-karaf</artifactId>
+        <artifactId>apache-karaf-minimal</artifactId>
         <version>${karaf.version}</version>
         <type>zip</type>
       </dependency>
diff --git a/runner/src/main/java/org/jclouds/cli/runner/Main.java b/runner/src/main/java/org/jclouds/cli/runner/Main.java
index c2dde3e..4d0b9b9 100644
--- a/runner/src/main/java/org/jclouds/cli/runner/Main.java
+++ b/runner/src/main/java/org/jclouds/cli/runner/Main.java
@@ -49,9 +49,11 @@
 import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
 import org.apache.felix.service.command.CommandSession;
 import org.apache.felix.service.command.Function;
+import org.apache.felix.service.threadio.ThreadIO;
+import org.apache.karaf.shell.console.Console;
 import org.apache.karaf.shell.console.NameScoping;
-import org.apache.karaf.shell.console.jline.Console;
-import org.apache.karaf.shell.console.jline.TerminalFactory;
+import org.apache.karaf.shell.console.impl.jline.ConsoleImpl;
+import org.apache.karaf.shell.console.impl.jline.TerminalFactory;
 import org.fusesource.jansi.Ansi;
 import org.fusesource.jansi.AnsiConsole;
 import org.jclouds.blobstore.ContainerNotFoundException;
@@ -173,7 +175,7 @@
         InputStream in = unwrap(System.in);
         PrintStream out = wrap(unwrap(System.out));
         PrintStream err = wrap(unwrap(System.err));
-        run(commandProcessor, args, in, out, err);
+        run(commandProcessor, threadio, args, in, out, err);
     }
 
 
@@ -211,7 +213,7 @@
 
     }
 
-    private void run(final CommandProcessorImpl commandProcessor, String[] args, final InputStream in, final PrintStream out, final PrintStream err) throws Exception {
+    private void run(final CommandProcessorImpl commandProcessor, ThreadIO threadio, String[] args, final InputStream in, final PrintStream out, final PrintStream err) throws Exception {
 
         if (args.length > 0) {
             // Commands have the form: jclouds:category-action.
@@ -276,10 +278,9 @@
             session.execute(sb);
         } else {
             // We are going into full blown interactive shell mode.
-
             final TerminalFactory terminalFactory = new TerminalFactory();
             final Terminal terminal = terminalFactory.getTerminal();
-            Console console = createConsole(commandProcessor, in, out, err, terminal);
+            Console console = createConsole(commandProcessor, threadio, in, out, err, terminal);
             CommandSession session = console.getSession();
             session.put("USER", user);
             session.put("APPLICATION", application);
@@ -314,8 +315,8 @@
      * @return
      * @throws Exception
      */
-    protected Console createConsole(CommandProcessorImpl commandProcessor, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
-        return new Console(commandProcessor, in, out, err, terminal, null, null);
+    protected Console createConsole(CommandProcessorImpl commandProcessor, ThreadIO threadio, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
+        return new ConsoleImpl(commandProcessor, threadio, in, out, err, terminal, null, null, null, false);
     }
 
     /**