Split osgi and karaf modules. Improved navigation. Sample blueprint module (lists BlueprintContainers, details page doesn't work) attached to osgi tab. Add configuration page for osgi. Restructured widgets. This commit brokes i18n stuff.

git-svn-id: https://svn.apache.org/repos/asf/karaf/sandbox/pieber/karaf-webconsole/trunk@1158994 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/blueprint/pom.xml b/blueprint/pom.xml
new file mode 100644
index 0000000..d4cbb38
--- /dev/null
+++ b/blueprint/pom.xml
@@ -0,0 +1,54 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.karaf.webconsole</groupId>
+    <artifactId>org.apache.karaf.webconsole.blueprint.internal</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Karaf Webconsole Prototype :: OSGi Blueprint</name>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.osgi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+            <version>0.3.1</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>
+                            !org.apache.karaf.webconsole.blueprint.internal*,
+                            *,
+                            <!-- transient dependencies -->
+                            org.ops4j.pax.wicket.api,
+                            org.ops4j.pax.wicket.util,
+                            org.ops4j.pax.wicket.util.proxy
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.java
new file mode 100644
index 0000000..7cb0c98
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.java
@@ -0,0 +1,43 @@
+package org.apache.karaf.webconsole.blueprint.internal;
+
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.BasePage;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.util.ListModel;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+public class BlueprintPage extends BasePage {
+
+    @PaxWicketBean(name = "containers")
+    private List<ServiceReference> containers;
+
+    public BlueprintPage() {
+        add(new ListView<ServiceReference>("containers", new ListModel<ServiceReference>(containers)) {
+
+            @Override
+            protected void populateItem(ListItem<ServiceReference> item) {
+                ServiceReference reference = item.getModelObject();
+
+                String symbolicName = (String) reference.getProperty("osgi.blueprint.container.symbolicname");
+                Version version = (Version) reference.getProperty("osgi.blueprint.container.version");
+
+                item.add(new Label("symbolicName", symbolicName));
+                item.add(new Label("version", version.toString()));
+
+                PageParameters params = new PageParameters();
+                params.put("bundleId", reference.getBundle().getBundleId());
+                item.add(new BookmarkablePageLink<DetailsPage>("details", DetailsPage.class, params));
+            }
+            
+        });
+
+    }
+
+}
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintProvider.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintProvider.java
new file mode 100644
index 0000000..2fe0d75
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/BlueprintProvider.java
@@ -0,0 +1,47 @@
+package org.apache.karaf.webconsole.blueprint.internal;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.model.IModel;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public class BlueprintProvider extends SortableDataProvider<BlueprintContainer> {
+
+    private final List<ServiceReference> containers;
+
+    public BlueprintProvider(List<ServiceReference> containers) {
+        this.containers = containers;
+    }
+
+    public Iterator<? extends BlueprintContainer> iterator(int first, int count) {
+        containers.subList(first, count).iterator();
+        return new Iterator<BlueprintContainer>() {
+            public boolean hasNext() {
+                // TODO Auto-generated method stub
+                return false;
+            }
+
+            public BlueprintContainer next() {
+                // TODO Auto-generated method stub
+                return null;
+            }
+
+            public void remove() {
+                // TODO Auto-generated method stub
+                
+            }
+        };
+    }
+
+    public IModel<BlueprintContainer> model(BlueprintContainer object) {
+        return null;
+    }
+
+    public int size() {
+        return containers.size();
+    }
+
+}
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/ConsoleBlueprintContainer.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/ConsoleBlueprintContainer.java
new file mode 100644
index 0000000..3b492e4
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/ConsoleBlueprintContainer.java
@@ -0,0 +1,47 @@
+package org.apache.karaf.webconsole.blueprint.internal;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Set;
+
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+
+public class ConsoleBlueprintContainer implements BlueprintContainer, Serializable {
+
+    private BlueprintContainer container;
+    private final String symbolicName;
+    private final String version;
+
+    public ConsoleBlueprintContainer(BlueprintContainer container, String symbolicName, String version) {
+        this.container = container;
+        this.symbolicName = symbolicName;
+        this.version = version;
+        
+    }
+
+    public Set getComponentIds() {
+        return container.getComponentIds();
+    }
+
+    public Object getComponentInstance(String id) {
+        return container.getComponentInstance(id);
+    }
+
+    public ComponentMetadata getComponentMetadata(String id) {
+        return container.getComponentMetadata(id);
+    }
+
+    public Collection getMetadata(Class type) {
+        return container.getMetadata(type);
+    }
+
+    public String getSymbolicName() {
+        return symbolicName;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+}
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.java
new file mode 100644
index 0000000..aa908ab
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.java
@@ -0,0 +1,72 @@
+package org.apache.karaf.webconsole.blueprint.internal;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.BasePage;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+
+public class DetailsPage extends BasePage {
+
+    @PaxWicketBean(name = "blueprintBundleContext")
+    private BundleContext context;
+
+    public DetailsPage(PageParameters params) {
+        final Bundle bundle = context.getBundle(params.getLong("bundleId"));
+
+        ServiceReference[] references = bundle.getRegisteredServices();
+        ServiceReference reference = null;
+
+        for (ServiceReference ref : references) {
+            if ("org.osgi.service.blueprint.container.BlueprintContainer".equals(ref.getProperty("objectClass"))) {
+                reference = ref;
+                break;
+            }
+        }
+
+        if (reference == null) {
+            return;
+        }
+
+        final BlueprintContainer container = (BlueprintContainer) context.getService(reference);
+
+        LoadableDetachableModel<List<SerializableComponentMetadata>> model = new LoadableDetachableModel<List<SerializableComponentMetadata>>() {
+            @Override
+            protected List<SerializableComponentMetadata> load() {
+                @SuppressWarnings("unchecked")
+                Collection<ComponentMetadata> metadata = container.getMetadata(ComponentMetadata.class);
+
+                List<SerializableComponentMetadata> serializable = new LinkedList<SerializableComponentMetadata>();
+                for (ComponentMetadata componentMetadata : metadata) {
+                    serializable.add(new SerializableComponentMetadata(componentMetadata));
+                }
+
+                return serializable;
+            }
+        };
+
+        add(new ListView<SerializableComponentMetadata>("components", model) {
+            @Override
+            protected void populateItem(ListItem<SerializableComponentMetadata> item) {
+                SerializableComponentMetadata metadata = item.getModelObject();
+
+                item.add(new Label("componentId", metadata.getId()));
+                item.add(new Label("type", metadata.getTypeName()));
+            }
+        });
+
+        context.ungetService(reference);
+    }
+
+}
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/SerializableComponentMetadata.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/SerializableComponentMetadata.java
new file mode 100644
index 0000000..a12833d
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/SerializableComponentMetadata.java
@@ -0,0 +1,31 @@
+package org.apache.karaf.webconsole.blueprint.internal;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+
+public class SerializableComponentMetadata implements ComponentMetadata, Serializable {
+
+    private transient ComponentMetadata metadata;
+
+    public SerializableComponentMetadata(ComponentMetadata metadata) {
+        this.metadata = metadata;
+    }
+
+    public String getId() {
+        return metadata.getId();
+    }
+
+    public int getActivation() {
+        return metadata.getActivation();
+    }
+
+    public List<String> getDependsOn() {
+        return metadata.getDependsOn();
+    }
+
+    public String getTypeName() {
+        return metadata.getClass().getName();
+    }
+}
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/navigation/BlueprintNavigationProvider.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/navigation/BlueprintNavigationProvider.java
new file mode 100644
index 0000000..e0db253
--- /dev/null
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/navigation/BlueprintNavigationProvider.java
@@ -0,0 +1,18 @@
+package org.apache.karaf.webconsole.blueprint.internal.navigation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.webconsole.blueprint.internal.BlueprintPage;
+import org.apache.karaf.webconsole.core.navigation.NavigationProvider;
+import org.apache.wicket.Page;
+
+public class BlueprintNavigationProvider implements NavigationProvider {
+
+    public Map<String, Class<? extends Page>> getItems() {
+        Map<String, Class<? extends Page>> items = new HashMap<String, Class<? extends Page>>();
+        items.put("blueprint", BlueprintPage.class);
+        return items;
+    }
+
+}
diff --git a/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..fff195f
--- /dev/null
+++ b/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,18 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+    xmlns:wicket="http://www.ops4j.org/schema/wicket">
+
+    <reference-list id="containers" interface="org.osgi.service.blueprint.container.BlueprintContainer"
+        member-type="service-reference"
+    />
+
+    <service ref="provider" interface="org.apache.karaf.webconsole.core.navigation.NavigationProvider">
+        <service-properties>
+            <entry key="extends" value="osgi" />
+        </service-properties>
+
+    </service>
+
+
+    <bean id="provider" class="org.apache.karaf.webconsole.blueprint.internal.internal.navigation.BlueprintNavigationProvider" />
+
+</blueprint>
diff --git a/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.html b/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.html
new file mode 100644
index 0000000..ae0cd91
--- /dev/null
+++ b/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/BlueprintPage.html
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<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 Wicket console - Blueprint page</title>
+    </wicket:head>
+
+    <body>
+       <wicket:extend>
+            <h1>Blueprint containers</h1>
+            <table>
+                <tr>
+                    <th>Name</th>
+                    <th>Version</th>
+                    <th>Operations</th>
+                </tr>
+                <tr wicket:id="containers">
+                    <td>
+                        <span wicket:id="symbolicName">com.example</span>
+                    </td>
+                    <td>
+                        <span wicket:id="version">0.0.0</span>
+                    </td>
+                    <td>
+                        <a wicket:id="details">Details</a>
+                    </td>
+                </tr>
+            </table>
+        </wicket:extend>
+    </body>
+</html>
diff --git a/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.html b/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.html
new file mode 100644
index 0000000..f176bcc
--- /dev/null
+++ b/blueprint/src/main/resources/org/apache/karaf/webconsole/blueprint/internal/DetailsPage.html
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<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 Wicket console - Blueprint page</title>
+    </wicket:head>
+
+    <body>
+       <wicket:extend>
+            <h1>Blueprint container details</h1>
+
+            <table>
+                <tr>
+                    <th>Id</th>
+                    <th>Component type</th>
+                    <th>Operations</th>
+                </tr>
+                <tr wicket:id="components">
+                    <td>
+                        <span wicket:id="componentId">component-id</span>
+                    </td>
+                    <td>
+                        <span wicket:id="type">org.osgi.service.blueprint.reflect.ComponentMetadata</span>
+                    </td>
+                    <td>
+                        <a wicket:id="details">Details</a>
+                    </td>
+                </tr>
+            </table>
+        </wicket:extend>
+    </body>
+</html>
diff --git a/core/pom.xml b/core/pom.xml
index 8f2f9de..c7138e3 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -23,36 +23,22 @@
 
         <!-- WICKET DEPENDENCIES -->
         <dependency>
+            <groupId>org.apache.wicket</groupId>
+            <artifactId>wicket</artifactId>
+            <version>1.4.17</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.wicket</groupId>
+            <artifactId>wicket-extensions</artifactId>
+            <version>1.4.17</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.ops4j.pax.wicket</groupId>
             <artifactId>org.ops4j.pax.wicket.service</artifactId>
             <version>${ops4j.paxwicket.version}</version>
         </dependency>
 
-        <!-- JUNIT DEPENDENCY FOR TESTING -->
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.8.1</version>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- Karaf -->
-        <dependency>
-          <groupId>org.apache.karaf.features</groupId>
-          <artifactId>org.apache.karaf.features.core</artifactId>
-          <version>${karaf.version}</version>
-        </dependency>
-
-        <!-- <dependency> -->
-        <!-- <groupId>org.odlabs.wiquery</groupId> -->
-        <!-- <artifactId>wiquery</artifactId> -->
-        <!-- <version>1.2.4</version> -->
-        <!-- </dependency> -->
-        <!-- <dependency> -->
-        <!-- <groupId>org.slf4j</groupId> -->
-        <!-- <artifactId>slf4j-api</artifactId> -->
-        <!-- <version>1.6</version> -->
-        <!-- </dependency> -->
     </dependencies>
 
     <build>
@@ -68,6 +54,7 @@
                         <!-- The bundle activator is only required if we 
                             do the things by hand. -->
                         <Import-Package>
+                            !org.apache.karaf.webconsole.core*,
                             *,<!-- let bnd import direct dependencies -->
                             org.apache.wicket.settings,
                             org.apache.wicket.session,
@@ -90,9 +77,7 @@
                             net.sf.cglib.reflect;version="[2,3)",
                             <!-- and servlet api -->
                             javax.servlet,
-                            javax.servlet.http,
-                            <!-- Karaf -->
-                            org.apache.karaf.features
+                            javax.servlet.http
                         </Import-Package>
                     </instructions>
                 </configuration>
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationReference.java b/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationReference.java
deleted file mode 100644
index 95d62f0..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationReference.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.apache.karaf.webconsole.core;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.Session;
-
-public interface ApplicationReference {
-
-    Application getApplication();
-
-    Session getSession();
-
-    RequestCycle getRequestCycle();
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationSetter.java b/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationSetter.java
deleted file mode 100644
index 45e1cdf..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/ApplicationSetter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.apache.karaf.webconsole.core;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Session;
-
-/**
- * Helper class which calls {@link Application#set(Application)} with given
- * instance.
- */
-public class ApplicationSetter {
-
-    private ApplicationReference reference;
-
-    public ApplicationSetter(ApplicationReference reference) {
-        this.reference = reference;
-    }
-
-    public void initialize() {
-        Application.set(reference.getApplication());
-        Session.set(reference.getSession());
-    }
-
-    public void destroy() {
-        Application.unset();
-        Session.unset();
-    }
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/BasePage.java b/core/src/main/java/org/apache/karaf/webconsole/core/BasePage.java
index 463dba9..35e242b 100644
--- a/core/src/main/java/org/apache/karaf/webconsole/core/BasePage.java
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/BasePage.java
@@ -5,6 +5,8 @@
 import java.util.Locale;
 
 import org.apache.karaf.webconsole.core.internal.LanguagePanel;
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
+import org.apache.karaf.webconsole.core.navigation.markup.NavigationPanel;
 import org.apache.wicket.ResourceReference;
 import org.apache.wicket.markup.html.CSSPackageResource;
 import org.apache.wicket.markup.html.WebPage;
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/BasePage2.java b/core/src/main/java/org/apache/karaf/webconsole/core/BasePage2.java
index 7f010ec..ce8ae6a 100644
--- a/core/src/main/java/org/apache/karaf/webconsole/core/BasePage2.java
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/BasePage2.java
@@ -1,5 +1,10 @@
 package org.apache.karaf.webconsole.core;
 
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
 import org.apache.wicket.ResourceReference;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
 import org.apache.wicket.extensions.markup.html.tabs.TabbedPanel;
@@ -14,10 +19,6 @@
 import org.apache.wicket.model.Model;
 import org.ops4j.pax.wicket.api.PaxWicketBean;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
 public class BasePage2 extends WebPage {
 
     @PaxWicketBean(name = "tabs")
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/ConsoleTab.java b/core/src/main/java/org/apache/karaf/webconsole/core/ConsoleTab.java
deleted file mode 100644
index 9a45526..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/ConsoleTab.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.apache.karaf.webconsole.core;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * Since the ConsoleTab is used directly in wicket please make sure that the implementing object is serializable
- */
-public interface ConsoleTab extends Serializable {
-
-    String getLabel();
-
-    Class getModuleHomePage();
-
-    Map<String, Class> getItems();
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/DashboardWidget.java b/core/src/main/java/org/apache/karaf/webconsole/core/DashboardWidget.java
deleted file mode 100644
index 12aaf49..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/DashboardWidget.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.apache.karaf.webconsole.core;
-
-import org.apache.wicket.markup.html.panel.Panel;
-
-public interface DashboardWidget {
-
-    Panel getWidgetPanel(String id);
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/dashboard/DashboardPage.java b/core/src/main/java/org/apache/karaf/webconsole/core/dashboard/DashboardPage.java
new file mode 100644
index 0000000..e100f44
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/dashboard/DashboardPage.java
@@ -0,0 +1,38 @@
+package org.apache.karaf.webconsole.core.dashboard;
+
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.BasePage;
+import org.apache.karaf.webconsole.core.widget.WidgetProvider;
+import org.apache.wicket.markup.html.CSSPackageResource;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.util.ListModel;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+
+public class DashboardPage extends BasePage {
+
+    @PaxWicketBean(name = "widgets")
+    private List<WidgetProvider> widgets;
+
+    public DashboardPage() {
+        add(CSSPackageResource.getHeaderContribution(DashboardPage.class, "dashboard.css"));
+
+        add(new Label("noWidgets", "So far there is no widgets to display") {
+            @Override
+            public boolean isVisible() {
+                return widgets.size() == 0;
+            }
+        });
+
+        add(new ListView<WidgetProvider>("widgets", new ListModel<WidgetProvider>(widgets)) {
+            @Override
+            protected void populateItem(ListItem<WidgetProvider> item) {
+                item.add(item.getModelObject().getWidgetPanel("widget"));
+            }
+        });
+
+    }
+
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/internal/DashboardPage.java b/core/src/main/java/org/apache/karaf/webconsole/core/internal/DashboardPage.java
deleted file mode 100644
index 806541d..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/internal/DashboardPage.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.karaf.webconsole.core.internal;
-
-import java.util.List;
-
-import org.apache.karaf.webconsole.core.BasePage;
-import org.apache.karaf.webconsole.core.DashboardWidget;
-import org.apache.wicket.markup.html.CSSPackageResource;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.model.util.ListModel;
-import org.ops4j.pax.wicket.api.PaxWicketBean;
-
-public class DashboardPage extends BasePage {
-
-    @PaxWicketBean(name = "widgets")
-    private List<DashboardWidget> widgets;
-
-    public DashboardPage() {
-        add(CSSPackageResource.getHeaderContribution(DashboardPage.class, "dashboard.css"));
-
-        add(new ListView<DashboardWidget>("widgets", new ListModel<DashboardWidget>(widgets)) {
-            @Override
-            protected void populateItem(ListItem<DashboardWidget> item) {
-                item.add(item.getModelObject().getWidgetPanel("widget"));
-            }
-        });
-
-    }
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/internal/Initializer.java b/core/src/main/java/org/apache/karaf/webconsole/core/internal/Initializer.java
deleted file mode 100644
index 0dd1868..0000000
--- a/core/src/main/java/org/apache/karaf/webconsole/core/internal/Initializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.apache.karaf.webconsole.core.internal;
-
-import java.util.Hashtable;
-
-import org.apache.karaf.webconsole.core.ApplicationReference;
-import org.apache.wicket.Application;
-import org.apache.wicket.IDestroyer;
-import org.apache.wicket.IInitializer;
-import org.apache.wicket.RequestCycle;
-import org.apache.wicket.Session;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceRegistration;
-
-public class Initializer implements IInitializer, IDestroyer {
-
-    private BundleContext context;
-    private ServiceRegistration registration;
-
-    public Initializer() {
-        context = FrameworkUtil.getBundle(getClass()).getBundleContext();
-    }
-
-    public void init(final Application application) {
-        Hashtable<String, String> properties = new Hashtable<String, String>();
-        properties.put("applicationKey", application.getApplicationKey());
-
-//        // access session from ThreadLocal
-//        final Session session = Session.get();
-        ApplicationReference reference = new ApplicationReference() {
-            public Application getApplication() {
-                return application;
-            }
-
-            public Session getSession() {
-                return Session.get();
-            }
-
-            public RequestCycle getRequestCycle() {
-                return RequestCycle.get();
-            }
-        };
-        registration = context.registerService(ApplicationReference.class.getName(), reference, properties);
-    }
-
-    public void destroy(Application application) {
-        if (registration != null) {
-            registration.unregister();
-        }
-    }
-
-}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/internal/SystemConsoleTab.java b/core/src/main/java/org/apache/karaf/webconsole/core/internal/SystemConsoleTab.java
index 04f1b6e..b1c76db 100644
--- a/core/src/main/java/org/apache/karaf/webconsole/core/internal/SystemConsoleTab.java
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/internal/SystemConsoleTab.java
@@ -1,27 +1,26 @@
 package org.apache.karaf.webconsole.core.internal;
 
-import org.apache.karaf.webconsole.core.ConsoleTab;
-
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.karaf.webconsole.core.dashboard.DashboardPage;
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
+import org.apache.wicket.Page;
+
 public class SystemConsoleTab implements ConsoleTab, Serializable {
 
-    private static final long serialVersionUID = -7381914604367435106L;
-    private static String dashBoard = "dashboard";
-
     public String getLabel() {
-        return "Dashboard";
+        return "dashboard";
     }
 
-    public Class getModuleHomePage() {
+    public Class<? extends Page> getModuleHomePage() {
         return DashboardPage.class;
     }
 
-    public Map<String, Class> getItems() {
-        Map<String, Class> map = new HashMap<String, Class>();
-        map.put(dashBoard, DashboardPage.class);
+    public Map<String, Class<? extends Page>> getItems() {
+        Map<String, Class<? extends Page>> map = new HashMap<String, Class<? extends Page>>();
+        map.put("dashboard", DashboardPage.class);
         return map;
     }
 
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/internal/WicketApplication.java b/core/src/main/java/org/apache/karaf/webconsole/core/internal/WebConsoleApplication.java
similarity index 75%
rename from core/src/main/java/org/apache/karaf/webconsole/core/internal/WicketApplication.java
rename to core/src/main/java/org/apache/karaf/webconsole/core/internal/WebConsoleApplication.java
index 4dc8c2a..ed5ca7c 100644
--- a/core/src/main/java/org/apache/karaf/webconsole/core/internal/WicketApplication.java
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/internal/WebConsoleApplication.java
@@ -1,5 +1,6 @@
 package org.apache.karaf.webconsole.core.internal;
 
+import org.apache.karaf.webconsole.core.dashboard.DashboardPage;
 import org.apache.wicket.protocol.http.WebApplication;
 
 /**
@@ -8,9 +9,9 @@
  * 
  * @see org.code-house.Start#main(String[])
  */
-public class WicketApplication extends WebApplication {
+public class WebConsoleApplication extends WebApplication {
 
-    public WicketApplication() {
+    public WebConsoleApplication() {
         super();
     }
 
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ConsoleTab.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ConsoleTab.java
new file mode 100644
index 0000000..b62d054
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ConsoleTab.java
@@ -0,0 +1,15 @@
+package org.apache.karaf.webconsole.core.navigation;
+
+import org.apache.wicket.Page;
+
+/**
+ * Console tab is top level extension of webconsole. It may provide new elements
+ * to navigation and should have label to be rendered in top menu.
+ */
+public interface ConsoleTab extends NavigationProvider {
+
+    String getLabel();
+
+    Class<? extends Page> getModuleHomePage();
+
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ExtendableConsoleTab.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ExtendableConsoleTab.java
new file mode 100644
index 0000000..34e0cbf
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/ExtendableConsoleTab.java
@@ -0,0 +1,42 @@
+package org.apache.karaf.webconsole.core.navigation;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.wicket.Page;
+
+/**
+ * Implementation of console tab which allows external providers to put own
+ * items to it.
+ */
+public class ExtendableConsoleTab implements ConsoleTab {
+
+    private Collection<NavigationProvider> extensions;
+    private ConsoleTab base;
+
+    public ExtendableConsoleTab(ConsoleTab base) {
+        this.base = base;
+    }
+
+    public String getLabel() {
+        return base.getLabel();
+    }
+
+    public Class<? extends Page> getModuleHomePage() {
+        return base.getModuleHomePage();
+    }
+
+    public Map<String, Class<? extends Page>> getItems() {
+        Map<String, Class<? extends Page>> items = base.getItems();
+
+        for (NavigationProvider provider : extensions) {
+            items.putAll(provider.getItems());
+        }
+
+        return items;
+    }
+
+    public void setExtensions(Collection<NavigationProvider> extensions) {
+        this.extensions = extensions;
+    }
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/navigation/NavigationProvider.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/NavigationProvider.java
new file mode 100644
index 0000000..10e39be
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/NavigationProvider.java
@@ -0,0 +1,22 @@
+package org.apache.karaf.webconsole.core.navigation;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.apache.wicket.Page;
+
+/**
+ * Base extension point in console. Allow suppliers to ship new navigation
+ * elements which points to new wicket pages.
+ */
+public interface NavigationProvider extends Serializable {
+
+    /**
+     * Return list of pages to add in navigation. Key in collection is element
+     * label.
+     * 
+     * @return Pages to add in navigation.
+     */
+    Map<String, Class<? extends Page>> getItems();
+
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableConsoleTab.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableConsoleTab.java
new file mode 100644
index 0000000..53866bc
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableConsoleTab.java
@@ -0,0 +1,24 @@
+package org.apache.karaf.webconsole.core.navigation.i18n;
+
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
+import org.apache.wicket.Page;
+import org.apache.wicket.model.ResourceModel;
+
+public class LocalizableConsoleTab extends LocalizableNavigationProvider implements ConsoleTab {
+
+    private ConsoleTab provider;
+
+    public LocalizableConsoleTab(ConsoleTab provider) {
+        super(provider);
+        this.provider = provider;
+    }
+
+    public String getLabel() {
+        return new ResourceModel(provider.getLabel(), provider.getLabel()).getObject();
+    }
+
+    public Class<? extends Page> getModuleHomePage() {
+        return provider.getModuleHomePage();
+    }
+
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableNavigationProvider.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableNavigationProvider.java
new file mode 100644
index 0000000..2161d64
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/i18n/LocalizableNavigationProvider.java
@@ -0,0 +1,31 @@
+package org.apache.karaf.webconsole.core.navigation.i18n;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.karaf.webconsole.core.navigation.NavigationProvider;
+import org.apache.wicket.Page;
+import org.apache.wicket.model.ResourceModel;
+
+public class LocalizableNavigationProvider implements NavigationProvider {
+
+    private final NavigationProvider provider;
+
+
+    public LocalizableNavigationProvider(NavigationProvider provider) {
+        this.provider = provider;
+    }
+
+
+    public Map<String, Class<? extends Page>> getItems() {
+        Map<String, Class<? extends Page>> items = new HashMap<String, Class<? extends Page>>();
+
+        for (Entry<String, Class<? extends Page>> entry : provider.getItems().entrySet()) {
+            items.put(new ResourceModel(entry.getKey(), entry.getKey()).getObject(), entry.getValue());
+        }
+
+        return items;
+    }
+
+}
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/NavigationPanel.java b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.java
similarity index 82%
rename from core/src/main/java/org/apache/karaf/webconsole/core/NavigationPanel.java
rename to core/src/main/java/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.java
index f475a7d..49681f0 100644
--- a/core/src/main/java/org/apache/karaf/webconsole/core/NavigationPanel.java
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.java
@@ -1,16 +1,19 @@
-package org.apache.karaf.webconsole.core;
+package org.apache.karaf.webconsole.core.navigation.markup;
 
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
 
+/**
+ * Component responsible for rendering top navigation in webconsole.
+ */
 public class NavigationPanel extends Panel {
 
     public NavigationPanel(String id, IModel<List<ConsoleTab>> model) {
@@ -20,6 +23,7 @@
             @Override
             protected void populateItem(ListItem<ConsoleTab> item) {
                 final ConsoleTab tab = item.getModelObject();
+
                 item.add(new BookmarkablePageLink("moduleLink", tab.getModuleHomePage()).add(new Label("moduleLabel", tab.getLabel())));
 
                 List<String> subItems = new LinkedList<String>(tab.getItems().keySet());
@@ -27,7 +31,7 @@
                     @Override
                     protected void populateItem(ListItem<String> item) {
                         String subItem = item.getModelObject();
-                        item.add(new BookmarkablePageLink("topLink", tab.getItems().get(subItem)).add(new Label("linkLabel", new ResourceModel(subItem))));
+                        item.add(new BookmarkablePageLink("topLink", tab.getItems().get(subItem)).add(new Label("linkLabel", subItem)));
                     }
                 });
             }
diff --git a/core/src/main/java/org/apache/karaf/webconsole/core/widget/WidgetProvider.java b/core/src/main/java/org/apache/karaf/webconsole/core/widget/WidgetProvider.java
new file mode 100644
index 0000000..f870feb
--- /dev/null
+++ b/core/src/main/java/org/apache/karaf/webconsole/core/widget/WidgetProvider.java
@@ -0,0 +1,21 @@
+package org.apache.karaf.webconsole.core.widget;
+
+import org.apache.wicket.markup.html.panel.Panel;
+
+/**
+ * Widget extension point which may be used in many places. Services registered
+ * in OSGi should provide information where it should be put using "intention"
+ * property.
+ */
+public interface WidgetProvider {
+
+    /**
+     * Create new panel with given id. This method will be called during page
+     * or parent component rendering - normally in container dispatching thread.
+     * 
+     * @param id Panel id.
+     * @return Panel to be put as widget.
+     */
+    Panel getWidgetPanel(String id);
+
+}
diff --git a/core/src/main/resources/OSGI-INF/blueprint/core.xml b/core/src/main/resources/OSGI-INF/blueprint/core.xml
new file mode 100644
index 0000000..bb18b2d
--- /dev/null
+++ b/core/src/main/resources/OSGI-INF/blueprint/core.xml
@@ -0,0 +1,21 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:wicket="http://www.ops4j.org/schema/wicket">
+
+    <wicket:application id="karafWebConsole" 
+        class="org.apache.karaf.webconsole.core.internal.WebConsoleApplication"
+        applicationName="karafWebConsole" mountPoint="cns" />
+
+    <reference-list id="tabs" interface="org.apache.karaf.webconsole.core.navigation.ConsoleTab" availability="optional" />
+
+    <!-- He is not ready yet ... -->
+    <reference-list id="widgets" interface="org.apache.karaf.webconsole.core.widget.WidgetProvider" availability="optional"
+        filter="(intention=dashboard)" />
+
+    <service interface="org.apache.karaf.webconsole.core.navigation.ConsoleTab">
+        <bean class="org.apache.karaf.webconsole.core.navigation.i18n.LocalizableConsoleTab">
+            <argument>
+                <bean class="org.apache.karaf.webconsole.core.internal.SystemConsoleTab" />
+            </argument>
+        </bean>
+    </service>
+
+</blueprint>
diff --git a/core/src/main/resources/OSGI-INF/blueprint/wicket.xml b/core/src/main/resources/OSGI-INF/blueprint/wicket.xml
deleted file mode 100644
index a730cf3..0000000
--- a/core/src/main/resources/OSGI-INF/blueprint/wicket.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:wicket="http://www.ops4j.org/schema/wicket">
-
-<wicket:application id="karafWebConsole" 
-  class="org.apache.karaf.webconsole.core.internal.WicketApplication"
-  applicationName="karafWebConsole" mountPoint="cns" />
-
-  <reference-list id="tabs" interface="org.apache.karaf.webconsole.core.ConsoleTab" availability="optional" />
-
-  <!-- He is not ready yet ... -->
-  <reference-list id="widgets" interface="org.apache.karaf.webconsole.core.DashboardWidget" availability="optional" />
-
-  <service auto-export="interfaces">
-    <bean class="org.apache.karaf.webconsole.core.internal.SystemConsoleTab" />
-  </service>
-
-</blueprint>
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/BasePage$TabPanel1.html b/core/src/main/resources/org/apache/karaf/webconsole/core/BasePage$TabPanel1.html
deleted file mode 100644
index ac2fcd7..0000000
--- a/core/src/main/resources/org/apache/karaf/webconsole/core/BasePage$TabPanel1.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
-<wicket:panel>
-    <br/>
-    This is tab-panel 1
-</wicket:panel>
-</html>
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/internal/DashboardPage.html b/core/src/main/resources/org/apache/karaf/webconsole/core/dashboard/DashboardPage.html
similarity index 82%
rename from core/src/main/resources/org/apache/karaf/webconsole/core/internal/DashboardPage.html
rename to core/src/main/resources/org/apache/karaf/webconsole/core/dashboard/DashboardPage.html
index a06f4d4..76707c0 100644
--- a/core/src/main/resources/org/apache/karaf/webconsole/core/internal/DashboardPage.html
+++ b/core/src/main/resources/org/apache/karaf/webconsole/core/dashboard/DashboardPage.html
@@ -7,6 +7,11 @@
 <body>
 
     <wicket:extend>
+
+        <wicket:enclosure>
+            <span wicket:id="noWidgets">Info goes here</span>
+        </wicket:enclosure>
+
         <ul id="widgets">
             <li wicket:id="widgets">
                 <div wicket:id="widget">
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/internal/dashboard.css b/core/src/main/resources/org/apache/karaf/webconsole/core/dashboard/dashboard.css
similarity index 100%
rename from core/src/main/resources/org/apache/karaf/webconsole/core/internal/dashboard.css
rename to core/src/main/resources/org/apache/karaf/webconsole/core/dashboard/dashboard.css
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/NavigationPanel.html b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.html
similarity index 100%
rename from core/src/main/resources/org/apache/karaf/webconsole/core/NavigationPanel.html
rename to core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.html
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.properties b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.properties
new file mode 100644
index 0000000..1c85219
--- /dev/null
+++ b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel.properties
@@ -0,0 +1,6 @@
+# Features Console properties
+features.list = Features list
+features.repositories = Features repositories
+
+osgi = OSGi
+dashboard = Dashboard
\ No newline at end of file
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_de.properties b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_de.properties
new file mode 100644
index 0000000..1c8c5da
--- /dev/null
+++ b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_de.properties
@@ -0,0 +1,6 @@
+# Features Console properties
+features.list = Feature Liste
+features.repositories = Feature Repository
+
+osgi = OSGi
+dashboard = Dashboard
\ No newline at end of file
diff --git a/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_fr.properties b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_fr.properties
new file mode 100644
index 0000000..54d8495
--- /dev/null
+++ b/core/src/main/resources/org/apache/karaf/webconsole/core/navigation/markup/NavigationPanel_fr.properties
@@ -0,0 +1,6 @@
+# Features Console properties
+features.list = Liste de features
+features.repositories = R\u00E9pertoires de features
+
+osgi = OSGi
+dashboard = Dashboard
\ No newline at end of file
diff --git a/core/src/main/resources/wicket.properties b/core/src/main/resources/wicket.properties
deleted file mode 100644
index 75c9b27..0000000
--- a/core/src/main/resources/wicket.properties
+++ /dev/null
@@ -1 +0,0 @@
-initializer=org.apache.karaf.webconsole.core.internal.Initializer
\ No newline at end of file
diff --git a/karaf/pom.xml b/karaf/pom.xml
new file mode 100644
index 0000000..11d3b7d
--- /dev/null
+++ b/karaf/pom.xml
@@ -0,0 +1,54 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.karaf.webconsole</groupId>
+    <artifactId>org.apache.karaf.webconsole.karaf</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Karaf Webconsole Prototype :: Karaf extension</name>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+            <version>${karaf.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>
+                            !org.apache.karaf.webconsole.karaf*,
+                            *,
+                            <!-- transient dependencies -->
+                            org.ops4j.pax.wicket.api,
+                            org.ops4j.pax.wicket.util,
+                            org.ops4j.pax.wicket.util.proxy
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ExtendedFeature.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/ExtendedFeature.java
similarity index 96%
rename from osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ExtendedFeature.java
rename to karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/ExtendedFeature.java
index cfe7909..a89fdee 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ExtendedFeature.java
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/ExtendedFeature.java
@@ -1,4 +1,4 @@
-package org.apache.karaf.webconsole.osgi.internal;
+package org.apache.karaf.webconsole.karaf.internal.feature;
 
 import org.apache.karaf.features.BundleInfo;
 import org.apache.karaf.features.ConfigFileInfo;
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.java
similarity index 93%
rename from osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.java
rename to karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.java
index 2f04775..f7d45fc 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.java
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.java
@@ -1,9 +1,16 @@
-package org.apache.karaf.webconsole.osgi.internal;
+package org.apache.karaf.webconsole.karaf.internal.feature;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
 import org.apache.karaf.features.Repository;
 import org.apache.karaf.webconsole.core.BasePage;
+import org.apache.karaf.webconsole.karaf.internal.feature.ExtendedFeature.State;
 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.extensions.markup.html.repeater.data.table.PropertyColumn;
@@ -13,8 +20,6 @@
 import org.apache.wicket.model.StringResourceModel;
 import org.ops4j.pax.wicket.api.PaxWicketBean;
 
-import java.util.*;
-
 /**
  * Features
  */
diff --git a/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/navigation/KarafConsoleTab.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/navigation/KarafConsoleTab.java
new file mode 100644
index 0000000..20fa8df
--- /dev/null
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/navigation/KarafConsoleTab.java
@@ -0,0 +1,27 @@
+package org.apache.karaf.webconsole.karaf.internal.navigation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
+import org.apache.karaf.webconsole.karaf.internal.feature.FeaturesPage;
+import org.apache.karaf.webconsole.karaf.internal.repository.RepositoriesPage;
+import org.apache.wicket.Page;
+
+public class KarafConsoleTab implements ConsoleTab {
+
+    public String getLabel() {
+        return "karaf";
+    }
+
+    public Class<? extends Page> getModuleHomePage() {
+        return FeaturesPage.class;
+    }
+
+    public Map<String, Class<? extends Page>> getItems() {
+        Map<String, Class<? extends Page>> features = new HashMap<String, Class<? extends Page>>();
+        features.put("repositories", RepositoriesPage.class);
+        return features;
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.java
similarity index 97%
rename from osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.java
rename to karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.java
index fe47d59..71d1773 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.java
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.java
@@ -1,4 +1,4 @@
-package org.apache.karaf.webconsole.osgi.internal;
+package org.apache.karaf.webconsole.karaf.internal.repository;
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/FeaturesWidgetPanel.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/FeaturesWidgetPanel.java
similarity index 83%
rename from osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/FeaturesWidgetPanel.java
rename to karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/FeaturesWidgetPanel.java
index 5476245..88fac6d 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/FeaturesWidgetPanel.java
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/FeaturesWidgetPanel.java
@@ -1,9 +1,9 @@
-package org.apache.karaf.webconsole.osgi.internal.widget;
+package org.apache.karaf.webconsole.karaf.internal.widget;
 
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.webconsole.osgi.internal.FeaturesPage;
-import org.apache.karaf.webconsole.osgi.internal.RepositoriesPage;
+import org.apache.karaf.webconsole.karaf.internal.feature.FeaturesPage;
+import org.apache.karaf.webconsole.karaf.internal.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;
diff --git a/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/KarafFeaturesWidgetProvider.java b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/KarafFeaturesWidgetProvider.java
new file mode 100644
index 0000000..f2abaa0
--- /dev/null
+++ b/karaf/src/main/java/org/apache/karaf/webconsole/karaf/internal/widget/KarafFeaturesWidgetProvider.java
@@ -0,0 +1,19 @@
+package org.apache.karaf.webconsole.karaf.internal.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 {
+
+    private final FeaturesService service;
+
+    public KarafFeaturesWidgetProvider(FeaturesService service) {
+        this.service = service;
+    }
+
+    public Panel getWidgetPanel(String id) {
+        return new FeaturesWidgetPanel(id, service);
+    }
+
+}
diff --git a/karaf/src/main/resources/OSGI-INF/blueprint/karaf.xml b/karaf/src/main/resources/OSGI-INF/blueprint/karaf.xml
new file mode 100644
index 0000000..c7e4759
--- /dev/null
+++ b/karaf/src/main/resources/OSGI-INF/blueprint/karaf.xml
@@ -0,0 +1,19 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <service interface="org.apache.karaf.webconsole.core.navigation.ConsoleTab">
+        <bean class="org.apache.karaf.webconsole.karaf.internal.navigation.KarafConsoleTab" />
+    </service>
+
+    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService"/>
+
+    <service ref="widgetProvider" interface="org.apache.karaf.webconsole.core.widget.WidgetProvider">
+        <service-properties>
+            <entry key="intention" value="dashboard" />
+        </service-properties>
+    </service>
+
+    <bean id="widgetProvider" class="org.apache.karaf.webconsole.karaf.internal.widget.KarafFeaturesWidgetProvider">
+        <argument ref="featuresService" />
+    </bean>
+
+</blueprint>
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.html b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.html
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.html
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.html
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.properties b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.properties
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage.properties
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage.properties
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage_de.properties b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage_de.properties
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage_de.properties
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage_de.properties
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage_fr.properties b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage_fr.properties
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/FeaturesPage_fr.properties
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/feature/FeaturesPage_fr.properties
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.html b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.html
similarity index 99%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.html
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.html
index 16c92bb..2678351 100644
--- a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/RepositoriesPage.html
+++ b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/repository/RepositoriesPage.html
@@ -10,4 +10,5 @@
             <table wicket:id="repositories" class="dataview"/>
         </wicket:extend>
     </body>
+
 </html>
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/widget/FeaturesWidgetPanel.html b/karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/widget/FeaturesWidgetPanel.html
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/widget/FeaturesWidgetPanel.html
rename to karaf/src/main/resources/org/apache/karaf/webconsole/karaf/internal/widget/FeaturesWidgetPanel.html
diff --git a/osgi/pom.xml b/osgi/pom.xml
index 2e5c646..51d49e2 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -21,6 +21,11 @@
             <version>${project.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <version>4.2.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.java
deleted file mode 100644
index b98cbe5..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.webconsole.core.BasePage;
-
-public class ConfigurationsPage extends BasePage {
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/EventsPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/EventsPage.java
deleted file mode 100644
index 6f21f30..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/EventsPage.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.webconsole.core.BasePage;
-
-public class EventsPage extends BasePage {
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesConsoleTab.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesConsoleTab.java
deleted file mode 100644
index 8526f36..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/FeaturesConsoleTab.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.webconsole.core.ConsoleTab;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class FeaturesConsoleTab implements ConsoleTab {
-
-    private static final long serialVersionUID = 1L;
-    private static String featuresList = "features.list";
-    private static String featuresRepositories = "features.repositories";
-
-    public String getLabel() {
-        return "Features";
-    }
-
-    public Class getModuleHomePage() {
-        return FeaturesPage.class;
-    }
-
-    public Map<String, Class> getItems() {
-        Map<String, Class> features = new HashMap<String, Class>();
-        features.put(featuresList, FeaturesPage.class);
-        features.put(featuresRepositories, RepositoriesPage.class);
-        return features;
-    }
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/HomePage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/HomePage.java
deleted file mode 100644
index d18b75b..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/HomePage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.karaf.webconsole.core.SidebarPage;
-import org.apache.wicket.Page;
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.behavior.SimpleAttributeModifier;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.ops4j.pax.wicket.api.PaxWicketBean;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.startlevel.StartLevel;
-
-/**
- * Homepage
- */
-public class HomePage extends SidebarPage {
-
-    @PaxWicketBean(name = "blueprintBundleContext")
-    private BundleContext context;
-
-    // TODO Add any page properties or variables here
-
-    interface ItemClassModifier {
-        List<String> getCssClasses(Bundle bundle);
-    }
-
-    class SystemBundleClassModifier implements ItemClassModifier {
-
-        public List<String> getCssClasses(Bundle bundle) {
-            List<String> classes = new ArrayList<String>();
-
-            if (bundle.getBundleId() == 0) {
-                classes.add("framework");
-            }
-
-            ServiceReference startLevelReference = context.getServiceReference(StartLevel.class.getName());
-
-            if (startLevelReference != null) {
-                StartLevel startLevel = (StartLevel) context.getService(startLevelReference);
-
-                int bundleStartLevel = startLevel.getBundleStartLevel(bundle);
-                if (bundleStartLevel < startLevel.getInitialBundleStartLevel()) {
-                    classes.add("system");
-                }
-                context.ungetService(startLevelReference);
-            }
-
-            return classes;
-        }
-    }
-
-    class BlueprintClassModifier implements ItemClassModifier {
-
-        public List<String> getCssClasses(Bundle bundle) {
-            List<String> classes = new ArrayList<String>();
-
-            ServiceReference[] registeredServices = bundle.getRegisteredServices();
-            if (registeredServices != null) {
-                for (ServiceReference reference : registeredServices) {
-                    List<String> oc = Arrays.asList((String[]) reference.getProperty("objectClass"));
-
-                    if (oc.contains("org.osgi.service.blueprint.container.BlueprintContainer")) {
-                        classes.add("blueprint");
-                        break;
-                    }
-
-                }
-            }
-
-            return classes;
-        }
-
-    }
-
-    class SpringClassModifier implements ItemClassModifier {
-
-        public List<String> getCssClasses(Bundle bundle) {
-            List<String> classes = new ArrayList<String>();
-
-            ServiceReference[] registeredServices = bundle.getRegisteredServices();
-            if (registeredServices != null) {
-                for (ServiceReference reference : registeredServices) {
-                    List<String> oc = Arrays.asList((String[]) reference.getProperty("objectClass"));
-
-                    if (oc.contains("org.springframework.context.ApplicationContext")) {
-                        classes.add("spring");
-                        break;
-                    }
-
-                }
-            }
-
-            return classes;
-        }
-
-    }
-
-    /**
-     * Constructor that is invoked when page is invoked without a session.
-     * 
-     * @param parameters Page parameters
-     */
-    public HomePage() {
-        final List<ItemClassModifier> modifiers = new ArrayList<HomePage.ItemClassModifier>();
-        modifiers.add(new SystemBundleClassModifier());
-        modifiers.add(new BlueprintClassModifier());
-        modifiers.add(new SpringClassModifier());
-
-        List<Bundle> model = context == null ? new ArrayList() : Arrays.asList(context.getBundles());
-
-        add(new ListView<Bundle>("bundles", model) {
-            @Override
-            protected void populateItem(ListItem<Bundle> item) {
-                final Bundle bundle = item.getModelObject();
-                item.add(new Label("id", "" + bundle.getBundleId()));
-                item.add(new Label("symbolicName", bundle.getSymbolicName()));
-                item.add(new Label("version", bundle.getVersion().toString()));
-
-                List<String> classes = new ArrayList<String>() {
-                    @Override
-                    public String toString() {
-                        String toString = "";
-                        for (String item : this) {
-                            toString += " " + item;
-                        }
-                        return toString;
-                    }
-                };
-
-                for (ItemClassModifier modifier : modifiers) {
-                    classes.addAll(modifier.getCssClasses(bundle));
-                }
-
-                item.add(new SimpleAttributeModifier("class", classes.toString()));
-
-
-                PageParameters params = new PageParameters();
-                params.put("bundleId", bundle.getBundleId());
-
-                item.add(new BookmarkablePageLink<DetailsPage>("link", DetailsPage.class, params));
-            }
-        });
-
-    }
-
-    @Override
-    protected List<Class<? extends Page>> getSubPages() {
-        List<Class<? extends Page>> subpages = new LinkedList<Class<? extends Page>>();
-        subpages.add(ConfigurationsPage.class);
-        subpages.add(EventsPage.class);
-        return subpages;
-    }
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/KarafFeaturesWidget.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/KarafFeaturesWidget.java
deleted file mode 100644
index 7b5f76b..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/KarafFeaturesWidget.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.webconsole.core.DashboardWidget;
-import org.apache.karaf.webconsole.osgi.internal.widget.FeaturesWidgetPanel;
-import org.apache.wicket.markup.html.panel.Panel;
-
-public class KarafFeaturesWidget implements DashboardWidget {
-
-    private final FeaturesService service;
-
-    public KarafFeaturesWidget(FeaturesService service) {
-        this.service = service;
-    }
-
-    public Panel getWidgetPanel(String id) {
-        return new FeaturesWidgetPanel(id, service);
-    }
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiConsoleTab.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiConsoleTab.java
deleted file mode 100644
index 9280855..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiConsoleTab.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.webconsole.core.ConsoleTab;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class OsgiConsoleTab implements ConsoleTab {
-
-    private static String osgiHome = "osgi";
-
-	public String getLabel() {
-		return "Runtime";
-	}
-
-	public Class getModuleHomePage() {
-		return HomePage.class;
-	}
-
-	public Map<String, Class> getItems() {
-		Map<String, Class> map = new HashMap<String, Class>();
-		map.put(osgiHome, HomePage.class);
-		return map;
-	}
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiPage.java
new file mode 100644
index 0000000..93ed04b
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiPage.java
@@ -0,0 +1,26 @@
+package org.apache.karaf.webconsole.osgi.internal;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.SidebarPage;
+import org.apache.karaf.webconsole.osgi.internal.configuration.ConfigurationsPage;
+import org.apache.karaf.webconsole.osgi.internal.event.EventsPage;
+import org.apache.wicket.Page;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+import org.osgi.framework.BundleContext;
+
+public abstract class OsgiPage extends SidebarPage {
+
+    @PaxWicketBean(name = "blueprintBundleContext")
+    protected BundleContext context;
+
+    @Override
+    protected List<Class<? extends Page>> getSubPages() {
+        List<Class<? extends Page>> subpages = new LinkedList<Class<? extends Page>>();
+        subpages.add(ConfigurationsPage.class);
+        subpages.add(EventsPage.class);
+        return subpages;
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiWidget.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiWidget.java
deleted file mode 100644
index 93ee4ee..0000000
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/OsgiWidget.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.apache.karaf.webconsole.osgi.internal;
-
-import org.apache.karaf.webconsole.core.DashboardWidget;
-import org.apache.karaf.webconsole.osgi.internal.widget.OsgiWidgetPanel;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.osgi.framework.BundleContext;
-
-public class OsgiWidget implements DashboardWidget {
-
-    private final BundleContext context;
-
-    public OsgiWidget(BundleContext context) {
-        this.context = context;
-        
-    }
-
-    public Panel getWidgetPanel(String id) {
-        return new OsgiWidgetPanel(id, context);
-    }
-
-}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/BundlesPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/BundlesPage.java
new file mode 100644
index 0000000..fd3f955
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/BundlesPage.java
@@ -0,0 +1,55 @@
+package org.apache.karaf.webconsole.osgi.internal.bundle;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.karaf.webconsole.osgi.internal.OsgiPage;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.osgi.framework.Bundle;
+
+public class BundlesPage extends OsgiPage {
+
+    public BundlesPage() {
+
+        List<Bundle> model = Arrays.asList(context.getBundles());
+
+        add(new ListView<Bundle>("bundles", model) {
+            @Override
+            protected void populateItem(ListItem<Bundle> item) {
+                final Bundle bundle = item.getModelObject();
+                item.add(new Label("id", "" + bundle.getBundleId()));
+                item.add(new Label("symbolicName", bundle.getSymbolicName()));
+                item.add(new Label("version", bundle.getVersion().toString()));
+
+//                List<String> classes = new ArrayList<String>() {
+//                    @Override
+//                    public String toString() {
+//                        String toString = "";
+//                        for (String item : this) {
+//                            toString += " " + item;
+//                        }
+//                        return toString;
+//                    }
+//                };
+
+//                for (ItemClassModifier modifier : modifiers) {
+//                    classes.addAll(modifier.getCssClasses(bundle));
+//                }
+
+//                item.add(new SimpleAttributeModifier("class", classes.toString()));
+
+
+                PageParameters params = new PageParameters();
+                params.put("bundleId", bundle.getBundleId());
+
+                item.add(new BookmarkablePageLink<DetailsPage>("link", DetailsPage.class, params));
+            }
+        });
+
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/DetailsPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/DetailsPage.java
similarity index 97%
rename from osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/DetailsPage.java
rename to osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/DetailsPage.java
index 66c43f4..ad65ab6 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/DetailsPage.java
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/DetailsPage.java
@@ -1,4 +1,4 @@
-package org.apache.karaf.webconsole.osgi.internal;
+package org.apache.karaf.webconsole.osgi.internal.bundle;
 
 import java.util.Arrays;
 
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/ItemClassModifier.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/ItemClassModifier.java
new file mode 100644
index 0000000..23290aa
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/ItemClassModifier.java
@@ -0,0 +1,11 @@
+package org.apache.karaf.webconsole.osgi.internal.bundle;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+
+public interface ItemClassModifier {
+
+    List<String> getCssClasses(Bundle bundle);
+
+}
\ No newline at end of file
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/decorator/SystemBundleClassModifier.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/decorator/SystemBundleClassModifier.java
new file mode 100644
index 0000000..2399dc1
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/bundle/decorator/SystemBundleClassModifier.java
@@ -0,0 +1,36 @@
+package org.apache.karaf.webconsole.osgi.internal.bundle.decorator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.karaf.webconsole.osgi.internal.bundle.ItemClassModifier;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.startlevel.StartLevel;
+
+class SystemBundleClassModifier implements ItemClassModifier {
+
+    public List<String> getCssClasses(Bundle bundle) {
+        BundleContext context = bundle.getBundleContext();
+        List<String> classes = new ArrayList<String>();
+
+        if (bundle.getBundleId() == 0) {
+            classes.add("framework");
+        }
+
+        ServiceReference startLevelReference = context.getServiceReference(StartLevel.class.getName());
+
+        if (startLevelReference != null) {
+            StartLevel startLevel = (StartLevel) context.getService(startLevelReference);
+
+            int bundleStartLevel = startLevel.getBundleStartLevel(bundle);
+            if (bundleStartLevel < startLevel.getInitialBundleStartLevel()) {
+                classes.add("system");
+            }
+            context.ungetService(startLevelReference);
+        }
+
+        return classes;
+    }
+}
\ No newline at end of file
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationProvider.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationProvider.java
new file mode 100644
index 0000000..fe4875a
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationProvider.java
@@ -0,0 +1,31 @@
+package org.apache.karaf.webconsole.osgi.internal.configuration;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.osgi.service.cm.Configuration;
+
+public class ConfigurationProvider extends SortableDataProvider<Configuration> {
+
+    private final Configuration[] configurations;
+
+    public ConfigurationProvider(Configuration[] configurations) {
+        this.configurations = configurations;
+    }
+
+    public Iterator<? extends Configuration> iterator(int arg0, int arg1) {
+        return Arrays.asList(Arrays.copyOfRange(configurations, arg0, arg1)).iterator();
+    }
+
+    public IModel<Configuration> model(Configuration arg0) {
+        return new CompoundPropertyModel<Configuration>(arg0);
+    }
+
+    public int size() {
+        return configurations.length;
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.java
new file mode 100644
index 0000000..d52e605
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.java
@@ -0,0 +1,45 @@
+package org.apache.karaf.webconsole.osgi.internal.configuration;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.karaf.webconsole.osgi.internal.OsgiPage;
+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.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class ConfigurationsPage extends OsgiPage {
+
+    @PaxWicketBean(name = "configurationAdmin")
+    private ConfigurationAdmin configurationAdmin;
+
+    public ConfigurationsPage() {
+
+        Configuration[] configurations = new Configuration[0];
+        try {
+            configurations = configurationAdmin.listConfigurations(null);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InvalidSyntaxException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        IModel<String> pid = Model.of("pid");
+
+        List<IColumn<Configuration>> columns = new ArrayList<IColumn<Configuration>>();
+        columns.add(new PropertyColumn<Configuration>(pid, "pid"));
+
+        add(new DefaultDataTable<Configuration>("configurations", columns, new ConfigurationProvider(configurations), 20));
+
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.java
new file mode 100644
index 0000000..9ca7035
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.java
@@ -0,0 +1,7 @@
+package org.apache.karaf.webconsole.osgi.internal.event;
+
+import org.apache.karaf.webconsole.osgi.internal.OsgiPage;
+
+public class EventsPage extends OsgiPage {
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/navigation/OsgiConsoleTab.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/navigation/OsgiConsoleTab.java
new file mode 100644
index 0000000..4ed49b8
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/navigation/OsgiConsoleTab.java
@@ -0,0 +1,24 @@
+package org.apache.karaf.webconsole.osgi.internal.navigation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.webconsole.core.navigation.ConsoleTab;
+import org.apache.karaf.webconsole.osgi.internal.bundle.BundlesPage;
+import org.apache.wicket.Page;
+
+public class OsgiConsoleTab implements ConsoleTab {
+
+    public String getLabel() {
+        return "osgi";
+    }
+
+    public Class<? extends Page> getModuleHomePage() {
+        return BundlesPage.class;
+    }
+
+    public Map<String, Class<? extends Page>> getItems() {
+        return new HashMap<String, Class<? extends Page>>();
+    }
+
+}
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetPanel.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetPanel.java
index 11d9820..62e2fc6 100644
--- a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetPanel.java
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetPanel.java
@@ -1,6 +1,7 @@
 package org.apache.karaf.webconsole.osgi.internal.widget;
 
-import org.apache.karaf.webconsole.osgi.internal.HomePage;
+import org.apache.karaf.webconsole.osgi.internal.OsgiPage;
+import org.apache.karaf.webconsole.osgi.internal.bundle.BundlesPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -16,7 +17,7 @@
 
         add(new Label("bundleCount", "" + context.getBundles().length));
 
-        add(new BookmarkablePageLink<HomePage>("osgiLink", HomePage.class).add(new Label("osgiLinkLabel", "Manage")));
+        add(new BookmarkablePageLink<OsgiPage>("osgiLink", BundlesPage.class).add(new Label("osgiLinkLabel", "Manage")));
 
     }
 }
diff --git a/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetProvider.java b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetProvider.java
new file mode 100644
index 0000000..bfa490f
--- /dev/null
+++ b/osgi/src/main/java/org/apache/karaf/webconsole/osgi/internal/widget/OsgiWidgetProvider.java
@@ -0,0 +1,20 @@
+package org.apache.karaf.webconsole.osgi.internal.widget;
+
+import org.apache.karaf.webconsole.core.widget.WidgetProvider;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.osgi.framework.BundleContext;
+
+public class OsgiWidgetProvider implements WidgetProvider {
+
+    private final BundleContext context;
+
+    public OsgiWidgetProvider(BundleContext context) {
+        this.context = context;
+        
+    }
+
+    public Panel getWidgetPanel(String id) {
+        return new OsgiWidgetPanel(id, context);
+    }
+
+}
diff --git a/osgi/src/main/resources/OSGI-INF/blueprint/osgi.xml b/osgi/src/main/resources/OSGI-INF/blueprint/osgi.xml
new file mode 100644
index 0000000..7e9d78b
--- /dev/null
+++ b/osgi/src/main/resources/OSGI-INF/blueprint/osgi.xml
@@ -0,0 +1,36 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+        http://www.osgi.org/xmlns/blueprint/v1.0.0
+        http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
+    ">
+
+    <service interface="org.apache.karaf.webconsole.core.navigation.ConsoleTab">
+        <bean class="org.apache.karaf.webconsole.core.navigation.ExtendableConsoleTab">
+            <argument>
+                <bean class="org.apache.karaf.webconsole.core.navigation.i18n.LocalizableConsoleTab">
+                    <argument>
+                        <bean class="org.apache.karaf.webconsole.osgi.internal.navigation.OsgiConsoleTab" />
+                    </argument>
+                </bean>
+            </argument>
+            <property name="extensions">
+                <reference-list interface="org.apache.karaf.webconsole.core.navigation.NavigationProvider"
+                    availability="optional" filter="(extends=osgi)" />
+            </property>
+        </bean>
+    </service>
+
+    <service ref="widgetProvider" interface="org.apache.karaf.webconsole.core.widget.WidgetProvider">
+        <service-properties>
+            <entry key="intention" value="dashboard" />
+        </service-properties>
+    </service>
+
+    <bean id="widgetProvider" class="org.apache.karaf.webconsole.osgi.internal.widget.OsgiWidgetProvider">
+        <argument ref="blueprintBundleContext" />
+    </bean>
+
+    <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" availability="optional" />
+
+</blueprint>
diff --git a/osgi/src/main/resources/OSGI-INF/blueprint/wicket.xml b/osgi/src/main/resources/OSGI-INF/blueprint/wicket.xml
deleted file mode 100644
index e042e3e..0000000
--- a/osgi/src/main/resources/OSGI-INF/blueprint/wicket.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-    xmlns:wicket="http://www.ops4j.org/schema/wicket">
-
-    <service auto-export="interfaces">
-        <bean class="org.apache.karaf.webconsole.osgi.internal.OsgiConsoleTab" />
-    </service>
-    
-    <service auto-export="interfaces">
-        <bean class="org.apache.karaf.webconsole.osgi.internal.FeaturesConsoleTab" />
-    </service>
-    
-    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService"/>
-
-    <service interface="org.apache.karaf.webconsole.core.DashboardWidget">
-        <bean class="org.apache.karaf.webconsole.osgi.internal.OsgiWidget">
-            <argument ref="blueprintBundleContext" />
-        </bean>
-    </service>
-
-    <service interface="org.apache.karaf.webconsole.core.DashboardWidget">
-        <bean class="org.apache.karaf.webconsole.osgi.internal.KarafFeaturesWidget">
-            <argument ref="featuresService" />
-        </bean>
-    </service>
-
-</blueprint>
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/EventsPage.html b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/EventsPage.html
deleted file mode 100644
index 5f05b55..0000000
--- a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/EventsPage.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<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 Wicket console - Features page</title>
-    </wicket:head>
-
-    <body>
-
-        <wicket:extend>
-            <h1>Configuration</h1>
-            <p>
-                In this place you will be able to manage configurations.
-            </p>
-        </wicket:extend>
-    </body>
-</html>
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/HomePage.html b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/bundle/BundlesPage.html
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/HomePage.html
rename to osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/bundle/BundlesPage.html
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/DetailsPage.html b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/bundle/DetailsPage.html
similarity index 100%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/DetailsPage.html
rename to osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/bundle/DetailsPage.html
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.html
similarity index 69%
rename from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html
rename to osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.html
index 33038b1..45574f6 100644
--- a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html
+++ b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/configuration/ConfigurationsPage.html
@@ -7,11 +7,9 @@
     <body>
 
         <wicket:extend>
-            <h1>Confgiration</h1>
+            <h1>Configurations</h1>
 
-            <p>
-                In this place you will be able to manage configurations.
-            </p>
+            <table wicket:id="configurations" class="dataview" />
         </wicket:extend>
     </body>
 </html>
diff --git a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.html
similarity index 67%
copy from osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html
copy to osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.html
index 33038b1..bc3bb5a 100644
--- a/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/ConfigurationsPage.html
+++ b/osgi/src/main/resources/org/apache/karaf/webconsole/osgi/internal/event/EventsPage.html
@@ -1,17 +1,18 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <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 Wicket console</title>
+        <title>Karaf Wicket console - Events page</title>
     </wicket:head>
 
     <body>
 
         <wicket:extend>
-            <h1>Confgiration</h1>
+            <h1>Events</h1>
 
             <p>
-                In this place you will be able to manage configurations.
+                Not supported yet.
             </p>
+
         </wicket:extend>
     </body>
 </html>
diff --git a/pom.xml b/pom.xml
index 48ba2a5..e34f8fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,8 @@
     <modules>
         <module>core</module>
         <module>osgi</module>
+        <module>blueprint</module>
+        <module>karaf</module>
         <module>features</module>
     </modules>