[maven-release-plugin]  copy for tag karaf-2.2.4

git-svn-id: https://svn.apache.org/repos/asf/karaf/tags/karaf-2.2.4@1182765 13f79535-47bb-0310-9956-ffa450edef68
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;