FELIX-1766: Refactor and enable AdminServiceMBean

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@828802 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/shell/admin/NOTICE b/karaf/admin/command/NOTICE
similarity index 100%
copy from karaf/shell/admin/NOTICE
copy to karaf/admin/command/NOTICE
diff --git a/karaf/admin/command/pom.xml b/karaf/admin/command/pom.xml
new file mode 100644
index 0000000..6a67a21
--- /dev/null
+++ b/karaf/admin/command/pom.xml
@@ -0,0 +1,102 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.felix.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.felix.karaf.admin</groupId>
+    <artifactId>org.apache.felix.karaf.admin.command</artifactId>
+    <packaging>bundle</packaging>
+    <version>1.1.0-SNAPSHOT</version>
+    <name>Apache Felix Karaf :: Admin Command</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix.karaf.admin</groupId>
+            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix.karaf.shell</groupId>
+            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${pom.artifactId}*;version=${pom.version}</Export-Package>
+                        <Import-Package>
+                            !${pom.artifactId}*,
+                            javax.management,
+                            javax.management.loading,
+                            org.osgi.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.felix.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/AdminCommandSupport.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/AdminCommandSupport.java
similarity index 86%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/AdminCommandSupport.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/AdminCommandSupport.java
index edfa425..617d1db 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/AdminCommandSupport.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/AdminCommandSupport.java
@@ -14,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.Instance;
 import org.apache.felix.karaf.shell.console.OsgiCommandSupport;
-import org.apache.felix.gogo.commands.Command;
 
 public abstract class AdminCommandSupport extends OsgiCommandSupport {
 
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ChangePortCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ChangePortCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.java
index b632742..e096399 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ChangePortCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ChangePortCommand.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ConnectCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.java
similarity index 96%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ConnectCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.java
index e5f2da6..bf48a72 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ConnectCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ConnectCommand.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Option;
 import org.apache.felix.gogo.commands.Argument;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.java
similarity index 94%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.java
index 194be21..a512fcb 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/CreateCommand.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import java.util.List;
 
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
 import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.karaf.shell.admin.InstanceSettings;
+import org.apache.felix.karaf.admin.InstanceSettings;
 
 
 /**
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/DestroyCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/DestroyCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.java
index a15edc9..88919cb 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/DestroyCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/DestroyCommand.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ListCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ListCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.java
index aacb030..bf15909 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/ListCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/ListCommand.java
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Option;
 import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.admin.Instance;
 
 /**
  * List available instances
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StartCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StartCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.java
index 125a4a7..c14947c 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StartCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StartCommand.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Option;
 import org.apache.felix.gogo.commands.Argument;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StopCommand.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StopCommand.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StopCommand.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StopCommand.java
index 5e0e078..1ad5789 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/StopCommand.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/StopCommand.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/completers/InstanceCompleter.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/completers/InstanceCompleter.java
similarity index 90%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/completers/InstanceCompleter.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/completers/InstanceCompleter.java
index 57c8db4..467989f 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/completers/InstanceCompleter.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/command/completers/InstanceCompleter.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.completers;
+package org.apache.felix.karaf.admin.command.completers;
 
 import java.util.List;
 
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.Instance;
 import org.apache.felix.karaf.shell.console.completer.StringsCompleter;
 import org.apache.felix.karaf.shell.console.Completer;
 
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/main/Execute.java b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.java
similarity index 85%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/main/Execute.java
rename to karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.java
index 997277e..5466d7c 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/main/Execute.java
+++ b/karaf/admin/command/src/main/java/org/apache/felix/karaf/admin/main/Execute.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.main;
+package org.apache.felix.karaf.admin.main;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -26,14 +26,14 @@
 import org.apache.felix.gogo.commands.Action;
 import org.apache.felix.gogo.commands.Command;
 import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
-import org.apache.felix.karaf.shell.admin.internal.AdminServiceImpl;
-import org.apache.felix.karaf.shell.admin.internal.commands.AdminCommandSupport;
-import org.apache.felix.karaf.shell.admin.internal.commands.CreateCommand;
-import org.apache.felix.karaf.shell.admin.internal.commands.DestroyCommand;
-import org.apache.felix.karaf.shell.admin.internal.commands.ListCommand;
-import org.apache.felix.karaf.shell.admin.internal.commands.StartCommand;
-import org.apache.felix.karaf.shell.admin.internal.commands.StopCommand;
-import org.apache.felix.karaf.shell.admin.internal.commands.ChangePortCommand;
+import org.apache.felix.karaf.admin.command.AdminCommandSupport;
+import org.apache.felix.karaf.admin.command.ChangePortCommand;
+import org.apache.felix.karaf.admin.command.CreateCommand;
+import org.apache.felix.karaf.admin.command.DestroyCommand;
+import org.apache.felix.karaf.admin.command.ListCommand;
+import org.apache.felix.karaf.admin.command.StartCommand;
+import org.apache.felix.karaf.admin.command.StopCommand;
+import org.apache.felix.karaf.admin.internal.AdminServiceImpl;
 import org.fusesource.jansi.AnsiConsole;
 
 public class Execute {
@@ -42,7 +42,7 @@
         CreateCommand.class,
         StartCommand.class,
         StopCommand.class,
-        DestroyCommand.class,  
+        DestroyCommand.class,
         ListCommand.class,
         ChangePortCommand.class};
     private static final Map<String, Class<?>> COMMANDS = new TreeMap<String, Class<?>>();
diff --git a/karaf/shell/admin/src/main/resources/OSGI-INF/blueprint/shell-admin.xml b/karaf/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
similarity index 70%
rename from karaf/shell/admin/src/main/resources/OSGI-INF/blueprint/shell-admin.xml
rename to karaf/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
index c79983f..e2c7a6b 100644
--- a/karaf/shell/admin/src/main/resources/OSGI-INF/blueprint/shell-admin.xml
+++ b/karaf/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
@@ -23,12 +23,12 @@
 
     <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/shell/v1.0.0">
         <command name="admin/create">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.CreateCommand">
+            <action class="org.apache.felix.karaf.admin.command.CreateCommand">
                 <property name="adminService" ref="adminService" />
             </action>
         </command>
         <command name="admin/connect">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.ConnectCommand">
+            <action class="org.apache.felix.karaf.admin.command.ConnectCommand">
                 <property name="adminService" ref="adminService" />
             </action>
             <completers>
@@ -37,12 +37,12 @@
             </completers>
         </command>
         <command name="admin/list">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.ListCommand">
+            <action class="org.apache.felix.karaf.admin.command.ListCommand">
                 <property name="adminService" ref="adminService" />
             </action>
         </command>
         <command name="admin/start">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.StartCommand">
+            <action class="org.apache.felix.karaf.admin.command.StartCommand">
                 <property name="adminService" ref="adminService" />
             </action>
             <completers>
@@ -51,7 +51,7 @@
             </completers>
         </command>
         <command name="admin/stop">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.StopCommand">
+            <action class="org.apache.felix.karaf.admin.command.StopCommand">
                 <property name="adminService" ref="adminService" />
             </action>
             <completers>
@@ -60,7 +60,7 @@
             </completers>
         </command>
         <command name="admin/destroy">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.DestroyCommand">
+            <action class="org.apache.felix.karaf.admin.command.DestroyCommand">
                 <property name="adminService" ref="adminService" />
             </action>
             <completers>
@@ -69,7 +69,7 @@
             </completers>
         </command>
         <command name="admin/change-port">
-            <action class="org.apache.felix.karaf.shell.admin.internal.commands.ChangePortCommand">
+            <action class="org.apache.felix.karaf.admin.command.ChangePortCommand">
                 <property name="adminService" ref="adminService" />
             </action>
             <completers>
@@ -79,17 +79,10 @@
         </command>
     </command-bundle>
 
-    <bean id="adminService" class="org.apache.felix.karaf.shell.admin.internal.AdminServiceImpl" init-method="init">
-        <property name="storageLocation" value="${karaf.home}/instances" />
-    </bean>
+    <reference id="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
 
-    <bean id="instanceCompleter" class="org.apache.felix.karaf.shell.admin.internal.completers.InstanceCompleter">
+    <bean id="instanceCompleter" class="org.apache.felix.karaf.admin.command.completers.InstanceCompleter">
         <property name="adminService" ref="adminService" />
     </bean>
     
-    <service ref="adminService" interface="org.apache.felix.karaf.shell.admin.AdminService" />
-
-    <!-- Allow the use of system properties -->
-    <ext:property-placeholder />
-
 </blueprint>
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommandTest.java b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.java
similarity index 89%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommandTest.java
rename to karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.java
index 53cffce..b467713 100644
--- a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommandTest.java
+++ b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/command/CreateCommandTest.java
@@ -14,15 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal.commands;
+package org.apache.felix.karaf.admin.command;
 
 import java.util.Arrays;
 import java.util.Collections;
 
 import junit.framework.TestCase;
 
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.InstanceSettings;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.InstanceSettings;
 import org.easymock.EasyMock;
 
 public class CreateCommandTest extends TestCase {
@@ -40,7 +40,7 @@
         
         EasyMock.verify(adminService); // check precondition
         EasyMock.reset(adminService);
-        InstanceSettings expectedIS = 
+        InstanceSettings expectedIS =
             new InstanceSettings(9941, "top", Collections.singletonList("http://something"), Arrays.asList("abc", "def"));
         EasyMock.expect(adminService.createInstance("myInstance", expectedIS)).andReturn(null);
         EasyMock.replay(adminService);
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/main/ExecuteTest.java b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.java
similarity index 95%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/main/ExecuteTest.java
rename to karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.java
index 7e4fc1a..268549b 100644
--- a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/main/ExecuteTest.java
+++ b/karaf/admin/command/src/test/java/org/apache/felix/karaf/admin/main/ExecuteTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.main;
+package org.apache.felix.karaf.admin.main;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -28,9 +28,9 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.internal.AdminServiceImpl;
-import org.apache.felix.karaf.shell.admin.internal.commands.AdminCommandSupport;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.command.AdminCommandSupport;
+import org.apache.felix.karaf.admin.internal.AdminServiceImpl;
 import org.easymock.IAnswer;
 import org.easymock.classextension.EasyMock;
 
diff --git a/karaf/shell/admin/NOTICE b/karaf/admin/core/NOTICE
similarity index 100%
rename from karaf/shell/admin/NOTICE
rename to karaf/admin/core/NOTICE
diff --git a/karaf/shell/admin/pom.xml b/karaf/admin/core/pom.xml
similarity index 83%
rename from karaf/shell/admin/pom.xml
rename to karaf/admin/core/pom.xml
index c0ecde3..86bff82 100644
--- a/karaf/shell/admin/pom.xml
+++ b/karaf/admin/core/pom.xml
@@ -21,20 +21,16 @@
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
-        <groupId>org.apache.felix.karaf.shell</groupId>
-        <artifactId>shell</artifactId>
+        <groupId>org.apache.felix.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
         <version>1.1.0-SNAPSHOT</version>
     </parent>
 
-    <groupId>org.apache.felix.karaf.shell</groupId>
-    <artifactId>org.apache.felix.karaf.shell.admin</artifactId>
+    <groupId>org.apache.felix.karaf.admin</groupId>
+    <artifactId>org.apache.felix.karaf.admin.core</artifactId>
     <packaging>bundle</packaging>
     <version>1.1.0-SNAPSHOT</version>
-    <name>Apache Felix Karaf :: Shell Admin</name>
-
-    <description>
-        Provides administration commands
-    </description>
+    <name>Apache Felix Karaf :: Admin Core</name>
 
     <properties>
         <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
@@ -42,11 +38,6 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
-        </dependency>
-
-        <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.osgi.core</artifactId>
             <scope>provided</scope>
@@ -59,21 +50,38 @@
         </dependency>
 
         <dependency>
-            <groupId>org.ops4j.pax.logging</groupId>
-            <artifactId>pax-logging-api</artifactId>
-            <scope>test</scope>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
         </dependency>
 
         <dependency>
+            <groupId>org.apache.felix.karaf.shell</groupId>
+            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix.karaf.shell</groupId>
+            <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.servicemix.bundles</groupId>
             <artifactId>org.apache.servicemix.bundles.junit</artifactId>
             <scope>test</scope>
         </dependency>
-        
         <dependency>
             <groupId>org.easymock</groupId>
-            <artifactId>easymockclassextension</artifactId>
-            <version>${easymock.version}</version>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
@@ -86,15 +94,6 @@
                     <include>**/*</include>
                 </includes>
             </resource>
-            <!--
-            <resource>
-                <directory>${pom.basedir}/src/main/filtered-resources</directory>
-                <filtering>true</filtering>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-            </resource>
-            -->
         </resources>
         <filters>
             <filter>target/filter.txt</filter>
@@ -145,7 +144,7 @@
                             <goal>copy-resources</goal>
                         </goals>
                         <configuration>
-                            <outputDirectory>${basedir}/target/classes/org/apache/felix/karaf/shell/admin/etc</outputDirectory>
+                            <outputDirectory>${basedir}/target/classes/org/apache/felix/karaf/admin/etc</outputDirectory>
                             <resources>
                                 <resource>
                                     <directory>../../assembly/src/main/distribution/text/etc/</directory>
@@ -170,7 +169,7 @@
                             <goal>copy-resources</goal>
                         </goals>
                         <configuration>
-                            <outputDirectory>${basedir}/target/classes/org/apache/felix/karaf/shell/admin/etc</outputDirectory>
+                            <outputDirectory>${basedir}/target/classes/org/apache/felix/karaf/admin/etc</outputDirectory>
                             <resources>
                                 <resource>
                                     <directory>../../assembly/src/main/filtered-resources/etc</directory>
@@ -184,29 +183,31 @@
                         </configuration>
                     </execution>
                 </executions>
-            </plugin>            
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <configuration>
-                    <mainClass>Main</mainClass>
-                </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
                 <configuration>
                     <instructions>
-                        <Bundle-SymbolicName>${artifactId}</Bundle-SymbolicName>
-                        <Export-Package>${pom.artifactId}*;version=${project.version}</Export-Package>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>
+                            org.apache.felix.karaf.admin;version=${pom.version},
+                            org.apache.felix.karaf.jpm;version=${pom.version}
+                        </Export-Package>
                         <Import-Package>
-                            !${pom.artifactId}*,
+                            !org.apache.felix.karaf.admin,
+                            !org.apache.felix.karaf.jpm,
+                            javax.management,
+                            javax.management.loading,
                             org.osgi.service.command,
                             org.apache.felix.gogo.commands,
                             org.apache.felix.karaf.shell.console,
                             *
                         </Import-Package>
-                        <Private-Package>org.apache.felix.karaf.jpm.*</Private-Package>
+                        <Private-Package>
+                            org.apache.felix.karaf.admin.internal,
+                            org.apache.felix.karaf.jpm.impl
+                        </Private-Package>
                         <_versionpolicy>${bnd.version.policy}</_versionpolicy>
                     </instructions>
                 </configuration>
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.java
similarity index 95%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.java
index 138f45b..e8d1cb5 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/AdminService.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin;
+package org.apache.felix.karaf.admin;
 
 public interface AdminService {
 
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/Instance.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.java
similarity index 96%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/Instance.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.java
index 61f642e..4f267c7 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/Instance.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/Instance.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin;
+package org.apache.felix.karaf.admin;
 
 public interface Instance {
 
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.java
similarity index 97%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.java
index b8a9c01..832e24f 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/InstanceSettings.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin;
+package org.apache.felix.karaf.admin;
 
 import java.util.List;
 
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java
similarity index 97%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java
index efb4d1a..df8d155 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/AdminServiceImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal;
+package org.apache.felix.karaf.admin.internal;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -29,9 +29,9 @@
 import java.util.Properties;
 import java.util.Scanner;
 
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.Instance;
-import org.apache.felix.karaf.shell.admin.InstanceSettings;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.Instance;
+import org.apache.felix.karaf.admin.InstanceSettings;
 import org.fusesource.jansi.Ansi;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -227,7 +227,7 @@
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/shell/admin/" + resource);
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/admin/" + resource);
             try {
                 if( text ) {
                     // Read it line at a time so that we can use the platform line ending when we write it out.
@@ -267,7 +267,7 @@
         File outFile = new File(target, resource);
         if( !outFile.exists() ) {
             println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
-            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/shell/admin/" + resource);
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/felix/karaf/admin/" + resource);
             try {
                 // Read it line at a time so that we can use the platform line ending when we write it out.
                 PrintStream out = new PrintStream(new FileOutputStream(outFile));
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/InstanceImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java
similarity index 98%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/InstanceImpl.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java
index 33ad649..40a76a5 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/InstanceImpl.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/admin/internal/InstanceImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal;
+package org.apache.felix.karaf.admin.internal;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -26,7 +26,7 @@
 import java.net.Socket;
 import java.util.Properties;
 
-import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.admin.Instance;
 import org.apache.felix.karaf.jpm.Process;
 import org.apache.felix.karaf.jpm.ProcessBuilderFactory;
 import org.apache.felix.karaf.jpm.impl.ScriptUtils;
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/Process.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/Process.java
similarity index 100%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/Process.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/Process.java
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java
similarity index 100%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilder.java
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
similarity index 97%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
index 06b3539..6c4980c 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/ProcessBuilderFactory.java
@@ -16,6 +16,8 @@
  */
 package org.apache.felix.karaf.jpm;
 
+import java.lang.*;
+
 import org.apache.felix.karaf.jpm.impl.ProcessBuilderFactoryImpl;
 
 /**
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
similarity index 100%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
similarity index 94%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
index fb11d60..c6b622e 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessBuilderImpl.java
@@ -42,7 +42,7 @@
         return ProcessImpl.create(dir, command);
     }
 
-    public org.apache.felix.karaf.jpm.Process attach(int pid) throws IOException {
+    public Process attach(int pid) throws IOException {
         return ProcessImpl.attach(pid);
     }
 }
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
similarity index 97%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
index 8974f59..27dec49 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
+++ b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ProcessImpl.java
@@ -103,7 +103,7 @@
         return 0;
     }
 
-    public static org.apache.felix.karaf.jpm.Process create(File dir, String command) throws IOException {
+    public static Process create(File dir, String command) throws IOException {
         //File input = File.createTempFile("jpm.", ".input");
         //File output = File.createTempFile("jpm.", ".output");
         //File error = File.createTempFile("jpm.", ".error");
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java b/karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java
similarity index 100%
rename from karaf/shell/admin/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java
rename to karaf/admin/core/src/main/java/org/apache/felix/karaf/jpm/impl/ScriptUtils.java
diff --git a/karaf/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml b/karaf/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
new file mode 100644
index 0000000..f68a106
--- /dev/null
+++ b/karaf/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://geronimo.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <bean id="adminService" class="org.apache.felix.karaf.admin.internal.AdminServiceImpl" init-method="init">
+        <property name="storageLocation" value="${karaf.home}/instances" />
+    </bean>
+
+    <service ref="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
+
+    <!-- Allow the use of system properties -->
+    <ext:property-placeholder />
+
+</blueprint>
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/karaf b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/karaf
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/karaf.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf.bat
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/karaf.bat
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/karaf.bat
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/start b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/start
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/start.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start.bat
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/start.bat
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/start.bat
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/stop b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/stop
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/stop.bat b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop.bat
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/bin/stop.bat
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/bin/stop.bat
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/org.apache.felix.karaf.shell.cfg b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.apache.felix.karaf.shell.cfg
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/org.apache.felix.karaf.shell.cfg
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.apache.felix.karaf.shell.cfg
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/org.ops4j.pax.url.mvn.cfg b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/org.ops4j.pax.url.mvn.cfg
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/system.properties b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/system.properties
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/shell/admin/etc/system.properties
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/admin/etc/system.properties
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/unix/start.sh
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/destroy.vbs
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/running.vbs
diff --git a/karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs b/karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs
similarity index 100%
rename from karaf/shell/admin/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs
rename to karaf/admin/core/src/main/resources/org/apache/felix/karaf/jpm/impl/windows/start.vbs
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/InstanceSettingsTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.java
similarity index 87%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/InstanceSettingsTest.java
rename to karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.java
index 499c8ff..cce8c80 100644
--- a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/InstanceSettingsTest.java
+++ b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/InstanceSettingsTest.java
@@ -14,20 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin;
+package org.apache.felix.karaf.admin;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
 import junit.framework.TestCase;
+import org.apache.felix.karaf.admin.InstanceSettings;
+import org.junit.Assert;
 
 public class InstanceSettingsTest extends TestCase {
     public void testInstanceSettings() {
-        InstanceSettings is = 
+        InstanceSettings is =
             new InstanceSettings(1, null, Collections.<String>emptyList(), Arrays.asList("hi"));
         assertEquals(1, is.getPort());
-        assertNull(is.getLocation());
+        Assert.assertNull(is.getLocation());
         assertEquals(Arrays.asList("hi"), is.getFeatures());
         assertEquals(0, is.getFeatureURLs().size());
     }
@@ -46,8 +48,8 @@
     
     public void testEqualsHashCode2() {
         InstanceSettings is = new InstanceSettings(1, "top", Collections.<String>emptyList(), Arrays.asList("hi"));
-        assertFalse(is.equals(null));
-        assertFalse(is.equals(new Object()));
+        Assert.assertFalse(is.equals(null));
+        Assert.assertFalse(is.equals(new Object()));
         assertEquals(is, is);
     }
 }
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImplTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java
similarity index 94%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImplTest.java
rename to karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java
index f4ba88f..02b9961 100644
--- a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImplTest.java
+++ b/karaf/admin/core/src/test/java/org/apache/felix/karaf/admin/internal/AdminServiceImplTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.felix.karaf.shell.admin.internal;
+package org.apache.felix.karaf.admin.internal;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -26,7 +26,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.karaf.shell.admin.InstanceSettings;
+import org.apache.felix.karaf.admin.InstanceSettings;
 
 public class AdminServiceImplTest extends TestCase {
     public void testHandleFeatures() throws Exception {
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/jpm/MainTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/MainTest.java
similarity index 100%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/jpm/MainTest.java
rename to karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/MainTest.java
diff --git a/karaf/shell/admin/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java b/karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java
similarity index 100%
rename from karaf/shell/admin/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java
rename to karaf/admin/core/src/test/java/org/apache/felix/karaf/jpm/ProcessTest.java
diff --git a/karaf/shell/admin/NOTICE b/karaf/admin/management/NOTICE
similarity index 100%
copy from karaf/shell/admin/NOTICE
copy to karaf/admin/management/NOTICE
diff --git a/karaf/admin/management/pom.xml b/karaf/admin/management/pom.xml
new file mode 100644
index 0000000..d227ede
--- /dev/null
+++ b/karaf/admin/management/pom.xml
@@ -0,0 +1,86 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.felix.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.felix.karaf.admin</groupId>
+    <artifactId>org.apache.felix.karaf.admin.management</artifactId>
+    <packaging>bundle</packaging>
+    <version>1.1.0-SNAPSHOT</version>
+    <name>Apache Felix Karaf :: Admin Management</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix.karaf.admin</groupId>
+            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>
+                            ${pom.artifactId}*;version=${pom.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !${pom.artifactId}*,
+                            javax.management,
+                            javax.management.loading,
+                            org.osgi.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.felix.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>org.apache.felix.karaf.admin.management.internal</Private-Package>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.java
new file mode 100644
index 0000000..7d5427a
--- /dev/null
+++ b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/AdminServiceMBean.java
@@ -0,0 +1,43 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management;
+
+import javax.management.openmbean.TabularData;
+
+public interface AdminServiceMBean {
+
+    String INSTANCE_PID = "Pid";
+    String INSTANCE_NAME = "Name";
+    String INSTANCE_PORT = "Port";
+    String INSTANCE_STATE = "State";
+    String INSTANCE_LOCATION = "Location";
+
+    String[] INSTANCE = {INSTANCE_PID, INSTANCE_NAME, INSTANCE_PORT,
+            INSTANCE_STATE, INSTANCE_LOCATION };
+
+    // Operations
+    int createInstance(String name, int port, String location, String features, String featureURLs)
+            throws Exception;
+    void changePort(String name, int port) throws Exception;
+    void destroyInstance(String name) throws Exception;
+    void startInstance(String name, String opts) throws Exception;
+    void stopInstance(String name) throws Exception;
+
+    // Attributes
+    TabularData getInstances() throws Exception;
+
+}
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.java
new file mode 100644
index 0000000..5f398db
--- /dev/null
+++ b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/codec/JmxInstance.java
@@ -0,0 +1,114 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management.codec;
+
+import java.util.List;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+import org.apache.felix.karaf.admin.management.AdminServiceMBean;
+import org.apache.felix.karaf.admin.Instance;
+
+public class JmxInstance {
+    static final CompositeType INSTANCE;
+    static final TabularType INSTANCE_TABLE;
+
+    static {
+        INSTANCE = createInstanceType();
+        INSTANCE_TABLE = createInstanceTableType();
+    }
+
+    private final CompositeDataSupport data;
+
+    private CompositeData asCompositeData() {
+        return data;
+    }
+
+    public JmxInstance(Instance instance) {
+        try {
+            String[] itemNames = AdminServiceMBean.INSTANCE;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = instance.getPid();
+            itemValues[1] = instance.getName();
+            itemValues[2] = instance.getPort();
+            try {
+                itemValues[3] = instance.getState();
+            } catch (Exception e) {
+                itemValues[3] = "Error";
+            }
+            itemValues[4] = instance.getLocation();
+
+            data = new CompositeDataSupport(INSTANCE, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot create instance open data", e);
+        }
+    }
+
+    private static CompositeType createInstanceType() {
+        try {
+            String desc = "This type describes Karaf instances";
+            String[] itemNames = AdminServiceMBean.INSTANCE;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] descriptions = new String[itemNames.length];
+
+            itemTypes[0] = SimpleType.INTEGER;
+            descriptions[0] = "The Process ID of the instance or 0 if not running.";
+
+            itemTypes[1] = SimpleType.STRING;
+            descriptions[1] = "The name of the instance.";
+
+            itemTypes[2] = SimpleType.INTEGER;
+            descriptions[2] = "The SSH port that can be used to connect to the instance.";
+
+            itemTypes[3] = SimpleType.STRING;
+            descriptions[3] = "The state of the instance.";
+
+            itemTypes[4] = SimpleType.STRING;
+            descriptions[4] = "The location of the instance.";
+
+            return new CompositeType("Instance", desc, itemNames, descriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build instance type", e);
+        }
+    }
+
+    private static TabularType createInstanceTableType() {
+        try {
+            return new TabularType("Instances", "Table of all Karaf instances", INSTANCE,
+                    new String[] {AdminServiceMBean.INSTANCE_NAME});
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build instance table type", e);
+        }
+    }
+
+    public static TabularData tableFrom(List<JmxInstance> instances) {
+        TabularDataSupport table = new TabularDataSupport(INSTANCE_TABLE);
+        for (JmxInstance instance : instances) {
+            table.put(instance.asCompositeData());
+        }
+        return table;
+    }
+
+}
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java
new file mode 100644
index 0000000..d362463
--- /dev/null
+++ b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImpl.java
@@ -0,0 +1,107 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.management.openmbean.TabularData;
+
+import org.apache.felix.karaf.admin.management.AdminServiceMBean;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.Instance;
+import org.apache.felix.karaf.admin.InstanceSettings;
+import org.apache.felix.karaf.admin.management.codec.JmxInstance;
+
+public class AdminServiceMBeanImpl implements AdminServiceMBean {
+
+    private AdminService adminService;
+
+    public AdminService getAdminService() {
+        return adminService;
+    }
+
+    public void setAdminService(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    public int createInstance(String name, int port, String location, String features, String featureURLs)
+            throws Exception {
+        if ("".equals(location)) {
+            location = null;
+        }
+
+        InstanceSettings settings = new InstanceSettings(port, location,
+                parseStringList(featureURLs), parseStringList(features));
+
+        Instance inst = adminService.createInstance(name, settings);
+        if (inst != null) {
+            return inst.getPid();
+        } else {
+            return -1;
+        }
+    }
+
+    public void changePort(String name, int port) throws Exception {
+        getExistingInstance(name).changePort(port);
+    }
+
+    public void destroyInstance(String name) throws Exception {
+        getExistingInstance(name).destroy();
+    }
+
+    public void startInstance(String name, String opts) throws Exception {
+        getExistingInstance(name).start(opts);
+    }
+
+    public void stopInstance(String name) throws Exception {
+        getExistingInstance(name).stop();
+    }
+
+    public TabularData getInstances() throws Exception {
+        List<Instance> allInstances = Arrays.asList(adminService.getInstances());
+        List<JmxInstance> instances = new ArrayList<JmxInstance>();
+        for (Instance instance : allInstances) {
+            instances.add(new JmxInstance(instance));
+        }
+        TabularData table = JmxInstance.tableFrom(instances);
+        return table;
+    }
+
+    private Instance getExistingInstance(String name) {
+        Instance i = adminService.getInstance(name);
+        if (i == null) {
+            throw new IllegalArgumentException("Instance '" + name + "' does not exist");
+        }
+        return i;
+    }
+
+    private List<String> parseStringList(String value) {
+        List<String> list = new ArrayList<String>();
+        if (value != null) {
+            for (String el : value.split(",")) {
+                String trimmed = el.trim();
+                if (trimmed.length() == 0) {
+                    continue;
+                }
+                list.add(trimmed);
+            }
+        }
+        return list;
+    }
+}
diff --git a/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/MBeanRegistrer.java b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/MBeanRegistrer.java
new file mode 100644
index 0000000..0479b77
--- /dev/null
+++ b/karaf/admin/management/src/main/java/org/apache/felix/karaf/admin/management/internal/MBeanRegistrer.java
@@ -0,0 +1,67 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management.internal;
+
+import java.util.Map;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+public class MBeanRegistrer {
+
+    private MBeanServer mbeanServer;
+
+    private Map<Object, String> mbeans;
+
+    public void setMbeans(Map<Object, String> mbeans) {
+        this.mbeans = mbeans;
+    }
+
+    public void registerMBeanServer(MBeanServer mbeanServer) throws JMException {
+        if (this.mbeanServer != mbeanServer) {
+            unregisterMBeans();
+        }
+        this.mbeanServer = mbeanServer;
+        registerMBeans();
+    }
+
+    public void unregisterMBeanServer(MBeanServer mbeanServer) throws JMException {
+        unregisterMBeans();
+        this.mbeanServer = null;
+    }
+
+    public void init() throws Exception {
+        registerMBeans();
+    }
+
+    protected void registerMBeans() throws JMException {
+        if (mbeanServer != null && mbeans != null) {
+            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
+                mbeanServer.registerMBean(entry.getKey(), new ObjectName(entry.getValue()));
+            }
+        }
+    }
+
+    protected void unregisterMBeans() throws JMException {
+        if (mbeanServer != null && mbeans != null) {
+            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
+                mbeanServer.unregisterMBean(new ObjectName(entry.getValue()));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/karaf/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml b/karaf/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
new file mode 100644
index 0000000..3e4a253
--- /dev/null
+++ b/karaf/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <reference id="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
+
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegister" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer" />
+    </reference>
+
+    <bean id="mbeanImpl" class="org.apache.felix.karaf.admin.management.internal.AdminServiceMBeanImpl">
+        <property name="adminService" ref="adminService" />
+    </bean>
+
+    <bean id="mbeanRegister" class="org.apache.felix.karaf.admin.management.internal.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry>
+                    <key>
+                        <bean class="javax.management.StandardMBean">
+                            <argument ref="mbeanImpl" />
+                            <argument value="org.apache.felix.karaf.admin.management.AdminServiceMBean"/>
+                        </bean>
+                    </key>
+                    <value>org.apache.felix.karaf:service=admin</value>
+                </entry>
+            </map>
+        </property>
+    </bean>
+
+
+</blueprint>
diff --git a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.java b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.java
new file mode 100644
index 0000000..bc06679
--- /dev/null
+++ b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/codec/JmxInstanceTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management.codec;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
+
+import junit.framework.TestCase;
+import org.apache.felix.karaf.admin.Instance;
+import org.apache.felix.karaf.admin.management.AdminServiceMBean;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+
+public class JmxInstanceTest extends TestCase {
+    public void testJMXInstanceStatics() {
+        CompositeType it = JmxInstance.INSTANCE;
+        Assert.assertEquals(
+            new HashSet<String>(Arrays.asList(AdminServiceMBean.INSTANCE)),
+            it.keySet());
+
+        TabularType tt = JmxInstance.INSTANCE_TABLE;
+        Assert.assertEquals("Instances", tt.getTypeName());
+    }
+
+    public void testJMXInstance() throws Exception {
+        Instance i = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i.getPid()).andReturn(1712);
+        EasyMock.expect(i.getName()).andReturn("MyInstance");
+        EasyMock.expect(i.getPort()).andReturn(0);
+        EasyMock.expect(i.getState()).andThrow(new Exception("gotcha"));
+        EasyMock.expect(i.getLocation()).andReturn("somewhere");
+        EasyMock.replay(i);
+        
+        JmxInstance ji = new JmxInstance(i);
+        TabularData td = JmxInstance.tableFrom(Collections.singletonList(ji));        
+        Collection<?> keys = (Collection<?>) td.keySet().iterator().next();
+        Assert.assertEquals("MyInstance", keys.iterator().next());
+        
+        CompositeData cd = td.get(keys.toArray());
+        Assert.assertEquals(1712, cd.get("Pid"));
+        Assert.assertEquals("MyInstance", cd.get("Name"));
+        Assert.assertEquals(0, cd.get("Port"));
+        Assert.assertEquals("Error", cd.get("State"));
+        Assert.assertEquals("somewhere", cd.get("Location"));
+    }
+
+    public void testJMXInstance2() throws Exception {
+        Instance i = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i.getPid()).andReturn(1712);
+        EasyMock.expect(i.getName()).andReturn("MyInstance");
+        EasyMock.expect(i.getPort()).andReturn(0);
+        EasyMock.expect(i.getState()).andReturn("Started");
+        EasyMock.expect(i.getLocation()).andReturn(null);
+        EasyMock.replay(i);
+        
+        JmxInstance ji = new JmxInstance(i);
+        TabularData td = JmxInstance.tableFrom(Collections.singletonList(ji));        
+        Collection<?> keys = (Collection<?>) td.keySet().iterator().next();
+        Assert.assertEquals("MyInstance", keys.iterator().next());
+        
+        CompositeData cd = td.get(keys.toArray());
+        Assert.assertEquals(1712, cd.get("Pid"));
+        Assert.assertEquals("MyInstance", cd.get("Name"));
+        Assert.assertEquals(0, cd.get("Port"));
+        Assert.assertEquals("Started", cd.get("State"));
+        Assert.assertNull(cd.get("Location"));
+    }
+}
diff --git a/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
new file mode 100644
index 0000000..5a2cfca
--- /dev/null
+++ b/karaf/admin/management/src/test/java/org/apache/felix/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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 org.apache.felix.karaf.admin.management.internal;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
+
+import junit.framework.TestCase;
+import org.apache.felix.karaf.admin.AdminService;
+import org.apache.felix.karaf.admin.Instance;
+import org.apache.felix.karaf.admin.InstanceSettings;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+
+public class AdminServiceMBeanImplTest extends TestCase {
+    public void testCreateInstance() throws Exception {
+        final InstanceSettings is = new InstanceSettings(123, "somewhere",
+                Collections.<String>emptyList(), Arrays.asList("webconsole", "funfeat"));
+        
+        final Instance inst = EasyMock.createMock(Instance.class);
+        EasyMock.expect(inst.getPid()).andReturn(42);
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.createInstance("t1", is)).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+        
+        assertEquals(42, ab.createInstance("t1", 123, "somewhere", " webconsole,  funfeat", ""));
+    }
+    
+    public void testCreateInstance2() throws Exception {
+        final InstanceSettings is = new InstanceSettings(0, null, 
+                Collections.<String>emptyList(), Collections.<String>emptyList());
+        
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.createInstance("t1", is)).andReturn(null);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+        
+        assertEquals(-1, ab.createInstance("t1", 0, "", "", ""));
+    }
+    
+    public void testGetInstances() throws Exception {       
+        Instance i1 = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i1.getPid()).andReturn(1234);
+        EasyMock.expect(i1.getPort()).andReturn(8818);
+        EasyMock.expect(i1.getName()).andReturn("i1");
+        EasyMock.expect(i1.getLocation()).andReturn("somewhere");
+        EasyMock.expect(i1.getState()).andReturn("Stopped");
+        EasyMock.replay(i1);
+        Instance i2 = EasyMock.createNiceMock(Instance.class);
+        EasyMock.expect(i2.getName()).andReturn("i2");
+        EasyMock.replay(i2);
+        
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstances()).andReturn(new Instance [] {i1, i2});
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        
+        TabularData td = ab.getInstances();
+        Assert.assertEquals(2, td.size());
+        CompositeData cd1 = td.get(new Object [] {"i1"});
+        Assert.assertTrue(cd1.containsValue("i1"));
+        Assert.assertTrue(cd1.containsValue(1234));
+        Assert.assertTrue(cd1.containsValue(8818));
+        Assert.assertTrue(cd1.containsValue("somewhere"));
+        Assert.assertTrue(cd1.containsValue("Stopped"));
+
+        CompositeData cd2 = td.get(new Object [] {"i2"});
+        Assert.assertTrue(cd2.containsValue("i2"));
+    }
+    
+    public void testStartInstance() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.start("-x -y -z");
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.startInstance("test instance", "-x -y -z");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+    
+    public void testStopInstance() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.stop();
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.stopInstance("test instance");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testDestroyInstance() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.destroy();
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.destroyInstance("test instance");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testChangePort() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.changePort(7788);
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.changePort("test instance", 7788);
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+}
diff --git a/karaf/admin/pom.xml b/karaf/admin/pom.xml
new file mode 100644
index 0000000..300fecc
--- /dev/null
+++ b/karaf/admin/pom.xml
@@ -0,0 +1,41 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.felix.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.felix.karaf.admin</groupId>
+    <artifactId>admin</artifactId>
+    <packaging>pom</packaging>
+    <version>1.1.0-SNAPSHOT</version>
+    <name>Apache Felix Karaf :: Admin</name>
+
+    <modules>
+        <module>core</module>
+        <module>command</module>
+        <module>management</module>
+    </modules>
+
+</project>
diff --git a/karaf/assembly/pom.xml b/karaf/assembly/pom.xml
index d34b25d..e36a367 100644
--- a/karaf/assembly/pom.xml
+++ b/karaf/assembly/pom.xml
@@ -80,12 +80,20 @@
             <artifactId>org.apache.felix.karaf.features.management</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
+            <groupId>org.apache.felix.karaf.admin</groupId>
+            <artifactId>org.apache.felix.karaf.admin.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix.karaf.admin</groupId>
+            <artifactId>org.apache.felix.karaf.admin.command</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix.karaf.admin</groupId>
+            <artifactId>org.apache.felix.karaf.admin.management</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.felix.karaf.shell</groupId>
-            <artifactId>org.apache.felix.karaf.shell.admin</artifactId>
+            <artifactId>org.apache.felix.karaf.shell.console</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.felix.karaf.shell</groupId>
diff --git a/karaf/assembly/src/main/descriptors/unix-bin.xml b/karaf/assembly/src/main/descriptors/unix-bin.xml
index ab92574..a0289cf 100644
--- a/karaf/assembly/src/main/descriptors/unix-bin.xml
+++ b/karaf/assembly/src/main/descriptors/unix-bin.xml
@@ -189,6 +189,17 @@
             <outputDirectory>/system</outputDirectory>
             <unpack>false</unpack>
             <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>org/apache/felix/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.core</include>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.command</include>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
             <outputFileNameMapping>org/apache/felix/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
             <includes>
                 <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.spring</include>
@@ -203,7 +214,6 @@
             <outputFileNameMapping>org/apache/felix/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
             <includes>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.console</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.admin</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.osgi</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.log</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.config</include>
diff --git a/karaf/assembly/src/main/descriptors/windows-bin.xml b/karaf/assembly/src/main/descriptors/windows-bin.xml
index 232cc76..7adbe14 100644
--- a/karaf/assembly/src/main/descriptors/windows-bin.xml
+++ b/karaf/assembly/src/main/descriptors/windows-bin.xml
@@ -180,6 +180,17 @@
             <outputDirectory>/system</outputDirectory>
             <unpack>false</unpack>
             <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>org/apache/felix/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.core</include>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.command</include>
+                <include>org.apache.felix.karaf.admin:org.apache.felix.karaf.admin.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
             <outputFileNameMapping>org/apache/felix/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
             <includes>
                 <include>org.apache.felix.karaf.deployer:org.apache.felix.karaf.deployer.spring</include>
@@ -194,7 +205,6 @@
             <outputFileNameMapping>org/apache/felix/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
             <includes>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.console</include>
-                <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.admin</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.osgi</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.log</include>
                 <include>org.apache.felix.karaf.shell:org.apache.felix.karaf.shell.config</include>
diff --git a/karaf/assembly/src/main/filtered-resources/bin/admin b/karaf/assembly/src/main/filtered-resources/bin/admin
index 226f7c1..bd468f5 100644
--- a/karaf/assembly/src/main/filtered-resources/bin/admin
+++ b/karaf/assembly/src/main/filtered-resources/bin/admin
@@ -273,7 +273,7 @@
 
     CLASSPATH=${KARAF_HOME}/system/org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.admin/${project.version}/org.apache.felix.karaf.shell.admin-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.console/${project.version}/org.apache.felix.karaf.shell.console-${project.version}.jar:${KARAF_HOME}/system/org/apache/felix/gogo/org.apache.felix.gogo.runtime/${felix.gogo.version}/org.apache.felix.gogo.runtime-${felix.gogo.version}.jar:${KARAF_HOME}/system/org/apache/geronimo/blueprint/geronimo-blueprint/${geronimo.blueprint.version}/geronimo-blueprint-${geronimo.blueprint.version}.jar:${KARAF_HOME}/system/org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar:${KARAF_HOME}/system/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
 
-    exec $JAVA $JAVA_OPTS -Dstorage.location="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.shell.admin.main.Execute "$@"
+    exec $JAVA $JAVA_OPTS -Dstorage.location="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $OPTS -classpath "$CLASSPATH" org.apache.felix.karaf.admin.main.Execute "$@"
 }
 
 main() {
diff --git a/karaf/assembly/src/main/filtered-resources/bin/admin.bat b/karaf/assembly/src/main/filtered-resources/bin/admin.bat
index 3dfcf30..b16f9f6 100644
--- a/karaf/assembly/src/main/filtered-resources/bin/admin.bat
+++ b/karaf/assembly/src/main/filtered-resources/bin/admin.bat
@@ -87,7 +87,7 @@
     if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8
     if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8    
     rem Execute the Java Virtual Machine
-    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dstorage.location="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" org.apache.felix.karaf.shell.admin.main.Execute %ARGS%
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dstorage.location="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" org.apache.felix.karaf.admin.main.Execute %ARGS%
 
 rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
 
diff --git a/karaf/assembly/src/main/filtered-resources/etc/startup.properties b/karaf/assembly/src/main/filtered-resources/etc/startup.properties
index b1b679b..1a79a4d 100644
--- a/karaf/assembly/src/main/filtered-resources/etc/startup.properties
+++ b/karaf/assembly/src/main/filtered-resources/etc/startup.properties
@@ -41,7 +41,6 @@
 org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.spring/${pom.version}/org.apache.felix.karaf.deployer.spring-${pom.version}.jar=30
 org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.blueprint/${pom.version}/org.apache.felix.karaf.deployer.blueprint-${pom.version}.jar=30
 org/apache/felix/karaf/deployer/org.apache.felix.karaf.deployer.features/${pom.version}/org.apache.felix.karaf.deployer.features-${pom.version}.jar=30
-org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.admin/${pom.version}/org.apache.felix.karaf.shell.admin-${pom.version}.jar=30
 org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.osgi/${pom.version}/org.apache.felix.karaf.shell.osgi-${pom.version}.jar=30
 org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.log/${pom.version}/org.apache.felix.karaf.shell.log-${pom.version}.jar=30
 org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.config/${pom.version}/org.apache.felix.karaf.shell.config-${pom.version}.jar=30
@@ -49,7 +48,9 @@
 org/apache/felix/karaf/shell/org.apache.felix.karaf.shell.commands/${pom.version}/org.apache.felix.karaf.shell.commands-${pom.version}.jar=30
 org/apache/felix/karaf/jaas/org.apache.felix.karaf.jaas.config/${pom.version}/org.apache.felix.karaf.jaas.config-${pom.version}.jar=30
 org/apache/felix/karaf/jaas/org.apache.felix.karaf.jaas.modules/${pom.version}/org.apache.felix.karaf.jaas.modules-${pom.version}.jar=30
-
+org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.core/${pom.version}/org.apache.felix.karaf.admin.core-${pom.version}.jar=30
+org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.command/${pom.version}/org.apache.felix.karaf.admin.command-${pom.version}.jar=30
+org/apache/felix/karaf/admin/org.apache.felix.karaf.admin.management/${pom.version}/org.apache.felix.karaf.admin.management-${pom.version}.jar=30
 org/apache/felix/karaf/features/org.apache.felix.karaf.features.core/${pom.version}/org.apache.felix.karaf.features.core-${pom.version}.jar=30
 org/apache/felix/karaf/features/org.apache.felix.karaf.features.command/${pom.version}/org.apache.felix.karaf.features.command-${pom.version}.jar=30
 org/apache/felix/karaf/features/org.apache.felix.karaf.features.management/${pom.version}/org.apache.felix.karaf.features.management-${pom.version}.jar=30
diff --git a/karaf/pom.xml b/karaf/pom.xml
index 2f7e297..c2b04c8 100644
--- a/karaf/pom.xml
+++ b/karaf/pom.xml
@@ -36,6 +36,7 @@
     <modules>
         <module>main</module>
         <module>features</module>
+        <module>admin</module>
         <module>deployer</module>
         <module>shell</module>
         <module>jaas</module>
@@ -217,6 +218,21 @@
                 <version>${pom.version}</version>
             </dependency>
             <dependency>
+                <groupId>org.apache.felix.karaf.admin</groupId>
+                <artifactId>org.apache.felix.karaf.admin.core</artifactId>
+                <version>${pom.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix.karaf.admin</groupId>
+                <artifactId>org.apache.felix.karaf.admin.command</artifactId>
+                <version>${pom.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix.karaf.admin</groupId>
+                <artifactId>org.apache.felix.karaf.admin.management</artifactId>
+                <version>${pom.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>org.apache.felix.karaf.shell</groupId>
                 <artifactId>org.apache.felix.karaf.shell.core</artifactId>
                 <version>${pom.version}</version>
@@ -238,6 +254,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.felix.karaf.shell</groupId>
+                <artifactId>org.apache.felix.karaf.shell.admin.management</artifactId>
+                <version>${pom.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix.karaf.shell</groupId>
                 <artifactId>org.apache.felix.karaf.shell.obr</artifactId>
                 <version>${pom.version}</version>
             </dependency>
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminServiceMBean.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminServiceMBean.java
deleted file mode 100644
index fdd0034..0000000
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminServiceMBean.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 org.apache.felix.karaf.shell.admin;
-
-public interface AdminServiceMBean {
-
-    void createInstance(String name, int port, String location) throws Exception;
-
-    String[] getInstances();
-
-    int getPort(String name);
-
-    void changePort(String name, int port) throws Exception;
-
-    String getState(String name) throws Exception;
-
-    void start(String name, String javaOpts) throws Exception;
-
-    void stop(String name) throws Exception;
-
-    void destroy(String name) throws Exception;
-
-}
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
deleted file mode 100644
index f2ebabd..0000000
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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 org.apache.felix.karaf.shell.admin.internal;
-
-import java.util.Collections;
-
-import org.apache.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.AdminServiceMBean;
-import org.apache.felix.karaf.shell.admin.Instance;
-import org.apache.felix.karaf.shell.admin.InstanceSettings;
-
-public class AdminServiceMBeanImpl implements AdminServiceMBean {
-
-    private AdminService adminService;
-
-    public AdminService getAdminService() {
-        return adminService;
-    }
-
-    public void setAdminService(AdminService adminService) {
-        this.adminService = adminService;
-    }
-
-    public void createInstance(String name, int port, String location) throws Exception {
-        InstanceSettings settings = new InstanceSettings(port, location, 
-                Collections.<String>emptyList(), Collections.<String>emptyList());
-        adminService.createInstance(name, settings);
-    }
-
-    public String[] getInstances() {
-        Instance[] instances = adminService.getInstances();
-        String[] names = new String[instances.length];
-        for (int i = 0; i < instances.length; i++) {
-            names[i] = instances[i].getName();
-        }
-        return names;
-    }
-
-    public int getPort(String name) {
-        return getExistingInstance(name).getPort();
-    }
-
-    public void changePort(String name, int port) throws Exception {
-        getExistingInstance(name).changePort(port);
-    }
-
-    public String getState(String name) throws Exception {
-        return getExistingInstance(name).getState();
-    }
-
-    public void start(String name, String javaOpts) throws Exception {
-        getExistingInstance(name).start(javaOpts);
-    }
-
-    public void stop(String name) throws Exception {
-        getExistingInstance(name).stop();
-    }
-
-    public void destroy(String name) throws Exception {
-        getExistingInstance(name).destroy();
-    }
-
-
-    private Instance getExistingInstance(String name) {
-        Instance i = adminService.getInstance(name);
-        if (i == null) {
-            throw new IllegalArgumentException("Instance '" + name + "' does not exist");
-        }
-        return i;
-    }
-
-}
diff --git a/karaf/shell/pom.xml b/karaf/shell/pom.xml
index 0b1a1aa..3959f8e 100644
--- a/karaf/shell/pom.xml
+++ b/karaf/shell/pom.xml
@@ -33,7 +33,6 @@
     <name>Apache Felix Karaf :: Shell</name>
 
     <modules>
-        <module>admin</module>
         <module>commands</module>
         <module>config</module>
         <module>console</module>
diff --git a/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml b/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
index 48499a6..93e68fd 100644
--- a/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
+++ b/karaf/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
@@ -20,7 +20,7 @@
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            xmlns:cm="http://geronimo.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
 
-    <reference id="adminService" interface="org.apache.felix.karaf.shell.admin.AdminService" />
+    <reference id="adminService" interface="org.apache.felix.karaf.admin.AdminService" />
 
     <bean id="adminPlugin" class="org.apache.felix.karaf.webconsole.admin.AdminPlugin" init-method="start" destroy-method="stop">
         <property name="adminService" ref="adminService" />