Index: gshell/gshell-features/src/test/java/org/apache/servicemix/kernel/gshell/features/FeaturesServiceTest.java
===================================================================
--- gshell/gshell-features/src/test/java/org/apache/servicemix/kernel/gshell/features/FeaturesServiceTest.java	(revision 755503)
+++ gshell/gshell-features/src/test/java/org/apache/servicemix/kernel/gshell/features/FeaturesServiceTest.java	(working copy)
@@ -34,9 +34,12 @@
 import static org.easymock.EasyMock.verify;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.prefs.Preferences;
 import org.osgi.service.prefs.PreferencesService;
+import org.osgi.service.packageadmin.PackageAdmin;
 import org.springframework.context.ApplicationContext;
+import org.springframework.core.task.TaskExecutor;
 
 public class FeaturesServiceTest extends TestCase {
 
@@ -84,7 +87,7 @@
         svc.setBundleContext(bundleContext);
         svc.setFeaturesServiceRegistry(featuresRegistry);
         svc.addRepository(uri);
-        
+
         Repository[] repositories = svc.listRepositories();
         assertNotNull(repositories);
         assertEquals(1, repositories.length);
@@ -122,11 +125,125 @@
         prefs.putBoolean("bootFeaturesInstalled", false);
         prefs.flush();
 
-        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle);
+        ServiceReference paSvcRef = EasyMock.createMock(ServiceReference.class);
+        PackageAdmin pa = EasyMock.createMock(PackageAdmin.class);
+        expect(bundleContext.getServiceReference(PackageAdmin.class.getName())).andStubReturn(paSvcRef);
+        expect(bundleContext.getService(paSvcRef)).andStubReturn(pa);
+        expect(bundleContext.ungetService(paSvcRef)).andReturn(true);
+        pa.refreshPackages(EasyMock.aryEq(new Bundle[] { installedBundle }));
 
+        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle, paSvcRef, pa);
+
         svc.installFeature("f1");
     }
 
+    public void testInstallFeatureWithDep() throws Exception {
+
+        String name1 = ApplicationContext.class.getName();
+        name1 = name1.replace(".", "/")  + ".class";
+        name1 = getClass().getClassLoader().getResource(name1).toString();
+        name1 = name1.substring("jar:".length(), name1.indexOf('!'));
+        String name2 = TaskExecutor.class.getName();
+        name2 = name2.replace(".", "/")  + ".class";
+        name2 = getClass().getClassLoader().getResource(name2).toString();
+        name2 = name2.substring("jar:".length(), name2.indexOf('!'));
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features>");
+        pw.println("  <feature name=\"f2\">");
+        pw.println("    <bundle>" + name1 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f1\">");
+        pw.println("    <feature>f2</feature>");
+        pw.println("    <bundle>" + name2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        Preferences prefs = EasyMock.createMock(Preferences.class);
+        PreferencesService preferencesService = EasyMock.createMock(PreferencesService.class);
+        Preferences repositoriesNode = EasyMock.createMock(Preferences.class);
+        Preferences featuresNode = EasyMock.createMock(Preferences.class);
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+        FeaturesRegistry featuresRegistry = EasyMock.createNiceMock(FeaturesRegistry.class);
+
+        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
+        expect(prefs.node("repositories")).andReturn(repositoriesNode);
+        repositoriesNode.clear();
+        repositoriesNode.putInt("count", 1);
+        repositoriesNode.put("item.0", uri.toString());
+        expect(prefs.node("features")).andReturn(featuresNode);
+        featuresNode.clear();
+        prefs.putBoolean("bootFeaturesInstalled", false);
+        prefs.flush();
+        featuresRegistry.register(isA(Repository.class));
+
+        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2, featuresRegistry);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setPreferences(preferencesService);
+        svc.setBundleContext(bundleContext);
+        svc.setFeaturesServiceRegistry(featuresRegistry);
+        svc.addRepository(uri);
+
+        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2, featuresRegistry);
+
+        reset(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2, featuresRegistry);
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle1);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle1);
+        installedBundle1.start();
+        expect(installedBundle1.getSymbolicName()).andReturn("org.springframework.context").anyTimes();
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { installedBundle1 });
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle2);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(bundleContext.getBundle(54321L)).andReturn(installedBundle2);
+        installedBundle2.start();
+
+        expect(preferencesService.getUserPreferences("FeaturesServiceState")).andStubReturn(prefs);
+        expect(prefs.node("repositories")).andReturn(repositoriesNode);
+        repositoriesNode.clear();
+        repositoriesNode.putInt("count", 1);
+        repositoriesNode.put("item.0", uri.toString());
+        expect(prefs.node("features")).andReturn(featuresNode);
+        featuresNode.clear();
+        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, "12345");
+        prefs.putBoolean("bootFeaturesInstalled", false);
+        prefs.flush();
+
+        expect(prefs.node("repositories")).andReturn(repositoriesNode);
+        repositoriesNode.clear();
+        repositoriesNode.putInt("count", 1);
+        repositoriesNode.put("item.0", uri.toString());
+        expect(prefs.node("features")).andReturn(featuresNode);
+        featuresNode.clear();
+        featuresNode.put("f2" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, "12345");
+        featuresNode.put("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, "54321");
+        prefs.putBoolean("bootFeaturesInstalled", false);
+        prefs.flush();
+        
+        ServiceReference paSvcRef = EasyMock.createMock(ServiceReference.class);
+        PackageAdmin pa = EasyMock.createMock(PackageAdmin.class);
+        expect(bundleContext.getServiceReference(PackageAdmin.class.getName())).andStubReturn(paSvcRef);
+        expect(bundleContext.getService(paSvcRef)).andStubReturn(pa);
+        expect(bundleContext.ungetService(paSvcRef)).andReturn(true);
+        pa.refreshPackages(EasyMock.aryEq(new Bundle[] { installedBundle1, installedBundle2 }));
+
+        replay(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2, paSvcRef, pa);
+
+        svc.installFeature("f1");
+    }
+
     public void testUninstallFeature() throws Exception {
         File tmp = File.createTempFile("smx", ".feature");
         PrintWriter pw = new PrintWriter(new FileWriter(tmp));
Index: gshell/gshell-features/src/main/java/org/apache/servicemix/kernel/gshell/features/internal/FeaturesServiceImpl.java
===================================================================
--- gshell/gshell-features/src/main/java/org/apache/servicemix/kernel/gshell/features/internal/FeaturesServiceImpl.java	(revision 755503)
+++ gshell/gshell-features/src/main/java/org/apache/servicemix/kernel/gshell/features/internal/FeaturesServiceImpl.java	(working copy)
@@ -48,11 +48,13 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.Version;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 import org.osgi.service.prefs.PreferencesService;
+import org.osgi.service.packageadmin.PackageAdmin;
 import org.springframework.osgi.context.BundleContextAware;
 
 /**
@@ -157,13 +159,32 @@
     }
 
     public void installFeature(String name, String version) throws Exception {
+        List<Bundle> bundles = installFeatureBundles(name, version);
+        try {
+            ServiceReference ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+            PackageAdmin pa = (PackageAdmin) getBundleContext().getService(ref);
+            try {
+                pa.refreshPackages(bundles.toArray(new Bundle[bundles.size()]));
+            } finally {
+                getBundleContext().ungetService(ref);
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Could not refresh packages for installed feature '" + name + "' (" + version + ")", e);
+        }
+        for (Bundle bundle : bundles) {
+            bundle.start();
+        }
+    }
+
+    protected List<Bundle> installFeatureBundles(String name, String version) throws Exception {
+        List<Bundle> bundles = new ArrayList<Bundle>();
         Feature f = getFeature(name, version);
         if (f == null) {
             throw new Exception("No feature named '" + name 
             		+ "' with version '" + version + "' available");
         }
         for (Feature dependency : f.getDependencies()) {
-        	installFeature(dependency.getName(), dependency.getVersion());
+        	bundles.addAll(installFeatureBundles(dependency.getName(), dependency.getVersion()));
         }
         for (String config : f.getConfigurations().keySet()) {
             Dictionary<String,String> props = new Hashtable<String, String>(f.getConfigurations().get(config));
@@ -177,19 +198,19 @@
             }
             cfg.update(props);
         }
-        Set<Long> bundles = new HashSet<Long>();
+        Set<Long> bundleIds = new HashSet<Long>();
         for (String bundleLocation : f.getBundles()) {
             Bundle b = installBundleIfNeeded(bundleLocation);
-            bundles.add(b.getBundleId());
+            if (bundleIds.add(b.getBundleId())) {
+                bundles.add(b);
+            }
         }
-        for (long id : bundles) {
-            bundleContext.getBundle(id).start();
-        }
-
         featuresRegistry.registerInstalled(f);
-        installed.put(f, bundles);
+        installed.put(f, bundleIds);
         saveState();
+        return bundles;
     }
+    
     protected Bundle installBundleIfNeeded(String bundleLocation) throws IOException, BundleException {
         LOGGER.debug("Checking " + bundleLocation);
         InputStream is = new BufferedInputStream(new URL(bundleLocation).openStream());
