Clean up karaf modules:
- admin
- features

Add support for bootstrap, removed sidebar dependency. Updated itests.

git-svn-id: https://svn.apache.org/repos/asf/karaf/webconsole/trunk@1242785 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/assembly/src/main/resources/features.xml b/assembly/src/main/resources/features.xml
index 9ce91ac..c3e9d9a 100644
--- a/assembly/src/main/resources/features.xml
+++ b/assembly/src/main/resources/features.xml
@@ -67,7 +67,9 @@
   <feature name="webconsole-karaf" version="${project.version}" description="Karaf WebConsole Features">
     <details>Karaf bundle will contain all the pages and java classes about content specific to Karaf like features,repositories and obr.</details>
     <feature>webconsole-core</feature>
-    <bundle>mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.karaf/${project.version}</bundle>
+    <bundle>mvn:org.apache.karaf.webconsole.karaf/org.apache.karaf.webconsole.karaf.core/${project.version}</bundle>
+    <bundle>mvn:org.apache.karaf.webconsole.karaf/org.apache.karaf.webconsole.karaf.admin/${project.version}</bundle>
+    <bundle>mvn:org.apache.karaf.webconsole.karaf/org.apache.karaf.webconsole.karaf.feature/${project.version}</bundle>
   </feature>
 
   <feature name="webconsole-blueprint" version="${project.version}" description="Karaf WebConsole Blueprint">
diff --git a/itest/pom.xml b/itest/pom.xml
index 6d87ee7..dc34bac 100644
--- a/itest/pom.xml
+++ b/itest/pom.xml
@@ -33,7 +33,7 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.karaf.webconsole</groupId>
-            <artifactId>features</artifactId>
+            <artifactId>apache-karaf-webconsole</artifactId>
             <version>${project.version}</version>
             <classifier>features</classifier>
             <type>xml</type>
@@ -78,18 +78,18 @@
 
     <build>
         <plugins>
-      <plugin>
-        <groupId>org.apache.servicemix.tooling</groupId>
-        <artifactId>depends-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>generate-depends-file</id>
-            <goals>
-              <goal>generate-depends-file</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
+            <plugin>
+                <groupId>org.apache.servicemix.tooling</groupId>
+                <artifactId>depends-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-depends-file</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/itest/src/test/java/org/apache/karaf/webconsole/itest/FeaturesIntegrationTest.java b/itest/src/test/java/org/apache/karaf/webconsole/itest/FeaturesIntegrationTest.java
index 5579716..8a3cd41 100644
--- a/itest/src/test/java/org/apache/karaf/webconsole/itest/FeaturesIntegrationTest.java
+++ b/itest/src/test/java/org/apache/karaf/webconsole/itest/FeaturesIntegrationTest.java
@@ -50,7 +50,7 @@
     @Configuration
     public Option[] config() {
         String karafVersion = MavenUtils.getArtifactVersion("org.apache.karaf", "karaf");
-        String webconsoleVersion = MavenUtils.getArtifactVersion("org.apache.karaf.webconsole", "features");
+        String webconsoleVersion = MavenUtils.getArtifactVersion("org.apache.karaf.webconsole", "apache-karaf-webconsole");
         return new Option[] {
             karafDistributionConfiguration().frameworkUrl(
                 maven().groupId("org.apache.karaf").artifactId("apache-karaf").version(karafVersion).type("zip")
@@ -68,7 +68,11 @@
 
     @Test
     public void someTest() throws Exception {
-        String url = maven("org.apache.karaf.webconsole", "features").version(featuresVersion).classifier("features").type("xml").getURL();
+        String url = maven("org.apache.karaf.webconsole", "apache-karaf-webconsole")
+            .version(featuresVersion)
+            .classifier("features")
+            .type("xml")
+            .getURL();
 
         features.addRepository(new URI(url));
 
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminPage.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminPage.java
index d699b75..785e280 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminPage.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminPage.java
@@ -1,16 +1,15 @@
 package org.apache.karaf.webconsole.karaf.admin;
 
 import org.apache.karaf.admin.AdminService;
-import org.apache.karaf.webconsole.core.page.SidebarPage;
+import org.apache.karaf.webconsole.core.page.SinglePage;
 import org.ops4j.pax.wicket.api.PaxWicketBean;
 
-public class AdminPage extends SidebarPage {
+public class AdminPage extends SinglePage {
 
     @PaxWicketBean(name = "adminService")
     protected AdminService admin;
 
     public AdminPage() {
-        setSidebarProvider(new AdminSidebarProvider());
     }
 
 }
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminSidebarProvider.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminSidebarProvider.java
deleted file mode 100644
index 4077324..0000000
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/AdminSidebarProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.apache.karaf.webconsole.karaf.admin;
-
-import static org.apache.karaf.webconsole.core.util.LinkUtils.createPageLink;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.karaf.webconsole.core.navigation.SidebarProvider;
-import org.apache.karaf.webconsole.core.widget.WidgetProvider;
-import org.apache.karaf.webconsole.karaf.admin.create.CreateInstancePage;
-import org.apache.karaf.webconsole.karaf.admin.list.InstancesPage;
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.html.link.Link;
-
-public class AdminSidebarProvider implements SidebarProvider {
-
-    @SuppressWarnings("unchecked")
-    public List<Link<Page>> getItems(String componentId, String labelId) {
-        return Arrays.asList(
-            createPageLink(componentId, labelId, "Create instance", CreateInstancePage.class)
-        );
-    }
-
-    public Link<Page> getMasterPageLink(String linkId, String labelId) {
-        return createPageLink(linkId, labelId, "Instances", InstancesPage.class);
-    }
-
-    public List<WidgetProvider> getWidgetProviders() {
-        return Collections.emptyList();
-    }
-
-}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.java
index e02005f..3126251 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.java
@@ -1,10 +1,26 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.create;
 
 import static org.apache.wicket.model.Model.of;
 
 import org.apache.karaf.webconsole.karaf.admin.AdminPage;
-import org.apache.karaf.webconsole.karaf.admin.model.InstanceSettingsExt;
-import org.apache.karaf.webconsole.karaf.admin.model.KarafInstance;
+import org.apache.karaf.webconsole.karaf.admin.model.WicketInstanceSettings;
+import org.apache.karaf.webconsole.karaf.admin.model.WicketInstance;
 import org.apache.karaf.webconsole.karaf.admin.settings.InstanceSettingsPanel;
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.form.Button;
@@ -13,24 +29,27 @@
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
 
+/**
+ * Create instance page.
+ */
 @PaxWicketMountPoint(mountPoint = "/karaf/admin/create")
 public class CreateInstancePage extends AdminPage {
 
     public CreateInstancePage() {
-        KarafInstance instance = new KarafInstance();
-        instance.setSettings(new InstanceSettingsExt());
+        WicketInstance instance = new WicketInstance();
+        instance.setSettings(new WicketInstanceSettings());
 
-        CompoundPropertyModel<KarafInstance> model = new CompoundPropertyModel<KarafInstance>(instance);
+        CompoundPropertyModel<WicketInstance> model = new CompoundPropertyModel<WicketInstance>(instance);
 
-        Form<KarafInstance> form = new Form<KarafInstance>("instance", model);
+        Form<WicketInstance> form = new Form<WicketInstance>("instance", model);
         form.add(new TextField<String>("name"));
-        form.add(new InstanceSettingsPanel("settings", of(new InstanceSettingsExt())));
+        form.add(new InstanceSettingsPanel("settings", of(new WicketInstanceSettings())));
 
         form.add(new Button("submit") {
             @Override
             public void onSubmit() {
                 try {
-                    KarafInstance instance = (KarafInstance) getForm().getModelObject();
+                    WicketInstance instance = (WicketInstance) getForm().getModelObject();
                     admin.createInstance(instance.getName(), instance.getSettings());
                 } catch (Exception e) {
                     e.printStackTrace();
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstanceActionsPanel.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstanceActionsPanel.java
index 807819f..c4f4595 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstanceActionsPanel.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstanceActionsPanel.java
@@ -1,3 +1,19 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.list;
 
 import java.util.ArrayList;
@@ -10,8 +26,13 @@
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
 
+/**
+ * Instance actions.
+ */
 public class InstanceActionsPanel extends ActionsPanel<Instance> {
 
+    private static final long serialVersionUID = 1205787953299100012L;
+
     public InstanceActionsPanel(String id, IModel<Instance> model) {
         super(id, model);
     }
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.java
new file mode 100644
index 0000000..d5fb7f5
--- /dev/null
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.java
@@ -0,0 +1,61 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.list;
+
+import static org.apache.wicket.model.Model.of;
+
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.webconsole.core.table.OrdinalColumn;
+import org.apache.karaf.webconsole.core.table.PropertyColumnExt;
+import org.apache.karaf.webconsole.karaf.admin.AdminPage;
+import org.apache.karaf.webconsole.karaf.admin.model.InstanceDataProvider;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.IModel;
+import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
+
+/**
+ * Page which shows all karaf instances.
+ */
+@PaxWicketMountPoint(mountPoint = "/karaf/instance")
+public class InstancePage extends AdminPage {
+
+    @SuppressWarnings("unchecked")
+    public InstancePage() {
+        IColumn<Instance>[] columns = new IColumn[] {
+            new OrdinalColumn<Instance>(),
+            new PropertyColumnExt<Instance>("PID", "pid"),
+            new PropertyColumnExt<Instance>("Name", "name"),
+            new PropertyColumnExt<Instance>("Root", "root"),
+            new PropertyColumnExt<Instance>("State", "state"),
+            new PropertyColumnExt<Instance>("Location", "location"),
+            new AbstractColumn<Instance>(of("Actions")) {
+                private static final long serialVersionUID = 1L;
+
+                public void populateItem(Item<ICellPopulator<Instance>> cellItem, String componentId, IModel<Instance> rowModel) {
+                    cellItem.add(new InstanceActionsPanel(componentId, rowModel));
+                }
+            }
+        };
+
+        add(new DefaultDataTable<Instance>("instances", columns, new InstanceDataProvider(admin), 20));
+    }
+
+}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.java
deleted file mode 100644
index d09829c..0000000
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.apache.karaf.webconsole.karaf.admin.list;
-
-import static org.apache.wicket.model.Model.of;
-
-import org.apache.karaf.admin.Instance;
-import org.apache.karaf.webconsole.core.table.OrdinalColumn;
-import org.apache.karaf.webconsole.core.table.PropertyColumnExt;
-import org.apache.karaf.webconsole.core.table.advanced.AdvancedDataTable;
-import org.apache.karaf.webconsole.core.table.advanced.ColumnList;
-import org.apache.karaf.webconsole.karaf.admin.AdminPage;
-import org.apache.karaf.webconsole.karaf.admin.model.InstancesDataProvider;
-import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
-import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.model.IModel;
-import org.ops4j.pax.wicket.api.PaxWicketBean;
-import org.osgi.service.prefs.PreferencesService;
-
-public class InstancesPage extends AdminPage {
-
-	@PaxWicketBean(name = "preferencesService")
-	private PreferencesService preferences;
-
-    public InstancesPage() {
-        ColumnList<Instance> columns = new ColumnList<Instance>(preferences.getUserPreferences("karaf"));
-
-        columns.addColumn(new OrdinalColumn<Instance>());
-        columns.addColumn(new PropertyColumnExt<Instance>("PID", "pid"));
-        columns.addColumn(new PropertyColumnExt<Instance>("Name", "name"));
-        columns.addColumn(new PropertyColumnExt<Instance>("Root", "root"));
-        columns.addColumn(new PropertyColumnExt<Instance>("State", "state"));
-        columns.addColumn(new PropertyColumnExt<Instance>("Location", "location"));
-        columns.addColumn(new AbstractColumn<Instance>(of("Actions")) {
-            public void populateItem(Item<ICellPopulator<Instance>> cellItem, String componentId, IModel<Instance> rowModel) {
-                cellItem.add(new InstanceActionsPanel(componentId, rowModel));
-            }
-        });
-
-        add(new AdvancedDataTable<Instance>("instances", columns, new InstancesDataProvider(admin), 20));
-    }
-
-}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceDataProvider.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceDataProvider.java
new file mode 100644
index 0000000..80bca50
--- /dev/null
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceDataProvider.java
@@ -0,0 +1,56 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.model.IModel;
+
+/**
+ * Data provider for instances list.
+ */
+public class InstanceDataProvider extends SortableDataProvider<Instance> {
+
+    private static final long serialVersionUID = 1L;
+
+    private AdminService admin;
+
+    public InstanceDataProvider(AdminService admin) {
+        this.admin = admin;
+    }
+
+    public Iterator<? extends Instance> iterator(int first, int count) {
+        List<Instance> list = new ArrayList<Instance>();
+        Collections.addAll(list, admin.getInstances());
+        return list.subList(first, count).iterator();
+    }
+
+    public int size() {
+        return admin.getInstances().length;
+    }
+
+    public IModel<Instance> model(Instance object) {
+        return new InstanceModel(admin, object);
+    }
+
+}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceModel.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceModel.java
index 2e776fa..2535342 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceModel.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceModel.java
@@ -1,11 +1,32 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.model;
 
 import org.apache.karaf.admin.AdminService;
 import org.apache.karaf.admin.Instance;
 import org.apache.wicket.model.LoadableDetachableModel;
 
+/**
+ * Karaf instance model.
+ */
 public class InstanceModel extends LoadableDetachableModel<Instance> {
 
+    private static final long serialVersionUID = 1L;
+
     private AdminService admin;
     private String name;
 
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceSettingsExt.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceSettingsExt.java
deleted file mode 100644
index 9398988..0000000
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstanceSettingsExt.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.apache.karaf.webconsole.karaf.admin.model;
-
-import java.io.Serializable;
-
-import org.apache.karaf.admin.InstanceSettings;
-
-public class InstanceSettingsExt extends InstanceSettings implements Serializable {
-
-    public InstanceSettingsExt() {
-        super(0, 0, 0, "", "", null, null);
-    }
-
-}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstancesDataProvider.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstancesDataProvider.java
deleted file mode 100644
index 0d9b92f..0000000
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/InstancesDataProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.apache.karaf.webconsole.karaf.admin.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.karaf.admin.AdminService;
-import org.apache.karaf.admin.Instance;
-import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
-import org.apache.wicket.model.IModel;
-
-public class InstancesDataProvider extends SortableDataProvider<Instance> {
-
-    private AdminService admin;
-
-    public InstancesDataProvider(AdminService admin) {
-        this.admin = admin;
-    }
-
-    public Iterator<? extends Instance> iterator(int first, int count) {
-        List<Instance> list = new ArrayList<Instance>();
-        Collections.addAll(list, admin.getInstances());
-        return list.subList(first, count).iterator();
-    }
-
-    public int size() {
-        return admin.getInstances().length;
-    }
-
-    public IModel<Instance> model(Instance object) {
-        return new InstanceModel(admin, object);
-    }
-
-}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/KarafInstance.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/KarafInstance.java
deleted file mode 100644
index db9ff47..0000000
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/KarafInstance.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.karaf.webconsole.karaf.admin.model;
-
-import java.io.Serializable;
-
-public class KarafInstance implements Serializable {
-
-    private String name;
-
-    private InstanceSettingsExt settings;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public InstanceSettingsExt getSettings() {
-        return settings;
-    }
-
-    public void setSettings(InstanceSettingsExt settings) {
-        this.settings = settings;
-    }
-
-}
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstance.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstance.java
new file mode 100644
index 0000000..ae17947
--- /dev/null
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstance.java
@@ -0,0 +1,48 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.model;
+
+import java.io.Serializable;
+
+/**
+ * Serializable instance for wicket.
+ */
+public class WicketInstance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String name;
+
+    private WicketInstanceSettings settings;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public WicketInstanceSettings getSettings() {
+        return settings;
+    }
+
+    public void setSettings(WicketInstanceSettings settings) {
+        this.settings = settings;
+    }
+
+}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstanceSettings.java
similarity index 66%
copy from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java
copy to karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstanceSettings.java
index 464b478..67198f5 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/model/WicketInstanceSettings.java
@@ -14,12 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features;
+package org.apache.karaf.webconsole.karaf.admin.model;
 
-public class MissingFeatureException extends RuntimeException {
+import java.io.Serializable;
 
-    public MissingFeatureException(String name, String version) {
-        super("Feature " + name + " with version " + version + " is no longer available");
+import org.apache.karaf.admin.InstanceSettings;
+
+/**
+ * Wicket instance settings, serializable.
+ */
+public class WicketInstanceSettings extends InstanceSettings implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+	public WicketInstanceSettings() {
+        super(0, 0, 0, "", "", null, null);
     }
 
 }
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/navigation/AdminNavigationProvider.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/navigation/AdminNavigationProvider.java
index 79094c3..47f9531 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/navigation/AdminNavigationProvider.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/navigation/AdminNavigationProvider.java
@@ -1,3 +1,19 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.navigation;
 
 import static org.apache.karaf.webconsole.core.util.LinkUtils.createPageLink;
@@ -6,15 +22,18 @@
 import java.util.List;
 
 import org.apache.karaf.webconsole.core.navigation.NavigationProvider;
-import org.apache.karaf.webconsole.karaf.admin.list.InstancesPage;
+import org.apache.karaf.webconsole.karaf.admin.list.InstancePage;
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.link.Link;
 
+/**
+ * Navigation provider for admin module.
+ */
 public class AdminNavigationProvider implements NavigationProvider {
 
     public List<Link<Page>> getItems(String componentId, String labelId) {
         List<Link<Page>> links = new ArrayList<Link<Page>>();
-        links.add(createPageLink(componentId, labelId, "Instances", InstancesPage.class));
+        links.add(createPageLink(componentId, labelId, "Instances", InstancePage.class));
         return links;
     }
 
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsForm.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsForm.java
index 95b48cd..cd853f6 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsForm.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsForm.java
@@ -1,16 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.karaf.webconsole.karaf.admin.settings;
 
-import org.apache.karaf.webconsole.karaf.admin.model.InstanceSettingsExt;
+import org.apache.karaf.webconsole.karaf.admin.model.WicketInstanceSettings;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.TextArea;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.IModel;
 
-public class InstanceSettingsForm extends Form<InstanceSettingsExt> {
+/**
+ * Instance settings modification form.
+ */
+public class InstanceSettingsForm extends Form<WicketInstanceSettings> {
 
-    public InstanceSettingsForm(String id, IModel<InstanceSettingsExt> model) {
-        super(id, new CompoundPropertyModel<InstanceSettingsExt>(model));
+    private static final long serialVersionUID = 1L;
+
+    public InstanceSettingsForm(String id, IModel<WicketInstanceSettings> model) {
+        super(id, new CompoundPropertyModel<WicketInstanceSettings>(model));
 
         add(new TextField<Integer>("sshPort"));
         add(new TextField<Integer>("rmiRegistryPort"));
diff --git a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.java b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.java
index 4fb73de..20efbf1 100644
--- a/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.java
+++ b/karaf/admin/src/main/java/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.java
@@ -1,12 +1,33 @@
+/*
+ * 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.karaf.webconsole.karaf.admin.settings;
 
-import org.apache.karaf.webconsole.karaf.admin.model.InstanceSettingsExt;
+import org.apache.karaf.webconsole.karaf.admin.model.WicketInstanceSettings;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 
+/**
+ * Panel to wrap instance settings.
+ */
 public class InstanceSettingsPanel extends Panel {
 
-    public InstanceSettingsPanel(String id, IModel<InstanceSettingsExt> model) {
+    private static final long serialVersionUID = 1L;
+
+    public InstanceSettingsPanel(String id, IModel<WicketInstanceSettings> model) {
         super(id, model);
 
         add(new InstanceSettingsForm("settings", model));
diff --git a/karaf/admin/src/main/resources/OSGI-INF/blueprint/admin.xml b/karaf/admin/src/main/resources/OSGI-INF/blueprint/admin.xml
index 311bf13..aeddb0b 100644
--- a/karaf/admin/src/main/resources/OSGI-INF/blueprint/admin.xml
+++ b/karaf/admin/src/main/resources/OSGI-INF/blueprint/admin.xml
@@ -26,6 +26,4 @@
 
     <reference id="adminService" interface="org.apache.karaf.admin.AdminService"/>
 
-    <reference id="preferencesService" interface="org.osgi.service.prefs.PreferencesService" />
-
 </blueprint>
\ No newline at end of file
diff --git a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.html b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.html
index 9dd9b38..6d5d34d 100644
--- a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.html
+++ b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/create/CreateInstancePage.html
@@ -15,23 +15,15 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
+<wicket:extend xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
+    <h1>Create new instance</h1>
 
-    <body>
-        <wicket:extend>
-            <h1>Create new instance</h1>
+    <form wicket:id="instance">
+        Name<br />
+        <input type="text" wicket:id="name" />
 
-            <form wicket:id="instance">
-                Name<br />
-                <input type="text" wicket:id="name" />
+        <div wicket:id="settings"></div>
 
-                <div wicket:id="settings"></div>
-
-                <input wicket:id="submit" type="submit" />
-            </form>
-        </wicket:extend>
-    </body>
-</html>
+        <input wicket:id="submit" type="submit" />
+    </form>
+</wicket:extend>
\ No newline at end of file
diff --git a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.html
similarity index 64%
copy from karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html
copy to karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.html
index 92019f1..b05fc1a 100644
--- a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html
+++ b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancePage.html
@@ -15,17 +15,18 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
+<wicket:extend xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+    <div class="row-fluid">
+        <h1 class="pull-left">Instances</h1>
 
-    <body>
-        <wicket:extend>
-            <h1>Instances</h1>
+        <div class="btn-group pull-right">
+            <a class="btn btn-primary">
+                <i class="icon-plus icon-white"></i>
+                New instance
+            </a>
+        </div>
+    </div>
 
-            <table wicket:id="instances" class="table table-striped table-condensed" />
+    <table wicket:id="instances" class="table table-striped table-condensed" />
 
-        </wicket:extend>
-    </body>
-</html>
+</wicket:extend>
\ No newline at end of file
diff --git a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.html b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.html
index 44d71a9..ec2218a 100644
--- a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.html
+++ b/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/settings/InstanceSettingsPanel.html
@@ -15,29 +15,23 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
+<wicket:panel xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+    <form wicket:id="settings">
+        SSH port<br />
+        <input type="text" wicket:id="sshPort" />
 
-    <wicket:panel>
-        <form wicket:id="settings">
-            SSH port<br />
-            <input type="text" wicket:id="sshPort" />
+        <h2>RMI Connector</h2>
+        Registry port<br />
+        <input type="text" wicket:id="rmiRegistryPort" />
+        Server port<br />
+        <input type="text" wicket:id="rmiServerPort" />
 
-            <h2>RMI Connector</h2>
-            Registry port<br />
-            <input type="text" wicket:id="rmiRegistryPort" />
-            Server port<br />
-            <input type="text" wicket:id="rmiServerPort" />
+        <h2>Runtime</h2>
+        Java process options<br />
+        <textarea wicket:id="javaOpts"></textarea>
 
-            <h2>Runtime</h2>
-            Java process options<br />
-            <textarea wicket:id="javaOpts"></textarea>
-
-            <h2>Read only properties</h2>
-            Instance location<br />
-            <input type="text" wicket:id="location" />
-        </form>
-    </wicket:panel>
-</html>
+        <h2>Read only properties</h2>
+        Instance location<br />
+        <input type="text" wicket:id="location" />
+    </form>
+</wicket:panel>
diff --git a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/KarafOverviewPage.java b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/KarafOverviewPage.java
index 1e81495..b8de15f 100644
--- a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/KarafOverviewPage.java
+++ b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/KarafOverviewPage.java
@@ -1,16 +1,16 @@
 package org.apache.karaf.webconsole.karaf.core;
 
-import org.apache.karaf.webconsole.core.page.SecuredPage;
-import org.apache.karaf.webconsole.karaf.core.model.Karaf;
+import org.apache.karaf.webconsole.core.page.SinglePage;
+import org.apache.karaf.webconsole.karaf.core.model.WicketKaraf;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
 
 @PaxWicketMountPoint(mountPoint = "/karaf")
-public class KarafOverviewPage extends SecuredPage {
+public class KarafOverviewPage extends SinglePage {
 
     public KarafOverviewPage() {
-        setDefaultModel(new CompoundPropertyModel<Karaf>(new Karaf()));
+        setDefaultModel(new CompoundPropertyModel<WicketKaraf>(new WicketKaraf()));
 
         add(new Label("version"));
 
diff --git a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/Karaf.java b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/WicketKaraf.java
similarity index 93%
rename from karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/Karaf.java
rename to karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/WicketKaraf.java
index f01a280..1bf3706 100644
--- a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/Karaf.java
+++ b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/model/WicketKaraf.java
@@ -2,7 +2,7 @@
 
 import java.io.Serializable;
 
-public class Karaf implements Serializable {
+public class WicketKaraf implements Serializable {
 
     public String getVersion() {
         return System.getProperty("karaf.version");
diff --git a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/navigation/KarafConsoleTabProvider.java b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/navigation/KarafConsoleTabProvider.java
index 4e2f241..64149f3 100644
--- a/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/navigation/KarafConsoleTabProvider.java
+++ b/karaf/core/src/main/java/org/apache/karaf/webconsole/karaf/core/navigation/KarafConsoleTabProvider.java
@@ -12,12 +12,12 @@
 
 public class KarafConsoleTabProvider implements ConsoleTabProvider {
 
-    public List<Link<Page>> getItems(String componentId, String labelId) {
-        return Collections.emptyList();
-    }
-
     public Link<Page> getModuleLink(String componentId, String labelId) {
         return createPageLink(componentId, labelId, "Karaf", KarafOverviewPage.class);
     }
 
+    public List<Link<Page>> getItems(String componentId, String labelId) {
+        return Collections.emptyList();
+    }
+
 }
diff --git a/karaf/features/NOTICE b/karaf/feature/NOTICE
similarity index 100%
rename from karaf/features/NOTICE
rename to karaf/feature/NOTICE
diff --git a/karaf/features/pom.xml b/karaf/feature/pom.xml
similarity index 94%
rename from karaf/features/pom.xml
rename to karaf/feature/pom.xml
index ce757d1..fb58d24 100644
--- a/karaf/features/pom.xml
+++ b/karaf/feature/pom.xml
@@ -26,8 +26,8 @@
     </parent>
 
     <groupId>org.apache.karaf.webconsole.karaf</groupId>
-    <artifactId>org.apache.karaf.webconsole.karaf.features</artifactId>
-    <name>Apache Karaf :: WebConsole :: Karaf :: Features</name>
+    <artifactId>org.apache.karaf.webconsole.karaf.feature</artifactId>
+    <name>Apache Karaf :: WebConsole :: Karaf :: Feature</name>
     <packaging>bundle</packaging>
 
     <dependencies>
@@ -53,7 +53,7 @@
                     <instructions>
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                         <Import-Package>
-                            !org.apache.karaf.webconsole.karaf.features*,
+                            !org.apache.karaf.webconsole.karaf.feature*,
                             *,
                             <!-- transient dependencies -->
                             org.ops4j.pax.wicket.api,
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeatureModel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureModel.java
similarity index 96%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeatureModel.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureModel.java
index f0202fa..1bd285d 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeatureModel.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureModel.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features;
+package org.apache.karaf.webconsole.karaf.feature;
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
diff --git a/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureUtil.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureUtil.java
new file mode 100644
index 0000000..3b59517
--- /dev/null
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeatureUtil.java
@@ -0,0 +1,40 @@
+package org.apache.karaf.webconsole.karaf.feature;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.url.URLConstants;
+import org.osgi.service.url.URLStreamHandlerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class to work with feature related tasks.
+ */
+public class FeatureUtil {
+
+    private static Logger logger = LoggerFactory.getLogger(FeatureUtil.class);
+
+    public static Set<String> getAllowedProtocols(BundleContext context) {
+        Set<String> protocols = new HashSet<String>();
+
+        try {
+            ServiceReference[] references = context.getAllServiceReferences(URLStreamHandlerService.class.getName(),
+                "(!(" + URLConstants.URL_HANDLER_PROTOCOL + "=*))");
+            for (ServiceReference reference : references) {
+                Object property = reference.getProperty(URLConstants.URL_HANDLER_PROTOCOL);
+                if (property != null) {
+                    protocols.add((String) property);
+                }
+            }
+        } catch (InvalidSyntaxException e) {
+            logger.error("Exception during scanning the services", e);
+        }
+
+        return protocols;
+    }
+
+}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeaturesProvider.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeaturesProvider.java
similarity index 97%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeaturesProvider.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeaturesProvider.java
index a864ef7..3a0fad7 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/FeaturesProvider.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/FeaturesProvider.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features;
+package org.apache.karaf.webconsole.karaf.feature;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/KarafFeaturesPage.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/KarafFeaturesPage.java
new file mode 100644
index 0000000..e46c7bc
--- /dev/null
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/KarafFeaturesPage.java
@@ -0,0 +1,19 @@
+package org.apache.karaf.webconsole.karaf.feature;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.webconsole.core.page.SinglePage;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+
+public class KarafFeaturesPage extends SinglePage {
+
+    @PaxWicketBean(name = "featuresService")
+    protected FeaturesService featuresService;
+
+    //@PaxWicketBean(name = "featuresSidebar")
+    //protected SidebarProvider featuresSidebar;
+
+    public KarafFeaturesPage() {
+        //setSidebarProvider(featuresSidebar);
+    }
+
+}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/MissingFeatureException.java
similarity index 94%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/MissingFeatureException.java
index 464b478..1a0ccd0 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/MissingFeatureException.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/MissingFeatureException.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features;
+package org.apache.karaf.webconsole.karaf.feature;
 
 public class MissingFeatureException extends RuntimeException {
 
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/RepositoriesProvider.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/RepositoriesProvider.java
similarity index 92%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/RepositoriesProvider.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/RepositoriesProvider.java
index 86f640f..0daf07f 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/RepositoriesProvider.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/RepositoriesProvider.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features;
+package org.apache.karaf.webconsole.karaf.feature;
 
 import java.util.Arrays;
 import java.util.Iterator;
 
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
-import org.apache.karaf.webconsole.karaf.features.model.RepositoryModel;
+import org.apache.karaf.webconsole.karaf.feature.model.RepositoryModel;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
 import org.apache.wicket.model.IModel;
 
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesActionsPanel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesActionsPanel.java
similarity index 96%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesActionsPanel.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesActionsPanel.java
index 0b175ab..ebda174 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesActionsPanel.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesActionsPanel.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.feature;
+package org.apache.karaf.webconsole.karaf.feature.feature;
 
 import java.util.Arrays;
 import java.util.List;
@@ -57,7 +57,7 @@
             }
         };
 
-        link.add(new SimpleAttributeModifier("class", isInstalled(object) ? "installed" : "uninstalled"));
+        link.add(new SimpleAttributeModifier("class", isInstalled(object) ? "icon-eject" : "icon-play"));
         link.add(new Label(labelId));
 
         // add image to the link
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.java
similarity index 95%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.java
index 0f24ae4..e4f3871 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.feature;
+package org.apache.karaf.webconsole.karaf.feature.feature;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -23,8 +23,8 @@
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.Repository;
-import org.apache.karaf.webconsole.karaf.features.FeaturesProvider;
-import org.apache.karaf.webconsole.karaf.features.KarafFeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.FeaturesProvider;
+import org.apache.karaf.webconsole.karaf.feature.KarafFeaturesPage;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryModel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryModel.java
similarity index 96%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryModel.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryModel.java
index f1741fb..cedf1dc 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryModel.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryModel.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.model;
+package org.apache.karaf.webconsole.karaf.feature.model;
 
 import java.net.URI;
 
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryNotFoundException.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryNotFoundException.java
similarity index 94%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryNotFoundException.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryNotFoundException.java
index 7f5b7bd..9e17786 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/model/RepositoryNotFoundException.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/RepositoryNotFoundException.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.model;
+package org.apache.karaf.webconsole.karaf.feature.model;
 
 import java.net.URI;
 
diff --git a/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/WicketRepository.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/WicketRepository.java
new file mode 100644
index 0000000..8d826cd
--- /dev/null
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/model/WicketRepository.java
@@ -0,0 +1,58 @@
+/*
+ * 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.karaf.webconsole.karaf.feature.model;
+
+import java.io.Serializable;
+import java.net.URI;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.Repository;
+
+/**
+ * An implementation of karaf feature {@link Repository} which is used only to
+ * specify URI. All other operations are unsupported.
+ */
+public class WicketRepository implements Repository, Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private URI uri;
+
+    public URI getURI() {
+        return uri;
+    }
+
+    public void setUri(URI uri) {
+        this.uri = uri;
+    }
+
+    public String getName() {
+        throw new UnsupportedOperationException();
+    }
+
+    public URI[] getRepositories() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public Feature[] getFeatures() throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isValid() {
+        throw new UnsupportedOperationException();
+    }
+
+}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/navigation/FeaturesNavigationProvider.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/navigation/FeatureNavigationProvider.java
similarity index 85%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/navigation/FeaturesNavigationProvider.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/navigation/FeatureNavigationProvider.java
index bb36469..986d4aa 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/navigation/FeaturesNavigationProvider.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/navigation/FeatureNavigationProvider.java
@@ -14,21 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.navigation;
+package org.apache.karaf.webconsole.karaf.feature.navigation;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.karaf.webconsole.core.navigation.NavigationProvider;
-import org.apache.karaf.webconsole.karaf.features.feature.FeaturesPage;
-import org.apache.karaf.webconsole.karaf.features.repository.RepositoriesPage;
+import org.apache.karaf.webconsole.karaf.feature.feature.FeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.repository.RepositoriesPage;
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.ResourceModel;
 
-public class FeaturesNavigationProvider implements NavigationProvider {
+public class FeatureNavigationProvider implements NavigationProvider {
 
     public List<Link<Page>> getItems(String componentId, String labelId) {
         List<Link<Page>> items = new ArrayList<Link<Page>>();
diff --git a/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.java
new file mode 100644
index 0000000..f9457b0
--- /dev/null
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.java
@@ -0,0 +1,58 @@
+/*
+ * 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.karaf.webconsole.karaf.feature.repository;
+
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.webconsole.karaf.feature.KarafFeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.model.WicketRepository;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SubmitLink;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
+
+@PaxWicketMountPoint(mountPoint = "/karaf/repositories/add")
+public class AddRepositoryPage extends KarafFeaturesPage {
+
+    public AddRepositoryPage() {
+        final IModel<Repository> model = new Model(new WicketRepository());
+
+        final Form<Repository> form = new Form<Repository>("form", model);
+        form.add(new AddRepositoryPanel("repository", model));
+        form.add(new SubmitLink("submit") {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onSubmit() {
+				URI uri = model.getObject().getURI();
+                try {
+					featuresService.addRepository(uri);
+				} catch (Exception e) {
+					Map<String, Object> map = new HashMap<String, Object>();
+					map.put("uri", uri);
+					form.error("Can not create repository " + e.getMessage(), map);
+				}
+            }
+        });
+        add(form);
+    }
+
+}
diff --git a/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.java
new file mode 100644
index 0000000..2d78c70
--- /dev/null
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.java
@@ -0,0 +1,55 @@
+/*
+ * 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.karaf.webconsole.karaf.feature.repository;
+
+import java.net.URI;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.webconsole.core.form.LabelBorder;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+
+public class AddRepositoryPanel extends Panel {
+
+    private static final long serialVersionUID = 1L;
+
+    @PaxWicketBean(name = "featuresService")
+    private FeaturesService featuresService;
+
+    private TextField<URI> uri;
+
+    public AddRepositoryPanel(String id, IModel<Repository> model) {
+        super(id);
+
+        Form<Repository> form = new Form<Repository>("add", new CompoundPropertyModel<Repository>(model));
+        uri = new TextField<URI>("uri");
+        uri.setRequired(true);
+
+        LabelBorder border = new LabelBorder("border", new ResourceModel("feature.repository.uri"), uri);
+        border.setHelp(new ResourceModel("feature.repository.uri.help"));
+        form.add(border);
+        add(form);
+    }
+
+
+}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesActionPanel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesActionPanel.java
similarity index 96%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesActionPanel.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesActionPanel.java
index 66440f8..b43ec7e 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesActionPanel.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesActionPanel.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.repository;
+package org.apache.karaf.webconsole.karaf.feature.repository;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.java
similarity index 77%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.java
index e78dca4..1661a41 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.java
@@ -14,12 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.repository;
+package org.apache.karaf.webconsole.karaf.feature.repository;
 
 import org.apache.karaf.features.Repository;
 import org.apache.karaf.webconsole.core.table.OrdinalColumn;
-import org.apache.karaf.webconsole.karaf.features.KarafFeaturesPage;
-import org.apache.karaf.webconsole.karaf.features.RepositoriesProvider;
+import org.apache.karaf.webconsole.karaf.feature.KarafFeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.RepositoriesProvider;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
@@ -46,6 +49,17 @@
             }
         };
 
+        add(new AjaxFallbackLink("addRepository") {
+        	@Override
+        	public void onClick(AjaxRequestTarget target) {
+//        		if (target != null) {
+//        			target.addComponent(new AddRepositoryPanel(id, model));
+//        		} else {
+        			RequestCycle.get().setResponsePage(AddRepositoryPage.class);
+//        		}
+        	}
+        });
+
         add(new DefaultDataTable<Repository>("repositories", columns, new RepositoriesProvider(featuresService), 20));
     }
 
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/sidebar/KarafFeaturesSidebar.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/sidebar/KarafFeatureSidebar.java
similarity index 83%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/sidebar/KarafFeaturesSidebar.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/sidebar/KarafFeatureSidebar.java
index f21f32c..2504265 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/sidebar/KarafFeaturesSidebar.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/sidebar/KarafFeatureSidebar.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.sidebar;
+package org.apache.karaf.webconsole.karaf.feature.sidebar;
 
 import static org.apache.karaf.webconsole.core.util.LinkUtils.createPageLink;
 
@@ -24,16 +24,16 @@
 
 import org.apache.karaf.webconsole.core.navigation.SidebarProvider;
 import org.apache.karaf.webconsole.core.widget.WidgetProvider;
-import org.apache.karaf.webconsole.karaf.features.feature.FeaturesPage;
-import org.apache.karaf.webconsole.karaf.features.repository.AddRepositoryPage;
-import org.apache.karaf.webconsole.karaf.features.repository.RepositoriesPage;
+import org.apache.karaf.webconsole.karaf.feature.feature.FeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.repository.AddRepositoryPage;
+import org.apache.karaf.webconsole.karaf.feature.repository.RepositoriesPage;
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.link.Link;
 
 /**
  * Karaf features sidebar.
  */
-public class KarafFeaturesSidebar implements SidebarProvider {
+public class KarafFeatureSidebar implements SidebarProvider {
 
     @SuppressWarnings("unchecked")
     public List<Link<Page>> getItems(String componentId, String labelId) {
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.java
similarity index 83%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.java
index f196cf3..36a97cd 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.java
@@ -14,19 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.widget;
+package org.apache.karaf.webconsole.karaf.feature.widget;
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.webconsole.karaf.features.feature.FeaturesPage;
-import org.apache.karaf.webconsole.karaf.features.repository.RepositoriesPage;
+import org.apache.karaf.webconsole.karaf.feature.feature.FeaturesPage;
+import org.apache.karaf.webconsole.karaf.feature.repository.RepositoriesPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public class FeaturesWidgetPanel extends Panel {
+public class FeatureWidgetPanel extends Panel {
 
-    public FeaturesWidgetPanel(String id, FeaturesService service) {
+    public FeatureWidgetPanel(String id, FeaturesService service) {
         super(id);
 
         try {
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/KarafFeaturesWidgetProvider.java b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/KarafFeatureWidgetProvider.java
similarity index 81%
rename from karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/KarafFeaturesWidgetProvider.java
rename to karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/KarafFeatureWidgetProvider.java
index 4fc4cb0..65f1c8a 100644
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/widget/KarafFeaturesWidgetProvider.java
+++ b/karaf/feature/src/main/java/org/apache/karaf/webconsole/karaf/feature/widget/KarafFeatureWidgetProvider.java
@@ -14,22 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.karaf.webconsole.karaf.features.widget;
+package org.apache.karaf.webconsole.karaf.feature.widget;
 
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.webconsole.core.widget.WidgetProvider;
 import org.apache.wicket.markup.html.panel.Panel;
 
-public class KarafFeaturesWidgetProvider implements WidgetProvider {
+public class KarafFeatureWidgetProvider implements WidgetProvider {
 
     private final FeaturesService service;
 
-    public KarafFeaturesWidgetProvider(FeaturesService service) {
+    public KarafFeatureWidgetProvider(FeaturesService service) {
         this.service = service;
     }
 
     public Panel createPanel(String id) {
-        return new FeaturesWidgetPanel(id, service);
+        return new FeatureWidgetPanel(id, service);
     }
 
 }
diff --git a/karaf/features/src/main/resources/OSGI-INF/blueprint/features.xml b/karaf/feature/src/main/resources/OSGI-INF/blueprint/feature.xml
similarity index 88%
rename from karaf/features/src/main/resources/OSGI-INF/blueprint/features.xml
rename to karaf/feature/src/main/resources/OSGI-INF/blueprint/feature.xml
index 781c5f4..71404e0 100644
--- a/karaf/features/src/main/resources/OSGI-INF/blueprint/features.xml
+++ b/karaf/feature/src/main/resources/OSGI-INF/blueprint/feature.xml
@@ -21,7 +21,7 @@
         <service-properties>
             <entry key="extends" value="karaf" />
         </service-properties>
-        <bean class="org.apache.karaf.webconsole.karaf.features.navigation.FeaturesNavigationProvider" />
+        <bean class="org.apache.karaf.webconsole.karaf.feature.navigation.FeatureNavigationProvider" />
     </service>
 
     <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService"/>
@@ -32,10 +32,10 @@
         </service-properties>
     </service>
 
-    <bean id="widgetProvider" class="org.apache.karaf.webconsole.karaf.features.widget.KarafFeaturesWidgetProvider">
+    <bean id="widgetProvider" class="org.apache.karaf.webconsole.karaf.feature.widget.KarafFeatureWidgetProvider">
         <argument ref="featuresService" />
     </bean>
 
-    <bean id="featuresSidebar" class="org.apache.karaf.webconsole.karaf.features.sidebar.KarafFeaturesSidebar" />
+    <bean id="featuresSidebar" class="org.apache.karaf.webconsole.karaf.feature.sidebar.KarafFeatureSidebar" />
 
 </blueprint>
diff --git a/karaf/feature/src/main/resources/OSGI-INF/l10n/webconsole_pl.properties b/karaf/feature/src/main/resources/OSGI-INF/l10n/webconsole_pl.properties
new file mode 100644
index 0000000..89cac00
--- /dev/null
+++ b/karaf/feature/src/main/resources/OSGI-INF/l10n/webconsole_pl.properties
@@ -0,0 +1,3 @@
+feature.repository.uri URI Repozytorium
+feature.repository.uri.help Mozesz okreslic URI repozytorium cech. Reposytorium to plik \
+xml ktory zawiera definicje jednostek wdrozenia.
\ No newline at end of file
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.html b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.html
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.html
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.html
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.properties b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.properties
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage.properties
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage.properties
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage_de.properties b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage_de.properties
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage_de.properties
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage_de.properties
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage_fr.properties b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage_fr.properties
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/FeaturesPage_fr.properties
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/FeaturesPage_fr.properties
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/features.css b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/features.css
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/features.css
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/features.css
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/images/feature_install.png b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/images/feature_install.png
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/images/feature_install.png
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/images/feature_install.png
Binary files differ
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/images/feature_uninstall.png b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/images/feature_uninstall.png
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/feature/images/feature_uninstall.png
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/feature/images/feature_uninstall.png
Binary files differ
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/navigation/package_fr.properties b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/navigation/package_fr.properties
similarity index 100%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/navigation/package_fr.properties
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/navigation/package_fr.properties
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.html
similarity index 65%
rename from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.html
index d0b8d73..9ed2420 100644
--- a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html
+++ b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.html
@@ -15,16 +15,17 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
+<wicket:extend xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+    <h1>Add feature repository</h1>
 
-    <body>
-        <wicket:extend>
-            <h1>Feature Repositories</h1>
-            <table wicket:id="repositories" class="table table-striped table-condensed"/>
-        </wicket:extend>
-    </body>
+    <form wicket:id="form">
 
-</html>
+        <div wicket:id="repository"></div>
+
+        <div class="form-actions">
+            <input type="submit" wicket:id="submit" class="btn btn-primary" value="Create" />
+            <input type="reset" class="btn" value="Reset" />
+        </div>
+    </form>
+
+</wicket:extend>
\ No newline at end of file
diff --git a/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.properties b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.properties
new file mode 100644
index 0000000..6561485
--- /dev/null
+++ b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPage.properties
@@ -0,0 +1,3 @@
+feature.repository.uri Repository URI
+feature.repository.uri.help You can specify an URI to feature repository. The \
+feature repository is XML file which contains definition of deployment units.
\ No newline at end of file
diff --git a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.html
similarity index 67%
rename from karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html
rename to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.html
index 92019f1..10554d4 100644
--- a/karaf/admin/src/main/resources/org/apache/karaf/webconsole/karaf/admin/list/InstancesPage.html
+++ b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/AddRepositoryPanel.html
@@ -15,17 +15,13 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
-
-    <body>
-        <wicket:extend>
-            <h1>Instances</h1>
-
-            <table wicket:id="instances" class="table table-striped table-condensed" />
-
-        </wicket:extend>
-    </body>
-</html>
+<wicket:panel xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+    <form wicket:id="add">
+        <fieldset>
+            <legend>Feature details</legend>
+            <div class="control-group" wicket:id="border">
+                <input type="text" class="input-xlarge" id="uri" wicket:id="uri" />
+            </div>
+        </fieldset>
+    </form>
+</wicket:panel>
\ No newline at end of file
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.html
similarity index 62%
copy from karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html
copy to karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.html
index d0b8d73..5512771 100644
--- a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/RepositoriesPage.html
+++ b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/repository/RepositoriesPage.html
@@ -15,16 +15,19 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 -->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
+<wicket:extend xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 
-    <body>
-        <wicket:extend>
-            <h1>Feature Repositories</h1>
-            <table wicket:id="repositories" class="table table-striped table-condensed"/>
-        </wicket:extend>
-    </body>
+    <div class="row-fluid">
+        <h1 class="pull-left">Feature Repositories</h1>
 
-</html>
+        <div class="pull-right">
+            <a class="btn btn-primary" wicket:id="addRepository">
+                <i class="icon-plus"></i>
+                Add repository
+            </a>
+        </div>
+    </div>
+
+    <table wicket:id="repositories" class="table table-striped table-condensed"/>
+
+</wicket:extend>
\ No newline at end of file
diff --git a/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.html b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.html
new file mode 100644
index 0000000..8863518
--- /dev/null
+++ b/karaf/feature/src/main/resources/org/apache/karaf/webconsole/karaf/feature/widget/FeatureWidgetPanel.html
@@ -0,0 +1,32 @@
+<?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.
+-->
+<wicket:panel xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+    <div class="span3 widget">
+        <h3>Karaf Features</h3>
+        <p>
+            You have <span wicket:id="featuresCount">10</span> features.
+            <span wicket:id="installedCount">10</span> installed and
+            <span wicket:id="uninstalledCount">10</span> waiting for installation.
+        </p>
+
+        <p>
+            <a wicket:id="featuresLink">Go to feature management</a>
+            <a wicket:id="repositoriesLink">Go to repository management</a>
+        </p>
+    </div>
+</wicket:panel>
\ No newline at end of file
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/KarafFeaturesPage.java b/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/KarafFeaturesPage.java
deleted file mode 100644
index f330639..0000000
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/KarafFeaturesPage.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.karaf.webconsole.karaf.features;
-
-import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.webconsole.core.navigation.SidebarProvider;
-import org.apache.karaf.webconsole.core.page.SidebarPage;
-import org.ops4j.pax.wicket.api.PaxWicketBean;
-
-public class KarafFeaturesPage extends SidebarPage {
-
-    @PaxWicketBean(name = "featuresService")
-    protected FeaturesService featuresService;
-
-    @PaxWicketBean(name = "featuresSidebar")
-    protected SidebarProvider featuresSidebar;
-
-    public KarafFeaturesPage() {
-        setSidebarProvider(featuresSidebar);
-    }
-
-}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryForm.java b/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryForm.java
deleted file mode 100644
index 2653ccc..0000000
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryForm.java
+++ /dev/null
@@ -1,74 +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.karaf.webconsole.karaf.features.repository;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.features.Repository;
-import org.apache.karaf.webconsole.core.form.LabelBorder;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SubmitLink;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.Model;
-import org.ops4j.pax.wicket.api.PaxWicketBean;
-
-public class AddRepositoryForm extends Form<Repository> {
-
-    @PaxWicketBean(name = "featuresService")
-    private FeaturesService featuresService;
-
-    private TextField<String> uri;
-
-    public AddRepositoryForm(String id) {
-        super(id);
-
-        uri = new TextField<String>("uri", Model.of("mvn:")) {
-            @Override
-            public boolean isRequired() {
-                return true;
-            }
-        };
-
-        LabelBorder border = new LabelBorder("border");
-        border.add(new Label("label", "Repository URI"));
-        border.add(uri);
-
-        add(border);
-
-        add(new SubmitLink("submit"));
-    }
-
-    @Override
-    protected void onSubmit() {
-        String add = uri.getModelObject();
-        try {
-            URI uri = new URI(add);
-            featuresService.addRepository(uri);
-
-            getSession().info("New repository with uri " + uri + " added");
-            getRequestCycle().setResponsePage(RepositoriesPage.class);
-        } catch (URISyntaxException e) {
-            error("Cannot parse give uri " + e.getMessage());
-        } catch (Exception e) {
-            error("FeaturesService reported an error " + e.getMessage());
-        }
-    }
-
-}
diff --git a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.java b/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.java
deleted file mode 100644
index 9b1c77b..0000000
--- a/karaf/features/src/main/java/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.java
+++ /dev/null
@@ -1,29 +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.karaf.webconsole.karaf.features.repository;
-
-import org.apache.karaf.webconsole.karaf.features.KarafFeaturesPage;
-import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
-
-@PaxWicketMountPoint(mountPoint = "/karaf/repositories/add")
-public class AddRepositoryPage extends KarafFeaturesPage {
-
-    public AddRepositoryPage() {
-        add(new AddRepositoryForm("add"));
-    }
-
-}
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.html b/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.html
deleted file mode 100644
index 213fe99..0000000
--- a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/repository/AddRepositoryPage.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
-    <wicket:head>
-        <title>Karaf WebConsole</title>
-    </wicket:head>
-
-    <body>
-        <wicket:extend>
-            <h1>Add feature repository</h1>
-
-            <form wicket:id="add">
-                <span wicket:id="border">
-                    <input type="text" wicket:id="uri" value="mvn:foo/bar/1.0.0/xml/features" />
-                </span>
-
-                <input type="submit" wicket:id="submit" value="Confirm" />
-            </form>
-
-        </wicket:extend>
-    </body>
-
-</html>
diff --git a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.html b/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.html
deleted file mode 100644
index aa01e3f..0000000
--- a/karaf/features/src/main/resources/org/apache/karaf/webconsole/karaf/features/widget/FeaturesWidgetPanel.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-    <title>Karaf WebConsole</title>
-</head>
-<body>
-
-    <wicket:panel>
-        <div class="grid_3 widget">
-            <h3>Karaf Features</h3>
-            <p>
-                You have <span wicket:id="featuresCount">10</span> features.
-                <span wicket:id="installedCount">10</span> installed and
-                <span wicket:id="uninstalledCount">10</span> waiting for installation.
-            </p>
-
-            <p>
-                <a wicket:id="featuresLink">Go to feature management</a>
-                <a wicket:id="repositoriesLink">Go to repository management</a>
-            </p>
-        </div>
-    </wicket:panel>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/karaf/pom.xml b/karaf/pom.xml
index 05c5020..15aa438 100644
--- a/karaf/pom.xml
+++ b/karaf/pom.xml
@@ -33,7 +33,7 @@
     <modules>
         <module>core</module>
         <module>admin</module>
-        <module>features</module>
+        <module>feature</module>
     </modules>
 
     <dependencyManagement>