diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java
new file mode 100644
index 0000000..8dbe0c2
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/ClasspathUtil.java
@@ -0,0 +1,187 @@
+/*
+ * 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.tuscany.sca.core.classpath;
+
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+
+/**
+ * Utility functions to help determine the runtime classpath.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class ClasspathUtil {
+
+    private static final String TUSCANY_RUNTIME_LIBRARIES = "org.apache.tuscany.sca.core.runtimeLibraries";
+
+    private static final String VERSION_RESOURCE = "/org/apache/tuscany/sca/core/feature.version";
+    private static final String TUSCANY_FEATURE = "org.apache.tuscany.sca.feature.core";
+    
+    /**
+     * Return the installed runtime classpath entries.
+     * 
+     * @return
+     * @throws CoreException
+     */
+    public static String installedRuntimeClasspath() throws CoreException {
+        
+        List<IClasspathEntry> classpathEntries = new ArrayList<IClasspathEntry>(); 
+        for (IExtension extension: Platform.getExtensionRegistry().getExtensionPoint(TUSCANY_RUNTIME_LIBRARIES).getExtensions()) {
+            for (IConfigurationElement configuration: extension.getConfigurationElements()) {
+                IClasspathContainer container = (IClasspathContainer)configuration.createExecutableExtension("class");
+                classpathEntries.addAll(Arrays.asList(container.getClasspathEntries()));
+            }
+        }
+        
+        String separator = System.getProperty("path.separator");
+        StringBuffer classpath = new StringBuffer();
+        for (int i = 0, n = classpathEntries.size(); i < n; i++) {
+            IClasspathEntry entry = classpathEntries.get(i);
+            if (i >0) {
+                classpath.append(separator);
+            }
+            classpath.append(entry.getPath().toFile().toURI().getPath());
+        }
+        
+        return classpath.toString();
+    }
+
+    /**
+     * Returns the Tuscany feature location.
+     *  
+     * @return
+     */
+    static IPath feature() {
+        Path featurePath = null;
+        Exception ex = null;
+        try {
+            InputStream resourceStream = ClasspathUtil.class.getResourceAsStream(VERSION_RESOURCE);
+            if (resourceStream != null) {
+                BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, "UTF-8"));
+                String featureVersion = reader.readLine().trim();
+                reader.close();
+                URL location = Platform.getInstallLocation().getURL();
+                File feature = new File(location.getPath() + "/features/" + TUSCANY_FEATURE + "_" + featureVersion);
+                featurePath = new Path(feature.getPath());
+            }
+        } catch (Exception e) {
+            ex = e;
+        }
+
+        if (featurePath != null) {
+            return featurePath;
+        } else {
+            error("Tuscany runtime feature not found", ex);
+            return null;
+        }
+    }
+
+    /**
+     * Returns the location of the runtime distribution under the Tuscany feature.
+     * 
+     * @param feature
+     * @return
+     */
+    static IPath runtime(IPath feature) {
+        IPath runtimePath = null;
+        try {
+            
+            // Find the Tuscany distribution under the feature's runtime directory
+            // Typically runtime/distro-archive-name/un-archived-distro-dir
+            File file = new File(feature.toFile(), "runtime");
+            if (file.exists()) {
+                File distro = null;
+                for (File f: file.listFiles()) {
+                    if (f.getName().contains("tuscany-sca")) {
+                        distro = f;
+                        break;
+                    }
+                }
+                if (distro != null) {
+                    for (File f: distro.listFiles()) {
+                        if (f.getName().contains("tuscany-sca")) {
+                            runtimePath = new Path(f.getPath());
+                            break;
+                        }
+                    }
+                    if (runtimePath == null) {
+                        error("Tuscany runtime distribution directory not found", new FileNotFoundException(distro.getAbsolutePath()));
+                    }
+                } else {
+                    error("Tuscany runtime distribution archive not found", new FileNotFoundException(file.getAbsolutePath()));
+                }
+            } else {
+                error("Tuscany runtime feature not found", new FileNotFoundException(file.getAbsolutePath()));
+            }
+        } catch (Exception e) {
+            error("Tuscany runtime feature not found", e);
+        }
+        return runtimePath;
+    }
+
+    /**
+     * Returns the location of the src distribution under the Tuscany feature.
+     * 
+     * @param feature
+     * @return
+     */
+    static IPath src(IPath feature) {
+        IPath sourcePath = null;
+        try {
+
+            // Find the Tuscany source distribution under the feature's src directory
+            // Typically src/distro-archive-src.zip
+            File file = new File(feature.toFile(), "src");
+            if (file.exists()) {
+                File distro = null;
+                for (File f: file.listFiles()) {
+                    if (f.getName().contains("tuscany-sca") && f.getName().endsWith("-src.zip")) {
+                        distro = f;
+                        break;
+                    }
+                }
+                if (distro != null) {
+                    sourcePath = new Path(distro.getPath());
+                }
+            }
+        } catch (Exception e) {
+        }
+        return sourcePath;
+    }
+    
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
new file mode 100644
index 0000000..c1a674a
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainer.java
@@ -0,0 +1,154 @@
+/*
+ * 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.tuscany.sca.core.classpath;
+
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.feature;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.runtime;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.src;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container for the Tuscany runtime.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TuscanyClasspathContainer implements IClasspathContainer {
+    
+    public static final IPath TUSCANY_LIBRARY_CONTAINER = new Path("org.apache.tuscany.sca.runtime.library");  
+    
+    private static final String TUSCANY_HOME = "TUSCANY_HOME";
+    private static final String TUSCANY_SRC = "TUSCANY_SRC";
+    
+    public TuscanyClasspathContainer() {
+    }
+
+    public IClasspathEntry[] getClasspathEntries() {
+        List<IClasspathEntry> list = new ArrayList<IClasspathEntry>();
+        
+        // Find the Tuscany feature
+        IPath feature = feature();
+        
+        // Get the runtime location from the installed Tuscany feature
+        IPath runtimePath = runtime(feature);
+
+        if (runtimePath == null) {
+
+            // Try to get the location of the Tuscany binary distribution from
+            // the TUSCANY_HOME property or environment variable
+            String home = System.getProperty(TUSCANY_HOME);
+            if (home == null || home.length() == 0) {
+                home = System.getenv(TUSCANY_HOME);
+            }
+            if (home != null && home.length() != 0) {
+                if (new File(home).exists()) {
+                    runtimePath = new Path(home);
+                }
+            }
+        }
+        
+        // Get the source location from the installed Tuscany feature
+        IPath sourcePath = src(feature);
+
+        if (sourcePath == null) {
+            
+            // Try to get the location of the Tuscany source distribution from
+            // the TUSCANY_SRC property or environment variable
+            String source = System.getProperty(TUSCANY_SRC);
+            if (source == null || source.length() == 0) {
+                source = System.getenv(TUSCANY_SRC);
+            }
+            if (source != null && source.length() != 0) {
+                if (new File(source).exists()) {
+                    sourcePath = new Path(source);
+                }
+            }
+        }
+        
+        // Add the JARs from runtime/lib and runtime/modules as classpath entries
+        if (runtimePath != null) {
+            
+            // Add a selection of the jars from runtime/modules
+            File modulesDirectory = runtimePath.append("modules").toFile();
+            if (modulesDirectory != null && modulesDirectory.exists()) {
+                for (File file : modulesDirectory.listFiles()) {
+                    IPath path = new Path(file.getPath());
+                    String name = path.lastSegment();
+                    String extension = path.getFileExtension();
+                    
+                    // Only include API and launcher JARs
+                    if (!"jar".equals(extension)) {
+                        continue;
+                    }
+                    if (name.indexOf("-api-") == -1 && name.indexOf("-launcher-") == -1) {
+                        continue;
+                    }
+                    if (name.startsWith("tuscany-node-api-") || name.startsWith("tuscany-domain-api-")) {
+                        continue;
+                    }
+
+                    list.add(JavaCore.newLibraryEntry(path, sourcePath, null));
+                }
+            }
+
+            File libDirectory = runtimePath.append("lib").toFile();
+            if (libDirectory != null && libDirectory.exists()) {
+                for (File file : libDirectory.listFiles()) {
+                    IPath path = new Path(file.getPath());
+                    String name = path.lastSegment();
+                    String extension = path.getFileExtension();
+                    
+                    // Only include jaxb, jaxws and jsr API JARs
+                    if (!"jar".equals(extension)) {
+                        continue;
+                    }
+                    if (name.indexOf("-api-") != -1) {
+                        if (name.startsWith("jaxb") || name.startsWith("jaxws") || name.startsWith("jsr")) {
+                            list.add(JavaCore.newLibraryEntry(path, sourcePath, null));
+                        }
+                    }
+                }
+            }
+        }
+        
+        return (IClasspathEntry[])list.toArray(new IClasspathEntry[list.size()]);
+    }
+
+    public String getDescription() {
+        return "Tuscany Library";
+    }
+
+    public int getKind() {
+        return IClasspathContainer.K_APPLICATION;
+    }
+
+    public IPath getPath() {
+        return TUSCANY_LIBRARY_CONTAINER;
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java
new file mode 100644
index 0000000..c82281b
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyClasspathContainerInitializer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.tuscany.sca.core.classpath;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container initializer for the Tuscany runtime.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+    @Override
+    public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+        TuscanyClasspathContainer classpathContainer = new TuscanyClasspathContainer();
+        JavaCore.setClasspathContainer(containerPath,
+                                       new IJavaProject[] {project},
+                                       new IClasspathContainer[] {classpathContainer},
+                                       null);
+    }
+
+    @Override
+    public boolean canUpdateClasspathContainer(IPath containerPath, IJavaProject project) {
+        return true;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
new file mode 100644
index 0000000..21f6f27
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyLibraryEntryPage.java
@@ -0,0 +1,69 @@
+/*
+ * 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.tuscany.sca.core.classpath;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * A classpath container page for the Tuscany runtime library.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLibraryEntryPage extends WizardPage implements IClasspathContainerPage {
+
+    private IClasspathEntry classpathEntry;
+
+    public TuscanyLibraryEntryPage() {
+        super("Tuscany");
+    }
+
+    public void createControl(Composite parent) {
+        setTitle("Tuscany Library");
+
+        Label label = new Label(parent, SWT.NONE);
+        label.setText("Press Finish to add the Tuscany Library");
+        label.setFont(parent.getFont());
+
+        setControl(label);
+    }
+
+    public boolean finish() {
+        classpathEntry = JavaCore.newContainerEntry(TuscanyClasspathContainer.TUSCANY_LIBRARY_CONTAINER);
+        return true;
+    }
+
+    public boolean isPageComplete() {
+        return true;
+    }
+
+    public IClasspathEntry getSelection() {
+        return classpathEntry;
+    }
+
+    public void setSelection(IClasspathEntry containerEntry) {
+        this.classpathEntry = containerEntry;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java
new file mode 100644
index 0000000..df73402
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/classpath/TuscanyRuntimeClasspathContainer.java
@@ -0,0 +1,89 @@
+/*
+ * 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.tuscany.sca.core.classpath;
+
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.feature;
+import static org.apache.tuscany.sca.core.classpath.ClasspathUtil.runtime;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+
+/**
+ * A classpath container for the Tuscany runtime.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TuscanyRuntimeClasspathContainer implements IClasspathContainer {
+    
+    public static final IPath TUSCANY_LIBRARY_CONTAINER = new Path("org.apache.tuscany.sca.runtime.library");  
+    
+    private static final String TUSCANY_HOME = "TUSCANY_HOME";
+    
+    public TuscanyRuntimeClasspathContainer() {
+    }
+
+    public IClasspathEntry[] getClasspathEntries() {
+        
+        // Find the Tuscany feature
+        IPath feature = feature();
+        
+        // Get the runtime location from the installed Tuscany feature
+        IPath runtimePath = runtime(feature);
+
+        if (runtimePath == null) {
+
+            // Try to get the location of the Tuscany binary distribution from
+            // the TUSCANY_HOME property or environment variable
+            String home = System.getProperty(TUSCANY_HOME);
+            if (home == null || home.length() == 0) {
+                home = System.getenv(TUSCANY_HOME);
+            }
+            if (home != null && home.length() != 0) {
+                if (new File(home).exists()) {
+                    runtimePath = new Path(home);
+                }
+            }
+        }
+        
+        if (runtimePath != null) {
+            return new IClasspathEntry[] {JavaCore.newLibraryEntry(runtimePath, null, null)};
+        } else {
+            return new IClasspathEntry[0];
+        }
+    }
+
+    public String getDescription() {
+        return "Tuscany Library";
+    }
+
+    public int getKind() {
+        return IClasspathContainer.K_APPLICATION;
+    }
+
+    public IPath getPath() {
+        return TUSCANY_LIBRARY_CONTAINER;
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
new file mode 100644
index 0000000..bd255f4
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/DomainManagerLauncherUtil.java
@@ -0,0 +1,255 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.TuscanyLaunchConfigurationDelegate.TUSCANY_LAUNCH_CONFIGURATIONTYPE;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+
+import org.apache.tuscany.sca.core.classpath.ClasspathUtil;
+import org.apache.tuscany.sca.core.classpath.TuscanyClasspathContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.jdt.launching.JavaRuntime;
+
+/**
+ * Provides utility methods to launch the SCA Domain Manager.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class DomainManagerLauncherUtil {
+    
+    private static final String TUSCANY_DOMAIN_LAUNCH_CONFIGURATION = "SCA Domain Manager";
+    private static final String TUSCANY_SCA_DOMAIN_PROJECT = "tuscany-sca-domain";
+
+    private static final String PING_HEADER =
+        "GET /ping HTTP/1.0\n" + "Host: localhost\n"
+            + "Content-Type: text/xml\n"
+            + "Connection: close\n"
+            + "Content-Length: ";
+    private static final String PING_CONTENT = "";
+    private static final String PING =
+        PING_HEADER + PING_CONTENT.getBytes().length + "\n\n" + PING_CONTENT;
+    
+    /**
+     * Returns the SCA domain project.
+     * 
+     * @return
+     * @throws CoreException
+     */
+    static IProject domainProject(IProgressMonitor progressMonitor) throws CoreException {
+        
+        IProject domainProject = ResourcesPlugin.getWorkspace().getRoot().getProject(TUSCANY_SCA_DOMAIN_PROJECT);
+        if (progressMonitor.isCanceled()) {
+            return domainProject;
+        }
+        if (!domainProject.exists()) {
+            progressMonitor.subTask("Creating SCA domain resources");
+            
+            // Create SCA domain project if necessary 
+            domainProject.create(new SubProgressMonitor(progressMonitor, 5));
+            domainProject.open(new SubProgressMonitor(progressMonitor, 5));
+            
+            String html = "<html>\n" +
+                "<head>\n" +
+                "<meta http-equiv=\"refresh\" content=\"0;url=http://localhost:9990/ui/home\">\n" +
+                "</head>\n" +
+                "<body>\n" +
+                "<a href=\"http://localhost:9990/ui/home\">SCA Domain</a>\n" +
+                "</body>\n" +
+                "</html>"; 
+            
+            IFile file = domainProject.getFile(new Path("domain.html"));
+            file.create(new ByteArrayInputStream(html.getBytes()), true, new SubProgressMonitor(progressMonitor, 5));
+            
+            IProjectDescription description = domainProject.getDescription();
+            String[] prevNatures= description.getNatureIds();
+            String[] newNatures= new String[prevNatures.length + 1];
+            System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+            newNatures[prevNatures.length]= JavaCore.NATURE_ID;
+            description.setNatureIds(newNatures);
+            domainProject.setDescription(description, new SubProgressMonitor(progressMonitor, 5));
+            
+            IJavaProject javaProject = JavaCore.create(domainProject);
+            javaProject.setOutputLocation(domainProject.getFullPath(), new SubProgressMonitor(progressMonitor, 5));
+            
+            IClasspathEntry classPath = JavaCore.newContainerEntry(TuscanyClasspathContainer.TUSCANY_LIBRARY_CONTAINER);
+            IClasspathEntry jrePath = JavaRuntime.getDefaultJREContainerEntry();
+            javaProject.setRawClasspath(new IClasspathEntry[] {jrePath, classPath}, new SubProgressMonitor(progressMonitor, 5));
+        
+        } else {
+            domainProject.open(new SubProgressMonitor(progressMonitor, 5));
+        }
+        
+        return domainProject;
+    }
+
+    /**
+     * Returns true if the SCA domain controller is running.
+     * 
+     * @return
+     */
+    private static boolean isDomainManagerRunning() {
+        try {
+            Socket client = new Socket("localhost", 9990);
+            OutputStream os = client.getOutputStream();
+            os.write(DomainManagerLauncherUtil.PING.getBytes());
+            os.flush();
+            String response = DomainManagerLauncherUtil.read(client);
+            if (response.indexOf("<span id=\"ping\">") != -1) {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Wait for domain to be running.
+     * 
+     * @return
+     */
+    private static boolean waitForDomainManager(IProgressMonitor progressMonitor) throws InterruptedException {
+        progressMonitor.subTask("Contacting SCA domain manager");
+        for (int i = 0; i < 40; i++) {
+            if (progressMonitor.isCanceled()) {
+                return false;
+            }
+            if (isDomainManagerRunning()) {
+                return true;
+            }
+            Thread.sleep(500);
+        }
+        return false;
+    }
+
+    static void launchDomainManager(IProgressMonitor progressMonitor) throws JavaModelException, CoreException, InterruptedException {
+        
+        progressMonitor.beginTask("Starting SCA Domain Manager", 100);
+        
+        // If the SCA domain controller is not running yet, launch it
+        if (!isDomainManagerRunning()) {
+
+            progressMonitor.subTask("Starting SCA domain manager");
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+            
+            // Get the SCA domain project
+            IProject domainProject = domainProject(progressMonitor);
+            
+            // Get the domain manager launch configuration
+            ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+            ILaunchConfigurationType launchConfigurationType =launchManager.getLaunchConfigurationType(TUSCANY_LAUNCH_CONFIGURATIONTYPE);
+            ILaunchConfiguration configuration = null;
+            for (ILaunchConfiguration c : launchManager.getLaunchConfigurations(launchConfigurationType)) {
+                if (TUSCANY_DOMAIN_LAUNCH_CONFIGURATION.equals(c.getName())) {
+                    configuration = c;
+                    break;
+                }
+            }
+            
+            if (configuration == null) {
+                progressMonitor.worked(10);
+                if (progressMonitor.isCanceled()) {
+                    return;
+                }
+    
+                // Create a new launch configuration
+                ILaunchConfigurationWorkingCopy newConfiguration = launchConfigurationType.newInstance(null, TUSCANY_DOMAIN_LAUNCH_CONFIGURATION);
+
+                // Set the project and type to launch
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, domainProject.getProject().getName());
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "org.apache.tuscany.sca.node.launcher.DomainManagerLauncher");
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, domainProject.getLocation().toString());
+                
+                // Pass the runtime classpath as a system property
+                newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "\"-DTUSCANY_PATH=" + ClasspathUtil.installedRuntimeClasspath() + "\"");
+
+                // Save the configuration
+                newConfiguration.doSave();
+
+                configuration = newConfiguration;
+            }
+
+            // Launch
+            configuration.launch(ILaunchManager.RUN_MODE, new SubProgressMonitor(progressMonitor, 20));
+            
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+            if (!waitForDomainManager(progressMonitor)) {
+                throw new RuntimeException("SCA Domain Manager could not be started.");
+            }
+        }
+        if (progressMonitor.isCanceled()) {
+            return;
+        }
+        progressMonitor.done();
+            
+    }
+
+    /**
+     * Read a String from a socket.
+     * 
+     * @param socket
+     * @return
+     * @throws IOException
+     */
+    static String read(Socket socket) throws IOException {
+        BufferedReader reader = null;
+        try {
+            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+            StringBuffer sb = new StringBuffer();
+            String str;
+            while ((str = reader.readLine()) != null) {
+                sb.append(str);
+            }
+            return sb.toString();
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
new file mode 100644
index 0000000..c9b96c7
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/NodeLauncherUtil.java
@@ -0,0 +1,244 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.domainProject;
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.launchDomainManager;
+import static org.apache.tuscany.sca.core.launch.TuscanyLaunchConfigurationDelegate.TUSCANY_LAUNCH_CONFIGURATIONTYPE;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.Socket;
+
+import org.apache.tuscany.sca.core.classpath.ClasspathUtil;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+
+/**
+ * Provides utility methods to launch SCA nodes.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class NodeLauncherUtil {
+
+    private static final String START_HEADER1 =
+        "GET /quickstart?";
+    private static final String START_HEADER2 =
+        " HTTP/1.0\n" + "Host: localhost\n"
+            + "Content-Type: text/xml\n"
+            + "Connection: close\n"
+            + "Content-Length: ";
+    private static final String START_CONTENT = "";
+
+    /**
+     * Launch an SCA node.
+     * 
+     * @param mode
+     * @param file
+     * @param launchManager
+     * @param launchConfigurationType
+     * @throws CoreException
+     * @throws JavaModelException
+     */
+    static void launchNode(String mode,
+                            IFile file,
+                            IProgressMonitor progressMonitor) throws CoreException, JavaModelException, IOException, InterruptedException {
+        progressMonitor.subTask("Starting SCA node");
+        if (progressMonitor.isCanceled()) {
+            return;
+        }
+        
+        // First start the SCA domain manager
+        launchDomainManager(new SubProgressMonitor(progressMonitor, 20));
+        
+        // Get the Java project
+        IJavaProject javaProject = JavaCore.create(file.getProject());
+        
+        // Get the contribution location and URI
+        String contributionLocation = contributionLocation(javaProject);
+        String contributionURI = contributionURI(javaProject);
+    
+        // Determine the composite file URI
+        String compositeURI = compositeURI(javaProject, file);
+        
+        // Configure the node
+        String nodeName = configureNode(contributionURI, contributionLocation, compositeURI, progressMonitor);
+    
+        // Get the node launch configuration
+        ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+        ILaunchConfigurationType launchConfigurationType =launchManager.getLaunchConfigurationType(TUSCANY_LAUNCH_CONFIGURATIONTYPE);
+        ILaunchConfiguration configuration = null;
+        for (ILaunchConfiguration c : launchManager.getLaunchConfigurations(launchConfigurationType)) {
+            if (file.getFullPath().toString().equals(c.getAttribute("COMPOSITE_PATH", ""))) {
+                configuration = c;
+                break;
+            }
+        }
+        
+        if (configuration == null) {
+            progressMonitor.worked(10);
+            if (progressMonitor.isCanceled()) {
+                return;
+            }
+
+            // Create a new launch configuration
+            ILaunchConfigurationWorkingCopy newConfiguration = launchConfigurationType.newInstance(null,
+                                        launchManager.generateUniqueLaunchConfigurationNameFrom(file.getName()));
+
+            // Set the project and type to launch
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, file.getProject().getName());
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "org.apache.tuscany.sca.node.launcher.NodeLauncher");
+
+            // Pass the URL of the node install image to the launcher
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
+                                       "http://localhost:9990/node-config/" + nodeName);
+            
+            // Save the composite path in the launch configuration
+            newConfiguration.setAttribute("COMPOSITE_PATH", file.getFullPath().toString());
+
+            // Pass the runtime classpath as a system property
+            newConfiguration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "\"-DTUSCANY_PATH=" + ClasspathUtil.installedRuntimeClasspath() + "\"");
+
+            // Save the configuration
+            newConfiguration.doSave();
+
+            configuration = newConfiguration;
+        }
+
+        // Launch
+        configuration.launch(mode, null);
+    }
+
+    /**
+     * Returns the location of the SCA contribution representing a Java project. 
+     * @param javaProject
+     * @return
+     * @throws MalformedURLException
+     * @throws JavaModelException
+     */
+    private static String contributionLocation(IJavaProject javaProject) throws MalformedURLException, JavaModelException {
+        IPath location = javaProject.getOutputLocation();
+        IResource resource;
+        if (location.segmentCount() == 1) {
+            resource = javaProject.getProject();
+        } else {
+            resource = javaProject.getProject().getWorkspace().getRoot().getFolder(location);
+        }
+        location = resource.getLocation();
+        String url = location.toFile().toURI().toURL().toString();
+        if (url.endsWith("/")) {
+            url = url.substring(0, url.length() - 1);
+        }
+        return url;
+    }
+
+    /**
+     * Returns the URI of the SCA contribution representing a Java project. 
+     * @param javaProject
+     * @return
+     */
+    private static String contributionURI(IJavaProject javaProject) {
+        return javaProject.getProject().getName();
+    }
+
+    /**
+     * Returns the SCA artifact URI of a composite file inside a Java project.
+     * 
+     * @param javaProject
+     * @param file
+     * @return
+     * @throws JavaModelException
+     */
+    private static String compositeURI(IJavaProject javaProject, IFile file) throws JavaModelException {
+    
+        // Find the Java source container containing the specified file
+        IClasspathEntry[] classpathEntries = javaProject.getRawClasspath();
+        int sourceFolderSegments = 0;
+        for (IClasspathEntry entry : classpathEntries) {
+            if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+                sourceFolderSegments = entry.getPath().matchingFirstSegments(file.getFullPath());
+                if (sourceFolderSegments > 0)
+                    break;
+            }
+        }
+    
+        // Determine the composite URI
+        String compositeURI = file.getFullPath().removeFirstSegments(sourceFolderSegments).toString();
+        return compositeURI;
+    }
+
+    /**
+     * Send a request to the SCA domain manager to configure an SCA node for
+     * the specified composite.
+     *  
+     * @param contributionURI
+     * @param contributionLocation
+     * @param compositeURI
+     * @return
+     * @throws IOException
+     */
+    private static String configureNode(String contributionURI, String contributionLocation, String compositeURI,
+                                        IProgressMonitor progressMonitor) throws IOException, CoreException {
+        progressMonitor.subTask("Configuring node");
+        
+        // Send the request to configure the node
+        Socket client = new Socket("localhost", 9990);
+        OutputStream os = client.getOutputStream();
+        String request = START_HEADER1 +
+            "contribution=" + contributionURI + "&location=" + contributionLocation + "&composite=" + compositeURI +
+            START_HEADER2 + START_CONTENT.getBytes().length + "\n\n" + START_CONTENT;
+        os.write(request.getBytes());
+        os.flush();
+        String response = DomainManagerLauncherUtil.read(client);
+        
+        // Refresh the domain project
+        domainProject(progressMonitor).refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+        
+        int i = response.indexOf("<span id=\"node\">");
+        if (i != -1) {
+            
+            // Extract the node name
+            response = response.substring(i + 16);
+            i = response.indexOf("</span>");
+            String nodeName = response.substring(0, i);
+            return nodeName;
+            
+        } else {
+            throw new RuntimeException("Node could not be configured: " + response);
+        }
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
new file mode 100644
index 0000000..ddcfb66
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationDelegate.java
@@ -0,0 +1,75 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
+import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
+import org.eclipse.jdt.launching.ExecutionArguments;
+import org.eclipse.jdt.launching.IVMInstall;
+import org.eclipse.jdt.launching.IVMRunner;
+import org.eclipse.jdt.launching.VMRunnerConfiguration;
+
+/**
+ * Launch configuration delegate for the Tuscany launch configuration.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate implements
+    ILaunchConfigurationDelegate {
+
+    public static final String TUSCANY_LAUNCH_CONFIGURATIONTYPE = "org.apache.tuscany.sca.core.launch.configurationtype";
+
+    public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor)
+        throws CoreException {
+
+        // Verify the configuration
+        String mainTypeName = verifyMainTypeName(configuration);
+        IVMInstall vm = verifyVMInstall(configuration);
+        IVMRunner runner = vm.getVMRunner(mode);
+
+        ExecutionArguments execArgs =
+            new ExecutionArguments(getVMArguments(configuration), getProgramArguments(configuration));
+        Map vmAttributesMap = getVMSpecificAttributesMap(configuration);
+        String[] classpath = getClasspath(configuration);
+
+        File workingDir = verifyWorkingDirectory(configuration);
+        String workingDirName = null;
+        if (workingDir != null)
+            workingDirName = workingDir.getAbsolutePath();
+
+        // Create a VM runner configuration
+        VMRunnerConfiguration runConfig = new VMRunnerConfiguration(mainTypeName, classpath);
+        runConfig.setProgramArguments(execArgs.getProgramArgumentsArray());
+        runConfig.setVMArguments(execArgs.getVMArgumentsArray());
+        runConfig.setVMSpecificAttributesMap(vmAttributesMap);
+        runConfig.setWorkingDirectory(workingDirName);
+        runConfig.setBootClassPath(getBootpath(configuration));
+
+        // Run!!
+        runner.run(runConfig, launch, monitor);
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java
new file mode 100644
index 0000000..738fe26
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchConfigurationTabGroup.java
@@ -0,0 +1,48 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.EnvironmentTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.debug.ui.ILaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
+
+/**
+ * Tab groups from the Tuscany launch configuration.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLaunchConfigurationTabGroup extends AbstractLaunchConfigurationTabGroup implements
+    ILaunchConfigurationTabGroup {
+
+    public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+        ILaunchConfigurationTab[] tabs =
+            new ILaunchConfigurationTab[] {new JavaArgumentsTab(), new JavaJRETab(), new JavaClasspathTab(),
+                                           new SourceLookupTab(), new EnvironmentTab(), new CommonTab()};
+
+        setTabs(tabs);
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
new file mode 100644
index 0000000..895cde6
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchDomainManagerAction.java
@@ -0,0 +1,79 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.DomainManagerLauncherUtil.launchDomainManager;
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * Launch the SCA DomainManager.
+ * 
+ * @version $Rev: $ $Date: $
+ */
+public class TuscanyLaunchDomainManagerAction implements IWorkbenchWindowActionDelegate {
+    
+    private IWorkbenchWindow window;
+
+    public TuscanyLaunchDomainManagerAction() {
+    }
+
+    public void run(IAction action) {
+
+        try {
+            
+            // Run with a progress monitor
+            window.run(true, true, new IRunnableWithProgress() {
+
+                public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
+                    try {
+                        
+                        launchDomainManager(progressMonitor);
+                            
+                    } catch (Exception e) {
+                        throw new InvocationTargetException(e);
+                    } finally {
+                        progressMonitor.done();
+                    }
+                }
+            });
+
+        } catch (Exception e) {
+            error("Could not launch SCA Domain Manager", e);
+        }
+    }
+
+    public void selectionChanged(IAction action, ISelection selection) {
+    }
+
+    public void dispose() {
+    }
+
+    public void init(IWorkbenchWindow window) {
+        this.window = window;
+    }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java
new file mode 100644
index 0000000..c5aeefb
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeFilter.java
@@ -0,0 +1,29 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+/**
+ * TuscanyLaunchNodeFilter
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class TuscanyLaunchNodeFilter {
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
new file mode 100644
index 0000000..94ab29c
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/launch/TuscanyLaunchNodeShortcut.java
@@ -0,0 +1,88 @@
+/*
+ * 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.tuscany.sca.core.launch;
+
+import static org.apache.tuscany.sca.core.launch.NodeLauncherUtil.launchNode;
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.ui.ILaunchShortcut;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A launch shortcut for SCA .composite files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class TuscanyLaunchNodeShortcut implements ILaunchShortcut {
+    
+    public void launch(final ISelection selection, final String mode) {
+
+        try {
+            
+            // Make sure we have a .composite file selected
+            if (!(selection instanceof IStructuredSelection)) {
+                return;
+            }
+            Object[] selections = ((IStructuredSelection)selection).toArray();
+            if (selections.length == 0) {
+                return;
+            }
+            final IFile file = (IFile)selections[0];
+            if (!file.getFileExtension().equals("composite")) {
+                return;
+            }
+            
+            // Run with a progress monitor
+            PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(true, true, new IRunnableWithProgress() {
+
+                public void run(IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException {
+                    try {
+                        progressMonitor.beginTask("Starting SCA Composite", 100);
+                        
+                        launchNode(mode, file, progressMonitor);
+                        
+                        progressMonitor.done();
+                            
+                    } catch (Exception e) {
+                        throw new InvocationTargetException(e);
+                    } finally {
+                        progressMonitor.done();
+                    }
+                }
+            });
+
+        } catch (Exception e) {
+            error("Could not launch SCA composite", e);
+        }
+    }
+
+    public void launch(IEditorPart editor, String mode) {
+        //TODO later...
+    }
+    
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java
new file mode 100644
index 0000000..3bbdc81
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/log/LogUtil.java
@@ -0,0 +1,39 @@
+/*
+ * 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.tuscany.sca.core.log;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+/**
+ * A log utility
+ *
+ * @version $Rev: $ $Date: $
+ */
+public class LogUtil {
+    
+    public static void error(String msg, Exception e) {
+        Platform.getLog(
+                        Platform.getBundle("org.apache.tuscany.sca.core")).log(
+                        new Status(IStatus.ERROR, "org.apache.tuscany.sca.core", IStatus.OK, msg, e));
+    }
+
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java
new file mode 100644
index 0000000..09b800f
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizard.java
@@ -0,0 +1,53 @@
+/*
+ * 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.tuscany.sca.core.newwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWizard;
+
+/**
+ * A wizard to create new .componentType files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewComponentTypeWizard extends Wizard implements IWorkbenchWizard {
+
+	private IWorkbench workbench;
+	private IStructuredSelection selection;
+	private NewComponentTypeWizardPage mainPage;
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+	      this.workbench = workbench;
+	      this.selection = selection;
+	      setWindowTitle("New SCA ComponentType");
+	}
+	
+	public void addPages() {
+		mainPage = new NewComponentTypeWizardPage(workbench, selection);
+		addPage(mainPage);
+	}	
+	
+	@Override
+	public boolean performFinish() {
+		return mainPage.finish();
+	}
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java
new file mode 100644
index 0000000..53b9607
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewComponentTypeWizardPage.java
@@ -0,0 +1,98 @@
+/*
+ * 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.tuscany.sca.core.newwizards;
+
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Wizard page for the new .componentType file wizard.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewComponentTypeWizardPage extends WizardNewFileCreationPage {
+        
+        private IWorkbench workbench;
+
+        public NewComponentTypeWizardPage(IWorkbench workbench, IStructuredSelection selection)  {
+                super("New SCA ComponentType Page", selection);
+                
+                this.workbench = workbench;
+                
+                setTitle("SCA ComponentType");
+                setDescription("Create a new SCA ComponentType.");
+                
+                try {
+                        String location = FileLocator.toFileURL(Platform.getBundle("org.apache.tuscany.sca.core").getEntry("/")).getFile().toString();
+                        setImageDescriptor(ImageDescriptor.createFromImageData((new ImageLoader()).load(location + "/icons/tuscany.gif")[0]));
+                } catch (Exception e) {
+                    error("Could not create wizard", e);
+                }
+                
+                setFileName("sample.componentType");
+                
+        }
+        
+        public boolean finish() {
+                try {
+                        IFile file = createNewFile();
+                        
+            IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+                IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                IDE.openEditor(workbenchPage, file, true);
+                } catch (Exception e) {
+                    error("Could not open editor", e);
+                    return false;
+                }
+                return true;
+        }
+
+        @Override
+        protected InputStream getInitialContents() {
+                
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                PrintWriter printWriter = new PrintWriter(outputStream);
+                printWriter.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+                printWriter.println("<componentType xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\">");        
+                printWriter.println();
+                printWriter.println();
+                printWriter.println("</componentType>");
+                printWriter.close();
+                
+                return new ByteArrayInputStream(outputStream.toByteArray());
+        }
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java
new file mode 100644
index 0000000..f07f0b6
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizard.java
@@ -0,0 +1,53 @@
+/*
+ * 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.tuscany.sca.core.newwizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWizard;
+
+/**
+ * A wizard to create new .composite files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewCompositeWizard extends Wizard implements IWorkbenchWizard {
+	
+	private IWorkbench workbench;
+	private IStructuredSelection selection;
+	private NewCompositeWizardPage mainPage;
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+	      this.workbench = workbench;
+	      this.selection = selection;
+	      setWindowTitle("New SCA Composite");
+	}
+	
+	public void addPages() {
+		mainPage = new NewCompositeWizardPage(workbench, selection);
+		addPage(mainPage);
+	}	
+	
+	@Override
+	public boolean performFinish() {
+		return mainPage.finish();
+	}
+}
diff --git a/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java
new file mode 100644
index 0000000..bbca961
--- /dev/null
+++ b/tools/eclipse/plugins/core/src/main/java/org/apache/tuscany/sca/core/newwizards/NewCompositeWizardPage.java
@@ -0,0 +1,105 @@
+/*
+ * 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.tuscany.sca.core.newwizards;
+
+import static org.apache.tuscany.sca.core.log.LogUtil.error;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintWriter;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Wizard page for the new .composite file wizard.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NewCompositeWizardPage extends WizardNewFileCreationPage {
+        
+        private IWorkbench workbench;
+
+        public NewCompositeWizardPage(IWorkbench workbench, IStructuredSelection selection)  {
+                super("New SCA Composite Page", selection);
+                
+                this.workbench = workbench;
+                
+                setTitle("SCA Composite");
+                setDescription("Create a new SCA Composite.");
+                
+                try {
+                        String location = FileLocator.toFileURL(Platform.getBundle("org.apache.tuscany.sca.core").getEntry("/")).getFile().toString();
+                        setImageDescriptor(ImageDescriptor.createFromImageData((new ImageLoader()).load(location + "/icons/tuscany.gif")[0]));
+                } catch (Exception e) {
+                    error("Could not create wizard", e);
+                }
+                
+                setFileName("sample.composite");
+                
+        }
+        
+        public boolean finish() {
+                try {
+                        IFile file = createNewFile();
+                        
+            IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+                IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                IDE.openEditor(workbenchPage, file, true);
+                } catch (Exception e) {
+                    error("Could not open editor", e);
+                        return false;
+                }
+                return true;
+        }
+
+        @Override
+        protected InputStream getInitialContents() {
+
+                IPath path = new Path(getFileName());
+                String name = path.removeFileExtension().toString();
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                PrintWriter printWriter = new PrintWriter(outputStream);
+                printWriter.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");              
+                printWriter.println("<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.0\"");
+                printWriter.println("    xmlns:c=\"http://" + name + "\"");     
+                printWriter.println("    targetNamespace=\"http://" + name + "\"");      
+                printWriter.println("    name=\"" + name + "\">");
+                printWriter.println();
+                printWriter.println();
+                printWriter.println("</composite>");
+                printWriter.close();
+                
+                return new ByteArrayInputStream(outputStream.toByteArray());
+        }
+}
