[KARAF-2665] Fix issue with Karaf custom distributions
diff --git a/features/org.apache.karaf.eik.feature/feature.xml b/features/org.apache.karaf.eik.feature/feature.xml
index 11a46bd..bba28ec 100644
--- a/features/org.apache.karaf.eik.feature/feature.xml
+++ b/features/org.apache.karaf.eik.feature/feature.xml
@@ -99,4 +99,10 @@
          install-size="0"
          version="0.0.0"/>
 
+   <plugin
+         id="jdom"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
 </feature>
diff --git a/features/org.apache.karaf.eik.repository/pom.xml b/features/org.apache.karaf.eik.repository/pom.xml
index 2df3db6..76eda02 100644
--- a/features/org.apache.karaf.eik.repository/pom.xml
+++ b/features/org.apache.karaf.eik.repository/pom.xml
@@ -91,6 +91,12 @@
                                     <outputDirectory>plugins</outputDirectory>
                                 </artifactItem>
                                 <artifactItem>
+                                    <groupId>org.apache.karaf.eik.plugins</groupId>
+                                    <artifactId>jdom</artifactId>
+                                    <version>${jdom.version}</version>
+                                    <outputDirectory>plugins</outputDirectory>
+                                </artifactItem>
+                                <artifactItem>
                                     <groupId>org.apache.karaf.eik.features</groupId>
                                     <artifactId>org.apache.karaf.eik.feature</artifactId>
                                     <version>${project.version}</version>
diff --git a/parent/pom.xml b/parent/pom.xml
index c2379c5..4769ca5 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -35,7 +35,7 @@
     <name>Apache Karaf :: EIK :: Parent</name>
 
     <properties>
-        <platform-version-name>helios</platform-version-name>
+        <platform-version-name>juno</platform-version-name>
         <eclipse-site>http://download.eclipse.org/releases/${platform-version-name}</eclipse-site>
         <wikitext-site>http://download.eclipse.org/tools/mylyn/update/weekly</wikitext-site>
         <swtbot-site>http://download.eclipse.org/technology/swtbot/${platform-version-name}/dev-build/update-site
@@ -46,6 +46,7 @@
         <commons-collections.version>3.2.1</commons-collections.version>
         <commons-lang.version>2.6</commons-lang.version>
         <jansi.version>1.7</jansi.version>
+        <jdom.version>1.0</jdom.version>
         <mina.version>2.0.1</mina.version>
         <pax.url.version>1.2.8</pax.url.version>
         <sshd.version>0.5.0</sshd.version>
diff --git a/plugins/jdom/.settings/org.eclipse.core.resources.prefs b/plugins/jdom/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/plugins/jdom/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/plugins/jdom/.settings/org.eclipse.jdt.core.prefs b/plugins/jdom/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c537b63
--- /dev/null
+++ b/plugins/jdom/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/plugins/jdom/.settings/org.eclipse.m2e.core.prefs b/plugins/jdom/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/plugins/jdom/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/plugins/jdom/META-INF/MANIFEST.MF b/plugins/jdom/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..dcb94b7
--- /dev/null
+++ b/plugins/jdom/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-Description:  Types that extend and augment the Java Lang.
+Bundle-DocURL: http://www.apache.org/
+Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
+Bundle-ManifestVersion: 2
+Bundle-Name: Apache Karaf :: EIK :: Plugins :: JDOM
+Bundle-SymbolicName: jdom;singleton:=true
+Bundle-Vendor: The Apache Software Foundation
+Bundle-Version: 1.0
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: lib/jdom-1.0.jar
+Export-Package: org.jdom,
+ org.jdom.adapters,
+ org.jdom.filter,
+ org.jdom.input,
+ org.jdom.output,
+ org.jdom.transform,
+ org.jdom.xpath
diff --git a/plugins/jdom/NOTICE b/plugins/jdom/NOTICE
new file mode 100644
index 0000000..7040fed
--- /dev/null
+++ b/plugins/jdom/NOTICE
@@ -0,0 +1,31 @@
+Apache Karaf EIK
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Used Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software developed at
+Eclipse Foundation (http://www.eclipse.org/).
+Licensed under the EPL.
+
+
+II. License Summary
+- Apache License 2.0
+- EPL License
diff --git a/plugins/jdom/build.properties b/plugins/jdom/build.properties
new file mode 100644
index 0000000..60913c6
--- /dev/null
+++ b/plugins/jdom/build.properties
@@ -0,0 +1,6 @@
+bin.includes = META-INF/,\
+               lib/,\
+               lib/jdom-2.0.2.jar,\
+               lib/jdom-1.0.jar
+bin.excludes = lib/jdom-2.0.2-javadoc.jar
+src.includes = lib/jdom-2.0.2-sources.jar
diff --git a/plugins/jdom/pom.xml b/plugins/jdom/pom.xml
new file mode 100644
index 0000000..a29aa66
--- /dev/null
+++ b/plugins/jdom/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.eik</groupId>
+        <artifactId>parent</artifactId>
+        <version>0.10.0-SNAPSHOT</version>
+        <relativePath>../../parent/pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.eik.plugins</groupId>
+    <artifactId>jdom</artifactId>
+    <version>1.0</version>
+    <packaging>eclipse-plugin</packaging>
+    <name>Apache Karaf :: EIK :: Plugins :: JDOM</name>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>lib</directory>
+                <includes>
+                    <include>**/*.jar</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>jdom</groupId>
+                                    <artifactId>jdom</artifactId>
+                                    <version>${jdom.version}</version>
+                                    <outputDirectory>lib</outputDirectory>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>jdom</groupId>
+                                    <artifactId>jdom</artifactId>
+                                    <version>${jdom.version}</version>
+                                    <classifier>sources</classifier>
+                                    <outputDirectory>lib</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifestFile>${project.basedir}/META-INF/MANIFEST.MF</manifestFile>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>lib</directory>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <!-- this plugin configuration is used to store Eclipse m2e settings only. It doesn't affect the core Maven build -->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>org.apache.maven.plugins</groupId>
+                                        <artifactId>maven-dependency-plugin</artifactId>
+                                        <versionRange>[2.1,)</versionRange>
+                                        <goals>
+                                            <goal>copy</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore />
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/plugins/org.apache.karaf.eik.core/META-INF/MANIFEST.MF b/plugins/org.apache.karaf.eik.core/META-INF/MANIFEST.MF
index ab7a0d3..1953eca 100644
--- a/plugins/org.apache.karaf.eik.core/META-INF/MANIFEST.MF
+++ b/plugins/org.apache.karaf.eik.core/META-INF/MANIFEST.MF
@@ -9,7 +9,7 @@
  org.eclipse.osgi.services;bundle-version="3.2.0",
  org.eclipse.core.variables;bundle-version="[3.1.0,4.0.0)",
  org.eclipse.pde.ui;bundle-version="[3.2.0,4.0.0)",
- org.jdom;bundle-version="1.0.0",
+ jdom;bundle-version="1.0.0",
  org.apache.mina.core;bundle-version="2.0.0",
  org.fusesource.jansi;bundle-version="1.5.0",
  sshd-core;bundle-version="0.5.0",
diff --git a/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Bundle.java b/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Bundle.java
index 2468663..8169a32 100644
--- a/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Bundle.java
+++ b/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Bundle.java
@@ -27,6 +27,8 @@
 
     private final String bundleUrl;
 
+    private final String startLevel;
+
     private final Element element;
 
     public Bundle(final Element element) {
@@ -35,6 +37,8 @@
             throw new IllegalArgumentException("bundle element is invalid: " + element.toString());
         }
 
+        this.startLevel = element.getAttributeValue("start-level");
+
         this.element = element;
     }
 
@@ -42,6 +46,11 @@
         return bundleUrl;
     }
 
+
+    public String getStartLevel() {
+         return startLevel;
+    }
+
     @Override
     public Object getParent() {
         final Transformer transformer = new ElementTransformer();
@@ -53,4 +62,4 @@
         return bundleUrl;
     }
 
-}
\ No newline at end of file
+}
diff --git a/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Feature.java b/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Feature.java
index 3cb4bb3..fd250f4 100644
--- a/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Feature.java
+++ b/plugins/org.apache.karaf.eik.core/src/main/java/org/apache/karaf/eik/core/features/Feature.java
@@ -38,6 +38,8 @@
 
     private final Element element;
 
+    private final String startLevel;
+
     private static final class BundleOnlyPredicate implements Predicate {
         @Override
         public boolean evaluate(final Object element) {
@@ -53,6 +55,8 @@
         }
 
         version = element.getAttributeValue("version");
+  
+        startLevel = element.getAttributeValue("start-level");
 
         this.element = element;
     }
@@ -134,4 +138,8 @@
         return Collections.unmodifiableList(KarafCorePluginUtils.filterList(transformedList, new FeatureOnlyPredicate()));
     }
 
-}
\ No newline at end of file
+    public String getStartLevel() {
+        return startLevel;
+    }
+
+}
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/KarafLaunchConfigurationInitializer.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/KarafLaunchConfigurationInitializer.java
index 9da1d15..558954c 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/KarafLaunchConfigurationInitializer.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/KarafLaunchConfigurationInitializer.java
@@ -18,6 +18,10 @@
  */
 package org.apache.karaf.eik.ui;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.karaf.eik.core.IKarafConstants;
 import org.apache.karaf.eik.core.KarafCorePluginUtils;
 import org.apache.karaf.eik.core.KarafPlatformModel;
@@ -27,27 +31,33 @@
 import org.apache.karaf.eik.core.configuration.StartupSection;
 import org.apache.karaf.eik.core.equinox.BundleEntry;
 import org.apache.karaf.eik.core.model.WorkingKarafPlatformModel;
+import org.apache.karaf.eik.ui.features.FeaturesBundlesStartLevels;
 import org.apache.karaf.eik.ui.internal.WorkbenchServiceExtensions;
+import org.apache.karaf.eik.ui.project.KarafProject;
 import org.apache.karaf.eik.ui.workbench.KarafWorkbenchServiceFactory;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
 import org.eclipse.pde.core.plugin.IPluginBase;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.core.plugin.ModelEntry;
 import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.core.target.ITargetHandle;
+import org.eclipse.pde.core.target.ITargetPlatformService;
+import org.eclipse.pde.internal.core.PDECore;
 import org.eclipse.pde.internal.launching.launcher.LaunchConfigurationHelper;
 import org.eclipse.pde.internal.ui.IPDEUIConstants;
 import org.eclipse.pde.launching.IPDELauncherConstants;
 import org.eclipse.pde.launching.OSGiLaunchConfigurationInitializer;
-import org.osgi.framework.Version;
 
 @SuppressWarnings("restriction")
 public class KarafLaunchConfigurationInitializer extends OSGiLaunchConfigurationInitializer {
@@ -74,16 +84,16 @@
 
     protected StartupSection startupSection;
 
+    private FeaturesBundlesStartLevels featuresBundlesStartLevels;
+
     @Override
     public void initialize(final ILaunchConfigurationWorkingCopy configuration) {
         loadKarafPlatform(configuration);
 
-        final File configDir =
-            LaunchConfigurationHelper.getConfigurationArea(configuration);
+        final File configDir = LaunchConfigurationHelper.getConfigurationArea(configuration);
 
         final IPath workingArea = new Path(configDir.getAbsolutePath());
-        final WorkingKarafPlatformModel workingKarafPlatform =
-            new WorkingKarafPlatformModel(workingArea, karafPlatform);
+        final WorkingKarafPlatformModel workingKarafPlatform = new WorkingKarafPlatformModel(workingArea, karafPlatform);
 
         workingKarafPlatform.getConfigurationDirectory().toFile().mkdirs();
         workingKarafPlatform.getUserDeployedDirectory().toFile().mkdirs();
@@ -122,6 +132,8 @@
     protected String getAutoStart(final String bundleID) {
         if (startupSection.containsPlugin(bundleID)) {
             return "true"; //$NON-NLS-1$
+        } else if (featuresBundlesStartLevels.containsPlugin(bundleID)) {
+            return "true"; //$NON-NLS-1$
         } else {
             return super.getAutoStart(bundleID);
         }
@@ -139,6 +151,8 @@
     protected String getStartLevel(final String bundleID) {
         if (startupSection.containsPlugin(bundleID)) {
             return startupSection.getStartLevel(bundleID);
+        } else if (featuresBundlesStartLevels.containsPlugin(bundleID)) {
+            return featuresBundlesStartLevels.getStartLevel(bundleID);
         } else {
             return super.getStartLevel(bundleID);
         }
@@ -160,18 +174,13 @@
                 continue;
             }
 
-            final BundleEntry entry = new BundleEntry.Builder(getBundleId(models[i])).autostart(getAutoStart(id)).startLevel(
-                    getStartLevel(id)).build();
+            final BundleEntry entry = new BundleEntry.Builder(getBundleId(models[i])).autostart(getAutoStart(id)).startLevel(getStartLevel(id)).build();
 
             final boolean inWorkspace = models[i].getUnderlyingResource() != null;
             if (inWorkspace) {
                 workspacePlugins.add(entry.toString());
             } else {
-                // By default, only add the plugin if it is in the Karaf model
-                final Version v = Version.parseVersion(models[i].getPluginBase().getVersion());
-                if (karafPlatform.getState().getBundle(id, v) != null && startupSection.containsPlugin(id)) {
-                    externalPlugins.add(entry.toString());
-                }
+                externalPlugins.add(entry.toString());
             }
         }
 
@@ -196,13 +205,9 @@
 
         final String bootClasspath = KarafCorePluginUtils.join(bootClasspathEntries, ",");
 
-        configuration.setAttribute(
-                KarafLaunchConfigurationConstants.KARAF_LAUNCH_REQUIRED_BOOT_CLASSPATH,
-                bootClasspath);
+        configuration.setAttribute(KarafLaunchConfigurationConstants.KARAF_LAUNCH_REQUIRED_BOOT_CLASSPATH, bootClasspath);
 
-        configuration.setAttribute(
-                IPDELauncherConstants.DEFAULT_START_LEVEL,
-                Integer.parseInt(IKarafConstants.KARAF_DEFAULT_BUNDLE_START_LEVEL));
+        configuration.setAttribute(IPDELauncherConstants.DEFAULT_START_LEVEL, Integer.parseInt(IKarafConstants.KARAF_DEFAULT_BUNDLE_START_LEVEL));
     }
 
     /**
@@ -214,17 +219,48 @@
     protected void loadKarafPlatform(final ILaunchConfigurationWorkingCopy configuration) {
         try {
             this.karafPlatform = KarafPlatformModelRegistry.findActivePlatformModel();
+
+            if (karafPlatform == null) {
+                throw new CoreException(new Status(IStatus.ERROR, KarafUIPluginActivator.PLUGIN_ID, "Karaf target platform is not set !"));
+            }
+
             this.karafPlatformFactory = KarafPlatformModelRegistry.findPlatformModelFactory(karafPlatform.getRootDirectory());
 
             this.startupSection = (StartupSection) this.karafPlatform.getAdapter(StartupSection.class);
             this.startupSection.load();
+
+            IProject project = findProjectForActiveTargetPlatform();
+            if (project != null) {
+                this.featuresBundlesStartLevels = new FeaturesBundlesStartLevels(new KarafProject(project));
+                this.featuresBundlesStartLevels.load();
+            } else {
+                throw new CoreException(new Status(IStatus.ERROR, KarafUIPluginActivator.PLUGIN_ID, "Target platform is not set from Karaf project !"));
+            }
         } catch (final CoreException e) {
             KarafUIPluginActivator.getLogger().error("Unable to locate the Karaf platform", e);
 
             this.karafPlatform = null;
+            throw new IllegalStateException(e.getMessage(), e);
         }
     }
 
+    private IProject findProjectForActiveTargetPlatform() throws CoreException {
+        ITargetPlatformService service = (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName());
+
+        ITargetHandle workspaceTargetHandle = service.getWorkspaceTargetHandle();
+        if (workspaceTargetHandle != null && workspaceTargetHandle.exists()) {
+            String memento = workspaceTargetHandle.getMemento();
+
+            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+            IResource targetDefinitionFile = root.findMember(memento);
+            if (targetDefinitionFile != null) {
+                return targetDefinitionFile.getProject();
+            }
+        }
+
+        return null;
+    }
+
     /**
      * Returns the a plugin id favoring the newest version in the target
      * platform
@@ -264,7 +300,7 @@
 
         // prevent terminal CTRL-characters in Eclipse console on Windows
         final String localOperatingSystem = System.getProperty("os.name"); //$NON-NLS-1$
-        if (   localOperatingSystem.toLowerCase().indexOf("windows") >= 0 //$NON-NLS-1$
+        if (localOperatingSystem.toLowerCase().indexOf("windows") >= 0 //$NON-NLS-1$
             && vmArgs.indexOf("-Djline.terminal") == -1) { //$NON-NLS-1$
             vmArgs.append(" -Djline.terminal=jline.UnsupportedTerminal"); //$NON-NLS-1$
         }
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesBundlesStartLevels.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesBundlesStartLevels.java
new file mode 100644
index 0000000..0d5c395
--- /dev/null
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesBundlesStartLevels.java
@@ -0,0 +1,104 @@
+/*
+ * 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.eik.ui.features;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.karaf.eik.core.IKarafConstants;
+import org.apache.karaf.eik.core.KarafPlatformModel;
+import org.apache.karaf.eik.core.configuration.FeaturesSection;
+import org.apache.karaf.eik.core.features.Bundle;
+import org.apache.karaf.eik.core.features.Feature;
+import org.apache.karaf.eik.core.features.FeaturesRepository;
+import org.apache.karaf.eik.ui.IKarafProject;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+
+public class FeaturesBundlesStartLevels {
+
+	private final IKarafProject karafProject;
+	private final Map<String, String> symbolicNameToStartLevel;
+	private final MvnUrlConverter converter;
+	
+	private KarafPlatformModel karafPlatformModel;
+	private String baseBundlesDir;
+
+	public FeaturesBundlesStartLevels(IKarafProject karafProject) {
+		this.karafProject = karafProject;
+		this.symbolicNameToStartLevel = new HashMap<String, String>();
+		this.converter = new MvnUrlConverter();
+	}
+	
+	public void load(){
+		karafPlatformModel = (KarafPlatformModel) karafProject.getAdapter(KarafPlatformModel.class);
+		baseBundlesDir = getBaseBundleDir();
+		
+        final FeaturesSection featuresSection = (FeaturesSection) karafPlatformModel.getAdapter(FeaturesSection.class);
+        final FeaturesResolverJob job = new FeaturesResolverJob(karafProject.getName(), karafPlatformModel, featuresSection);
+        job.run(new NullProgressMonitor());
+        List<FeaturesRepository> featuresRepositories = job.getFeaturesRepositories();
+        for (FeaturesRepository featuresRepository : featuresRepositories) {
+			List<Feature> features = featuresRepository.getFeatures().getFeatures();
+			for (Feature feature : features) {
+				String featureStartLevel = feature.getStartLevel();
+				List<Bundle> bundles = feature.getBundles();
+				for (Bundle bundle : bundles) {
+					String bundleStartLevel = bundle.getStartLevel();
+					
+					String startLevel = (bundleStartLevel != null) ? bundleStartLevel : featureStartLevel; 
+					if(startLevel != null) {
+						String symbolicName = getSymbolicName(bundle.getBundleUrl());
+						if(symbolicName != null) {
+							symbolicNameToStartLevel.put(symbolicName, startLevel);
+						}
+					}
+				}
+			}
+		}
+	}
+
+    private String getBaseBundleDir() {
+        Properties runtimeProperties = karafProject.getRuntimeProperties();
+		String karafHome = (String) runtimeProperties.get(IKarafConstants.KARAF_HOME_PROP);
+		String defaultRepository = (String) runtimeProperties.get("karaf.default.repository");
+		return karafHome + "/" + defaultRepository;
+   }
+	
+	public boolean containsPlugin(String bundleSymbolicName) {
+		return symbolicNameToStartLevel.containsKey(bundleSymbolicName);
+	}
+	
+	public String getStartLevel(String bundleSymbolicName) {
+		return symbolicNameToStartLevel.get(bundleSymbolicName);
+	}
+	
+	private String getSymbolicName(String bundleUrl){
+		File bundlePath = new File(baseBundlesDir, converter.getPath(bundleUrl));
+		BundleDescription bundleDescription = karafPlatformModel.getState().getBundleByLocation(bundlePath.getAbsolutePath());
+		if(bundleDescription != null) {
+			return bundleDescription.getSymbolicName();
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesResolverJob.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesResolverJob.java
index 44e055f..c89917d 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesResolverJob.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/FeaturesResolverJob.java
@@ -119,7 +119,7 @@
                     final String repos = (String) mvnConfiguration.get("org.ops4j.pax.url.mvn.repositories");
 
                     final String combinedRepos = KarafCorePluginUtils.join(Arrays.asList(new String[] { defaultRepos, repos }), ",");
-                    mvnConfiguration.put("org.ops4j.pax.url.mvn.repositories", combinedRepos);
+                    mvnConfiguration.put("org.ops4j.pax.url.mvn.repositories", removeInvalidSuffixes(combinedRepos));
                     // End: Refactor
 
                     final String repositoryName;
@@ -168,4 +168,26 @@
         }
     }
 
-}
\ No newline at end of file
+	private String removeInvalidSuffixes(String mergedRepositories) {
+		String[] repositories = mergedRepositories.split(",");
+		
+		for (int i = 0; i < repositories.length; i++) {
+			String repository = repositories[0];
+			String[] segments = repository.split("@");
+			StringBuilder urlBuilder = new StringBuilder(segments[0]);
+			for (int j = 0; j < segments.length; ++j)
+			{
+				String segment = segments[j];
+				if (segment.trim().equalsIgnoreCase("snapshots") || segment.trim().equalsIgnoreCase("noreleases"))
+				{
+					urlBuilder.append("@");
+					urlBuilder.append(segment);
+				}
+			}
+			repositories[i] = urlBuilder.toString();
+		}
+		
+		return KarafCorePluginUtils.join(Arrays.asList(repositories), ",");
+	}
+
+}
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/MvnUrlConverter.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/MvnUrlConverter.java
new file mode 100644
index 0000000..b7563df
--- /dev/null
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/features/MvnUrlConverter.java
@@ -0,0 +1,45 @@
+/*
+ * 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.eik.ui.features;
+
+public class MvnUrlConverter {
+
+	public String getPath(String mvnUrl) {
+		if(mvnUrl != null) {
+			if(mvnUrl.startsWith("mvn:")) {
+				mvnUrl = mvnUrl.substring(4);
+			}
+
+			String[] repositorySplit = mvnUrl.split("!");
+			String urlWithoutRepository = repositorySplit[repositorySplit.length - 1];
+			
+			String[] segments = urlWithoutRepository.split("/");
+			if(segments.length == 3) {
+				String groupId = segments[0];
+				String artifactId = segments[1];
+				String version = segments[2];
+				
+				return groupId.replace(".", "/") + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".jar";
+			}
+		}
+		
+		return null;
+	}
+	
+}
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/internal/KarafLaunchUtils.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/internal/KarafLaunchUtils.java
index c104ea8..4ba774a 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/internal/KarafLaunchUtils.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/internal/KarafLaunchUtils.java
@@ -18,9 +18,6 @@
  */
 package org.apache.karaf.eik.ui.internal;
 
-import org.apache.karaf.eik.core.KarafCorePluginUtils;
-import org.apache.karaf.eik.core.KarafPlatformModel;
-
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -28,18 +25,20 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.karaf.eik.core.KarafCorePluginUtils;
+import org.apache.karaf.eik.core.KarafPlatformModel;
+import org.eclipse.pde.core.target.ITargetLocation;
 import org.eclipse.pde.internal.core.target.DirectoryBundleContainer;
-import org.eclipse.pde.internal.core.target.provisional.IBundleContainer;
 
 public final class KarafLaunchUtils {
 
     private static final int MAX_DIRECTORY_RECURSE_DEPTH = 50;
 
     @SuppressWarnings("restriction")
-    public static List<IBundleContainer> getBundleContainers(final KarafPlatformModel karafPlatformModel) {
+    public static List<ITargetLocation> getBundleContainers(final KarafPlatformModel karafPlatformModel) {
         final Collection<File> directories = KarafLaunchUtils.getJarDirectories(karafPlatformModel);
 
-        final List<IBundleContainer> bundleContainers = new ArrayList<IBundleContainer>();
+        final List<ITargetLocation> bundleContainers = new ArrayList<ITargetLocation>();
         for (final File dir : directories) {
             bundleContainers.add(new DirectoryBundleContainer(dir.getAbsolutePath()));
         }
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProject.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProject.java
index e2bbde9..4eeeb94 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProject.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProject.java
@@ -18,14 +18,14 @@
  */
 package org.apache.karaf.eik.ui.project;
 
+import java.util.Properties;
+
 import org.apache.karaf.eik.core.KarafCorePluginUtils;
 import org.apache.karaf.eik.core.KarafPlatformModel;
 import org.apache.karaf.eik.core.KarafPlatformModelRegistry;
 import org.apache.karaf.eik.ui.IKarafProject;
 import org.apache.karaf.eik.ui.KarafUIPluginActivator;
 
-import java.util.Properties;
-
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
@@ -41,6 +41,8 @@
 
     public static final IPath ROOT_PLATFORM_PATH = ROOT_PATH.append("platform");
 
+    public static final IPath ROOT_RUNTIME_PATH = ROOT_PATH.append("runtime");
+
     /**
      * Determines if the {@link IProject} is actually an {@link IKarafProject}
      *
@@ -51,8 +53,7 @@
      */
     public static boolean isKarafProject(final IProject project) {
         try {
-            final String karafProject = project.getPersistentProperty(
-                    new QualifiedName(KarafUIPluginActivator.PLUGIN_ID, "karafProject"));
+            final String karafProject = project.getPersistentProperty(new QualifiedName(KarafUIPluginActivator.PLUGIN_ID, "karafProject"));
 
             return karafProject != null;
         } catch (final CoreException e) {
@@ -127,7 +128,7 @@
     public Properties getRuntimeProperties() {
         try {
             return KarafCorePluginUtils.loadProperties(
-                    project.getFolder("runtime").getRawLocation().toFile(),
+                    project.getFolder(ROOT_RUNTIME_PATH).getRawLocation().toFile(),
                     "runtime.properties");
         } catch (final CoreException e) {
             return new Properties();
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProjectBuilder.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProjectBuilder.java
index 330f586..c79ecf2 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProjectBuilder.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/KarafProjectBuilder.java
@@ -18,17 +18,6 @@
  */
 package org.apache.karaf.eik.ui.project;
 
-import org.apache.karaf.eik.core.KarafCorePluginUtils;
-import org.apache.karaf.eik.core.KarafPlatformModel;
-import org.apache.karaf.eik.core.PropertyUtils;
-import org.apache.karaf.eik.core.configuration.FeaturesSection;
-import org.apache.karaf.eik.core.features.FeaturesRepository;
-import org.apache.karaf.eik.ui.IKarafProject;
-import org.apache.karaf.eik.ui.KarafUIPluginActivator;
-import org.apache.karaf.eik.ui.features.FeaturesResolverJob;
-import org.apache.karaf.eik.ui.internal.KarafLaunchUtils;
-import org.apache.karaf.eik.ui.internal.PopulateObrFileJob;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -44,6 +33,17 @@
 import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
 
+import org.apache.karaf.eik.core.KarafCorePluginUtils;
+import org.apache.karaf.eik.core.KarafPlatformModel;
+import org.apache.karaf.eik.core.PropertyUtils;
+import org.apache.karaf.eik.core.configuration.FeaturesSection;
+import org.apache.karaf.eik.core.features.FeaturesRepository;
+import org.apache.karaf.eik.ui.IKarafProject;
+import org.apache.karaf.eik.ui.KarafUIPluginActivator;
+import org.apache.karaf.eik.ui.features.FeaturesResolverJob;
+import org.apache.karaf.eik.ui.internal.KarafLaunchUtils;
+import org.apache.karaf.eik.ui.internal.PopulateObrFileJob;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
@@ -57,10 +57,10 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.pde.internal.core.target.provisional.IBundleContainer;
-import org.eclipse.pde.internal.core.target.provisional.ITargetDefinition;
-import org.eclipse.pde.internal.core.target.provisional.ITargetHandle;
-import org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService;
+import org.eclipse.pde.core.target.ITargetDefinition;
+import org.eclipse.pde.core.target.ITargetHandle;
+import org.eclipse.pde.core.target.ITargetLocation;
+import org.eclipse.pde.core.target.ITargetPlatformService;
 
 public class KarafProjectBuilder extends IncrementalProjectBuilder {
 
@@ -327,7 +327,6 @@
         return getKarafProject().getProjectHandle().getFile(targetFilename);
     }
 
-    @SuppressWarnings("restriction")
     private void createTargetPlatform(final IProgressMonitor monitor) throws CoreException {
         final ITargetPlatformService targetPlatformService = (ITargetPlatformService) KarafUIPluginActivator.getDefault().getService(ITargetPlatformService.class.getName());
 
@@ -338,8 +337,8 @@
 
         target.setName(getKarafProject().getName());
 
-        final List<IBundleContainer> bundleContainers = KarafLaunchUtils.getBundleContainers(getKarafPlatformModel());
-        target.setBundleContainers(bundleContainers.toArray(new IBundleContainer[0]));
+        final List<ITargetLocation> bundleContainers = KarafLaunchUtils.getBundleContainers(getKarafPlatformModel());
+        target.setTargetLocations(bundleContainers.toArray(new ITargetLocation[0]));
 
         targetPlatformService.saveTargetDefinition(target);
     }
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/NewKarafProjectOperation.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/NewKarafProjectOperation.java
index d47c9cd..9e80bb5 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/NewKarafProjectOperation.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/project/NewKarafProjectOperation.java
@@ -18,14 +18,14 @@
  */
 package org.apache.karaf.eik.ui.project;
 
+import java.lang.reflect.InvocationTargetException;
+
 import org.apache.karaf.eik.core.KarafPlatformModel;
 import org.apache.karaf.eik.core.KarafWorkingPlatformModel;
 import org.apache.karaf.eik.ui.IKarafProject;
 import org.apache.karaf.eik.ui.KarafLaunchConfigurationInitializer;
 import org.apache.karaf.eik.ui.KarafUIPluginActivator;
 
-import java.lang.reflect.InvocationTargetException;
-
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
 import org.eclipse.core.runtime.CoreException;
@@ -36,9 +36,6 @@
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.core.variables.IDynamicVariable;
 import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.ui.actions.WorkspaceModifyOperation;
 
 public class NewKarafProjectOperation extends WorkspaceModifyOperation {
@@ -119,16 +116,6 @@
         newKarafProject.getProjectHandle().setPersistentProperty(
                 new QualifiedName(KarafUIPluginActivator.PLUGIN_ID, "karafModel"),
                 karafPlatformModel.getRootDirectory().toString());
-
-        final ILaunchConfigurationType launchType =
-            DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType("org.eclipse.pde.ui.EquinoxLauncher");
-
-        final ILaunchConfigurationWorkingCopy launchConfiguration =
-            launchType.newInstance(newKarafProject.getProjectHandle(), newKarafProject.getName());
-
-        KarafLaunchConfigurationInitializer.initializeConfiguration(launchConfiguration);
-
-        launchConfiguration.doSave();
     }
 
     private void createProject(final IProgressMonitor monitor) throws CoreException {
diff --git a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/workbench/internal/GenericKarafWorkbenchService.java b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/workbench/internal/GenericKarafWorkbenchService.java
index 0c87c2d..ec58ad9 100644
--- a/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/workbench/internal/GenericKarafWorkbenchService.java
+++ b/plugins/org.apache.karaf.eik.ui/src/main/java/org/apache/karaf/eik/ui/workbench/internal/GenericKarafWorkbenchService.java
@@ -231,10 +231,12 @@
             final String bundleLocation =
                 KarafCorePluginUtils.getBundleLocation(b);
 
-            final BundleEntry entry =
-                new BundleEntry.Builder(bundleLocation).startLevel("1").autostart("start").build(); //$NON-NLS-1$ $NON-NLS-2$
-
-            bundleEntries.add(entry);
+            if (bundleLocation != null) {
+                final BundleEntry entry =
+                        new BundleEntry.Builder(bundleLocation).startLevel("1").autostart("start").build(); //$NON-NLS-1$ $NON-NLS-2$
+                
+                bundleEntries.add(entry);
+            }
         }
 
         return bundleEntries;
diff --git a/pom.xml b/pom.xml
index b8d7164..0daa6ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,7 @@
         <module>plugins/org.apache.aries.jmx.core</module>
         <module>plugins/org.apache.commons.collections</module>
         <module>plugins/org.apache.commons.lang</module>
+        <module>plugins/jdom</module>
         <module>plugins/org.apache.mina.core</module>
         <module>plugins/org.apache.sshd.core</module>
         <module>plugins/org.fusesource.jansi</module>