deprecated MavenRuntimeManager and friends

At very least this API was misplaced, it should have been exposed
from o.e.m2e.launch bundle, not from the core. More realistically,
all maven launch support should be moved to o.e.m2e.launch
implementation and exposed as API when we get at least few real
consumers.

Change-Id: I6250d5c8d1a05801ca7dbdc2e628906c809b3441
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizard.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizard.java
index d2e4568..6f8bac3 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizard.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationWizard.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.jface.wizard.Wizard;
 
-import org.eclipse.m2e.core.embedder.MavenRuntime;
 import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
 import org.eclipse.m2e.core.ui.internal.Messages;
 
@@ -25,15 +24,15 @@
 
   private final MavenInstallationWizardPage runtimePage;
 
-  private MavenRuntime result;
+  private AbstractMavenRuntime result;
 
   public MavenInstallationWizard(Set<String> names) {
     this.runtimePage = new MavenInstallationWizardPage(null, names);
     setWindowTitle(Messages.MavenInstallationWizard_titleNewInstallation);
   }
 
-  public MavenInstallationWizard(MavenRuntime original, Set<String> names) {
-    this.runtimePage = new MavenInstallationWizardPage((AbstractMavenRuntime) original, names);
+  public MavenInstallationWizard(AbstractMavenRuntime original, Set<String> names) {
+    this.runtimePage = new MavenInstallationWizardPage(original, names);
     setWindowTitle(Messages.MavenInstallationWizard_titleAddInstallation);
   }
 
@@ -48,7 +47,7 @@
     return true;
   }
 
-  public MavenRuntime getResult() {
+  public AbstractMavenRuntime getResult() {
     return result;
   }
 
diff --git a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
index 54dffdc..147093b 100644
--- a/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
+++ b/org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/launch/MavenInstallationsPreferencePage.java
@@ -51,9 +51,9 @@
 import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.m2e.core.embedder.IMaven;
 import org.eclipse.m2e.core.embedder.IMavenConfiguration;
-import org.eclipse.m2e.core.embedder.MavenRuntime;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
 import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 import org.eclipse.m2e.core.ui.internal.Messages;
 
 
@@ -65,7 +65,7 @@
 @SuppressWarnings("restriction")
 public class MavenInstallationsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
 
-  final MavenRuntimeManager runtimeManager;
+  final MavenRuntimeManagerImpl runtimeManager;
 
   final IMavenConfiguration mavenConfiguration;
 
@@ -73,14 +73,14 @@
 
   String defaultRuntime;
 
-  List<MavenRuntime> runtimes;
+  List<AbstractMavenRuntime> runtimes;
 
   CheckboxTableViewer runtimesViewer;
 
   public MavenInstallationsPreferencePage() {
     setTitle(Messages.MavenInstallationsPreferencePage_title);
 
-    this.runtimeManager = MavenPlugin.getMavenRuntimeManager();
+    this.runtimeManager = MavenPluginActivator.getDefault().getMavenRuntimeManager();
     this.mavenConfiguration = MavenPlugin.getMavenConfiguration();
     this.maven = MavenPlugin.getMaven();
   }
@@ -133,12 +133,12 @@
     return composite;
   }
 
-  private MavenRuntime getDefaultRuntime() {
-    MavenRuntime embedded = null;
-    for(MavenRuntime runtime : runtimes) {
+  private AbstractMavenRuntime getDefaultRuntime() {
+    AbstractMavenRuntime embedded = null;
+    for(AbstractMavenRuntime runtime : runtimes) {
       if(defaultRuntime.equals(runtime.getName())) {
         return runtime;
-      } else if(MavenRuntimeManager.EMBEDDED.equals(runtime.getName())) {
+      } else if(MavenRuntimeManagerImpl.EMBEDDED.equals(runtime.getName())) {
         embedded = runtime;
       }
     }
@@ -150,7 +150,7 @@
 
     Object[] checkedElements = runtimesViewer.getCheckedElements();
     if(checkedElements == null || checkedElements.length == 0) {
-      MavenRuntime runtime = getDefaultRuntime();
+      AbstractMavenRuntime runtime = getDefaultRuntime();
       runtimesViewer.setChecked(runtime, true);
       defaultRuntime = runtime.getName();
     }
@@ -160,9 +160,9 @@
     }
   }
 
-  protected MavenRuntime getSelectedMavenRuntime() {
+  protected AbstractMavenRuntime getSelectedMavenRuntime() {
     IStructuredSelection sel = (IStructuredSelection) runtimesViewer.getSelection();
-    return (MavenRuntime) sel.getFirstElement();
+    return (AbstractMavenRuntime) sel.getFirstElement();
   }
 
   private void createTable(Composite composite) {
@@ -176,7 +176,7 @@
         if(input instanceof List<?>) {
           List<?> list = (List<?>) input;
           if(list.size() > 0) {
-            return list.toArray(new MavenRuntime[list.size()]);
+            return list.toArray(new AbstractMavenRuntime[list.size()]);
           }
         }
         return new Object[0];
@@ -226,11 +226,11 @@
     editButton.setText(Messages.MavenInstallationsPreferencePage_btnEdit);
     editButton.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
-        MavenRuntime runtime = getSelectedMavenRuntime();
+        AbstractMavenRuntime runtime = getSelectedMavenRuntime();
         MavenInstallationWizard wizard = new MavenInstallationWizard(runtime, getForbiddenNames(runtime));
         WizardDialog dialog = new WizardDialog(getShell(), wizard);
         if(dialog.open() == Window.OK) {
-          MavenRuntime updatedRuntime = wizard.getResult();
+          AbstractMavenRuntime updatedRuntime = wizard.getResult();
           for(int i = 0; i < runtimes.size(); i++ ) {
             if(runtime == runtimes.get(i)) {
               runtimes.set(i, updatedRuntime);
@@ -248,7 +248,7 @@
     removeButton.setText(Messages.MavenInstallationsPreferencePage_btnRemove);
     removeButton.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
-        MavenRuntime runtime = getSelectedMavenRuntime();
+        AbstractMavenRuntime runtime = getSelectedMavenRuntime();
         runtimes.remove(runtime);
         refreshRuntimesViewer();
       }
@@ -257,7 +257,7 @@
     runtimesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
       public void selectionChanged(SelectionChangedEvent event) {
         if(runtimesViewer.getSelection() instanceof IStructuredSelection) {
-          MavenRuntime runtime = getSelectedMavenRuntime();
+          AbstractMavenRuntime runtime = getSelectedMavenRuntime();
           boolean isEnabled = runtime != null && runtime.isEditable();
           removeButton.setEnabled(isEnabled);
           editButton.setEnabled(isEnabled);
@@ -267,7 +267,7 @@
 
     runtimesViewer.addCheckStateListener(new ICheckStateListener() {
       public void checkStateChanged(CheckStateChangedEvent event) {
-        setCheckedRuntime((MavenRuntime) event.getElement());
+        setCheckedRuntime((AbstractMavenRuntime) event.getElement());
       }
     });
     Label noteLabel = new Label(composite, SWT.WRAP);
@@ -278,9 +278,9 @@
     noteLabel.setText(Messages.MavenInstallationsPreferencePage_lblNote);
   }
 
-  protected Set<String> getForbiddenNames(MavenRuntime runtime) {
+  protected Set<String> getForbiddenNames(AbstractMavenRuntime runtime) {
     Set<String> names = new HashSet<String>();
-    for(MavenRuntime other : runtimes) {
+    for(AbstractMavenRuntime other : runtimes) {
       if(other != runtime) {
         names.add(other.getName());
       }
@@ -288,7 +288,7 @@
     return names;
   }
 
-  protected void setCheckedRuntime(MavenRuntime runtime) {
+  protected void setCheckedRuntime(AbstractMavenRuntime runtime) {
     runtimesViewer.setAllChecked(false);
     if(runtime == null || !runtime.isAvailable()) {
       runtime = getDefaultRuntime();
@@ -328,7 +328,7 @@
     }
 
     public Color getForeground(Object element) {
-      MavenRuntime runtime = (MavenRuntime) element;
+      AbstractMavenRuntime runtime = (AbstractMavenRuntime) element;
       if(!runtime.isEditable()) {
         return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY);
       }
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java
index df93ebb..0f85366 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/MavenPlugin.java
@@ -62,8 +62,12 @@
     return MavenPluginActivator.getDefault().getMavenConfiguration();
   }
 
+  /**
+   * @deprecated as of version 1.5, m2e does not provide API to access or configure Maven Installations
+   */
+  @SuppressWarnings("deprecation")
   public static MavenRuntimeManager getMavenRuntimeManager() {
-    return MavenPluginActivator.getDefault().getMavenRuntimeManager();
+    return new MavenRuntimeManager(MavenPluginActivator.getDefault().getMavenRuntimeManager());
   }
 
   public static MavenModelManager getMavenModelManager() {
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMavenLauncherConfiguration.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMavenLauncherConfiguration.java
index 538be2d..8e9d89f 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMavenLauncherConfiguration.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/IMavenLauncherConfiguration.java
@@ -21,6 +21,7 @@
  * 
  * @author Igor Fedorenko
  * @see MavenRuntime#createLauncherConfiguration
+ * @deprecated as of version 1.5, m2e does not provide API to access or configure Maven Installations
  */
 public interface IMavenLauncherConfiguration {
 
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntime.java
index c4bad9a..8341293 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntime.java
@@ -21,7 +21,9 @@
  * @author Eugene Kuleshov
  * @author Igor Fedorenko
  * @noimplement This interface is not intended to be implemented by clients.
+ * @deprecated as of version 1.5, m2e does not provide API to access or configure Maven Installations
  */
+@SuppressWarnings("deprecation")
 public interface MavenRuntime {
 
   public abstract boolean isEditable();
@@ -33,11 +35,6 @@
   public abstract void createLauncherConfiguration(IMavenLauncherConfiguration collector, IProgressMonitor monitor)
       throws CoreException;
 
-  /**
-   * @since 1.5
-   */
-  public abstract String getName();
-
   public abstract String getLocation();
 
   public abstract String getSettings();
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java
index 69e06b4..ab42641 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/embedder/MavenRuntimeManager.java
@@ -12,55 +12,34 @@
 package org.eclipse.m2e.core.embedder;
 
 import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IPreferencesService;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-
-import org.eclipse.m2e.core.internal.IMavenConstants;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
 import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
-import org.eclipse.m2e.core.internal.launch.ClasspathEntry;
-import org.eclipse.m2e.core.internal.launch.DefaultWorkspaceRuntime;
-import org.eclipse.m2e.core.internal.launch.MavenEmbeddedRuntime;
 import org.eclipse.m2e.core.internal.launch.MavenExternalRuntime;
-import org.eclipse.m2e.core.internal.launch.MavenWorkspaceRuntime;
-import org.eclipse.m2e.core.internal.preferences.MavenPreferenceConstants;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 
 
 /**
  * Maven runtime manager
  * 
+ * @deprecated as of version 1.5, m2e does not provide API to access or configure Maven Installations
  * @author Eugene Kuleshov
  * @author Jason van Zyl
  */
+@SuppressWarnings("deprecation")
 public class MavenRuntimeManager {
 
-  public static final String DEFAULT = "DEFAULT"; //$NON-NLS-1$
+  public static final String DEFAULT = MavenRuntimeManagerImpl.DEFAULT;
 
-  public static final String EMBEDDED = "EMBEDDED"; //$NON-NLS-1$
+  public static final String EMBEDDED = MavenRuntimeManagerImpl.EMBEDDED;
 
-  public static final String WORKSPACE = "WORKSPACE"; //$NON-NLS-1$
+  public static final String WORKSPACE = MavenRuntimeManagerImpl.WORKSPACE;
 
-  public static final String EXTERNAL = "EXTERNAL"; //$NON-NLS-1$
+  private final MavenRuntimeManagerImpl impl;
 
-  private final IEclipsePreferences[] preferencesLookup = new IEclipsePreferences[2];
-
-  private final IPreferencesService preferenceStore;
-
-  public MavenRuntimeManager() {
-    this.preferenceStore = Platform.getPreferencesService();
-    this.preferencesLookup[0] = InstanceScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID);
-    this.preferencesLookup[1] = DefaultScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID);
+  public MavenRuntimeManager(MavenRuntimeManagerImpl impl) {
+    this.impl = impl;
   }
 
   /**
@@ -72,27 +51,18 @@
   /**
    * @deprecated this method does nothing
    */
-  @Deprecated
   public void setWorkspaceRuntime(MavenRuntime workspaceRuntime) {
   }
 
   public MavenRuntime getDefaultRuntime() {
-    String selected = preferenceStore.get(MavenPreferenceConstants.P_DEFAULT_RUNTIME, null, preferencesLookup);
-    if(selected == null) {
-      return new MavenEmbeddedRuntime();
-    }
-    MavenRuntime runtime = getRuntimeByName(selected);
-    return runtime != null && runtime.isAvailable() ? runtime : new MavenEmbeddedRuntime();
+    return impl.getDefaultRuntime();
   }
 
-  /**
-   * @deprecated use {@link #getRuntimeByName(String)}
-   */
   public MavenRuntime getRuntime(String location) {
     if(location == null || location.length() == 0 || DEFAULT.equals(location)) {
       return getDefaultRuntime();
     }
-    for(MavenRuntime runtime : getRuntimes().values()) {
+    for(MavenRuntime runtime : impl.getRuntimes().values()) {
       if(location.equals(runtime.getLocation())) {
         return runtime;
       }
@@ -101,200 +71,36 @@
     return null;
   }
 
-  /**
-   * @since 1.5
-   */
-  public MavenRuntime getRuntimeByName(String name) {
-    return getRuntimes().get(name);
-  }
-
   public List<MavenRuntime> getMavenRuntimes() {
-    List<MavenRuntime> mavenRuntimes = new ArrayList<MavenRuntime>();
-    for(MavenRuntime mavenRuntime : getRuntimes().values()) {
-      if(mavenRuntime.isAvailable()) {
-        mavenRuntimes.add(mavenRuntime);
-      }
-    }
-    return mavenRuntimes;
-  }
-
-  /**
-   * @param available is {@code true} only available runtimes are returned, all runtimes are returned if {@code false}
-   * @since 1.5
-   */
-  public List<MavenRuntime> getMavenRuntimes(boolean available) {
-    List<MavenRuntime> mavenRuntimes = new ArrayList<MavenRuntime>();
-    for(MavenRuntime mavenRuntime : getRuntimes().values()) {
-      if(!available || mavenRuntime.isAvailable()) {
-        mavenRuntimes.add(mavenRuntime);
-      }
-    }
-    return mavenRuntimes;
-  }
-
-  public void reset() {
-    preferencesLookup[0].remove(MavenPreferenceConstants.P_RUNTIMES);
-    preferencesLookup[0].remove(MavenPreferenceConstants.P_DEFAULT_RUNTIME);
-    removeRuntimePreferences();
-    flush();
-  }
-
-  public void setDefaultRuntime(MavenRuntime runtime) {
-    if(runtime == null) {
-      preferencesLookup[0].remove(MavenPreferenceConstants.P_DEFAULT_RUNTIME);
-    } else {
-      preferencesLookup[0].put(MavenPreferenceConstants.P_DEFAULT_RUNTIME, runtime.getName());
-    }
-    flush();
-  }
-
-  private void flush() {
-    try {
-      preferencesLookup[0].flush();
-    } catch(BackingStoreException ex) {
-      // TODO do nothing
-    }
-  }
-
-  public void setRuntimes(List<MavenRuntime> runtimes) {
-    removeRuntimePreferences();
-    Set<String> names = new HashSet<String>();
-    StringBuilder sb = new StringBuilder();
-    for(MavenRuntime runtime : runtimes) {
-      if(!names.add(runtime.getName())) {
-        throw new IllegalArgumentException();
-      }
-      if(runtime.isEditable()) {
-        AbstractMavenRuntime impl = (AbstractMavenRuntime) runtime;
-        if(sb.length() > 0) {
-          sb.append('|');
-        }
-        sb.append(runtime.getName());
-        if(!impl.isLegacy()) {
-          Preferences runtimeNode = getRuntimePreferences(runtime.getName(), true);
-          runtimeNode.put("type", getRuntimeType(runtime));
-          runtimeNode.put("location", runtime.getLocation());
-          String extensions = encodeClasspath(impl.getExtensions());
-          if(extensions != null) {
-            runtimeNode.put("extensions", extensions);
-          } else {
-            runtimeNode.remove("extensions");
-          }
-        }
-      }
-    }
-    preferencesLookup[0].put(MavenPreferenceConstants.P_RUNTIMES, sb.toString());
-    flush();
-  }
-
-  private void removeRuntimePreferences() {
-    try {
-      if(preferencesLookup[0].nodeExists(MavenPreferenceConstants.P_RUNTIMES_NODE)) {
-        preferencesLookup[0].node(MavenPreferenceConstants.P_RUNTIMES_NODE).removeNode();
-      }
-    } catch(BackingStoreException ex) {
-      // assume the node does not exist
-    }
-  }
-
-  private String getRuntimeType(MavenRuntime runtime) {
-    if(runtime instanceof MavenExternalRuntime) {
-      return EXTERNAL;
-    } else if(runtime instanceof MavenWorkspaceRuntime) {
-      return WORKSPACE;
-    }
-    throw new IllegalArgumentException();
-  }
-
-  private Preferences getRuntimePreferences(String name, boolean create) {
-    Preferences runtimesNode = preferencesLookup[0].node(MavenPreferenceConstants.P_RUNTIMES_NODE);
-    try {
-      if(runtimesNode.nodeExists(name) || create) {
-        return runtimesNode.node(name);
-      }
-    } catch(BackingStoreException ex) {
-      // assume the node does not exist
-    }
-    return null;
-  }
-
-  private String encodeClasspath(List<ClasspathEntry> classpath) {
-    if(classpath == null || classpath.isEmpty()) {
-      return null;
-    }
-    StringBuilder sb = new StringBuilder();
-    for(ClasspathEntry cpe : classpath) {
-      if(sb.length() > 0) {
-        sb.append('|');
-      }
-      sb.append(cpe.toExternalForm());
-    }
-    return sb.toString();
-  }
-
-  private List<ClasspathEntry> decodeClasspath(String string) {
-    if(string == null || string.isEmpty()) {
-      return null;
-    }
-    List<ClasspathEntry> result = new ArrayList<ClasspathEntry>();
-    for(String entry : string.split("\\|")) {
-      ClasspathEntry decoded = ClasspathEntry.fromExternalForm(entry);
-      if(decoded != null) {
-        result.add(decoded);
-      }
+    List<MavenRuntime> result = new ArrayList<MavenRuntime>();
+    for(AbstractMavenRuntime runtime : impl.getMavenRuntimes()) {
+      result.add(runtime);
     }
     return result;
   }
 
-  private Map<String, AbstractMavenRuntime> getRuntimes() {
-    Map<String, AbstractMavenRuntime> runtimes = new LinkedHashMap<String, AbstractMavenRuntime>();
-    runtimes.put(EMBEDDED, new MavenEmbeddedRuntime());
-    runtimes.put(WORKSPACE, new DefaultWorkspaceRuntime());
-
-    String runtimesPreference = preferenceStore.get(MavenPreferenceConstants.P_RUNTIMES, null, preferencesLookup);
-    if(runtimesPreference != null && runtimesPreference.length() > 0) {
-      for(String name : runtimesPreference.split("\\|")) { //$NON-NLS-1$
-        Preferences preferences = getRuntimePreferences(name, false);
-        AbstractMavenRuntime runtime;
-        if(preferences == null) {
-          runtime = (AbstractMavenRuntime) createExternalRuntime(name);
-        } else {
-          runtime = createRuntime(name, preferences);
-        }
-        runtimes.put(runtime.getName(), runtime);
-      }
-    }
-
-    return runtimes;
+  public void reset() {
+    impl.reset();
   }
 
-  private AbstractMavenRuntime createRuntime(String name, Preferences preferences) {
-    String location = preferences.get("location", null);
-    String type = preferences.get("type", EXTERNAL);
-    AbstractMavenRuntime runtime;
-    if(WORKSPACE.equals(type)) {
-      runtime = new MavenWorkspaceRuntime(name);
-    } else {
-      runtime = new MavenExternalRuntime(name, location);
-    }
-    runtime.setExtensions(decodeClasspath(preferences.get("extensions", null)));
-    return runtime;
+  public void setDefaultRuntime(MavenRuntime runtime) {
+    impl.setDefaultRuntime((AbstractMavenRuntime) runtime);
   }
 
-  /**
-   * @deprecated as of version 1.5, m2e does not provide public API to create MavenRuntime instances
-   */
+  public void setRuntimes(List<MavenRuntime> runtimes) {
+    List<AbstractMavenRuntime> internal = new ArrayList<AbstractMavenRuntime>();
+    for(MavenRuntime runtime : runtimes) {
+      internal.add((AbstractMavenRuntime) runtime);
+    }
+    impl.setRuntimes(internal);
+  }
+
   public static MavenRuntime createExternalRuntime(String location) {
     return new MavenExternalRuntime(location);
   }
 
-  /**
-   * @deprecated global setting file is only used to determine localRepository location, which does not make much sense
-   */
   public String getGlobalSettingsFile() {
-    String globalSettings = preferenceStore.get(MavenPreferenceConstants.P_GLOBAL_SETTINGS_FILE, null,
-        preferencesLookup);
-    return globalSettings.trim().length() == 0 ? null : globalSettings;
+    return MavenPluginActivator.getDefault().getMavenConfiguration().getGlobalSettingsFile();
   }
 
 }
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/MavenPluginActivator.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/MavenPluginActivator.java
index 0f9a095..8220768 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/MavenPluginActivator.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/MavenPluginActivator.java
@@ -59,7 +59,6 @@
 import org.eclipse.m2e.core.embedder.IMavenConfiguration;
 import org.eclipse.m2e.core.embedder.IMavenExecutionContext;
 import org.eclipse.m2e.core.embedder.MavenModelManager;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
 import org.eclipse.m2e.core.internal.archetype.ArchetypeCatalogFactory;
 import org.eclipse.m2e.core.internal.archetype.ArchetypeManager;
 import org.eclipse.m2e.core.internal.embedder.MavenImpl;
@@ -67,6 +66,7 @@
 import org.eclipse.m2e.core.internal.index.nexus.IndexesExtensionReader;
 import org.eclipse.m2e.core.internal.index.nexus.IndexingTransferListener;
 import org.eclipse.m2e.core.internal.index.nexus.NexusIndexManager;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
 import org.eclipse.m2e.core.internal.markers.IMavenMarkerManager;
 import org.eclipse.m2e.core.internal.markers.MavenMarkerManager;
@@ -109,7 +109,7 @@
 
   private MavenProjectManager projectManager;
 
-  private MavenRuntimeManager runtimeManager;
+  private MavenRuntimeManagerImpl runtimeManager;
 
   private ProjectConfigurationManager configurationManager;
 
@@ -224,7 +224,7 @@
 
     this.modelManager = new MavenModelManager(maven, projectManager);
 
-    this.runtimeManager = new MavenRuntimeManager();
+    this.runtimeManager = new MavenRuntimeManagerImpl();
 
     this.configurationManager = new ProjectConfigurationManager(maven, managerImpl, modelManager, mavenMarkerManager,
         mavenConfiguration);
@@ -347,7 +347,7 @@
     return this.indexManager;
   }
 
-  public MavenRuntimeManager getMavenRuntimeManager() {
+  public MavenRuntimeManagerImpl getMavenRuntimeManager() {
     return this.runtimeManager;
   }
 
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java
index 7d6742c..214c814 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/AbstractMavenRuntime.java
@@ -35,6 +35,7 @@
 /**
  * @since 1.5
  */
+@SuppressWarnings("deprecation")
 public abstract class AbstractMavenRuntime implements MavenRuntime {
 
   private static final IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
@@ -54,7 +55,6 @@
     this.name = name;
   }
 
-  @Override
   public String getName() {
     return name != null ? name : getLocation();
   }
@@ -105,4 +105,14 @@
     return getName().hashCode();
   }
 
+  public abstract void createLauncherConfiguration(IMavenLauncherConfiguration collector, IProgressMonitor monitor)
+      throws CoreException;
+
+  public abstract String getLocation();
+
+  public abstract boolean isAvailable();
+
+  public abstract boolean isEditable();
+
+  public abstract String getVersion();
 }
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/DefaultWorkspaceRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/DefaultWorkspaceRuntime.java
index cf30681..e01d3bf 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/DefaultWorkspaceRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/DefaultWorkspaceRuntime.java
@@ -11,16 +11,13 @@
 
 package org.eclipse.m2e.core.internal.launch;
 
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
-
-
 /**
  * @since 1.5
  */
 public class DefaultWorkspaceRuntime extends MavenWorkspaceRuntime {
 
   public DefaultWorkspaceRuntime() {
-    super(MavenRuntimeManager.WORKSPACE);
+    super(MavenRuntimeManagerImpl.WORKSPACE);
   }
 
   public boolean isEditable() {
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java
index 2c9da47..4eae036 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenEmbeddedRuntime.java
@@ -40,7 +40,6 @@
 import org.codehaus.plexus.util.IOUtil;
 
 import org.eclipse.m2e.core.embedder.IMavenLauncherConfiguration;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
 import org.eclipse.m2e.core.internal.Bundles;
 import org.eclipse.m2e.core.internal.MavenPluginActivator;
 import org.eclipse.m2e.core.internal.Messages;
@@ -53,6 +52,7 @@
  * @author Eugene Kuleshov
  * @author Igor Fedorenko
  */
+@SuppressWarnings("deprecation")
 public class MavenEmbeddedRuntime extends AbstractMavenRuntime {
 
   private static final String MAVEN_CORE_POM_PROPERTIES = "META-INF/maven/org.apache.maven/maven-core/pom.properties"; //$NON-NLS-1$
@@ -74,7 +74,7 @@
   private static final Bundle m2eCore = MavenPluginActivator.getDefault().getBundle();
 
   public MavenEmbeddedRuntime() {
-    super(MavenRuntimeManager.EMBEDDED);
+    super(MavenRuntimeManagerImpl.EMBEDDED);
   }
 
   public boolean isEditable() {
@@ -82,7 +82,7 @@
   }
 
   public String getLocation() {
-    return MavenRuntimeManager.EMBEDDED;
+    return MavenRuntimeManagerImpl.EMBEDDED;
   }
 
   public String getSettings() {
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java
index c12cc42..bf2c54a 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenExternalRuntime.java
@@ -41,6 +41,7 @@
  * @author Eugene Kuleshov
  * @author Igor Fedorenko
  */
+@SuppressWarnings("deprecation")
 public class MavenExternalRuntime extends AbstractMavenRuntime {
   private static final Logger log = LoggerFactory.getLogger(MavenExternalRuntime.class);
 
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenRuntimeManagerImpl.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenRuntimeManagerImpl.java
new file mode 100644
index 0000000..3cdede2
--- /dev/null
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenRuntimeManagerImpl.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Takari, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *      Takari, Inc. - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.m2e.core.internal.launch;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IPreferencesService;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+
+import org.eclipse.m2e.core.internal.IMavenConstants;
+import org.eclipse.m2e.core.internal.preferences.MavenPreferenceConstants;
+
+
+/**
+ * @since 1.5
+ */
+public class MavenRuntimeManagerImpl {
+  public static final String DEFAULT = "DEFAULT"; //$NON-NLS-1$
+
+  public static final String EMBEDDED = "EMBEDDED"; //$NON-NLS-1$
+
+  public static final String WORKSPACE = "WORKSPACE"; //$NON-NLS-1$
+
+  public static final String EXTERNAL = "EXTERNAL"; //$NON-NLS-1$
+
+  private final IEclipsePreferences[] preferencesLookup = new IEclipsePreferences[2];
+
+  private final IPreferencesService preferenceStore;
+
+  public MavenRuntimeManagerImpl() {
+    this.preferenceStore = Platform.getPreferencesService();
+    this.preferencesLookup[0] = InstanceScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID);
+    this.preferencesLookup[1] = DefaultScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID);
+  }
+
+  public AbstractMavenRuntime getDefaultRuntime() {
+    String selected = preferenceStore.get(MavenPreferenceConstants.P_DEFAULT_RUNTIME, null, preferencesLookup);
+    if(selected == null) {
+      return new MavenEmbeddedRuntime();
+    }
+    AbstractMavenRuntime runtime = getRuntimeByName(selected);
+    return runtime != null && runtime.isAvailable() ? runtime : new MavenEmbeddedRuntime();
+  }
+
+  public AbstractMavenRuntime getRuntimeByName(String name) {
+    return getRuntimes().get(name);
+  }
+
+  public List<AbstractMavenRuntime> getMavenRuntimes() {
+    List<AbstractMavenRuntime> mavenRuntimes = new ArrayList<AbstractMavenRuntime>();
+    for(AbstractMavenRuntime mavenRuntime : getRuntimes().values()) {
+      if(mavenRuntime.isAvailable()) {
+        mavenRuntimes.add(mavenRuntime);
+      }
+    }
+    return mavenRuntimes;
+  }
+
+  /**
+   * @param available is {@code true} only available runtimes are returned, all runtimes are returned if {@code false}
+   * @since 1.5
+   */
+  public List<AbstractMavenRuntime> getMavenRuntimes(boolean available) {
+    List<AbstractMavenRuntime> mavenRuntimes = new ArrayList<AbstractMavenRuntime>();
+    for(AbstractMavenRuntime mavenRuntime : getRuntimes().values()) {
+      if(!available || mavenRuntime.isAvailable()) {
+        mavenRuntimes.add(mavenRuntime);
+      }
+    }
+    return mavenRuntimes;
+  }
+
+  public void reset() {
+    preferencesLookup[0].remove(MavenPreferenceConstants.P_RUNTIMES);
+    preferencesLookup[0].remove(MavenPreferenceConstants.P_DEFAULT_RUNTIME);
+    removeRuntimePreferences();
+    flush();
+  }
+
+  public void setDefaultRuntime(AbstractMavenRuntime runtime) {
+    if(runtime == null) {
+      preferencesLookup[0].remove(MavenPreferenceConstants.P_DEFAULT_RUNTIME);
+    } else {
+      preferencesLookup[0].put(MavenPreferenceConstants.P_DEFAULT_RUNTIME, runtime.getName());
+    }
+    flush();
+  }
+
+  private void flush() {
+    try {
+      preferencesLookup[0].flush();
+    } catch(BackingStoreException ex) {
+      // TODO do nothing
+    }
+  }
+
+  public void setRuntimes(List<AbstractMavenRuntime> runtimes) {
+    removeRuntimePreferences();
+    Set<String> names = new HashSet<String>();
+    StringBuilder sb = new StringBuilder();
+    for(AbstractMavenRuntime runtime : runtimes) {
+      String name = runtime.getName();
+      if(!names.add(name)) {
+        throw new IllegalArgumentException();
+      }
+      if(runtime.isEditable()) {
+        if(sb.length() > 0) {
+          sb.append('|');
+        }
+        sb.append(name);
+        if(!runtime.isLegacy()) {
+          Preferences runtimeNode = getRuntimePreferences(name, true);
+          runtimeNode.put("type", getRuntimeType(runtime));
+          runtimeNode.put("location", runtime.getLocation());
+          String extensions = encodeClasspath(runtime.getExtensions());
+          if(extensions != null) {
+            runtimeNode.put("extensions", extensions);
+          } else {
+            runtimeNode.remove("extensions");
+          }
+        }
+      }
+    }
+    preferencesLookup[0].put(MavenPreferenceConstants.P_RUNTIMES, sb.toString());
+    flush();
+  }
+
+  private void removeRuntimePreferences() {
+    try {
+      if(preferencesLookup[0].nodeExists(MavenPreferenceConstants.P_RUNTIMES_NODE)) {
+        preferencesLookup[0].node(MavenPreferenceConstants.P_RUNTIMES_NODE).removeNode();
+      }
+    } catch(BackingStoreException ex) {
+      // assume the node does not exist
+    }
+  }
+
+  private String getRuntimeType(AbstractMavenRuntime runtime) {
+    if(runtime instanceof MavenExternalRuntime) {
+      return EXTERNAL;
+    } else if(runtime instanceof MavenWorkspaceRuntime) {
+      return WORKSPACE;
+    }
+    throw new IllegalArgumentException();
+  }
+
+  private Preferences getRuntimePreferences(String name, boolean create) {
+    Preferences runtimesNode = preferencesLookup[0].node(MavenPreferenceConstants.P_RUNTIMES_NODE);
+    try {
+      if(runtimesNode.nodeExists(name) || create) {
+        return runtimesNode.node(name);
+      }
+    } catch(BackingStoreException ex) {
+      // assume the node does not exist
+    }
+    return null;
+  }
+
+  private String encodeClasspath(List<ClasspathEntry> classpath) {
+    if(classpath == null || classpath.isEmpty()) {
+      return null;
+    }
+    StringBuilder sb = new StringBuilder();
+    for(ClasspathEntry cpe : classpath) {
+      if(sb.length() > 0) {
+        sb.append('|');
+      }
+      sb.append(cpe.toExternalForm());
+    }
+    return sb.toString();
+  }
+
+  private List<ClasspathEntry> decodeClasspath(String string) {
+    if(string == null || string.isEmpty()) {
+      return null;
+    }
+    List<ClasspathEntry> result = new ArrayList<ClasspathEntry>();
+    for(String entry : string.split("\\|")) {
+      ClasspathEntry decoded = ClasspathEntry.fromExternalForm(entry);
+      if(decoded != null) {
+        result.add(decoded);
+      }
+    }
+    return result;
+  }
+
+  public Map<String, AbstractMavenRuntime> getRuntimes() {
+    Map<String, AbstractMavenRuntime> runtimes = new LinkedHashMap<String, AbstractMavenRuntime>();
+    runtimes.put(EMBEDDED, new MavenEmbeddedRuntime());
+    runtimes.put(WORKSPACE, new DefaultWorkspaceRuntime());
+
+    String runtimesPreference = preferenceStore.get(MavenPreferenceConstants.P_RUNTIMES, null, preferencesLookup);
+    if(runtimesPreference != null && runtimesPreference.length() > 0) {
+      for(String name : runtimesPreference.split("\\|")) { //$NON-NLS-1$
+        Preferences preferences = getRuntimePreferences(name, false);
+        AbstractMavenRuntime runtime;
+        if(preferences == null) {
+          runtime = new MavenExternalRuntime(name);
+        } else {
+          runtime = createRuntime(name, preferences);
+        }
+        runtimes.put(runtime.getName(), runtime);
+      }
+    }
+
+    return runtimes;
+  }
+
+  private AbstractMavenRuntime createRuntime(String name, Preferences preferences) {
+    String location = preferences.get("location", null);
+    String type = preferences.get("type", EXTERNAL);
+    AbstractMavenRuntime runtime;
+    if(WORKSPACE.equals(type)) {
+      runtime = new MavenWorkspaceRuntime(name);
+    } else {
+      runtime = new MavenExternalRuntime(name, location);
+    }
+    runtime.setExtensions(decodeClasspath(preferences.get("extensions", null)));
+    return runtime;
+  }
+
+}
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenWorkspaceRuntime.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenWorkspaceRuntime.java
index d631ce2..7af1488 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenWorkspaceRuntime.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/launch/MavenWorkspaceRuntime.java
@@ -26,7 +26,6 @@
 import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.m2e.core.embedder.ArtifactKey;
 import org.eclipse.m2e.core.embedder.IMavenLauncherConfiguration;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
 import org.eclipse.m2e.core.project.IMavenProjectFacade;
 import org.eclipse.m2e.core.project.IMavenProjectRegistry;
 
@@ -38,6 +37,7 @@
  * @author Igor Fedorenko
  * @author Jason van Zyl
  */
+@SuppressWarnings("deprecation")
 public class MavenWorkspaceRuntime extends AbstractMavenRuntime {
 
   private static final ArtifactKey MAVEN_DISTRIBUTION = new ArtifactKey(
@@ -65,7 +65,7 @@
   }
 
   public String getLocation() {
-    return MavenRuntimeManager.WORKSPACE;
+    return MavenRuntimeManagerImpl.WORKSPACE;
   }
 
   public String getSettings() {
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/preferences/MavenPreferenceConstants.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/preferences/MavenPreferenceConstants.java
index 8a94dfd..7e545fa 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/preferences/MavenPreferenceConstants.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/preferences/MavenPreferenceConstants.java
@@ -12,7 +12,7 @@
 
 package org.eclipse.m2e.core.internal.preferences;
 
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 
 
 /**
@@ -64,10 +64,10 @@
   /** boolean */
   public static final String P_DISABLE_JDK_CHECK = PREFIX + "disableJdkCheck"; //$NON-NLS-1$
 
-  /** String, list of configured maven installations separated by '|', see {@link MavenRuntimeManager} */
+  /** String, list of configured maven installations separated by '|', see {@link MavenRuntimeManagerImpl} */
   public static final String P_RUNTIMES = PREFIX + "runtimes"; //$NON-NLS-1$
 
-  /** Root node of extended maven installation attributes, see {@link MavenRuntimeManager} */
+  /** Root node of extended maven installation attributes, see {@link MavenRuntimeManagerImpl} */
   public static final String P_RUNTIMES_NODE = PREFIX + "runtimesNodes"; //$NON-NLS-1$
 
   /** String */
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenLaunchUtils.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenLaunchUtils.java
index 3b625bb..0e753de 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenLaunchUtils.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenLaunchUtils.java
@@ -26,9 +26,9 @@
 import org.eclipse.osgi.util.NLS;
 
 import org.eclipse.m2e.actions.MavenLaunchConstants;
-import org.eclipse.m2e.core.MavenPlugin;
-import org.eclipse.m2e.core.embedder.MavenRuntime;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 
 
 /**
@@ -36,12 +36,13 @@
  * 
  * @author Igor Fedorenko
  */
+@SuppressWarnings("restriction")
 public class MavenLaunchUtils {
 
-  public static MavenRuntime getMavenRuntime(ILaunchConfiguration configuration) throws CoreException {
-    MavenRuntimeManager runtimeManager = MavenPlugin.getMavenRuntimeManager();
+  public static AbstractMavenRuntime getMavenRuntime(ILaunchConfiguration configuration) throws CoreException {
+    MavenRuntimeManagerImpl runtimeManager = MavenPluginActivator.getDefault().getMavenRuntimeManager();
     String name = configuration.getAttribute(MavenLaunchConstants.ATTR_RUNTIME, ""); //$NON-NLS-1$
-    MavenRuntime runtime = runtimeManager.getRuntimeByName(name);
+    AbstractMavenRuntime runtime = runtimeManager.getRuntimeByName(name);
     if(runtime == null) {
       throw new CoreException(new Status(IStatus.ERROR, MavenLaunchConstants.PLUGIN_ID, -1, //
           NLS.bind(Messages.MavenLaunchUtils_error_no_maven_install, name), null));
@@ -49,7 +50,7 @@
     return runtime;
   }
 
-  public static String getCliResolver(MavenRuntime runtime) throws CoreException {
+  public static String getCliResolver(AbstractMavenRuntime runtime) throws CoreException {
     String jarname;
     String runtimeVersion = runtime.getVersion();
     if(runtimeVersion.startsWith("3.0")) { //$NON-NLS-1$
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenRuntimeLaunchSupport.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenRuntimeLaunchSupport.java
index 5779c3c..ad631df 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenRuntimeLaunchSupport.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenRuntimeLaunchSupport.java
@@ -37,8 +37,8 @@
 import org.eclipse.jdt.launching.VMRunnerConfiguration;
 
 import org.eclipse.m2e.core.embedder.IMavenLauncherConfiguration;
-import org.eclipse.m2e.core.embedder.MavenRuntime;
 import org.eclipse.m2e.core.internal.MavenPluginActivator;
+import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
 import org.eclipse.m2e.core.internal.project.WorkspaceStateWriter;
 
 
@@ -60,10 +60,11 @@
  * 
  * @since 1.4
  */
+@SuppressWarnings("restriction")
 public class MavenRuntimeLaunchSupport {
   private static final String LAUNCH_M2CONF_FILE = "org.eclipse.m2e.internal.launch.M2_CONF"; //$NON-NLS-1$
 
-  private final MavenRuntime runtime;
+  private final AbstractMavenRuntime runtime;
 
   private final MavenLauncherConfigurationHandler cwconf;
 
@@ -97,8 +98,8 @@
     }
   }
 
-  private MavenRuntimeLaunchSupport(MavenRuntime runtime, MavenLauncherConfigurationHandler cwconf, File cwconfFile,
-      boolean resolveWorkspaceArtifacts) {
+  private MavenRuntimeLaunchSupport(AbstractMavenRuntime runtime, MavenLauncherConfigurationHandler cwconf,
+      File cwconfFile, boolean resolveWorkspaceArtifacts) {
     this.runtime = runtime;
     this.cwconf = cwconf;
     this.cwconfFile = cwconfFile;
@@ -107,7 +108,7 @@
 
   public static MavenRuntimeLaunchSupport create(ILaunchConfiguration configuration, ILaunch launch,
       IProgressMonitor monitor) throws CoreException {
-    MavenRuntime runtime = MavenLaunchUtils.getMavenRuntime(configuration);
+    AbstractMavenRuntime runtime = MavenLaunchUtils.getMavenRuntime(configuration);
 
     boolean resolveWorkspaceArtifacts = configuration.getAttribute(ATTR_WORKSPACE_RESOLUTION, false);
 
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenSourcePathComputer.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenSourcePathComputer.java
index 6050ccc..3ba8ef3 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenSourcePathComputer.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/internal/launch/MavenSourcePathComputer.java
@@ -41,7 +41,7 @@
 import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.m2e.core.embedder.IMaven;
 import org.eclipse.m2e.core.embedder.IMavenLauncherConfiguration;
-import org.eclipse.m2e.core.embedder.MavenRuntime;
+import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
 import org.eclipse.m2e.core.project.IMavenProjectFacade;
 
 
@@ -51,6 +51,7 @@
  * 
  * @author Eugene Kuleshov
  */
+@SuppressWarnings({"restriction", "deprecation"})
 public class MavenSourcePathComputer implements ISourcePathComputer {
 
   public MavenSourcePathComputer() {
@@ -69,7 +70,7 @@
       entries.add(jreEntry);
     }
 
-    MavenRuntime runtime = MavenLaunchUtils.getMavenRuntime(configuration);
+    AbstractMavenRuntime runtime = MavenLaunchUtils.getMavenRuntime(configuration);
     IMavenLauncherConfiguration collector = new IMavenLauncherConfiguration() {
       public void addArchiveEntry(String entry) throws CoreException {
         addArchiveRuntimeClasspathEntry(entries, entry);
diff --git a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
index 0a07664..a045f14 100644
--- a/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
+++ b/org.eclipse.m2e.launching/src/org/eclipse/m2e/ui/internal/launch/MavenRuntimeSelector.java
@@ -38,12 +38,11 @@
 import org.eclipse.ui.dialogs.PreferencesUtil;
 
 import org.eclipse.m2e.actions.MavenLaunchConstants;
-import org.eclipse.m2e.core.MavenPlugin;
-import org.eclipse.m2e.core.embedder.MavenRuntime;
-import org.eclipse.m2e.core.embedder.MavenRuntimeManager;
+import org.eclipse.m2e.core.internal.MavenPluginActivator;
 import org.eclipse.m2e.core.internal.launch.AbstractMavenRuntime;
 import org.eclipse.m2e.core.internal.launch.MavenEmbeddedRuntime;
 import org.eclipse.m2e.core.internal.launch.MavenExternalRuntime;
+import org.eclipse.m2e.core.internal.launch.MavenRuntimeManagerImpl;
 import org.eclipse.m2e.core.internal.launch.MavenWorkspaceRuntime;
 
 
@@ -55,8 +54,8 @@
 
   ComboViewer runtimeComboViewer;
 
-  private static MavenRuntimeManager getRuntimeManager() {
-    return MavenPlugin.getMavenRuntimeManager();
+  private static MavenRuntimeManagerImpl getRuntimeManager() {
+    return MavenPluginActivator.getDefault().getMavenRuntimeManager();
   }
 
   public MavenRuntimeSelector(final Composite mainComposite) {
@@ -106,7 +105,7 @@
         StringBuilder sb = new StringBuilder();
 
         if(runtime.isLegacy()) {
-          sb.append(MavenRuntimeManager.EXTERNAL).append(" ").append(runtime.toString());
+          sb.append(MavenRuntimeManagerImpl.EXTERNAL).append(" ").append(runtime.toString());
         } else if(!runtime.isEditable()) {
           sb.append(getType(runtime)).append(" (").append(runtime.toString()).append(')');
         } else {
@@ -143,30 +142,30 @@
     });
   }
 
-  protected String getType(MavenRuntime runtime) {
+  protected String getType(AbstractMavenRuntime runtime) {
     if(runtime instanceof MavenEmbeddedRuntime) {
-      return MavenRuntimeManager.EMBEDDED;
+      return MavenRuntimeManagerImpl.EMBEDDED;
     } else if(runtime instanceof MavenWorkspaceRuntime) {
-      return MavenRuntimeManager.WORKSPACE;
+      return MavenRuntimeManagerImpl.WORKSPACE;
     } else if(runtime instanceof MavenExternalRuntime) {
-      return MavenRuntimeManager.EXTERNAL;
+      return MavenRuntimeManagerImpl.EXTERNAL;
     }
     throw new IllegalArgumentException();
   }
 
   protected void setInput() {
-    MavenRuntimeManager runtimeManager = getRuntimeManager();
+    MavenRuntimeManagerImpl runtimeManager = getRuntimeManager();
     runtimeComboViewer.setInput(runtimeManager.getMavenRuntimes());
     runtimeComboViewer.setSelection(new StructuredSelection(runtimeManager.getDefaultRuntime()));
   }
 
-  public void setSelectRuntime(MavenRuntime runtime) {
+  public void setSelectRuntime(AbstractMavenRuntime runtime) {
     this.runtimeComboViewer.setSelection(new StructuredSelection(runtime));
   }
 
-  public MavenRuntime getSelectedRuntime() {
+  public AbstractMavenRuntime getSelectedRuntime() {
     IStructuredSelection selection = (IStructuredSelection) runtimeComboViewer.getSelection();
-    return (MavenRuntime) selection.getFirstElement();
+    return (AbstractMavenRuntime) selection.getFirstElement();
   }
 
   public void addSelectionChangedListener(ISelectionChangedListener listener) {
@@ -180,14 +179,14 @@
     } catch(CoreException ex) {
       // TODO log
     }
-    MavenRuntime runtime = getRuntimeManager().getRuntimeByName(name);
+    AbstractMavenRuntime runtime = getRuntimeManager().getRuntimeByName(name);
     if(runtime != null) {
       setSelectRuntime(runtime);
     }
   }
 
   public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-    MavenRuntime runtime = getSelectedRuntime();
+    AbstractMavenRuntime runtime = getSelectedRuntime();
     configuration.setAttribute(MavenLaunchConstants.ATTR_RUNTIME, runtime.getName());
   }
 }