diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index c88cd60..cba3603 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -51,6 +51,8 @@
     * [KARAF-921] - maven eclipse plugin 2.8 does not work correctly with karaf
     * [KARAF-922] - features-maven-plugin ignores repository tags in feature files
     * [KARAF-923] - features-maven-plugin#AddFeaturesToRepoMojo does not handle spaces in repository urls well
+    * [KARAF-929] - MBean bundles should be seen as system bundles
+    * [KARAF-932] - ConfigMBean raise a NPE when dictionnary is null
 
 ** Dependency upgrade
     * [KARAF-901] - Upgrade to Pax Web 1.0.7
@@ -71,6 +73,7 @@
     * [KARAF-900] - Shutdown command should display the instance name
     * [KARAF-907] - Include 64 bits wrapper library
     * [KARAF-925] - Karaf config.properties doesn't define J2SE-1.6 and J2SE-1.7 execution environment
+    * [KARAF-930] - Bundles MBean should mimic the BundleSelector like osgi:* commands
 
 ** New Feature
     * [KARAF-541] - Support JMX SSL via etc/org.apache.karaf.management.cfg 
diff --git a/assemblies/features/standard/src/main/resources/features.xml b/assemblies/features/standard/src/main/resources/features.xml
index d64bb6c..c770f03 100644
--- a/assemblies/features/standard/src/main/resources/features.xml
+++ b/assemblies/features/standard/src/main/resources/features.xml
@@ -145,7 +145,7 @@
         <bundle>mvn:org.ops4j.pax.url/pax-url-obr/${pax.url.version}</bundle>
     </feature>
     <feature name="config" version="${project.version}">
-        <bundle start-level='30'>mvn:org.apache.karaf.shell/org.apache.karaf.shell.config/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.config/${project.version}</bundle>
     </feature>
     <feature name="jetty" version="${jetty.version}" resolver="(obr)">
         <bundle dependency='true'>mvn:org.apache.geronimo.specs/geronimo-activation_1.1_spec/${geronimo.activation.version}</bundle>
@@ -220,21 +220,21 @@
             sshRealm=karaf
             hostKey=${karaf.base}/etc/host.key
         </config>
-        <bundle dependency='true'>mvn:org.apache.mina/mina-core/${mina.version}</bundle>
-        <bundle dependency='true'>mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
-        <bundle>mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}</bundle>
+        <bundle start-level="30" dependency='true'>mvn:org.apache.mina/mina-core/${mina.version}</bundle>
+        <bundle start-level="30" dependency='true'>mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}</bundle>
     </feature>
     <feature name="management" version="${project.version}">
-        <bundle>mvn:org.apache.karaf.management/org.apache.karaf.management.server/${project.version}</bundle>
-        <bundle>mvn:org.apache.aries.jmx/org.apache.aries.jmx/${aries.jmx.version}</bundle>
-        <bundle>mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.system/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.bundles/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.services/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.config/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.log/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.packages/${project.version}</bundle>
-        <bundle>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.dev/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management/org.apache.karaf.management.server/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.system/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.bundles/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.services/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.config/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.log/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.packages/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.dev/${project.version}</bundle>
     </feature>
     <feature name="eventadmin" version="${project.version}">
 		<bundle start-level='30'>mvn:org.apache.felix/org.apache.felix.eventadmin/${felix.eventadmin.version}</bundle>
diff --git a/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java b/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
index 54e1e74..57766aa 100644
--- a/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
+++ b/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
@@ -28,6 +28,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.apache.karaf.features.internal.FeatureImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
@@ -130,7 +131,13 @@
                             for (Repository repo : featuresService.listRepositories()) {
                                 if (repo.getURI().equals(url.toURI())) {
                                     Set<Feature> features = new HashSet<Feature>(Arrays.asList(repo.getFeatures()));
-                                    featuresService.installFeatures(features, EnumSet.noneOf(FeaturesService.Option.class));
+                                    Set<Feature> autoInstallFeatures = new HashSet<Feature>();
+                                    for(Feature feature:features) {
+                                        if(feature.getInstall().equals(Feature.DEFAULT_INSTALL_MODE)){
+                                            autoInstallFeatures.add(feature);
+                                        }
+                                    }
+                                    featuresService.installFeatures(autoInstallFeatures, EnumSet.noneOf(FeaturesService.Option.class));
                                 }
                             }
                             urls.add(url);
diff --git a/features/core/src/main/java/org/apache/karaf/features/Feature.java b/features/core/src/main/java/org/apache/karaf/features/Feature.java
index 77f0ee1..b87bc97 100644
--- a/features/core/src/main/java/org/apache/karaf/features/Feature.java
+++ b/features/core/src/main/java/org/apache/karaf/features/Feature.java
@@ -24,6 +24,8 @@
  */
 public interface Feature {
 
+    public static String DEFAULT_INSTALL_MODE = "auto";
+
     String getId();
 
     String getName();
@@ -36,6 +38,8 @@
 
     String getResolver();
 
+    String getInstall();
+
     List<Feature> getDependencies();
 
     List<BundleInfo> getBundles();
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
index 6a45251..a4b4259 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
@@ -36,6 +36,7 @@
     private String details;
     private String version;
     private String resolver;
+    private String install = DEFAULT_INSTALL_MODE;
     private List<Feature> dependencies = new ArrayList<Feature>();
     private List<BundleInfo> bundles = new ArrayList<BundleInfo>();
     private Map<String, Map<String,String>> configs = new HashMap<String, Map<String,String>>();
@@ -97,6 +98,14 @@
         this.resolver = resolver;
     }
 
+    public String getInstall() {
+        return install;
+    }
+
+    public void setInstall(String install) {
+        this.install = install;
+    }
+
     public List<Feature> getDependencies() {
         return dependencies;
     }
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
index b318b5e..982de6e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
@@ -136,6 +136,11 @@
                         f.setResolver(resolver);
                     }
 
+                    String install = e.getAttribute("install");
+                    if (install != null && install.length() > 0) {
+                        f.setInstall(install);
+                    }
+
                     String description = e.getAttribute("description");
                     if (description != null && description.length() > 0) {
                         f.setDescription(description);
diff --git a/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd b/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
index 81e1e1d..b1b6bb7 100644
--- a/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
+++ b/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
@@ -1,216 +1,236 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements. See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License. You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<xs:schema elementFormDefault="qualified"
-    targetNamespace="http://karaf.apache.org/xmlns/features/v1.0.0"
-    xmlns:tns="http://karaf.apache.org/xmlns/features/v1.0.0"
-    xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-    <xs:annotation>
-        <xs:documentation><![CDATA[
-Karaf features mechanism. For documentation please visit 
-<a href="http://karaf.apache.org/">Karaf website</a>.
-        ]]></xs:documentation>
-    </xs:annotation>
-
-    <xs:complexType name="features">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Root element of Feature definition. It contains optional attribute which allow
-name of repository. This name will be used in shell to display source repository
-of given feature.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="repository" type="xs:anyURI">
-                <xs:annotation>
-                    <xs:documentation><![CDATA[
-Additional repositories where dependencies are stored.
-                    ]]></xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="feature" type="tns:feature">
-                <xs:annotation>
-                    <xs:documentation><![CDATA[
-Feature definition.
-                    ]]></xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string" />
-    </xs:complexType>
-
-    <xs:complexType name="feature">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Definition of the Feature.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="details" minOccurs="0" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation><![CDATA[
-Long info displayed in features:info command result.
-                    ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="config" type="tns:config" />
-            <xs:element name="configfile" type="tns:configFile" />
-            <xs:element name="feature" type="tns:dependency" />
-            <xs:element name="bundle" type="tns:bundle" />
-        </xs:choice>
-        <xs:attribute name="name" type="tns:featureName" use="required" />
-        <xs:attribute name="version" type="xs:string" default="0.0.0" />
-        <xs:attribute name="description" type="xs:string" />
-        <xs:attribute name="resolver" type="tns:resolver">
-            <xs:annotation>
-                <xs:documentation><![CDATA[
-Karaf allow using dynamic resolvers.
-                ]]>
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="start-level" type="xs:int">
-             <xs:annotation>
-                <xs:documentation><![CDATA[
-Bundles in this feature start level set to OSGi framework.
-                ]]>
-                </xs:documentation>
-             </xs:annotation>
-         </xs:attribute>
-
-    </xs:complexType>
-
-    <xs:complexType name="bundle">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Deployable element to install.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:simpleContent>
-            <xs:extension base="xs:anyURI">
-                <xs:attribute name="start-level" type="xs:int">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-Bundle start level set to OSGi framework.
-                        ]]>
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-                <xs:attribute name="start" type="xs:boolean">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-This switch allow you to leave bundle in resolved state.
-                        ]]>
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-                <xs:attribute name="dependency" type="xs:boolean">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-Mark bundle as dependency for resolver.
-                        ]]>
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-            </xs:extension>
-        </xs:simpleContent>
-    </xs:complexType>
-
-    <xs:complexType name="dependency">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Dependency of feature.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:simpleContent>
-            <xs:extension base="tns:featureName">
-                <xs:attribute name="version" type="xs:string" default="0.0.0" />
-            </xs:extension>
-        </xs:simpleContent>
-    </xs:complexType>
-
-    <xs:complexType name="config">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Configuration entries which should be created during feature installation. This
-configuration may be used with OSGi Configuration Admin.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:simpleContent>
-            <xs:extension base="xs:string">
-                <xs:attribute name="name" type="xs:string" use="required" />
-            </xs:extension>
-        </xs:simpleContent>
-    </xs:complexType>
-
-    <xs:complexType name="configFile">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Additional configuration files which should be created during feature installation.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:simpleContent>
-            <xs:extension base="xs:anyURI">
-                <xs:attribute name="finalname" type="xs:string" use="required">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-Name of file name where given deployable element should be stored.
-                        ]]></xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-                <xs:attribute name="override" type="xs:boolean">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-flag to specify if the finalname file should be overriden
-                        ]]></xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-
-            </xs:extension>
-        </xs:simpleContent>
-    </xs:complexType>
-
-    <xs:simpleType name="featureName">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Feature name should be non empty string.
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:string">
-            <xs:minLength value="1" />
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:simpleType name="resolver">
-        <xs:annotation>
-            <xs:documentation><![CDATA[
-Resolver to use. Karaf will look for OSGi servie which have following properties:
-objectClass: org.apache.karaf.features.Resolver
-name: the value
-            ]]></xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:string">
-            <xs:minLength value="1" />
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:element name="features" type="tns:features" />
-
-</xs:schema>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements. See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License. You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<xs:schema elementFormDefault="qualified"
+    targetNamespace="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:tns="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:annotation>
+        <xs:documentation><![CDATA[
+Karaf features mechanism. For documentation please visit 
+<a href="http://karaf.apache.org/">Karaf website</a>.
+        ]]></xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="features">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Root element of Feature definition. It contains optional attribute which allow
+name of repository. This name will be used in shell to display source repository
+of given feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="repository" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Additional repositories where dependencies are stored.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="feature" type="tns:feature">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Feature definition.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:choice>
+        <xs:attribute name="name" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="feature">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Definition of the Feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="details" minOccurs="0" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Long info displayed in features:info command result.
+                    ]]>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="config" type="tns:config" />
+            <xs:element name="configfile" type="tns:configFile" />
+            <xs:element name="feature" type="tns:dependency" />
+            <xs:element name="bundle" type="tns:bundle" />
+        </xs:choice>
+        <xs:attribute name="name" type="tns:featureName" use="required" />
+        <xs:attribute name="version" type="xs:string" default="0.0.0" />
+        <xs:attribute name="description" type="xs:string" />
+        <xs:attribute name="resolver" type="tns:resolver">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+Karaf allow using dynamic resolvers.
+                ]]>
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="install" type="tns:install">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+Marks if the feaute will be automatically started when thrown to the deploy folder.
+                ]]>
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="start-level" type="xs:int">
+             <xs:annotation>
+                <xs:documentation><![CDATA[
+Bundles in this feature start level set to OSGi framework.
+                ]]>
+                </xs:documentation>
+             </xs:annotation>
+         </xs:attribute>
+
+    </xs:complexType>
+
+    <xs:complexType name="bundle">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Deployable element to install.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="start-level" type="xs:int">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Bundle start level set to OSGi framework.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="start" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+This switch allow you to leave bundle in resolved state.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="dependency" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Mark bundle as dependency for resolver.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="dependency">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Dependency of feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="tns:featureName">
+                <xs:attribute name="version" type="xs:string" default="0.0.0" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="config">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Configuration entries which should be created during feature installation. This
+configuration may be used with OSGi Configuration Admin.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="name" type="xs:string" use="required" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="configFile">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Additional configuration files which should be created during feature installation.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="finalname" type="xs:string" use="required">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Name of file name where given deployable element should be stored.
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="override" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+flag to specify if the finalname file should be overriden
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:simpleType name="featureName">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Feature name should be non empty string.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="resolver">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Resolver to use. Karaf will look for OSGi servie which have following properties:
+objectClass: org.apache.karaf.features.Resolver
+name: the value
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="install">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Installation mode. Can be either manual or auto. Specifies wether the feature should be automatically installed when
+dropped inside the deploy folder. Note: This attribute doesn't affect feature descriptors that are installed from the
+command line or as part of the org.apache.karaf.features.cfg.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="features" type="tns:features" />
+
+</xs:schema>
diff --git a/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java b/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
index 913b72f..1ee10c9 100644
--- a/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
+++ b/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
@@ -81,6 +81,12 @@
         //If encryption support is enabled, encrypt password
         if (encryptionSupport != null && encryptionSupport.getEncryption() != null) {
             newPassword = encryptionSupport.getEncryption().encryptPassword(password);
+            if (encryptionSupport.getEncryptionPrefix() != null) {
+                newPassword = encryptionSupport.getEncryptionPrefix() + newPassword;
+            }
+            if (encryptionSupport.getEncryptionSuffix() != null) {
+                newPassword = newPassword + encryptionSupport.getEncryptionSuffix();
+            }
         }
 
         if (dataSource != null) {
diff --git a/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java b/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
index d57b742..5a00362 100644
--- a/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
+++ b/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
@@ -67,6 +67,12 @@
         //If encryption support is enabled, encrypt password
         if (encryptionSupport != null && encryptionSupport.getEncryption() != null) {
             newPassword = encryptionSupport.getEncryption().encryptPassword(password);
+            if (encryptionSupport.getEncryptionPrefix() != null) {
+                newPassword = encryptionSupport.getEncryptionPrefix() + newPassword;
+            }
+            if (encryptionSupport.getEncryptionSuffix() != null) {
+                newPassword = newPassword + encryptionSupport.getEncryptionSuffix();
+            }
         }
 
         String userInfos = users.get(username);
diff --git a/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
index 83a5e45..0e8e9f8 100644
--- a/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
+++ b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
@@ -25,27 +25,27 @@
 
     TabularData list() throws Exception;
 
-    int getStartLevel(long bundleId) throws Exception;
-    void setStartLevel(long bundleId, int bundleStartLevel) throws Exception;
+    int getStartLevel(String bundleId) throws Exception;
+    void setStartLevel(String bundleId, int bundleStartLevel) throws Exception;
 
     void refresh() throws Exception;
-    void refresh(long bundleId) throws Exception;
+    void refresh(String bundleId) throws Exception;
 
-    void update(long bundleId) throws Exception;
-    void update(long bundleId, String location) throws Exception;
+    void update(String bundleId) throws Exception;
+    void update(String bundleId, String location) throws Exception;
 
     void resolve() throws Exception;
-    void resolve(long bundleId) throws Exception;
+    void resolve(String bundleId) throws Exception;
 
-    void restart(long bundleId) throws Exception;
+    void restart(String bundleId) throws Exception;
 
     long install(String url) throws Exception;
     long install(String url, boolean start) throws Exception;
 
-    void start(long bundleId) throws Exception;
+    void start(String bundleId) throws Exception;
 
-    void stop(long bundleId) throws Exception;
+    void stop(String bundleId) throws Exception;
 
-    void uninstall(long bundleId) throws Exception;
+    void uninstall(String bundleId) throws Exception;
 
 }
diff --git a/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
index da65a36..b39a5bb 100644
--- a/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
+++ b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
@@ -28,6 +28,7 @@
 import javax.management.openmbean.*;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.List;
 
 /**
  * Bundles MBean implementation.
@@ -50,7 +51,7 @@
         CompositeType bundleType = new CompositeType("Bundle", "OSGi Bundle",
                 new String[]{ "ID", "Name", "Version", "Start Level", "State" },
                 new String[]{ "ID of the Bundle", "Name of the Bundle", "Version of the Bundle", "Start Level of the Bundle", "Current State of the Bundle" },
-                new OpenType[]{ SimpleType.LONG, SimpleType.STRING, SimpleType.STRING, SimpleType.INTEGER, SimpleType.INTEGER });
+                new OpenType[]{ SimpleType.LONG, SimpleType.STRING, SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING });
         TabularType tableType = new TabularType("Bundles", "Tables of all Bundles", bundleType, new String[]{ "ID" });
         TabularData table = new TabularDataSupport(tableType);
 
@@ -61,9 +62,22 @@
             if (startLevel != null) {
                 bundleStartLevel = startLevel.getBundleStartLevel(bundles[i]);
             }
+            int bundleState = bundles[i].getState();
+            String bundleStateString;
+            if (bundleState == Bundle.ACTIVE)
+                bundleStateString = "ACTIVE";
+            else if (bundleState == Bundle.INSTALLED)
+                bundleStateString = "INSTALLED";
+            else if (bundleState == Bundle.RESOLVED)
+                bundleStateString = "RESOLVED";
+            else if (bundleState == Bundle.STARTING)
+                bundleStateString = "STARTING";
+            else if (bundleState == Bundle.STOPPING)
+                bundleStateString = "STOPPING";
+            else bundleStateString = "UNKNOWN";
             CompositeData data = new CompositeDataSupport(bundleType,
                     new String[]{ "ID", "Name", "Version", "Start Level", "State" },
-                    new Object[]{ bundles[i].getBundleId(), bundles[i].getSymbolicName(), bundles[i].getVersion().toString(), bundleStartLevel, bundles[i].getState() });
+                    new Object[]{ bundles[i].getBundleId(), bundles[i].getSymbolicName(), bundles[i].getVersion().toString(), bundleStartLevel, bundleStateString });
             table.put(data);
         }
 
@@ -72,7 +86,7 @@
         return table;
     }
 
-    public int getStartLevel(long bundleId) throws Exception {
+    public int getStartLevel(String bundleId) throws Exception {
         ServiceReference startLevelReference = bundleContext.getServiceReference(StartLevel.class.getName());
         if (startLevelReference == null) {
             throw new IllegalStateException("StartLevel service is not available");
@@ -81,12 +95,20 @@
         if (startLevel == null) {
             throw new IllegalStateException("StartLevel service is not available");
         }
-        int bundleStartLevel = startLevel.getBundleStartLevel(bundleContext.getBundle(bundleId));
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        if (bundles.size() != 1) {
+            throw new IllegalArgumentException("Provided bundle Id doesn't return any bundle or more than one bundle selected");
+        }
+
+        int bundleStartLevel = startLevel.getBundleStartLevel(bundles.get(0));
         bundleContext.ungetService(startLevelReference);
         return bundleStartLevel;
     }
 
-    public void setStartLevel(long bundleId, int bundleStartLevel) throws Exception {
+    public void setStartLevel(String bundleId, int bundleStartLevel) throws Exception {
         ServiceReference startLevelReference = bundleContext.getServiceReference(StartLevel.class.getName());
         if (startLevelReference == null) {
             throw new IllegalStateException("StartLevel service is not available");
@@ -95,7 +117,14 @@
         if (startLevel == null) {
             throw new IllegalStateException("StartLevel service is not available");
         }
-        startLevel.setBundleStartLevel(bundleContext.getBundle(bundleId), bundleStartLevel);
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            startLevel.setBundleStartLevel(bundle, bundleStartLevel);
+        }
+
         bundleContext.ungetService(startLevelReference);
     }
 
@@ -112,7 +141,7 @@
         getBundleContext().ungetService(packageAdminReference);
     }
 
-    public void refresh(long bundleId) throws Exception {
+    public void refresh(String bundleId) throws Exception {
         ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
         if (packageAdminReference == null) {
             throw new IllegalStateException("PackageAdmin service is not available");
@@ -121,21 +150,37 @@
         if (packageAdmin == null) {
             throw new IllegalStateException("PackageAdmin service is not available");
         }
-        packageAdmin.refreshPackages(new Bundle[]{ bundleContext.getBundle(bundleId) });
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        Bundle[] bundlesArray = new Bundle[bundles.size()];
+        packageAdmin.refreshPackages(bundles.toArray(bundlesArray));
+
         getBundleContext().ungetService(packageAdminReference);
     }
 
-    public void update(long bundleId) throws Exception {
+    public void update(String bundleId) throws Exception {
         update(bundleId, null);
     }
 
-    public void update(long bundleId, String location) throws Exception {
-        if (location != null) {
-            InputStream is = new URL(location).openStream();
-            bundleContext.getBundle(bundleId).update(is);
-        } else {
-            bundleContext.getBundle(bundleId).update();
+    public void update(String bundleId, String location) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        if (location == null) {
+            for (Bundle bundle : bundles) {
+                bundle.update();
+            }
+            return;
         }
+
+        if (bundles.size() != 1) {
+            throw new IllegalArgumentException("Provided bundle Id doesn't return any bundle or more than one bundle selected");
+        }
+
+        InputStream is = new URL(location).openStream();
+        bundles.get(0).update(is);
     }
 
     public void resolve() throws Exception {
@@ -151,7 +196,7 @@
         getBundleContext().ungetService(packageAdminReference);
     }
 
-    public void resolve(long bundleId) throws Exception {
+    public void resolve(String bundleId) throws Exception {
         ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
         if (packageAdminReference == null) {
             throw new IllegalStateException("PackageAdmin service is not available");
@@ -160,13 +205,24 @@
         if (packageAdmin == null) {
             throw new IllegalStateException("PackageAdmin service is not available");
         }
-        packageAdmin.resolveBundles(new Bundle[]{ bundleContext.getBundle(bundleId) });
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        Bundle[] bundlesArray = new Bundle[bundles.size()];
+        packageAdmin.resolveBundles(bundles.toArray(bundlesArray));
+
         getBundleContext().ungetService(packageAdminReference);
     }
 
-    public void restart(long bundleId) throws Exception {
-        bundleContext.getBundle(bundleId).stop();
-        bundleContext.getBundle(bundleId).start();
+    public void restart(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.stop();
+            bundle.start();
+        };
     }
 
     public long install(String url) throws Exception {
@@ -181,16 +237,31 @@
         return bundle.getBundleId();
     }
 
-    public void start(long bundleId) throws Exception {
-        bundleContext.getBundle(bundleId).start();
+    public void start(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.start();
+        }
     }
 
-    public void stop(long bundleId) throws Exception {
-        bundleContext.getBundle(bundleId).stop();
+    public void stop(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.stop();
+        }
     }
 
-    public void uninstall(long bundleId) throws Exception {
-        bundleContext.getBundle(bundleId).uninstall();
+    public void uninstall(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.uninstall();
+        }
     }
 
     public BundleContext getBundleContext() {
diff --git a/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
new file mode 100644
index 0000000..91b222e
--- /dev/null
+++ b/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.management.mbeans.bundles.internal;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Bundles selector which is able to get a bundle by ID, ID range, name, and version.
+ */
+public class BundlesSelector {
+
+    private BundleContext bundleContext;
+
+    public BundlesSelector(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /**
+     * Select bundles with ID, ID range, name, and version.
+     *
+     * @param bundleId the bundles ID for selection.
+     * @return the corresponding bundles found.
+     * @throws Exception in case of selection
+     */
+    public List<Bundle> selectBundles(String bundleId) throws Exception {
+        List<Bundle> bundles = new ArrayList<Bundle>();
+        if (bundleId != null && bundleId.length() > 0) {
+
+            // bundle ID is a number
+            Pattern pattern = Pattern.compile("^\\d+$");
+            Matcher matcher = pattern.matcher(bundleId);
+            if (matcher.find()) {
+                Bundle bundle = this.getBundleById(bundleId);
+                bundles.add(bundle);
+                return bundles;
+            }
+
+            // bundle is an ID range
+            pattern = Pattern.compile("^(\\d+)-(\\d+)$");
+            matcher = pattern.matcher(bundleId);
+            if (matcher.find()) {
+                int index = bundleId.indexOf('-');
+                long startId = Long.parseLong(bundleId.substring(0, index));
+                long stopId = Long.parseLong(bundleId.substring(index + 1));
+                if (startId < stopId) {
+                    for (long i = startId; i <= stopId; i++) {
+                        Bundle bundle = bundleContext.getBundle(i);
+                        bundles.add(bundle);
+                    }
+                }
+                return bundles;
+            }
+
+            // bundle ID is name/version
+            int index = bundleId.indexOf('/');
+            if (index != -1) {
+                // user has provided name and version
+                return this.getBundleByNameAndVersion(bundleId.substring(0, index), bundleId.substring(index + 1));
+            } else {
+                // user has provided only name
+                return this.getBundleByName(bundleId);
+            }
+
+
+        }
+        return bundles;
+    }
+
+    /**
+     * Get a bundle with the bundle ID.
+     *
+     * @param id the bundle ID.
+     * @return the corresponding bundle.
+     */
+    private Bundle getBundleById(String id) {
+        Bundle bundle = null;
+        try {
+            long idNumber = Long.parseLong(id);
+            bundle = bundleContext.getBundle(idNumber);
+        } catch (Exception e) {
+            // ignore
+        }
+        return bundle;
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the pattern.
+     *
+     * @param name the bundle name or symbolic name pattern to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByName(String name) {
+        return getBundleByNameAndVersion(name, null);
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the name pattern and version matching the version pattern.
+     *
+     * @param name    the bundle name or symbolic name regex to match.
+     * @param version the bundle version regex to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByNameAndVersion(String name, String version) {
+        Bundle[] bundles = bundleContext.getBundles();
+
+        ArrayList<Bundle> result = new ArrayList<Bundle>();
+
+        Pattern namePattern = Pattern.compile(name);
+
+        for (int i = 0; i < bundles.length; i++) {
+
+            String bundleSymbolicName = bundles[i].getSymbolicName();
+            // skip bundles without Bundle-SymbolicName header
+            if (bundleSymbolicName == null) {
+                continue;
+            }
+
+            Matcher symbolicNameMatcher = namePattern.matcher(bundleSymbolicName);
+
+            Matcher nameMatcher = null;
+            String bundleName = (String) bundles[i].getHeaders().get(Constants.BUNDLE_NAME);
+            if (bundleName != null) {
+                nameMatcher = namePattern.matcher(bundleName);
+            }
+
+            if (version != null) {
+                String bundleVersion = (String) bundles[i].getHeaders().get(Constants.BUNDLE_VERSION);
+                if (bundleVersion != null) {
+                    boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                    if (nameMatch) {
+                        Pattern versionPattern = Pattern.compile(version);
+                        Matcher versionMatcher = versionPattern.matcher(bundleVersion);
+                        if (versionMatcher.find()) {
+                            result.add(bundles[i]);
+                        }
+                    }
+                }
+            } else {
+                boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                if (nameMatch) {
+                    result.add(bundles[i]);
+                }
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java b/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
index 01d6a81..4ef7de5 100644
--- a/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
+++ b/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
@@ -85,6 +85,11 @@
             throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
         }
         Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
         Map<String, String> propertiesMap = new HashMap<String, String>();
         for (Enumeration e = dictionary.keys(); e.hasMoreElements(); ) {
             Object key = e.nextElement();
@@ -100,6 +105,11 @@
             throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
         }
         Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
         dictionary.remove(key);
         store(pid, dictionary, false);
     }
@@ -110,6 +120,11 @@
             throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
         }
         Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
         Object currentValue = dictionary.get(key);
         if (currentValue == null) {
             dictionary.put(key, value);
@@ -127,6 +142,11 @@
             throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
         }
         Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
         dictionary.put(key, value);
         store(pid, dictionary, false);
     }
diff --git a/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java b/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
index 1c363c8..6c6f761 100644
--- a/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
+++ b/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
@@ -150,7 +150,7 @@
             Set<String> bundles = new HashSet<String>();
             Map<String, Feature> featuresMap = new HashMap<String, Feature>();
             for (String uri : descriptors) {
-                retrieveDescriptorsRecursivly(uri, bundles, featuresMap);
+                retrieveDescriptorsRecursively(uri, bundles, featuresMap);
             }
 
             // no features specified, handle all of them
@@ -197,11 +197,11 @@
                 resolveBundle(explicitBundle, Collections.singletonList(explicitBundle.getRepository()));
             }
             if (copyFileBasedDescriptors != null) {
-                for (CopyFileBasedDescriptor fileBasedDescritpor : copyFileBasedDescriptors) {
-                    copy(new FileInputStream(fileBasedDescritpor.getSourceFile()),
+                for (CopyFileBasedDescriptor fileBasedDescriptor : copyFileBasedDescriptors) {
+                    copy(new FileInputStream(fileBasedDescriptor.getSourceFile()),
                         repository,
-                        fileBasedDescritpor.getTargetFileName(),
-                        fileBasedDescritpor.getTargetDirectory(),
+                        fileBasedDescriptor.getTargetFileName(),
+                        fileBasedDescriptor.getTargetDirectory(),
                         new byte[8192]);
                 }
             }
@@ -214,7 +214,7 @@
         }
     }
 
-    private void retrieveDescriptorsRecursivly(String uri, Set<String> bundles, Map<String, Feature> featuresMap)
+    private void retrieveDescriptorsRecursively(String uri, Set<String> bundles, Map<String, Feature> featuresMap)
         throws Exception {
         // let's ensure a mvn: based url is sitting in the local repo before we try reading it
         Artifact descriptor = bundleToArtifact(uri, true);
@@ -230,7 +230,7 @@
         }
         if (resolveDefinedRepositoriesRecursively) {
             for (String r : repo.getDefinedRepositories()) {
-                retrieveDescriptorsRecursivly(r, bundles, featuresMap);
+                retrieveDescriptorsRecursively(r, bundles, featuresMap);
             }
         }
     }
diff --git a/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java b/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
index 4be9243..8cac6f9 100644
--- a/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
+++ b/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
@@ -127,6 +127,9 @@
         return this.repository;
     }
 
+    public String getInstall() {
+        return feature.getInstall();
+    }
 
     public State getState() {
         return this.state;
