diff --git a/core/plugins/org.eclipse.dltk.debug.ui/.classpath b/core/plugins/org.eclipse.dltk.debug.ui/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/.cvsignore b/core/plugins/org.eclipse.dltk.debug.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/.project b/core/plugins/org.eclipse.dltk.debug.ui/.project
new file mode 100644
index 0000000..b21431c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.dltk.debug.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/META-INF/MANIFEST.MF b/core/plugins/org.eclipse.dltk.debug.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7585d16
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.dltk.debug.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin
+Bundle-Vendor: %pluginProvider
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.debug.ui,
+ org.eclipse.debug.core,
+ org.eclipse.core.resources,
+ org.eclipse.ui.ide,
+ org.eclipse.core.variables,
+ org.eclipse.dltk.core,
+ org.eclipse.dltk.ui,
+ org.eclipse.dltk.debug,
+ org.eclipse.dltk.launching,
+ com.ibm.icu,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.editors,
+ org.eclipse.jface.text,
+ org.eclipse.ui.console
+Eclipse-LazyStart: true
+Export-Package: org.eclipse.dltk.debug.ui,
+ org.eclipse.dltk.debug.ui.actions,
+ org.eclipse.dltk.debug.ui.launchConfigurations,
+ org.eclipse.dltk.debug.ui.messages,
+ org.eclipse.dltk.internal.debug.ui,
+ org.eclipse.dltk.internal.debug.ui.interpreters,
+ org.eclipse.dltk.internal.debug.ui.launcher
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/build.properties b/core/plugins/org.eclipse.dltk.debug.ui/build.properties
new file mode 100644
index 0000000..b5f960f
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               icons/,\
+               plugin.properties,\
+               schema/
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/Thumbs.db
new file mode 100644
index 0000000..8584de4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/constant_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/constant_co.gif
new file mode 100644
index 0000000..5812de9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/constant_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/deadlock_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/deadlock_view.gif
new file mode 100644
index 0000000..3e992f0
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/deadlock_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/exc_catch.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/exc_catch.gif
new file mode 100644
index 0000000..0944ffd
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/exc_catch.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/final_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/final_co.gif
new file mode 100644
index 0000000..4a538a3
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/final_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/monitor_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/monitor_view.gif
new file mode 100644
index 0000000..ba6a24b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/monitor_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/resume_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/resume_co.gif
new file mode 100644
index 0000000..8652797
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/resume_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/sethitcount_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/sethitcount_co.gif
new file mode 100644
index 0000000..9b468bb
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/sethitcount_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/static_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/static_co.gif
new file mode 100644
index 0000000..7660151
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/static_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/suspend_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/suspend_co.gif
new file mode 100644
index 0000000..e47777b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/suspend_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/thread_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/thread_view.gif
new file mode 100644
index 0000000..03ad783
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dlcl16/thread_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/Thumbs.db
new file mode 100644
index 0000000..74c4460
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/debug_exc.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/debug_exc.gif
new file mode 100644
index 0000000..6434db2
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/debug_exc.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/disp_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/disp_sbook.gif
new file mode 100644
index 0000000..42005c9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/disp_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/insp_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/insp_sbook.gif
new file mode 100644
index 0000000..d460ddd
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/insp_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_app.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_app.gif
new file mode 100644
index 0000000..cde1640
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_app.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_applet.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_applet.gif
new file mode 100644
index 0000000..1b4b282
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_applet.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_attach.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_attach.gif
new file mode 100644
index 0000000..45c7532
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/java_attach.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_exc.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_exc.gif
new file mode 100644
index 0000000..a252bf0
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_exc.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_sbook.gif
new file mode 100644
index 0000000..5c8aa53
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/run_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/term_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/term_sbook.gif
new file mode 100644
index 0000000..4f3dcba
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/term_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/watch_exp.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/watch_exp.gif
new file mode 100644
index 0000000..38f60cd
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/dtool16/watch_exp.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/Thumbs.db
new file mode 100644
index 0000000..9242f76
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/constant_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/constant_co.gif
new file mode 100644
index 0000000..5397588
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/constant_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/deadlock_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/deadlock_view.gif
new file mode 100644
index 0000000..8e3d48a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/deadlock_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/exc_catch.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/exc_catch.gif
new file mode 100644
index 0000000..96de5ff
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/exc_catch.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/final_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/final_co.gif
new file mode 100644
index 0000000..7b406f3
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/final_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/monitor_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/monitor_view.gif
new file mode 100644
index 0000000..e3ecc55
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/monitor_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/resume_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/resume_co.gif
new file mode 100644
index 0000000..16f4e25
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/resume_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/sethitcount_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/sethitcount_co.gif
new file mode 100644
index 0000000..1132786
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/sethitcount_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/static_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/static_co.gif
new file mode 100644
index 0000000..8803755
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/static_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/suspend_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/suspend_co.gif
new file mode 100644
index 0000000..161e3f5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/suspend_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/thread_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/thread_view.gif
new file mode 100644
index 0000000..9ac596d
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/elcl16/thread_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/Thumbs.db
new file mode 100644
index 0000000..8183de8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/debug_exc.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/debug_exc.gif
new file mode 100644
index 0000000..afe775b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/debug_exc.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/disp_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/disp_sbook.gif
new file mode 100644
index 0000000..5dbbebf
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/disp_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/insp_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/insp_sbook.gif
new file mode 100644
index 0000000..a4548c5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/insp_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_app.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_app.gif
new file mode 100644
index 0000000..a42a7c8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_app.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_applet.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_applet.gif
new file mode 100644
index 0000000..e235b45
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_applet.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_attach.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_attach.gif
new file mode 100644
index 0000000..3c42f63
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/java_attach.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_exc.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_exc.gif
new file mode 100644
index 0000000..57f4102
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_exc.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_sbook.gif
new file mode 100644
index 0000000..ffcef16
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/run_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/term_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/term_sbook.gif
new file mode 100644
index 0000000..69c31f4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/term_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/watch_exp.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/watch_exp.gif
new file mode 100644
index 0000000..d37495a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/etool16/watch_exp.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/Thumbs.db
new file mode 100644
index 0000000..868d942
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/thread_and_monitor_view.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/thread_and_monitor_view.gif
new file mode 100644
index 0000000..0a1fa96
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/thread_and_monitor_view.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/variable_tab.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/variable_tab.gif
new file mode 100644
index 0000000..e35f594
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/eview16/variable_tab.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/Thumbs.db
new file mode 100644
index 0000000..8868810
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/brkpi_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/brkpi_obj.gif
new file mode 100644
index 0000000..21036fe
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/brkpi_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/class_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/class_obj.gif
new file mode 100644
index 0000000..e4c2a83
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/class_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/classpath_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/classpath_obj.gif
new file mode 100644
index 0000000..671f1b5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/classpath_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/contended_monitor_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/contended_monitor_obj.gif
new file mode 100644
index 0000000..7758fc5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/contended_monitor_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/envvar_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/envvar_obj.gif
new file mode 100644
index 0000000..bf043f9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/envvar_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/insp_sbook.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/insp_sbook.gif
new file mode 100644
index 0000000..d8d7fad
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/insp_sbook.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jar_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jar_obj.gif
new file mode 100644
index 0000000..2fa1d77
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jar_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexcept_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexcept_obj.gif
new file mode 100644
index 0000000..812a927
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexcept_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexception_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexception_obj.gif
new file mode 100644
index 0000000..f72a715
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexception_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexceptiond_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexceptiond_obj.gif
new file mode 100644
index 0000000..4c28e7c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jexceptiond_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jline_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jline_obj.gif
new file mode 100644
index 0000000..5456ce2
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jline_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jload_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jload_obj.gif
new file mode 100644
index 0000000..8c64db6
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jload_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jmeth_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jmeth_obj.gif
new file mode 100644
index 0000000..8d1142a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jmeth_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jrtexception_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jrtexception_obj.gif
new file mode 100644
index 0000000..3b3028e
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jrtexception_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_obj.gif
new file mode 100644
index 0000000..772b363
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_run_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_run_obj.gif
new file mode 100644
index 0000000..8f7d005
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jsbook_run_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jspbrkpt_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jspbrkpt_obj.gif
new file mode 100644
index 0000000..1f4ec30
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jspbrkpt_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jwatch_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jwatch_obj.gif
new file mode 100644
index 0000000..7d1ece1
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/jwatch_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/library_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/library_obj.gif
new file mode 100644
index 0000000..cb55e33
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/library_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/localvariable_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/localvariable_obj.gif
new file mode 100644
index 0000000..3244b26
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/localvariable_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/monitor_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/monitor_obj.gif
new file mode 100644
index 0000000..e3ecc55
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/monitor_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/owned_monitor_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/owned_monitor_obj.gif
new file mode 100644
index 0000000..57fb95e
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/owned_monitor_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/package_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/package_obj.gif
new file mode 100644
index 0000000..131c28d
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/package_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/prj_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/prj_obj.gif
new file mode 100644
index 0000000..a4ea580
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/prj_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_and_monitor_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_and_monitor_obj.gif
new file mode 100644
index 0000000..e7ec2a1
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_and_monitor_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_obj.gif
new file mode 100644
index 0000000..b8ca14a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/thread_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/threadgroup_obj.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/threadgroup_obj.gif
new file mode 100644
index 0000000..18ffabe
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/obj16/threadgroup_obj.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/Thumbs.db
new file mode 100644
index 0000000..c05ac0e
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr.gif
new file mode 100644
index 0000000..02de6e8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr_disabled.gif
new file mode 100644
index 0000000..73d6454
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/caught_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr.gif
new file mode 100644
index 0000000..de7a274
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr_disabled.gif
new file mode 100644
index 0000000..81f44c8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/conditional_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contention_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contention_ovr.gif
new file mode 100644
index 0000000..d83704b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contention_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contentionformonitor_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contentionformonitor_ovr.gif
new file mode 100644
index 0000000..c59c8f8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/contentionformonitor_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/deadlock_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/deadlock_ovr.gif
new file mode 100644
index 0000000..4499ad0
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/deadlock_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr.gif
new file mode 100644
index 0000000..f35215a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr_disabled.gif
new file mode 100644
index 0000000..c3c0be9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/entry_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/error_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/error_co.gif
new file mode 100644
index 0000000..119dccc
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/error_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr.gif
new file mode 100644
index 0000000..a1f28ad
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr_disabled.gif
new file mode 100644
index 0000000..98fc222
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/exit_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr.gif
new file mode 100644
index 0000000..0e6b414
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr_disabled.gif
new file mode 100644
index 0000000..c276ace
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/installed_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/owned_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/owned_ovr.gif
new file mode 100644
index 0000000..ef582a5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/owned_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/ownsmonitor_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/ownsmonitor_ovr.gif
new file mode 100644
index 0000000..29dc4b2
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/ownsmonitor_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr.gif
new file mode 100644
index 0000000..5b97523
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr_disabled.gif
new file mode 100644
index 0000000..50d9082
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/scoped_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/sync_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/sync_ovr.gif
new file mode 100644
index 0000000..5893bda
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/sync_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr.gif
new file mode 100644
index 0000000..6c06996
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr_disabled.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr_disabled.gif
new file mode 100644
index 0000000..a631734
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/uncaught_ovr_disabled.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/warning_co.gif b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/warning_co.gif
new file mode 100644
index 0000000..ee2dac4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/ovr16/warning_co.gif
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/Thumbs.db b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/Thumbs.db
new file mode 100644
index 0000000..893632c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/Thumbs.db
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_app_wiz.png b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_app_wiz.png
new file mode 100644
index 0000000..d2ebfe3
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_app_wiz.png
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_attach_wiz.png b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_attach_wiz.png
new file mode 100644
index 0000000..3ec71ff
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/java_attach_wiz.png
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/library_wiz.png b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/library_wiz.png
new file mode 100644
index 0000000..705dc30
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/library_wiz.png
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/newsbook_wiz.png b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/newsbook_wiz.png
new file mode 100644
index 0000000..db5c70c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/icons/full/wizban/newsbook_wiz.png
Binary files differ
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/plugin.properties b/core/plugins/org.eclipse.dltk.debug.ui/plugin.properties
new file mode 100644
index 0000000..8ee108a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/plugin.properties
@@ -0,0 +1,342 @@
+pluginProvider=Eclipse.org
+pluginName=Dynamic Languages Toolkit Debug UI
+
+accessAction.label=&Access
+BreakpointsView.name=Breakpoints
+ConsoleColorProvidersExtensionName= Console Color Providers
+ConsoleFont.description= The font used by the debug console.
+ConsoleFont.label= Console font
+ConsoleLineTrackersExtensionName= Console Line Trackers
+LaunchingPreferencePage.name=Launching
+ViewManagementPreferencePage.name=View Management
+ConsolePreferencePage.name=Console
+DebugModelContextBindingsName=Debug Model Context Bindings
+ContextViewBindingsName=Context View Bindings
+BreakpointOrganizersName=Breakpoint Organizers
+VariableValueEditorsName=Variable Value Editors
+
+BreakpointActionSet.label=Breakpoints
+CollapseAll.label=Collapse All
+CollapseAll.tooltip= Collapse All
+CopyToClipboardAction.label=&Copy Stack
+CopyVariablesToClipboardAction.label=Copy &Variables
+CopyExpressionsToClipboardAction.label=Copy &Expressions
+CopyRegistersToClipboardAction.label=Copy &Registers
+DebugActionSet.label=Debug
+debugCurrentInstructionPointer=Debug Current Instruction Pointer
+debugCallStack=Debug Call Stack
+DebugDropDownAction.label=Debug
+DebugHistoryMenuAction.label=Debug &History
+DebugLastAction.label=&Debug Last Launched
+DebugLaunchGroup.label=Debu&g
+DebugLaunchGroup.title=Select or configure an application to debug
+DebugModelPresentationExtensionName=Debug Model Presentation
+
+DebugPerspective.name=Debug
+DebugPerspective.description=This Debug perspective is designed to support application debugging.  It incorporates views for displaying the debug stack, variables and breakpoint management.
+
+command.openDebugPerspective.description = Open the debug perspective
+DebugPreferencePage.name=Run/Debug
+DebugView.name=Debug
+DebugViewsCategory.name=Debug
+DebugWithConfigurationAction.label=Debu&g As
+DetailPaneFontDefinition.label=Detail pane text font
+DetailPaneFontDefinition.description=The detail pane text font is used in the detail panes of debug views.
+DisableBreakpointsAction.label=&Disable
+EnableBreakpointsAction.label=&Enable
+ExpandAll.label=Expand All
+ExpandAll.tooltip=Expand All
+ExpressionView.name=Expressions
+GroupBy.label=&Group By
+GroupBy.tooltip=Show
+LinkWithDebugView.label=Link with Debug View
+LinkWithDebugView.tooltip=Link with Debug View
+LaunchActionSet.label=Launch
+LaunchConfigurationTabGroupExtensionName=Launch Configuration Tab Group
+LaunchShortcutsName=Launch Shortcut
+LaunchConfigurationTypeImageExtensionName=Launch Configuration Type Image 
+LaunchGroupsExtensionName=Launch Groups
+modificationAction.label=&Modification
+OpenDebugConfigurations.label=De&bug...
+OpenRunConfigurations.label=Ru&n...
+OpenProfileConfigurations.label=&Profile...
+processPropertyPageName=Process Information
+ProfileLaunchGroup.label=&Profile
+ProfileLaunchGroup.title=Select or configure an application to profile
+ProfileDropDownAction.label=Profile
+ProfileWithConfigurationAction.label=Pro&file As
+ProfileHistoryMenuAction.label=Profile Histor&y
+ProfileLastAction.label=Profi&le Last Launched
+ProfileActionSet.label=Profile
+RegistersView.name=Registers
+RelaunchAction.label=Re&launch
+RemoveAction.label=Rem&ove
+RemoveAllAction.label=Remove A&ll
+RemoveAllBreakpointsAction.label=Remo&ve All Breakpoints
+RemoveAllBreakpointsAction.tooltip=Remove All Breakpoints
+RemoveAllExpressionsAction.tooltip=Remove All Expressions
+RemoveAllTerminatedAction.label=Remove &All Terminated
+RemoveAllTerminatedAction.tooltip=Remove All Terminated Launches
+RemoveBreakpointAction.tooltip=Remove Selected Breakpoints
+RemoveExpressionAction.tooltip=Remove Selected Expressions
+ResumeAction.label=Resu&me
+RunDropDownAction.label=&Run
+RunMenu.label=&Run
+RunLastAction.label=&Run Last Launched
+RunLaunchGroup.label=Ru&n
+RunLaunchGroup.title=Select or configure an application to run
+RunHistoryMenuAction.label=Run His&tory
+RunWithConfigurationAction.label=Run A&s
+RunToLine.label=Run to &Line
+SelectAll.label=Select &All
+StepWithFiltersAction.label=Use Step &Filters
+StepWithFiltersAction.tooltip=Use Step Filters/Step Debug
+StepIntoAction.label=Step &Into
+StepOverAction.label=Step &Over
+StepReturnAction.label=Step Ret&urn
+StringVariablePresentationsName=String Variable Presentations
+SuspendAction.label=&Suspend
+TerminateAction.label=&Terminate
+ToggleBreakpointAction.label=Toggle Line Brea&kpoint
+ToggleMethodBreakpointAction.label=Toggle &Method Breakpoint
+ToggleWatchpointAction.label=Toggle &Watchpoint
+VariablesView.name=Variables
+StringVariablePreferencePage.name=String Substitution
+ToggleMemoryMonitorsPaneAction.name = Toggle Memory Monitors Pane
+ToggleSplitPaneAction.name = Toggle Split Pane
+LinkRenderingPanesAction.name = Link Memory Rendering Panes
+AddRemoveRenderingMenu.name = Add/Remove Rendering
+AddRenderingAction.name = Add Rendering
+RemoveRenderingAction.name = Remove Rendering
+PerspectivePreferencePage.name = Perspectives
+LaunchConfigurationsPage.name = Launch Configurations
+
+#string substitution variables
+string_prompt.description=Returns the text value entered into a prompt dialog. When one argument is provided, it is used as a prompt hint on the input dialog. When a second argument is provided, it is used as an initial value in the input dialog. The first and second arguments must be separated with a ':'.
+file_prompt.description=Returns the absolute file system path of a file chosen in a file selection dialog. When one argument is provided, it is used a prompt hint on the dialog title. When a second argument is provided, it is used as an initial value for the file selection dialog. The first and second arguments must be separated with a ':'.
+folder_prompt.description=Returns the absolute file system path of a directory chosen in a directory selection dialog. When one argument is provided, it is used a prompt hint on the dialog title. When a second argument is provided, it is used as an initial value for the directory selection dialog. The first and second arguments must be separated with a ':'.
+container_loc.description=Returns the absolute file system path of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+container_path.description=Returns the workspace relative path of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+container_name.description=Returns the name of a resource's container. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+project_loc.description=Returns the absolute file system path of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+project_path.description=Returns the workspace relative path of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+project_name.description=Returns the name of a resource's project. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+resource_loc.description=Returns the absolute file system path of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+resource_path.description=Returns the workspace relative path of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+resource_name.description=Returns the name of a resource. The target resource is the selected resource when no argument is specified, or the resource identified by a workspace relative path.
+workspace_loc.description=Returns the absolute file system path of the workspace root. When an argument is specified, the absolute file system path of the resource identified by a workspace relative path is returned.
+selected_text.description=Returns the text currently selected in the active editor.
+
+pluginProvider=Eclipse.org
+
+runCategory.name= Run/Debug
+runCategory.description= Run/Debug command category
+
+NoSourceFoundEditor.name= No Source Found
+
+DetailPaneWordWrapAction.label=&Wrap Text in Details Pane
+DetailPaneWordWrapAction.tooltip=Wrap text in the Details pane
+DetailPaneMaxLengthAction.label=&Detail Pane...
+DetailPaneMaxLengthAction.tooltip=Configure detail pane settings
+
+Context.debugging.description= Debugging Programs
+Context.debugging.name= Debugging
+
+Context.console.description= In Console
+Context.console.name= In Console
+
+Context.memoryview.description = In Memory View
+Context.memoryview.name = In Memory View
+
+ActionDefinition.eof.name= EOF
+ActionDefinition.eof.description= Send end of file
+
+ActionDefinition.addMemoryBlock.name= Add Memory Block
+ActionDefinition.addMemoryBlock.description=Add Memory block
+
+ActionDefinition.toggleStepFilters.name= Toggle Step Filters
+ActionDefinition.toggleStepFilters.description= Toggles enablement of debug step filters
+
+ActionDefinition.stepInto.name= Step Into
+ActionDefinition.stepInto.description= Step into
+
+ActionDefinition.stepOver.name= Step Over
+ActionDefinition.stepOver.description= Step over
+
+ActionDefinition.stepReturn.name= Step Return
+ActionDefinition.stepReturn.description= Step return
+
+ActionDefinition.resume.name=Resume
+ActionDefinition.resume.description=Resume
+
+
+ActionDefinition.runToLine.name=Run to Line
+ActionDefinition.runToLine.description=Resume and break when execution reaches the current line
+
+ActionDefinition.terminate.name=Terminate
+ActionDefinition.terminate.description=Terminate
+
+ActionDefinition.terminateAndRelaunch.name=Terminate and Relaunch
+ActionDefinition.terminateAndRelaunch.description=Terminate and Relaunch
+
+ActionDefinition.toggleBreakpoint.name=Toggle Line Breakpoint
+ActionDefinition.toggleBreakpoint.description=Creates or removes a line breakpoint
+
+ActionDefinition.suspend.name=Suspend
+ActionDefinition.suspend.description=Suspend
+
+ActionDefinition.openProfile.name=Profile...
+ActionDefinition.openProfile.description=Open profile launch configuration dialog
+
+ActionDefinition.profileLast.name=Profile Last Launched
+ActionDefinition.profileLast.description=Profile the last launch in profile mode
+
+ActionDefinition.openRun.name=Run...
+ActionDefinition.openRun.description=Open run launch configuration dialog
+
+ActionDefinition.debugLast.name=Debug Last Launched
+ActionDefinition.debugLast.description=Debug the last launch in debug mode
+
+ActionDefinition.runLast.name=Run Last Launched
+ActionDefinition.runLast.description=Relaunch the last launch in run mode
+
+ActionDefinition.openDebug.name=Debug...
+ActionDefinition.openDebug.description=Open debug launch configuration dialog
+
+
+ActionDefinition.toggleWatchpoint.name=Toggle Watchpoint
+ActionDefinition.toggleWatchpoint.description=Creates or removes a watchpoint
+
+ActionDefinition.toggleMethodBreakpoint.name=Toggle Method Breakpoint
+ActionDefinition.toggleMethodBreakpoint.description=Creates or removes a method breakpoint
+
+ActionDefinition.removeAllBreakpoints.name=Remove All Breakpoints
+ActionDefinition.removeAllBreakpoints.description=Removes all breakpoints
+
+ActionDefinition.skipAllBreakpoints.name=Skip All Breakpoints
+ActionDefinition.skipAllBreakpoints.description=Sets whether or not any breakpoint should suspend execution
+
+ViewCommand.debugView.name=Debug
+ViewCommand.debugView.description=Show the Debug view
+
+ViewCommand.breakpointView.name=Breakpoints
+ViewCommand.breakpointView.description=Show the Breakpoints view
+
+ViewCommand.variableView.name=Variables
+ViewCommand.variableView.description=Show the Variables view
+
+ViewCommand.expressionView.name=Expressions
+ViewCommand.expressionView.description=Show the Expressions view
+
+ViewCommand.registerView.name=Registers
+ViewCommand.registerView.description=Show the Registers view
+
+ViewCommand.memoryView.name=Memory
+ViewCommand.memoryView.description=Show the Memory view
+
+SkipAllBreakpointsAction.label=S&kip All Breakpoints
+editWatchExpressionAction.label=&Edit Watch Expression...
+editWatchExpressionAction.tooltip=Edit the selected watch expression
+reevaluateWatchExpressionAction.label=&Reevaluate Watch Expression
+reevaluateWatchExpressionAction.tooltip=Reevaluate the watch expression in the selected stack frame
+addWatchExpressionAction.label=&Add Watch Expression...
+addWatchExpressionAction.tooltip=Create a new watch expression
+convertToWatchExpressionAction.label=Convert to &Watch Expression
+convertToWatchExpressionAction.tooltip=Convert an inspect expression to a watch expression
+Watch.label=Create Wa&tch Expression
+
+enableWatchExpressionAction.label=Enable
+enableWatchExpressionAction.tooltip=Enable watch expression
+
+disableWatchExpressionAction.label=Disable
+disableWatchExpressionAction.tooltip=Disable watch expression
+
+BreakpointMarkerPreference.label= Breakpoints
+
+SourceContainerPresentationsName = Source Container Presentations
+
+DebugContextMenu.label=&Debug As
+RunContextMenu.label=&Run As
+ProfileContextMenu.label=&Profile As
+
+containerName.workingSet = Working set
+sourceNotFoundEditorName=Source Not Found Editor
+
+debugPresentation.label= Debug
+
+MemoryViewName = Memory
+
+MemoryViewTableFontDefinition.label=Memory view table font
+MemoryViewTableFontDefinition.description=The font used in the table of the memory view.
+
+RawHex = Hex
+ASCIIName = ASCII
+SignedIntegerName = Signed Integer
+UnsignedIntegerName = Unsigned Integer
+Endianess = Endianess
+BigEndianActionName = Big Endian
+LittleEndianActionName = Little Endian
+RestoreDefEndianessActionName = Restore Default
+
+ViewManagementAction.label=&View Management...
+
+setDefaultGroup.label=&Select Default Working Set...
+setDefaultGroup.tooltip=Select Default Working Set
+clearDefaultGroup.label=&Deselect Default Working Set
+clearDefaultGroup.tooltip=Deselect Default Working Set
+workingSets.label=&Working Sets...
+workingSets.tooltip=Manage Working Sets
+
+editGroup.label=&Edit Working Set...
+ToggleDefault.label=Defaul&t Working Set
+
+Project.label=Projects
+Project.others=Others (no project)
+File.label=Files
+File.others=Others (no file)
+BreakpointType.label=Breakpoint Types
+BreakpointType.others=Others (type unspecified)
+WorkingSet.label=Resource Working Sets
+WorkingSet.others=Others (no working set)
+BreakpointWorkingSet.label=Breakpoint Working Sets
+BreakpointWorkingSet.others=Others (no working set)
+BreakpointWorkingSet.name=Breakpoint
+
+memoryRenderingsExtensionPointName = Memory Renderings
+TableRenderingPrefActionName = &Table Renderings Preferences...
+
+
+NewMemoryViewAction.label=New Memory View
+PinMemoryBlockAction.label=Pin Memory Monitor
+TableRenderingInfo.label = Rendering Selection
+
+preferenceKeywords.general=run debug breakpoints variables color
+preferenceKeywords.console=console stdout stderr color
+preferenceKeywords.launching=launching build
+preferenceKeywords.stringSubstitution=variables
+preferenceKeywords.viewManagement=views
+preferenceKeywords.perspective=perspectives switching assign automatic run debug
+preferenceKeywords.launchConfigurations=filters launch migration configurations run debug
+
+
+exportBreakpoints.label=E&xport Breakpoints...
+importBreakpoints.label=I&mport Breakpoints...
+exportBreakpoints.name=Breakpoints
+importBreakpoints.description=Import breakpoints from the local file system.
+exportBreakpoints.description=Export breakpoints to the local file system.
+
+switchMemoryBlock.label = Switch &Memory Monitor
+toggleMemoryMonitorsPane.label = Toggle Memory Monitors Pane
+toggleMemoryMonitorsPane.description = Toggle visibility of the Memory Monitors Pane
+nextMemoryBlockCommand.label = Next Memory Monitor
+nextMemoryBlockCommand.description = Show renderings from next memory monitor.
+memoryViewPrefAction.label = &Preferences...
+resetMemoryMonitorAction.label = &Reset
+
+ConsolePreferencesAction.label = &Preferences...
+ConsolePreferencesAction.tooltip = Opens the console's Preferences Page
+
+command.description.0 = Go to Address
+command.name.0 = Go to Address
+context.description.0 = In Table Memory Rendering
+context.name.0 = In Table MemoryRendering
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml b/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml
new file mode 100644
index 0000000..fadda6b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+<!-- Extensions Points -->
+   <extension-point id="interpreterInstallTypePage" name="%interpreterInstallTypePage" schema="schema/interpreterInstallTypePage.exsd"/>
+
+<!-- Extensions -->
+
+ <extension
+         point="org.eclipse.ui.actionSetPartAssociations">
+      <actionSetPartAssociation
+            targetID="org.eclipse.debug.ui.launchActionSet">
+         <part
+               id="org.eclipse.dltk.ui.ScriptExplorer">
+         </part>
+      </actionSetPartAssociation>
+      <actionSetPartAssociation
+            targetID="org.eclipse.dltk.debug.ui.DLTKDebugActionSet">
+      	<part
+           id="org.eclipse.dltk.ui.ScriptExplorer">
+        </part>
+      </actionSetPartAssociation>
+  </extension>
+ <!-- Adapters for contextual launch -->
+	<extension point="org.eclipse.core.runtime.adapters">
+         <factory 
+            class="" 
+            adaptableType="org.eclipse.dltk.core.IModelElement">
+            <adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
+         </factory>
+         <factory 
+            class="" 
+            adaptableType="org.eclipse.core.resources.IResource">
+            <adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
+         </factory>
+         <factory 
+            class="" 
+            adaptableType="org.eclipse.dltk.internal.ui.editor.ExternalStorageEditorInput">
+            <adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
+         </factory>
+         <factory
+          adaptableType="org.eclipse.dltk.internal.ui.editor.DLTKEditor"
+          class="org.eclipse.dltk.internal.debug.ui.DltkRetargettableActionAdapterFactory">
+       <adapter type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget"/>
+       <adapter
+             type="org.eclipse.debug.ui.actions.IRunToLineTarget">
+       </adapter>
+    </factory>         
+    </extension>
+ <extension
+         point="org.eclipse.ui.actionSets">
+      <actionSet
+            label="%DebugActionSet.label"
+            visible="false"
+            id="org.eclipse.dltk.debug.ui.DLTKDebugActionSet">
+         <menu
+               label="%RunMenu.label"
+               path="additions"
+               id="org.eclipse.ui.run">
+            <separator
+                  name="dltkGroup">
+            </separator>
+         </menu>  
+       </actionSet>
+ </extension>
+ <extension
+       point="org.eclipse.ui.propertyPages">
+    <page
+          class="org.eclipse.dltk.debug.ui.ScriptBreakpointPropertyPage"
+          id="org.eclipse.dltk.debug.ui.ScriptBreakpointPropertyPage"
+          name="Breakpoint properties"
+          objectClass="org.eclipse.dltk.debug.core.model.IScriptBreakpoint"/>
+ </extension>
+ 
+    <extension
+         point="org.eclipse.ui.contexts">
+      <context
+            name="DLTK Debugging"
+            description="DLTK Debugging description"
+            id="org.eclipse.dltk.debug.ui.debugging"
+            parentId="org.eclipse.debug.ui.debugging">
+      </context>
+   </extension>
+ 
+ <extension point="org.eclipse.debug.ui.debugModelContextBindings">
+	<modelContextBinding contextId="org.eclipse.dltk.debug.ui.debugging" debugModelId="org.eclipse.dltk.debug.core.model"></modelContextBinding>
+ </extension>   
+   
+ <extension
+       point="org.eclipse.debug.core.statusHandlers">
+    <statusHandler
+          class="org.eclipse.dltk.internal.debug.ui.DbgpServiceNotAvailableStatusHandler"
+          code="200"
+          id="org.eclipse.dltk.internal.debug.ui.DbgpServiceNotAvailableStatusHandler"
+          plugin="org.eclipse.dltk.launching">
+    </statusHandler>
+    <statusHandler
+          class="org.eclipse.dltk.internal.debug.ui.DebuggingEngineNotStartedStatusHandler"
+          code="201"
+          id="org.eclipse.dltk.internal.debug.ui.DebuggingEngineNotStartedStatusHandler"
+          plugin="org.eclipse.dltk.launching">
+    </statusHandler>
+    <statusHandler
+          class="org.eclipse.dltk.internal.debug.ui.DebuggingEngineNotConnectedStatusHandler"
+          code="202"
+          id="org.eclipse.dltk.internal.debug.ui.DebuggingEngineNotConnectedStatusHandler"
+          plugin="org.eclipse.dltk.launching">
+    </statusHandler>
+ </extension>
+ <extension
+       point="org.eclipse.ui.perspectiveExtensions">
+    <perspectiveExtension targetID="org.eclipse.debug.ui.DebugPerspective">
+		<view
+			relative="org.eclipse.debug.ui.DebugView"
+			visible="false"
+			relationship="stack"
+			id="org.eclipse.dltk.ui.ScriptExplorer">
+		</view> 
+	</perspectiveExtension>
+ </extension>
+</plugin>
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/schema/interpreterInstallTypePage.exsd b/core/plugins/org.eclipse.dltk.debug.ui/schema/interpreterInstallTypePage.exsd
new file mode 100644
index 0000000..04b7baf
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/schema/interpreterInstallTypePage.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.dltk.debug.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.dltk.debug.ui" id="interpreterInstallTypePage" name="%interpreterInstallTypePage"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <choice>
+            <element ref="interpreterInstallTypePage" minOccurs="0" maxOccurs="unbounded"/>
+         </choice>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="interpreterInstallTypePage">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="interpreterInstallTypeId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.debug.ui.ILaunchConfigurationTab"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/BreakpointUtils.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/BreakpointUtils.java
new file mode 100644
index 0000000..b142ce7
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/BreakpointUtils.java
@@ -0,0 +1,34 @@
+package org.eclipse.dltk.debug.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.eclipse.dltk.debug.internal.core.model.ScriptDebugModel;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class BreakpointUtils {
+	public static void addLineBreakpoint(ITextEditor textEditor, int lineNumber)
+			throws CoreException {
+		IDocument document = textEditor.getDocumentProvider().getDocument(
+				textEditor.getEditorInput());
+
+		IResource resource = (IResource) textEditor.getEditorInput()
+				.getAdapter(IResource.class);
+		if (resource != null) {
+			try {
+				IRegion line = document.getLineInformation(lineNumber - 1);
+				int start = line.getOffset();
+				int end = start + line.getLength() - 1;
+
+				ILineBreakpoint b = ScriptDebugModel.createLineBreakpoint(
+						resource, lineNumber, start, end, 0, true, null);
+			} catch (BadLocationException e) {
+				// TODO: log exception
+				e.printStackTrace();
+			}
+		}
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ConsoleScriptDebugTargetStreamManager.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ConsoleScriptDebugTargetStreamManager.java
new file mode 100644
index 0000000..285d491
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ConsoleScriptDebugTargetStreamManager.java
@@ -0,0 +1,38 @@
+package org.eclipse.dltk.debug.ui;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.eclipse.dltk.debug.internal.core.model.IScriptDebugTargetStreamManager;
+import org.eclipse.dltk.debug.internal.core.model.IScriptThreadStreamProxy;
+import org.eclipse.ui.console.IOConsole;
+
+
+public class ConsoleScriptDebugTargetStreamManager implements
+		IScriptDebugTargetStreamManager {
+	private IOConsole console;
+
+	public ConsoleScriptDebugTargetStreamManager(IOConsole console) {
+		this.console = console;
+	}
+
+	public IScriptThreadStreamProxy makeThreadStreamProxy() {
+		final InputStream input = console.getInputStream();
+		final OutputStream output = console.newOutputStream();
+
+		return new IScriptThreadStreamProxy() {
+
+			public OutputStream getStderr() {
+				return output;
+			}
+
+			public OutputStream getStdout() {
+				return output;
+			}
+
+			public InputStream getStdin() {
+				return input;
+			}
+		};
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DLTKDebugUIPlugin.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DLTKDebugUIPlugin.java
new file mode 100644
index 0000000..6cf6131
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DLTKDebugUIPlugin.java
@@ -0,0 +1,297 @@
+package org.eclipse.dltk.debug.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.dltk.internal.debug.ui.ImageDescriptorRegistry;
+import org.eclipse.dltk.internal.debug.ui.ScriptDebugOptionsManager;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class DLTKDebugUIPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.dltk.debug.ui";
+
+	private ImageDescriptorRegistry fImageDescriptorRegistry;
+
+	// The shared instance
+	private static DLTKDebugUIPlugin plugin;
+
+	// Map of InterpreterInstallTypeIDs to IConfigurationElements
+	protected Map fInterpreterInstallTypePageMap;
+	
+	/**
+	 * Whether this plugin is in the process of shutting
+	 * down.
+	 */
+	private boolean fShuttingDown= false;
+
+	// private Object fUtilPresentation;
+
+	/**
+	 * Returns the image descriptor registry used for this plugin.
+	 */
+	public static ImageDescriptorRegistry getImageDescriptorRegistry() {
+		if (getDefault().fImageDescriptorRegistry == null) {
+			getDefault().fImageDescriptorRegistry = new ImageDescriptorRegistry();
+		}
+		return getDefault().fImageDescriptorRegistry;
+	}
+
+	public DLTKDebugUIPlugin() {
+		plugin = this;
+	}
+
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+
+		ILaunchManager launchManager = DebugPlugin.getDefault()
+				.getLaunchManager();
+		launchManager.addLaunchListener(DebugConsoleManager.getInstance());
+
+		ScriptDebugOptionsManager.getDefault().startup();
+	}
+
+	public void stop(BundleContext context) throws Exception {
+		try {
+			setShuttingDown(true);
+			ScriptDebugOptionsManager.getDefault().shutdown();
+			ILaunchManager launchManager = DebugPlugin.getDefault()
+					.getLaunchManager();
+			launchManager.removeLaunchListener(DebugConsoleManager
+					.getInstance());
+		} finally {
+			super.stop(context);
+		}
+	}
+	/**
+	 * Returns whether this plug-in is in the process of
+	 * being shutdown.
+	 *
+	 * @return whether this plug-in is in the process of
+	 *  being shutdown
+	 */
+	public boolean isShuttingDown() {
+		return fShuttingDown;
+	}
+	
+	private void setShuttingDown(boolean value) {
+		this.fShuttingDown = value;
+	}
+
+	/**
+	 * Returns the shared instance
+	 * 
+	 * @return the shared instance
+	 */
+	public static DLTKDebugUIPlugin getDefault() {
+		return plugin;
+	}
+
+	// UI
+	/**
+	 * Returns the active workbench window
+	 * 
+	 * @return the active workbench window
+	 */
+	public static IWorkbenchWindow getActiveWorkbenchWindow() {
+		return getDefault().getWorkbench().getActiveWorkbenchWindow();
+	}
+
+	/**
+	 * Returns the active workbench shell or <code>null</code> if none
+	 * 
+	 * @return the active workbench shell or <code>null</code> if none
+	 */
+	public static Shell getActiveWorkbenchShell() {
+		IWorkbenchWindow window = getActiveWorkbenchWindow();
+		if (window != null) {
+			return window.getShell();
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the standard display to be used. The method first checks, if the
+	 * thread calling this method has an associated display. If so, this display
+	 * is returned. Otherwise the method returns the default display.
+	 */
+	public static Display getStandardDisplay() {
+		Display display;
+		display = Display.getCurrent();
+		if (display == null)
+			display = Display.getDefault();
+		return display;
+	}
+
+	/**
+	 * Convenience method which returns the unique identifier of this plugin.
+	 */
+	public static String getUniqueIdentifier() {
+		return PLUGIN_ID;
+	}
+
+	/**
+	 * Displays the given preference page.
+	 * 
+	 * @param id
+	 *            pref page id
+	 * @param page
+	 *            pref page
+	 */
+	public static void showPreferencePage(String id, IPreferencePage page) {
+		final IPreferenceNode targetNode = new PreferenceNode(id, page);
+
+		PreferenceManager manager = new PreferenceManager();
+		manager.addToRoot(targetNode);
+		final PreferenceDialog dialog = new PreferenceDialog(DLTKDebugUIPlugin
+				.getActiveWorkbenchShell(), manager);
+		final boolean[] result = new boolean[] { false };
+		BusyIndicator.showWhile(DLTKDebugUIPlugin.getStandardDisplay(),
+				new Runnable() {
+					public void run() {
+						dialog.create();
+						dialog.setMessage(targetNode.getLabelText());
+						result[0] = (dialog.open() == Window.OK);
+					}
+				});
+	}
+
+	/**
+	 * Logs the specified status with this plug-in's log.
+	 * 
+	 * @param status
+	 *            status to log
+	 */
+	public static void log(IStatus status) {
+		getDefault().getLog().log(status);
+	}
+
+	/**
+	 * Logs an internal error with the specified message.
+	 * 
+	 * @param message
+	 *            the error message to log
+	 */
+	public static void logErrorMessage(String message) {
+		log(new Status(IStatus.ERROR, getUniqueIdentifier(),
+				IDLTKDebugUIConstants.INTERNAL_ERROR, message, null));
+	}
+
+	/**
+	 * Logs an internal error with the specified throwable
+	 * 
+	 * @param e
+	 *            the exception to be logged
+	 */
+	public static void log(Throwable e) {
+		log(new Status(IStatus.ERROR, getUniqueIdentifier(),
+				IDLTKDebugUIConstants.INTERNAL_ERROR, "Internal error", e));
+	}
+
+	public static void errorDialog(String message, IStatus status) {
+		log(status);
+		Shell shell = getActiveWorkbenchShell();
+		if (shell != null) {
+			ErrorDialog
+					.openError(shell,
+							"DebugUIMessages.JDIDebugUIPlugin_Error_1",
+							message, status);
+		}
+	}
+
+	/**
+	 * Utility method with conventions
+	 */
+	public static void errorDialog(String message, Throwable t) {
+		log(t);
+		Shell shell = getActiveWorkbenchShell();
+		if (shell != null) {
+			IStatus status = new Status(IStatus.ERROR, getUniqueIdentifier(),
+					IDLTKDebugUIConstants.INTERNAL_ERROR,
+					"Error logged from DLTK Debug UI: ", t); //$NON-NLS-1$	
+			ErrorDialog
+					.openError(shell,
+							"DebugUIMessages.JDIDebugUIPlugin_Error_1",
+							message, status);
+		}
+	}
+
+	/**
+	 * Return an object that implements <code>ILaunchConfigurationTab</code>
+	 * for the specified Interpreter install type ID.
+	 */
+	public ILaunchConfigurationTab getInterpreterInstallTypePage(
+			String InterpreterInstallTypeID) {
+		if (fInterpreterInstallTypePageMap == null) {
+			initializeInterpreterInstallTypePageMap();
+		}
+		IConfigurationElement configElement = (IConfigurationElement) fInterpreterInstallTypePageMap
+				.get(InterpreterInstallTypeID);
+		ILaunchConfigurationTab tab = null;
+		if (configElement != null) {
+			try {
+				tab = (ILaunchConfigurationTab) configElement
+						.createExecutableExtension("class"); //$NON-NLS-1$
+			} catch (CoreException ce) {
+				log(new Status(
+						IStatus.ERROR,
+						getUniqueIdentifier(),
+						IDLTKDebugUIConstants.INTERNAL_ERROR,
+						"DebugUIMessages.JDIDebugUIPlugin_An_error_occurred_retrieving_a_InterpreterInstallType_page_1",
+						ce));
+			}
+		}
+		return tab;
+	}
+
+	protected void initializeInterpreterInstallTypePageMap() {
+		fInterpreterInstallTypePageMap = new HashMap(10);
+
+		IExtensionPoint extensionPoint = Platform
+				.getExtensionRegistry()
+				.getExtensionPoint(
+						getUniqueIdentifier(),
+						IDLTKDebugUIConstants.EXTENSION_POINT_INTERPRETER_INSTALL_TYPE_PAGE);
+		IConfigurationElement[] infos = extensionPoint
+				.getConfigurationElements();
+		for (int i = 0; i < infos.length; i++) {
+			String id = infos[i].getAttribute("interpreterInstallTypeID"); //$NON-NLS-1$
+			fInterpreterInstallTypePageMap.put(id, infos[i]);
+		}
+	}
+
+	public static IWorkbenchPage getActivePage() {
+		IWorkbenchWindow w = getActiveWorkbenchWindow();
+		if (w != null) {
+			return w.getActivePage();
+		}
+		return null;
+	}
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DebugConsoleManager.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DebugConsoleManager.java
new file mode 100644
index 0000000..9aaf0a5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/DebugConsoleManager.java
@@ -0,0 +1,89 @@
+package org.eclipse.dltk.debug.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchListener;
+import org.eclipse.dltk.debug.core.model.IScriptDebugTarget;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleManager;
+import org.eclipse.ui.console.IOConsole;
+
+public class DebugConsoleManager implements ILaunchListener {
+
+	private static DebugConsoleManager instance;
+
+	public static DebugConsoleManager getInstance() {
+		if (instance == null) {
+			instance = new DebugConsoleManager();
+		}
+
+		return instance;
+	}
+
+	private Map launchToConsoleMap;
+
+	protected boolean testLaunch(ILaunch launch) {
+		return launch != null;
+	}
+
+	protected IOConsole createConsole(String name) {
+		IOConsole console = new IOConsole(name, null);
+
+		IConsoleManager manager = ConsolePlugin.getDefault()
+				.getConsoleManager();
+		manager.addConsoles(new IConsole[] { console });
+		manager.showConsoleView(console);
+		return console;
+	}
+
+	protected void destroyConsole(IOConsole console) {
+		IConsoleManager manager = ConsolePlugin.getDefault()
+				.getConsoleManager();
+		manager.removeConsoles(new IConsole[] { console });
+	}
+
+	protected DebugConsoleManager() {
+		launchToConsoleMap = new HashMap();
+	}
+	
+	public void launchAdded(ILaunch launch) {
+		if (!testLaunch(launch)) {
+			return;
+		}
+
+		launchToConsoleMap.put(launch, createConsole("Debug console"));
+	}
+
+	public void launchChanged(ILaunch launch) {
+		if (!testLaunch(launch)) {
+			return;
+		}
+
+		IScriptDebugTarget target = (IScriptDebugTarget) launch
+				.getDebugTarget();
+
+		if (target != null) {
+			IOConsole console = (IOConsole) launchToConsoleMap.get(launch);
+			if (console != null) {
+				if (target.getStreamManager() == null) {
+					ConsoleScriptDebugTargetStreamManager manager = new ConsoleScriptDebugTargetStreamManager(
+							console);
+					target.setStreamManager(manager);
+				}
+			}
+		}
+	}
+
+	public void launchRemoved(ILaunch launch) {
+		if (!testLaunch(launch)) {
+			return;
+		}
+
+		IOConsole console = (IOConsole) launchToConsoleMap.get(launch);
+		destroyConsole(console);
+		launchToConsoleMap.remove(launch);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/IDLTKDebugUIConstants.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/IDLTKDebugUIConstants.java
new file mode 100644
index 0000000..bd5d9c7
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/IDLTKDebugUIConstants.java
@@ -0,0 +1,8 @@
+package org.eclipse.dltk.debug.ui;
+
+public interface IDLTKDebugUIConstants {
+
+	int INTERNAL_ERROR = 0;
+	String EXTENSION_POINT_INTERPRETER_INSTALL_TYPE_PAGE = "interpreterInstallTypePage";
+	//String PLUGIN_ID = "org.eclipse.dltk.debug.ui";
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptBreakpointPropertyPage.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptBreakpointPropertyPage.java
new file mode 100644
index 0000000..0724939
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptBreakpointPropertyPage.java
@@ -0,0 +1,218 @@
+package org.eclipse.dltk.debug.ui;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.dltk.debug.core.model.IScriptBreakpoint;
+import org.eclipse.dltk.debug.core.model.IScriptLineBreakpoint;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+public class ScriptBreakpointPropertyPage extends PropertyPage {
+
+	private Button enabledButton;
+
+	private Button hitCountButton;
+
+	private Text hitCountText;
+
+	private Combo hitConditionCombo;
+
+	protected Composite createComposite(Composite parent, int numColumns) {
+		Composite composit = new Composite(parent, SWT.NONE);
+		composit.setFont(parent.getFont());
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		composit.setLayout(layout);
+		composit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		return composit;
+	}
+
+	protected Button createRadioButton(Composite parent, String text) {
+		Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
+		button.setText(text);
+		button.setFont(parent.getFont());
+		button.setLayoutData(new GridData());
+		return button;
+	}
+
+	protected Button createCheckButton(Composite parent, String text) {
+		Button button = new Button(parent, SWT.CHECK | SWT.LEFT);
+		button.setText(text);
+		button.setFont(parent.getFont());
+		button.setLayoutData(new GridData());
+		return button;
+	}
+
+	protected Label createLabel(Composite parent, String text) {
+		Label label = new Label(parent, SWT.NONE);
+		label.setText(text);
+		label.setFont(parent.getFont());
+		label.setLayoutData(new GridData());
+		return label;
+	}
+
+	protected void createLabels(Composite parent) throws CoreException {
+		IScriptBreakpoint breakpoint = getBreakpoint();
+
+		Composite labelComposite = createComposite(parent, 2);
+
+		// Resource name
+		String resourceName = breakpoint.getResourceName();
+		if (resourceName != null) {
+			// File
+			createLabel(labelComposite, "File:");
+			createLabel(labelComposite, resourceName);
+
+			// Hit count
+			int hitCount = breakpoint.getHitCount();
+			createLabel(labelComposite, "Hit count:");			
+			createLabel(labelComposite, hitCount == -1 ? "Not available"
+					: Integer.toString(hitCount));
+
+		}
+
+		createTypeSpecificLabels(labelComposite);
+	}
+
+	protected void createTypeSpecificLabels(Composite parent)
+			throws CoreException {
+		IScriptBreakpoint breakpoint = getBreakpoint();
+
+		// IScriptLineBreakpoint
+		if (breakpoint instanceof IScriptLineBreakpoint) {
+			IScriptLineBreakpoint b = (IScriptLineBreakpoint) breakpoint;
+
+			// Line number
+			int lineNumber = b.getLineNumber();
+			createLabel(parent, "Line Number: ");
+			createLabel(parent, Integer.toString(lineNumber));
+		}
+	}
+
+	protected void createEnabledButton(Composite parent) throws CoreException {
+		enabledButton = createCheckButton(parent, "&Enabled");
+		enabledButton.setSelection(getBreakpoint().isEnabled());
+	}
+
+	protected void createHitCountEditor(Composite parent) {
+		IScriptBreakpoint breakpoint = getBreakpoint();
+
+		// Hit composite
+		Composite hitComposite = createComposite(parent, 1);
+		hitCountButton = createCheckButton(hitComposite, "Enable hit checking");
+
+		// Hit count
+		Composite hitCountComposite = createComposite(hitComposite, 2);
+		createLabel(hitCountComposite, "Hit count:");
+		hitCountText = new Text(hitCountComposite, SWT.BORDER);
+		hitCountText.setLayoutData(new GridData());
+
+		int hitCount = breakpoint.getHitValue();
+
+		if (hitCount > 0) {
+			hitCountText.setText(Integer.toString(hitCount));
+		}
+
+		// Hit condition
+		Composite hitConditionComposite = createComposite(hitComposite, 2);
+
+		createLabel(hitConditionComposite, "Hit condition:");
+		hitConditionCombo = new Combo(hitConditionComposite, SWT.DROP_DOWN
+				| SWT.READ_ONLY);
+
+		hitConditionCombo.add("greater",
+				IScriptBreakpoint.HIT_CONDITION_GREATER);
+
+		hitConditionCombo.add("equal", IScriptBreakpoint.HIT_CONDITION_EQUAL);
+
+		hitConditionCombo.add("multiple",
+				IScriptBreakpoint.HIT_CONDITION_MULTIPLE);
+
+		int hitCondition = breakpoint.getHitCondition();
+
+		if (hitCondition > 0) {
+			hitConditionCombo.select(hitCondition);
+		} else {
+			hitConditionCombo.select(IScriptBreakpoint.HIT_CONDITION_GREATER);
+		}
+	}
+
+	protected Control createContents(Composite parent) {
+		noDefaultAndApplyButton();
+		Composite mainComposite = createComposite(parent, 1);
+
+		try {
+			createLabels(mainComposite);
+			createEnabledButton(mainComposite);
+			createHitCountEditor(mainComposite);
+		} catch (CoreException e) {
+
+		}
+
+		setValid(true);
+		return mainComposite;
+	}
+
+	protected IScriptBreakpoint getBreakpoint() {
+		return (IScriptBreakpoint) getElement();
+	}
+
+	private void storeEnabled(IScriptBreakpoint breakpoint)
+			throws CoreException {
+		boolean enabled = enabledButton.getSelection();
+		breakpoint.setEnabled(enabled);
+	}
+
+	private void storeHits(IScriptBreakpoint breakpoint)
+			throws CoreException {
+		
+		if (false){
+			int hitCount = Integer.parseInt(hitCountText.getText());
+			breakpoint.setHitValue(hitCount);
+			
+			int hitCondition = hitConditionCombo.getSelectionIndex();			
+			breakpoint.setHitCondition(hitCondition);
+		} else {
+			breakpoint.setHitValue(-1);
+			breakpoint.setHitCondition(-1);
+		}
+	}
+
+	public boolean performOk() {
+		try {
+			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					IScriptBreakpoint breakpoint = getBreakpoint();
+
+					storeEnabled(breakpoint);
+					storeHits(breakpoint);			
+					
+					DebugPlugin.getDefault().getBreakpointManager()
+							.fireBreakpointChanged(breakpoint);
+				}
+			}, null, 0, null);
+
+		} catch (CoreException e) {
+			//TODO: log exception
+		}
+
+		return super.performOk();
+	}
+
+	public boolean performCancel() {
+		return super.performCancel();
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java
new file mode 100644
index 0000000..17c49a4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java
@@ -0,0 +1,178 @@
+package org.eclipse.dltk.debug.ui;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.dltk.debug.core.model.IScriptBreakpoint;
+import org.eclipse.dltk.debug.core.model.IScriptLineBreakpoint;
+import org.eclipse.dltk.debug.core.model.IScriptStackFrame;
+import org.eclipse.dltk.debug.core.model.IScriptThread;
+import org.eclipse.dltk.debug.core.model.IScriptValue;
+import org.eclipse.dltk.debug.core.model.IScriptVariable;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.part.FileEditorInput;
+
+public abstract class ScriptDebugModelPresentation extends LabelProvider
+		implements IDebugModelPresentation {
+	public static class ExternalFileEditorInput implements IPathEditorInput,
+			ILocationProvider {
+		private File file;
+
+		public ExternalFileEditorInput(File file) {
+			super();
+			this.file = file;
+		}
+
+		public boolean exists() {
+			return file.exists();
+		}
+
+		public ImageDescriptor getImageDescriptor() {
+			return null;
+		}
+
+		public String getName() {
+			return file.getName();
+		}
+
+		public IPersistableElement getPersistable() {
+			return null;
+		}
+
+		public String getToolTipText() {
+			return file.getAbsolutePath();
+		}
+
+		public Object getAdapter(Class adapter) {
+			if (ILocationProvider.class.equals(adapter))
+				return this;
+
+			return Platform.getAdapterManager().getAdapter(this, adapter);
+		}
+
+		public IPath getPath(Object element) {
+			if (element instanceof ExternalFileEditorInput) {
+				ExternalFileEditorInput input = (ExternalFileEditorInput) element;
+				return Path.fromOSString(input.file.getAbsolutePath());
+			}
+			return null;
+		}
+
+		public IPath getPath() {
+			return Path.fromOSString(file.getAbsolutePath());
+		}
+
+		public boolean equals(Object o) {
+			if (o == this)
+				return true;
+
+			if (o instanceof ExternalFileEditorInput) {
+				ExternalFileEditorInput input = (ExternalFileEditorInput) o;
+				return file.equals(input.file);
+			}
+
+			if (o instanceof IPathEditorInput) {
+				IPathEditorInput input = (IPathEditorInput) o;
+				return getPath().equals(input.getPath());
+			}
+
+			return false;
+		}
+
+		public int hashCode() {
+			return file.hashCode();
+		}
+	}
+
+	protected String getThreadText(IScriptThread thread) {
+		return thread.toString();
+	}
+
+	protected String getStackFrameText(IScriptStackFrame stackFrame) {
+		return stackFrame.toString();
+	}
+
+	protected String getVariableText(IScriptVariable variable) {
+		return variable.toString();
+	}
+
+	protected String getValueText(IScriptValue value) {
+		return value.toString();
+	}
+
+	protected String getBreakpointText(IScriptBreakpoint breakpoint) {
+		try {
+			if (breakpoint instanceof IScriptLineBreakpoint) {
+				IScriptLineBreakpoint b = (IScriptLineBreakpoint) breakpoint;
+				return b.getResourceName() + " [line: " + b.getLineNumber()
+						+ "]";
+			}
+		} catch (CoreException e) {
+			// Nothing to do
+		}
+
+		return breakpoint.toString();
+	}
+
+	public String getText(Object element) {
+		if (element instanceof IScriptBreakpoint) {
+			return getBreakpointText((IScriptBreakpoint) element);
+		} else if (element instanceof IScriptThread) {
+			return getThreadText((IScriptThread) element);
+		} else if (element instanceof IScriptStackFrame) {
+			return getStackFrameText((IScriptStackFrame) element);
+		} else if (element instanceof IScriptVariable) {
+			return getVariableText((IScriptVariable) element);
+		} else if (element instanceof IScriptValue) {
+			return getValueText((IScriptValue) element);
+		}
+
+		return element.toString();
+	}
+
+	public void computeDetail(IValue value, IValueDetailListener listener) {
+		String detail = "";
+		try {
+			detail = value.getValueString();
+		} catch (DebugException e) {
+			// Nothing to do
+		}
+		listener.detailComputed(value, detail);
+	}
+
+	public void setAttribute(String attribute, Object value) {
+	}
+
+	public Image getImage(Object element) {
+		return null;
+	}
+
+	public IEditorInput getEditorInput(Object element) {
+		if (element instanceof File) {
+			return new ExternalFileEditorInput((File) element);
+		} else if (element instanceof IFile) {
+			return new FileEditorInput((IFile) element);
+		} else if (element instanceof ILineBreakpoint) {
+			return new FileEditorInput((IFile) ((ILineBreakpoint) element)
+					.getMarker().getResource());
+		}
+		return null;
+	}
+
+	public abstract String getEditorId(IEditorInput input, Object element);
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.java
new file mode 100644
index 0000000..74d22d6
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.java
@@ -0,0 +1,16 @@
+package org.eclipse.dltk.debug.ui.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class ActionMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.dltk.debug.ui.actions.ActionMessages";//$NON-NLS-1$
+	
+	// ScriptBreakpointPropertiesRulerAction
+	public static String ScriptBreakpointPropertiesRulerAction_BreakpointProperties;
+	
+	
+
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, ActionMessages.class);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.properties b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.properties
new file mode 100644
index 0000000..0d7a882
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ActionMessages.properties
@@ -0,0 +1 @@
+ScriptBreakpointPropertiesRulerAction_BreakpointProperties=Breakpoint Properties...
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ControlAccessibleListener.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ControlAccessibleListener.java
new file mode 100644
index 0000000..f8fc02d
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ControlAccessibleListener.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.debug.ui.actions;
+
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.widgets.Control;
+
+public class ControlAccessibleListener extends AccessibleAdapter {
+	private String controlName;
+	
+	public ControlAccessibleListener(String name) {
+		controlName = name;
+	}
+
+	public void getName(AccessibleEvent e) {
+		e.result = controlName;
+	}
+
+	public static void addListener(Control comp, String name) {
+		//strip mnemonic
+		String[] strs = name.split("&"); //$NON-NLS-1$
+		StringBuffer stripped = new StringBuffer();
+		for (int i = 0; i < strs.length; i++) {
+			stripped.append(strs[i]);
+		}
+		comp.getAccessible().addAccessibleListener(new ControlAccessibleListener(stripped.toString()));
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerAction.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerAction.java
new file mode 100644
index 0000000..eda2612
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerAction.java
@@ -0,0 +1,57 @@
+package org.eclipse.dltk.debug.ui.actions;
+
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.ui.actions.RulerBreakpointAction;
+import org.eclipse.dltk.debug.core.model.IScriptBreakpoint;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.IUpdate;
+
+public class ScriptBreakpointPropertiesRulerAction extends
+		RulerBreakpointAction implements IUpdate {
+
+	private IBreakpoint fBreakpoint;
+
+	public ScriptBreakpointPropertiesRulerAction(ITextEditor editor,
+			IVerticalRulerInfo info) {
+		super(editor, info);
+		setText(ActionMessages.ScriptBreakpointPropertiesRulerAction_BreakpointProperties);
+	}
+
+	public void run() {
+		if (getBreakpoint() != null) {
+			PropertyDialogAction action = new PropertyDialogAction(getEditor()
+					.getEditorSite(), new ISelectionProvider() {
+				public void addSelectionChangedListener(
+						ISelectionChangedListener listener) {
+				}
+
+				public ISelection getSelection() {
+					return new StructuredSelection(getBreakpoint());
+				}
+
+				public void removeSelectionChangedListener(
+						ISelectionChangedListener listener) {
+				}
+
+				public void setSelection(ISelection selection) {
+				}
+			});
+			action.run();
+		}
+	}
+
+	public void update() {
+		fBreakpoint = null;
+		IBreakpoint breakpoint = getBreakpoint();
+		if (breakpoint != null && (breakpoint instanceof IScriptBreakpoint)) {
+			fBreakpoint = breakpoint;
+		}
+		setEnabled(fBreakpoint != null);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerActionDelegate.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerActionDelegate.java
new file mode 100644
index 0000000..dccc891
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ScriptBreakpointPropertiesRulerActionDelegate.java
@@ -0,0 +1,13 @@
+package org.eclipse.dltk.debug.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class ScriptBreakpointPropertiesRulerActionDelegate  extends AbstractRulerActionDelegate {
+	protected IAction createAction(ITextEditor editor,
+			IVerticalRulerInfo rulerInfo) {
+		return new ScriptBreakpointPropertiesRulerAction(editor, rulerInfo);		
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/WatchExpressionAction.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/WatchExpressionAction.java
new file mode 100644
index 0000000..087b949
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/WatchExpressionAction.java
@@ -0,0 +1,72 @@
+package org.eclipse.dltk.debug.ui.actions;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IWatchExpression;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+public class WatchExpressionAction implements IEditorActionDelegate {
+	private ITextSelection fSelection;
+
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+	}
+
+	public void run(IAction action) {
+		if (fSelection == null) {
+			return;
+		}
+		String text = fSelection.getText();
+		createExpression(text);
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		fSelection = null;
+		if (selection instanceof ITextSelection) {
+			fSelection = (ITextSelection) selection;
+		}
+	}
+
+	private void showExpressionsView() {
+		IWorkbenchPage page = PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage();
+		IViewPart part = page.findView(IDebugUIConstants.ID_EXPRESSION_VIEW);
+		if (part == null) {
+			try {
+				page.showView(IDebugUIConstants.ID_EXPRESSION_VIEW);
+			} catch (PartInitException e) {
+			}
+		} else {
+			page.bringToTop(part);
+		}
+
+	}
+
+	private void createExpression(String variable) {
+		IWatchExpression expression = DebugPlugin.getDefault()
+				.getExpressionManager().newWatchExpression(variable);
+
+		DebugPlugin.getDefault().getExpressionManager().addExpression(
+				expression);
+		IAdaptable object = DebugUITools.getDebugContext();
+		IDebugElement context = null;
+		if (object instanceof IDebugElement) {
+			context = (IDebugElement) object;
+		} else if (object instanceof ILaunch) {
+			context = ((ILaunch) object).getDebugTarget();
+		}
+		expression.setExpressionContext(context);
+		showExpressionsView();
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/CommonScriptLaunchTab.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/CommonScriptLaunchTab.java
new file mode 100644
index 0000000..409e02d
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/CommonScriptLaunchTab.java
@@ -0,0 +1,40 @@
+package org.eclipse.dltk.debug.ui.launchConfigurations;
+
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+
+public abstract class CommonScriptLaunchTab extends AbstractLaunchConfigurationTab {
+
+	/**
+	 * Config being modified
+	 */
+	private ILaunchConfiguration fLaunchConfig;
+		
+	/**
+	 * Returns the launch configuration this tab was initialized from.
+	 * 
+	 * @return launch configuration this tab was initialized from
+	 */
+	protected ILaunchConfiguration getCurrentLaunchConfiguration() {
+		return fLaunchConfig;
+	}
+	
+	/**
+	 * Sets the launch configuration this tab was initialized from
+	 * 
+	 * @param config launch configuration this tab was initialized from
+	 */
+	private void setCurrentLaunchConfiguration(ILaunchConfiguration config) {
+		fLaunchConfig = config;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+	 * 
+	 * Subclasses may override this method and should call super.initializeFrom(...).
+	 */
+	public void initializeFrom(ILaunchConfiguration config) {
+		setCurrentLaunchConfiguration(config);
+	}	
+	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/DLTKCommonTab.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/DLTKCommonTab.java
new file mode 100644
index 0000000..7a3ad5a
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/DLTKCommonTab.java
@@ -0,0 +1,54 @@
+package org.eclipse.dltk.debug.ui.launchConfigurations;
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+public class DLTKCommonTab extends CommonTab {
+	
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		
+		/*Composite comp = new Composite(parent, SWT.NONE);
+		setControl(comp);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_COMMON_TAB);
+		comp.setLayout(new GridLayout(2, true));
+		comp.setFont(parent.getFont());
+		
+		createSharedConfigComponent(comp);
+		createFavoritesComponent(comp);
+		createEncodingComponent(comp);
+		createOutputCaptureComponent(comp);
+		createLaunchInBackgroundComponent(comp);*/
+		createUseScriptConsoleComponent((Composite)getControl());
+	}
+	
+	private Button myButtom;
+	
+	private void createUseScriptConsoleComponent(Composite parent){
+		myButtom = createCheckButton(parent, "Use specific DLTK Script console"); 
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = 2;
+		myButtom.setLayoutData(data);
+		myButtom.setFont(parent.getFont());
+		myButtom.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateLaunchConfigurationDialog();
+			}
+		});	
+	}
+	
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		super.performApply(configuration);		
+		
+		if (myButtom.getSelection()){
+			configuration.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, false);
+			configuration.setAttribute("script_console_output", true);
+		}		
+	}	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/InterpreterTab.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/InterpreterTab.java
new file mode 100644
index 0000000..b25004b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/InterpreterTab.java
@@ -0,0 +1,459 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.debug.ui.launchConfigurations;
+
+ 
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.IDLTKProject;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.internal.debug.ui.interpreters.AbstractInterpreterComboBlock;
+import org.eclipse.dltk.internal.debug.ui.interpreters.InterpreterDescriptor;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.dltk.ui.DLTKPluginImages;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * A launch configuration tab that displays and edits the Interpreter install 
+ * launch configuration attributes.
+ * <p>
+ * This class may be instantiated. This class is not intended to be subclassed.
+ * </p>
+	 *
+ */
+
+public abstract class InterpreterTab extends CommonScriptLaunchTab {
+	
+	// Interpreter Block
+	protected AbstractInterpreterComboBlock fInterpreterBlock;
+	
+	// Dynamic Interpreter UI widgets
+	protected ILaunchConfigurationTab fDynamicTab;
+	protected Composite fDynamicTabHolder;
+	protected boolean fUseDynamicArea = true;
+	
+	protected ILaunchConfigurationWorkingCopy fWorkingCopy;
+	protected ILaunchConfiguration fLaunchConfiguration;
+	
+	// State
+	protected boolean fIsInitializing = false;
+	
+	// Selection changed listener (checked InterpreterEnvironment)
+	private IPropertyChangeListener fCheckListener = new IPropertyChangeListener() {
+		public void propertyChange(PropertyChangeEvent event) {
+			handleSelectedInterpreterChanged();
+		}
+	};
+	
+	// Constants
+	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		if (fInterpreterBlock != null) {
+			fInterpreterBlock.removePropertyChangeListener(fCheckListener);
+		}
+	}
+
+	/**
+	 * @see ILaunchConfigurationTab#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Font font = parent.getFont();
+		
+		Composite topComp = new Composite(parent, SWT.NONE);
+		setControl(topComp);
+		//PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IScriptDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_InterpreterEnvironment_TAB);
+		GridLayout topLayout = new GridLayout();
+		topLayout.numColumns = 1;
+		topLayout.marginHeight=0;
+		topLayout.marginWidth=0;
+		topComp.setLayout(topLayout);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		topComp.setLayoutData(gd);
+		topComp.setFont(font);
+				
+		fInterpreterBlock = getInterpreterBlock();
+		fInterpreterBlock.setDefaultInterpreterDescriptor(getDefaultInterpreterDescriptor());
+		fInterpreterBlock.setSpecificInterpreterDescriptor(getSpecificInterpreterDescriptor());
+		fInterpreterBlock.createControl(topComp);
+		Control control = fInterpreterBlock.getControl();
+		fInterpreterBlock.addPropertyChangeListener(fCheckListener);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		control.setLayoutData(gd);
+		
+		Composite dynTabComp = new Composite(topComp, SWT.NONE);
+		dynTabComp.setFont(font);
+		
+		setDynamicTabHolder(dynTabComp);
+		GridLayout tabHolderLayout = new GridLayout();
+		tabHolderLayout.marginHeight= 0;
+		tabHolderLayout.marginWidth= 0;
+		tabHolderLayout.numColumns = 1;
+		getDynamicTabHolder().setLayout(tabHolderLayout);
+		gd = new GridData(GridData.FILL_BOTH);
+		getDynamicTabHolder().setLayoutData(gd);
+	}
+	
+	protected abstract AbstractInterpreterComboBlock getInterpreterBlock ();
+
+	protected void setDynamicTabHolder(Composite tabHolder) {
+		this.fDynamicTabHolder = tabHolder;
+	}
+
+	protected Composite getDynamicTabHolder() {
+		return fDynamicTabHolder;
+	}
+
+	protected void setDynamicTab(ILaunchConfigurationTab tab) {
+		fDynamicTab = tab;
+	}
+
+	protected ILaunchConfigurationTab getDynamicTab() {
+		return fDynamicTab;
+	}
+
+	/**
+	 * @see ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+		setLaunchConfigurationWorkingCopy(config);
+		ILaunchConfigurationTab dynamicTab = getDynamicTab();
+		if (dynamicTab != null) {
+			dynamicTab.setDefaults(config);
+		}
+	}
+	
+	/**
+	 * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		fIsInitializing = true;
+		getControl().setRedraw(false);
+		setLaunchConfiguration(configuration);
+		updateInterpreterFromConfig(configuration);
+		fInterpreterBlock.setDefaultInterpreterDescriptor(getDefaultInterpreterDescriptor());
+		ILaunchConfigurationTab dynamicTab = getDynamicTab();
+		if (dynamicTab != null) {
+			dynamicTab.initializeFrom(configuration);
+		}		
+		getControl().setRedraw(true);
+		fIsInitializing = false;
+	}
+	
+	protected abstract String getNature ();
+
+	/**
+	 * @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_NATURE, getNature());
+		if (fInterpreterBlock.isDefaultInterpreter()) {
+			configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_CONTAINER_PATH, (String)null);
+		} else {
+			IPath containerPath = fInterpreterBlock.getPath();
+			String portablePath = null;
+			if (containerPath != null) {
+				portablePath = containerPath.toPortableString();
+			}
+			configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_CONTAINER_PATH, portablePath);
+		}
+	
+		// Handle any attributes in the Interpreter-specific area
+		ILaunchConfigurationTab dynamicTab = getDynamicTab();
+		if (dynamicTab == null) {
+			configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_INTERPRETER_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, (Map)null);
+		} else {
+			dynamicTab.performApply(configuration);
+		}
+	}
+
+	/**
+	 * @see ILaunchConfigurationTab#isValid(ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration config) {
+		
+		setErrorMessage(null);
+		setMessage(null);
+		
+		IStatus status = fInterpreterBlock.getStatus();
+		if (!status.isOK()) {
+			setErrorMessage(status.getMessage());			 
+			return false;
+		}
+
+		ILaunchConfigurationTab dynamicTab = getDynamicTab();
+		if (dynamicTab != null) {
+			return dynamicTab.isValid(config);
+		}
+		return true;
+	}
+
+	/**
+	 * @see ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return DLTKLaunchMessages.InterpreterTab__Interp_1; 
+	}
+	
+	/**
+	 * @see ILaunchConfigurationTab#getImage()
+	 */
+	public Image getImage() {
+		return DLTKPluginImages.DESC_OBJS_NATIVE_LIB_PATH_ATTRIB.createImage();
+	}	
+
+	protected void updateInterpreterFromConfig(ILaunchConfiguration config) {
+		try {
+			String path = config.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_CONTAINER_PATH, (String)null);
+			if (path != null) {
+				fInterpreterBlock.setPath(Path.fromPortableString(path));
+				return;
+			}
+		} catch (CoreException e) {
+			DLTKDebugUIPlugin.log(e);
+		}
+		fInterpreterBlock.setUseDefaultInterpreter();		
+	}	
+	
+	/**
+	 * Notification that the user changed the selection in the InterpreterEnvironment combination box.
+	 */
+	protected void handleSelectedInterpreterChanged() {
+		loadDynamicInterpreterArea();
+		
+		// always set the newly created area with defaults
+		ILaunchConfigurationWorkingCopy wc = getLaunchConfigurationWorkingCopy();
+		if (getDynamicTab() == null) {
+			// remove any Interpreter specific arguments from the config
+			if (wc == null) {
+				if (getLaunchConfiguration().isWorkingCopy()) {
+					wc = (ILaunchConfigurationWorkingCopy)getLaunchConfiguration();
+				}
+			}
+			if (!fIsInitializing) {
+				if (wc != null) {
+					wc.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_INTERPRETER_INSTALL_TYPE_SPECIFIC_ATTRS_MAP, (Map)null);
+				}
+			}
+		} else {
+			if (wc == null) {
+				try {
+					if (getLaunchConfiguration().isWorkingCopy()) {
+						// get a fresh copy to work on
+						wc = ((ILaunchConfigurationWorkingCopy)getLaunchConfiguration()).getOriginal().getWorkingCopy();
+					} else {
+							wc = getLaunchConfiguration().getWorkingCopy();
+					}
+				} catch (CoreException e) {
+					DLTKDebugUIPlugin.errorDialog(DLTKLaunchMessages.InterpreterTab_Unable_to_initialize_defaults_for_selected_InterpreterEnvironment_1, e); 
+					return;
+				}
+			}
+			if (!fIsInitializing) {
+				getDynamicTab().setDefaults(wc);
+				getDynamicTab().initializeFrom(wc);
+			}
+		}
+				
+		updateLaunchConfigurationDialog();		
+	}
+	
+	protected void selectInterpreter(String typeID, String InterpreterName) {
+		if (typeID == null) {
+			fInterpreterBlock.setUseDefaultInterpreter();
+		} else {
+			fInterpreterBlock.setPath(ScriptRuntime.newInterpreterContainerPath(typeID, InterpreterName));
+		}
+	}
+	
+	/**
+	 * Return the class that implements <code>ILaunchConfigurationTab</code>
+	 * that is registered against the install type of the currently selected Interpreter.
+	 */
+	protected ILaunchConfigurationTab getTabForCurrentInterpreter() {
+		IPath path = fInterpreterBlock.getPath();
+		if (path != null) {
+			IInterpreterInstall Interpreter = fInterpreterBlock.getInterpreter();
+			if (Interpreter != null) {
+				String InterpreterInstallTypeID = Interpreter.getInterpreterInstallType().getId();
+				return DLTKDebugUIPlugin.getDefault().getInterpreterInstallTypePage(InterpreterInstallTypeID);
+			}
+		}	
+		return null;
+	}
+	
+	/**
+	 * Show the contributed piece of UI that was registered for the install type
+	 * of the currently selected Interpreter.
+	 */
+	protected void loadDynamicInterpreterArea() {
+		
+		// Dispose of any current child widgets in the tab holder area
+		Control[] children = getDynamicTabHolder().getChildren();
+		for (int i = 0; i < children.length; i++) {
+			children[i].dispose();
+		}
+		
+		if (isUseDynamicInterpreterArea()) {
+			// Retrieve the dynamic UI for the current InterpreterEnvironment 
+			setDynamicTab(getTabForCurrentInterpreter());
+			if (getDynamicTab() == null) {
+				return;
+			}
+			
+			// Ask the dynamic UI to create its Control
+			getDynamicTab().setLaunchConfigurationDialog(getLaunchConfigurationDialog());
+			getDynamicTab().createControl(getDynamicTabHolder());
+			getDynamicTabHolder().layout();	
+		}
+			
+	}
+
+	protected ILaunchConfigurationWorkingCopy getLaunchConfigurationWorkingCopy() {
+		return fWorkingCopy;
+	}
+	
+	/**
+	 * Overridden here so that any error message in the dynamic UI gets returned.
+	 * 
+	 * @see ILaunchConfigurationTab#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		ILaunchConfigurationTab tab = getDynamicTab();
+		if ((super.getErrorMessage() != null) || (tab == null)) {
+			return super.getErrorMessage();
+		}
+		return tab.getErrorMessage();
+	}
+
+	protected void setLaunchConfigurationWorkingCopy(ILaunchConfigurationWorkingCopy workingCopy) {
+		fWorkingCopy = workingCopy;
+	}
+
+	protected ILaunchConfiguration getLaunchConfiguration() {
+		return fLaunchConfiguration;
+	}
+
+	protected void setLaunchConfiguration(ILaunchConfiguration launchConfiguration) {
+		fLaunchConfiguration = launchConfiguration;
+	}
+	
+	/**
+	 * Sets whether this tab will display the Interpreter specific arguments area
+	 * if a InterpreterEnvironment supports Interpreter specific arguments.
+	 * 
+	 * @param visible whether this tab will display the Interpreter specific arguments area
+	 * 	if a InterpreterEnvironment supports Interpreter specific arguments
+	 */
+	public void setInterpreterSpecificArgumentsVisible(boolean visible) {
+		fUseDynamicArea = visible;
+	}
+	
+	protected boolean isUseDynamicInterpreterArea() {
+		return fUseDynamicArea;
+	}
+
+	protected InterpreterDescriptor getDefaultInterpreterDescriptor() {
+		return new InterpreterDescriptor() {
+
+			public String getDescription() {
+				IDLTKProject project = getDLTKProject();
+				String name = DLTKLaunchMessages.InterpreterTab_7; 
+				if (project == null) {					
+					IInterpreterInstall Interpreter = null;
+					Interpreter = ScriptRuntime.getDefaultInterpreterInstall(getNature());
+					if (Interpreter != null) {
+						name = Interpreter.getName();
+					}
+					return MessageFormat.format(DLTKLaunchMessages.InterpreterTab_8, new String[]{name}); 
+				}
+				try {
+					IInterpreterInstall Interpreter = ScriptRuntime.getInterpreterInstall(project);
+					if (Interpreter != null) {
+						name = Interpreter.getName();
+					}
+				} catch (CoreException e) {
+				}
+				return MessageFormat.format(DLTKLaunchMessages.InterpreterTab_9, new String[]{name}); 
+			}
+		};
+	}
+	
+	protected InterpreterDescriptor getSpecificInterpreterDescriptor() {
+		return null;
+	}
+	
+	/**
+	 * Returns the Script project associated with the current config being edited,
+	 * or <code>null</code> if none.
+	 * 
+	 * @returnscriptproject or <code>null</code>
+	 */
+	protected IDLTKProject getDLTKProject() {
+		if (getLaunchConfiguration() != null) {
+			try {
+				String name = getLaunchConfiguration().getAttribute(IDLTKLaunchConfigurationConstants.ATTR_PROJECT_NAME, (String)null);
+				if (name != null && name.length() > 0) {
+					IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+					if (project.exists()) { 
+						return DLTKCore.create(project);
+					}
+				}
+			} catch (CoreException e) {
+				DLTKDebugUIPlugin.log(e);
+			}
+		}
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
+		// update the default InterpreterEnvironment description, in case it has changed
+		// based on the selected project
+		fInterpreterBlock.refresh();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
+		// do nothing when deactivated
+	}	
+}
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/MainLaunchConfigurationTab.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/MainLaunchConfigurationTab.java
new file mode 100644
index 0000000..cc6cde9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/MainLaunchConfigurationTab.java
@@ -0,0 +1,389 @@
+package org.eclipse.dltk.debug.ui.launchConfigurations;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.IDLTKProject;
+import org.eclipse.dltk.core.IModelElement;
+import org.eclipse.dltk.core.IScriptModel;
+import org.eclipse.dltk.core.ModelException;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchConfigurationsMessages;
+import org.eclipse.dltk.internal.corext.util.Messages;
+import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
+import org.eclipse.dltk.internal.ui.DLTKUIStatus;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.dltk.ui.DLTKUIPlugin;
+import org.eclipse.dltk.ui.viewsupport.ScriptUILabelProvider;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceSorter;
+
+
+public abstract class MainLaunchConfigurationTab extends AbstractLaunchConfigurationTab {
+	/**
+	 * A listener which handles widget change events for the controls in this
+	 * tab.
+	 */
+	private class WidgetListener implements ModifyListener, SelectionListener {
+		public void modifyText(ModifyEvent e) {
+			setErrorMessage(null);
+			if (e.getSource() == fProjText) {
+				IDLTKProject proj = getProject();
+				if (proj != null) {
+					if (!validateProject(proj))
+						setErrorMessage(DLTKLaunchConfigurationsMessages.error_notAValidProject);
+				} else
+					setErrorMessage(DLTKLaunchConfigurationsMessages.error_selectProject);
+			}
+			updateLaunchConfigurationDialog();
+		}
+
+		public void widgetDefaultSelected(SelectionEvent e) {/* do nothing */
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			Object source = e.getSource();
+			if (source == fProjButton) {
+				handleProjectButtonSelected();
+			} else {
+				updateLaunchConfigurationDialog();
+			}
+		}
+	}
+	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	// Project UI widgets
+	protected Text fProjText;
+	private Button fProjButton;
+	private WidgetListener fListener = new WidgetListener();
+
+	/**
+	 * chooses a project for the type of launch config that it is
+	 * 
+	 * @return
+	 */
+	private IDLTKProject chooseProject() {
+		ILabelProvider labelProvider = new ScriptUILabelProvider();
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider);
+		dialog.setTitle(DLTKLaunchConfigurationsMessages.mainTab_chooseProject_title);
+		dialog.setMessage(DLTKLaunchConfigurationsMessages.mainTab_chooseProject_message);
+		try {
+			dialog.setElements(DLTKCore.create(getWorkspaceRoot()).getScriptProjects());
+		}// end try
+		catch (ModelException jme) {
+			DLTKLaunchingPlugin.log(jme);
+		}
+		IDLTKProject project = getProject();
+		if (project != null) {
+			dialog.setInitialSelections(new Object[] {
+				project
+			});
+		}// end if
+		if (dialog.open() == Window.OK) {
+			return (IDLTKProject) dialog.getFirstResult();
+		}// end if
+		return null;
+	}
+
+	/**
+	 * Creates the widgets for specifying a main type.
+	 * 
+	 * @param parent
+	 *            the parent composite
+	 */
+	protected void createProjectEditor(Composite parent) {
+		Font font = parent.getFont();
+		Group group = new Group(parent, SWT.NONE);
+		group.setText(DLTKLaunchConfigurationsMessages.mainTab_projectGroup);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		group.setLayoutData(gd);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		group.setLayout(layout);
+		group.setFont(font);
+		fProjText = new Text(group, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fProjText.setLayoutData(gd);
+		fProjText.setFont(font);
+		fProjText.addModifyListener(fListener);
+		fProjButton = createPushButton(group, DLTKLaunchConfigurationsMessages.mainTab_projectButton, null);
+		fProjButton.addSelectionListener(fListener);
+	}
+
+	/**
+	 * Convenience method to get access to thescriptmodel.
+	 */
+	private IScriptModel getScriptModel() {
+		return DLTKCore.create(getWorkspaceRoot());
+	}
+
+	/**
+	 * Return the IDLTKProject corresponding to the project name in the project
+	 * name text field, or null if the text does not match a project name.
+	 */
+	protected IDLTKProject getProject() {
+		String projectName = fProjText.getText().trim();
+		if (projectName.length() < 1) {
+			return null;
+		}// end if
+		return getScriptModel().getScriptProject(projectName);
+	}
+
+	/**
+	 * Convenience method to get the workspace root.
+	 */
+	protected IWorkspaceRoot getWorkspaceRoot() {
+		return ResourcesPlugin.getWorkspace().getRoot();
+	}
+
+	protected abstract boolean validateProject(IDLTKProject project);
+
+	protected abstract String getLanguageName();
+
+	/**
+	 * Show a dialog that lets the user select a project. This in turn provides
+	 * context for the main type, allowing the user to key a main type name, or
+	 * constraining the search for main types to the specified project.
+	 */
+	protected void handleProjectButtonSelected() {
+		IDLTKProject project = chooseProject();
+		if (project == null)
+			return;
+		if (!validateProject(project)) {
+			String msg = Messages.format(DLTKLaunchConfigurationsMessages.mainTab_errorDlg_notALangProject, new String[] {
+				getLanguageName()
+			});
+			String reason = Messages.format(DLTKLaunchConfigurationsMessages.mainTab_errorDlg_reasonNotALangProject, new String[] {
+				getLanguageName()
+			});
+			ErrorDialog.openError(getShell(), DLTKLaunchConfigurationsMessages.mainTab_errorDlg_invalidProject, msg,
+					DLTKUIStatus.createError(IStatus.ERROR, reason, null));
+			return;
+		}
+		String projectName = project.getElementName();
+		fProjText.setText(projectName);
+	}// end handle selected
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration config) {
+		updateProjectFromConfig(config);
+		updateMainModuleFromConfig(config);
+		if (fProjText.getText().trim().length() == 0 && fMainText.getText().trim().length() == 0) {
+			// try to fill-in
+			IWorkbenchPage page = DLTKUIPlugin.getActivePage();
+			if (page != null) {
+				IEditorPart editor = page.getActiveEditor();
+				if (editor != null) {
+					IEditorInput editorInput = editor.getEditorInput();
+					if (editorInput != null) {
+						IModelElement me = DLTKUIPlugin.getEditorInputModelElement(editorInput);
+						IDLTKProject project = me.getScriptProject();
+						if (project != null && validateProject(project)) {
+							String projectName = project.getProject().getName();
+							String scriptName =  me.getResource().getProjectRelativePath().toPortableString();//me.getResource().getLocation().toPortableString(); /*me.getResource().getFullPath().toPortableString();*/
+							if (scriptName.trim().length() > 0) {
+								fProjText.setText(projectName);
+								fMainText.setText(scriptName);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * updates the project text field form the configuration
+	 * 
+	 * @param config
+	 *            the configuration we are editing
+	 */
+	private void updateProjectFromConfig(ILaunchConfiguration config) {
+		String projectName = EMPTY_STRING;
+		try {
+			projectName = config.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING);
+		}// end try
+		catch (CoreException ce) {
+			DLTKLaunchingPlugin.log(ce);
+		}
+		fProjText.setText(projectName);
+	}
+	protected Text fMainText;
+	private Button fSearchButton;
+
+	/**
+	 * Creates the widgets for specifying a main type.
+	 * 
+	 * @param parent
+	 *            the parent composite
+	 */
+	protected void createMainModuleEditor(Composite parent, String text) {
+		Font font = parent.getFont();
+		Group mainGroup = new Group(parent, SWT.NONE);
+		mainGroup.setText(text);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		mainGroup.setLayoutData(gd);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		mainGroup.setLayout(layout);
+		mainGroup.setFont(font);
+		fMainText = new Text(mainGroup, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fMainText.setLayoutData(gd);
+		fMainText.setFont(font);
+		fMainText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				updateLaunchConfigurationDialog();
+			}
+		});
+		fSearchButton = createPushButton(mainGroup, DLTKLaunchConfigurationsMessages.mainTab_searchButton, null);
+		fSearchButton.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {}
+
+			public void widgetSelected(SelectionEvent e) {
+				handleSearchButtonSelected();
+			}
+		});
+	}
+
+	/**
+	 * The select button pressed handler
+	 */
+	protected void handleSearchButtonSelected() {
+		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(),
+				new WorkbenchContentProvider());
+		dialog.setTitle(DLTKLaunchConfigurationsMessages.mainTab_searchButton_title);
+		dialog.setMessage(DLTKLaunchConfigurationsMessages.mainTab_searchButton_message);
+		IDLTKProject proj = getProject();
+		if (proj == null)
+			return;
+		dialog.setInput(proj.getProject());
+		dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
+		if (dialog.open() == IDialogConstants.OK_ID) {
+			IResource resource = (IResource) dialog.getFirstResult();
+			String arg = resource.getProjectRelativePath().toPortableString();
+			// check extension
+			fMainText.setText(arg);
+		}
+	}
+
+	/**
+	 * Loads the main type from the launch configuration's preference store
+	 * 
+	 * @param config
+	 *            the config to load the main type from
+	 */
+	protected void updateMainModuleFromConfig(ILaunchConfiguration config) {
+		String mainModuleName = EMPTY_STRING;
+		try {
+			mainModuleName = config.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_MAIN_SCRIPT_NAME, EMPTY_STRING);
+		}// end try
+		catch (CoreException ce) {
+			DLTKLaunchingPlugin.log(ce);
+		}
+		fMainText.setText(mainModuleName);
+	}
+
+	public void createControl(Composite parent) {
+		Font font = parent.getFont();
+		Composite comp = new Composite(parent, SWT.NONE);
+		setControl(comp);
+		// PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
+		// IScriptDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB);
+		GridLayout topLayout = new GridLayout();
+		topLayout.verticalSpacing = 0;
+		comp.setLayout(topLayout);
+		comp.setFont(font);
+		createProjectEditor(comp);
+		createVerticalSpacer(comp, 1);
+		createMainModuleEditor(comp, DLTKLaunchConfigurationsMessages.mainTab_mainModule);
+	}
+
+	public String getName() {
+		return DLTKLaunchConfigurationsMessages.mainTab_title;
+	}
+
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		String mainModule = fMainText.getText().trim();
+		String project = fProjText.getText().trim();
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_MAIN_SCRIPT_NAME, mainModule);
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_PROJECT_NAME, project);
+	}
+
+	protected boolean validateProject() {
+		String projectName = fProjText.getText().trim();
+		if (projectName.length() == 0) {
+			setErrorMessage(DLTKLaunchConfigurationsMessages.error_selectProject);
+			return false;
+		}
+		IDLTKProject proj = getScriptModel().getScriptProject(projectName);
+		if (proj == null || !validateProject(proj)) {
+			setErrorMessage(DLTKLaunchConfigurationsMessages.error_notAValidProject);
+			return false;
+		}
+		return true;
+	}
+
+	protected boolean validateModule() {
+		String mainModule = fMainText.getText().trim();
+		if (mainModule.length() == 0) {
+			setErrorMessage(DLTKLaunchConfigurationsMessages.error_selectScript);
+			return false;
+		}
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#canSave()
+	 */
+	public boolean canSave() {
+		return validateProject() && validateModule();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration launchConfig) {
+		setMessage(null);
+		setErrorMessage(null);
+		return validateProject() && validateModule();
+	}
+
+	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+	// TODO Auto-generated method stub
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/ScriptArgumentsTab.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/ScriptArgumentsTab.java
new file mode 100644
index 0000000..3cb7604
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/launchConfigurations/ScriptArgumentsTab.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.debug.ui.launchConfigurations;
+
+ 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.StringVariableSelectionDialog;
+import org.eclipse.dltk.debug.ui.actions.ControlAccessibleListener;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.internal.debug.ui.DLTKDebugImages;
+import org.eclipse.dltk.internal.debug.ui.launcher.InterpreterArgumentsBlock;
+import org.eclipse.dltk.internal.debug.ui.launcher.WorkingDirectoryBlock;
+import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+
+/**
+ * A launch configuration tab that displays and edits program arguments,
+ * Interpreter arguments, and working directory launch configuration attributes.
+ * <p>
+ * This class may be instantiated. This class may be subclassed by overloading createInterpreterArgsBlock and createWorkingDirBlock.
+ * </p>
+	 *
+ */
+public class ScriptArgumentsTab extends CommonScriptLaunchTab {
+		
+	// Program arguments widgets
+	protected Label fPrgmArgumentsLabel;
+	protected Text fPrgmArgumentsText;
+	
+	// Interpreter arguments widgets
+	protected InterpreterArgumentsBlock fInterpreterArgumentsBlock;
+
+	// Working directory
+	protected WorkingDirectoryBlock fWorkingDirectoryBlock;
+		
+	protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
+		
+	public ScriptArgumentsTab() {
+		fInterpreterArgumentsBlock = createInterpreterArgsBlock();
+		fWorkingDirectoryBlock = createWorkingDirBlock();
+	}
+	
+	protected InterpreterArgumentsBlock createInterpreterArgsBlock() {
+		return new InterpreterArgumentsBlock();
+	}
+	
+	protected WorkingDirectoryBlock createWorkingDirBlock() {
+		return new WorkingDirectoryBlock();
+	}
+	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Font font = parent.getFont();
+		Composite comp = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout(1, true);
+		comp.setLayout(layout);
+		comp.setFont(font);
+		
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		comp.setLayoutData(gd);
+		setControl(comp);
+		setHelpContextId();
+		
+		Group group = new Group(comp, SWT.NONE);
+		group.setFont(font);
+		layout = new GridLayout();
+		group.setLayout(layout);
+		group.setLayoutData(new GridData(GridData.FILL_BOTH));
+		
+		String controlName = (DLTKLaunchMessages.ArgumentsTab__Program_arguments__5); 
+		group.setText(controlName);
+		
+		fPrgmArgumentsText = new Text(group, SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
+		gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 40;
+		gd.widthHint = 100;
+		fPrgmArgumentsText.setLayoutData(gd);
+		fPrgmArgumentsText.setFont(font);
+		fPrgmArgumentsText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent evt) {
+				updateLaunchConfigurationDialog();
+			}
+		});
+		ControlAccessibleListener.addListener(fPrgmArgumentsText, group.getText());
+		
+		String buttonLabel = DLTKLaunchMessages.ArgumentsTab_5;  
+		Button pgrmArgVariableButton = createPushButton(group, buttonLabel, null); 
+		pgrmArgVariableButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		pgrmArgVariableButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
+				dialog.open();
+				String variable = dialog.getVariableExpression();
+				if (variable != null) {
+                    fPrgmArgumentsText.insert(variable);
+				}
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+			
+		});
+		
+		if (fInterpreterArgumentsBlock != null)
+			fInterpreterArgumentsBlock.createControl(comp);
+	
+		fWorkingDirectoryBlock.createControl(comp);		
+	}
+	
+	/**
+	 * Set the help context id for this launch config tab.  Subclasses may
+	 * override this method.
+	 */
+	protected void setHelpContextId() {
+		//PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IScriptDebugHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_ARGUMENTS_TAB);		
+	}
+			
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
+	 */
+	public void dispose() {
+	}
+		
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration config) {
+		return fWorkingDirectoryBlock.isValid(config);
+	}
+
+	/**
+	 * Defaults are empty.
+	 * 
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+		config.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_SCRIPT_ARGUMENTS, (String)null);
+		if (fInterpreterArgumentsBlock != null)
+			fInterpreterArgumentsBlock.setDefaults(config);
+		fWorkingDirectoryBlock.setDefaults(config);
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		try {
+			fPrgmArgumentsText.setText(configuration.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_SCRIPT_ARGUMENTS, "")); //$NON-NLS-1$
+			if (fInterpreterArgumentsBlock != null)
+				fInterpreterArgumentsBlock.initializeFrom(configuration);
+			fWorkingDirectoryBlock.initializeFrom(configuration);
+		} catch (CoreException e) {
+			setErrorMessage(DLTKLaunchMessages.ArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage()); 
+			DLTKLaunchingPlugin.log(e);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_SCRIPT_ARGUMENTS, 
+				getAttributeValueFrom(fPrgmArgumentsText));
+		if (fInterpreterArgumentsBlock != null)
+			fInterpreterArgumentsBlock.performApply(configuration);
+		fWorkingDirectoryBlock.performApply(configuration);
+	}
+
+	/**
+	 * Returns the string in the text widget, or <code>null</code> if empty.
+	 * 
+	 * @return text or <code>null</code>
+	 */
+	protected String getAttributeValueFrom(Text text) {
+		String content = text.getText().trim();
+		if (content.length() > 0) {
+			return content;
+		}
+		return null;
+	}
+	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return DLTKLaunchMessages.ArgumentsTab__Arguments_16; 
+	}	
+	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setLaunchConfigurationDialog(ILaunchConfigurationDialog)
+	 */
+	public void setLaunchConfigurationDialog(ILaunchConfigurationDialog dialog) {
+		super.setLaunchConfigurationDialog(dialog);
+		fWorkingDirectoryBlock.setLaunchConfigurationDialog(dialog);
+		if (fInterpreterArgumentsBlock != null)
+			fInterpreterArgumentsBlock.setLaunchConfigurationDialog(dialog);
+	}	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getErrorMessage()
+	 */
+	public String getErrorMessage() {
+		String m = super.getErrorMessage();
+		if (m == null) {
+			return fWorkingDirectoryBlock.getErrorMessage();
+		}
+		return m;
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getMessage()
+	 */
+	public String getMessage() {
+		String m = super.getMessage();
+		if (m == null) {
+			return fWorkingDirectoryBlock.getMessage();
+		}
+		return m;
+	}
+	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
+	 */
+	public Image getImage() {
+		return DLTKDebugImages.get(DLTKDebugImages.IMG_VIEW_ARGUMENTS_TAB);
+	}	
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#activated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
+		fWorkingDirectoryBlock.initializeFrom(workingCopy);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#deactivated(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
+		// do nothing when deactivated
+	}
+}
+
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.java
new file mode 100644
index 0000000..f9644ed
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.debug.ui.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class DLTKLaunchConfigurationsMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.dltk.debug.ui.messages.DLTKLaunchConfigurationsMessages";//$NON-NLS-1$
+	public static String mainTab_title;
+	public static String mainTab_projectGroup;
+	public static String mainTab_projectButton;
+	public static String mainTab_chooseProject_title;
+	public static String mainTab_chooseProject_message;
+	public static String mainTab_searchButton;
+	public static String mainTab_mainModule;
+	public static String mainTab_searchButton_title;
+	public static String mainTab_searchButton_message;
+	public static String error_selectProject;
+	public static String error_notAValidProject;
+	public static String mainTab_errorDlg_invalidProject;
+	public static String mainTab_errorDlg_notALangProject;
+	public static String mainTab_errorDlg_reasonNotALangProject;
+	public static String error_selectScript;
+
+	private DLTKLaunchConfigurationsMessages() {
+	// dont instatiate
+	}
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, DLTKLaunchConfigurationsMessages.class);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.properties b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.properties
new file mode 100644
index 0000000..427d680
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchConfigurationsMessages.properties
@@ -0,0 +1,15 @@
+mainTab_title=Main
+mainTab_projectGroup=Project:
+mainTab_projectButton=Browse...
+mainTab_chooseProject_title=Project selection
+mainTab_chooseProject_message=Select a project to launch
+mainTab_searchButton=Browse...
+mainTab_mainModule=Launch script:
+mainTab_searchButton_title=Script selection
+mainTab_searchButton_message=Select a script to launch
+error_selectProject=Select project
+error_notAValidProject=It is not a valid project name
+mainTab_errorDlg_invalidProject=Invalid project
+mainTab_errorDlg_notALangProject=It is not a {0} project
+mainTab_errorDlg_reasonNotALangProject=You have selected not a {0} project
+error_selectScript=Select a script to launch 
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.java
new file mode 100644
index 0000000..dc97f42
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.debug.ui.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+public class DLTKLaunchMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages";//$NON-NLS-1$
+	public static String scriptLaunchShortcut2_title;
+	public static String scriptLaunchShortcut2;
+	public static String WorkingDirectoryBlock_12;
+	public static String WorkingDirectoryBlock_18;
+	public static String WorkingDirectoryBlock_19;
+	public static String WorkingDirectoryBlock_0;
+	public static String WorkingDirectoryBlock_1;
+	public static String WorkingDirectoryBlock_17;
+	public static String WorkingDirectoryBlock_7;
+	public static String WorkingDirectoryBlock_4;
+	public static String WorkingDirectoryBlock_10;
+	public static String WorkingDirectoryBlock_20;
+	public static String ArgumentsTab_Exception_occurred_reading_configuration___15;
+	public static String WorkingDirectoryBlock_Working_Directory_8;
+	public static String ArgumentsTab__Program_arguments__5;
+	public static String ArgumentsTab_5;
+	public static String ArgumentsTab__Arguments_16;
+	public static String InterpreterTab__Interp_1;
+	public static String InterpreterTab_Unable_to_initialize_defaults_for_selected_InterpreterEnvironment_1;
+	public static String InterpreterTab_7;
+	public static String InterpreterTab_8;
+	public static String InterpreterTab_9;
+	public static String InterpreterArgumentsTab_Interpreter_ar_guments__6;
+	public static String InterpreterArgumentsBlock_4;
+	public static String InterpreterArgumentsTab_Exception_occurred_reading_configuration___15;
+	public static String InterpreterArgumentsBlock_Interpreter_Arguments;
+
+	private DLTKLaunchMessages() {
+	// dont instatiate
+	}
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, DLTKLaunchMessages.class);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.properties b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.properties
new file mode 100644
index 0000000..475c173
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/messages/DLTKLaunchMessages.properties
@@ -0,0 +1,26 @@
+scriptLaunchShortcut2_title=Launch configurations
+scriptLaunchShortcut2=&Select existing configuration:
+WorkingDirectoryBlock_4=Select a &workspace relative working directory:
+WorkingDirectoryBlock_7=Select a working directory for the launch configuration:
+WorkingDirectoryBlock_0=W&orkspace...
+WorkingDirectoryBlock_Working_Directory_8=Working Directory
+WorkingDirectoryBlock_10=Working directory does not exist
+WorkingDirectoryBlock_12=Working directory:
+WorkingDirectoryBlock_17=Variabl&es...
+WorkingDirectoryBlock_18=Defa&ult:
+WorkingDirectoryBlock_19=Ot&her:
+WorkingDirectoryBlock_20=Working directory not specified
+WorkingDirectoryBlock_1=File S&ystem...
+ArgumentsTab_Exception_occurred_reading_configuration___15=Exception occurred reading configuration:
+ArgumentsTab_5=Var&iables...
+ArgumentsTab__Arguments_16=Arguments
+ArgumentsTab__Program_arguments__5=Script &arguments:
+InterpreterTab__Interp_1=Interpreter
+InterpreterTab_Unable_to_initialize_defaults_for_selected_InterpreterEnvironment_1=Unable to initialize defaults for selected interpreter
+InterpreterTab_7=undefined
+InterpreterTab_8=Workspace &default interpreter ({0})
+InterpreterTab_9=&Project interpreter ({0})
+
+InterpreterArgumentsTab_Interpreter_ar_guments__6=Interpreter ar&guments:
+
+InterpreterArgumentsBlock_4=Variable&s...
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DLTKDebugImages.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DLTKDebugImages.java
new file mode 100644
index 0000000..dbddc7c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DLTKDebugImages.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui;
+
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Bundle of most images used by the debug plug-in.
+ * DLTK note: used icons are marked with a comment
+ * TODO: delete unused icons
+ */
+public class DLTKDebugImages {
+
+    private static String ICONS_PATH = "$nl$/icons/full/"; //$NON-NLS-1$
+	
+	// The plugin registry
+	private static ImageRegistry fgImageRegistry = null;
+
+	/*
+	 * Available cached Images in the Script debug plug-in image registry.
+	 */	
+	public static final String IMG_OBJS_EXCEPTION= "IMG_OBJS_EXCEPTION";			//$NON-NLS-1$
+	public static final String IMG_OBJS_EXCEPTION_DISABLED= "IMG_OBJS_EXCEPTION_DISABLED";			//$NON-NLS-1$
+	public static final String IMG_OBJS_ERROR= "IMG_OBJS_ERROR";			//$NON-NLS-1$	
+	
+	public static final String IMG_OVR_BREAKPOINT_INSTALLED= "IMG_OBJS_BREAKPOINT_INSTALLED";	//$NON-NLS-1$
+	public static final String IMG_OVR_BREAKPOINT_INSTALLED_DISABLED= "IMG_OBJS_BREAKPOINT_INSTALLED_DISABLED";	//$NON-NLS-1$
+		
+	public static final String IMG_OBJS_LOCAL_VARIABLE = "IMG_OBJS_LOCAL_VARIABLE";	//$NON-NLS-1$
+	
+	public static final String IMG_OVR_METHOD_BREAKPOINT_ENTRY= "IMG_OBJS_METHOD_BREAKPOINT_ENTRY";	//$NON-NLS-1$
+	public static final String IMG_OVR_METHOD_BREAKPOINT_ENTRY_DISABLED= "IMG_OBJS_METHOD_BREAKPOINT_ENTRY_DISABLED";	//$NON-NLS-1$
+	public static final String IMG_OVR_METHOD_BREAKPOINT_EXIT= "IMG_OBJS_METHOD_BREAKPOINT_EXIT";	//$NON-NLS-1$
+	public static final String IMG_OVR_METHOD_BREAKPOINT_EXIT_DISABLED= "IMG_OBJS_METHOD_BREAKPOINT_EXIT_DISABLED";	//$NON-NLS-1$
+	
+	public static final String IMG_OVR_CONDITIONAL_BREAKPOINT= "IMG_OBJS_CONDITIONAL_BREAKPOINT";	//$NON-NLS-1$
+	public static final String IMG_OVR_CONDITIONAL_BREAKPOINT_DISABLED= "IMG_OBJS_CONDITIONAL_BREAKPOINT_DISABLED";	//$NON-NLS-1$
+
+	public static final String IMG_OVR_SCOPED_BREAKPOINT= "IMG_OBJS_SCOPED_BREAKPOINT";	//$NON-NLS-1$
+	public static final String IMG_OVR_SCOPED_BREAKPOINT_DISABLED= "IMG_OBJS_SCOPED_BREAKPOINT_DISABLED";	//$NON-NLS-1$
+	
+	public static final String IMG_OVR_UNCAUGHT_BREAKPOINT= "IMG_OBJS_UNCAUGHT_BREAKPOINT";	//$NON-NLS-1$
+	public static final String IMG_OVR_UNCAUGHT_BREAKPOINT_DISABLED= "IMG_OBJS_UNCAUGHT_BREAKPOINT_DISABLED";	//$NON-NLS-1$
+	
+	public static final String IMG_OVR_CAUGHT_BREAKPOINT= "IMG_OBJS_CAUGHT_BREAKPOINT";	//$NON-NLS-1$
+	public static final String IMG_OVR_CAUGHT_BREAKPOINT_DISABLED= "IMG_OBJS_CAUGHT_BREAKPOINT_DISABLED";	//$NON-NLS-1$
+	
+	public static final String IMG_OBJS_SNIPPET_EVALUATING= "IMG_OBJS_SNIPPET_EVALUATING";	//$NON-NLS-1$
+	
+	//used
+	public static final String IMG_VIEW_ARGUMENTS_TAB= "IMG_VIEW_ARGUMENTS_TAB";  //$NON-NLS-1$
+	
+	public static final String IMG_OBJS_MONITOR = "IMG_OBJS_MONITOR";  //$NON-NLS-1$
+	public static final String IMG_OBJS_CONTENDED_MONITOR = "IMG_OBJS_CONTENDED_MONITOR";  //$NON-NLS-1$
+	public static final String IMG_OBJS_OWNED_MONITOR = "IMG_OBJS_OWNED_MONITOR";  //$NON-NLS-1$
+	
+	public static final String IMG_OVR_OWNED = "IMG_OVR_OWNED";			//$NON-NLS-1$
+	public static final String IMG_OVR_OWNS_MONITOR = "IMG_OVR_OWNS_MONITOR";		//$NON-NLS-1$
+	public static final String IMG_OVR_IN_CONTENTION = "IMG_OVR_IN_CONTENTION";			//$NON-NLS-1$
+	public static final String IMG_OVR_IN_CONTENTION_FOR_MONITOR = "IMG_OVR_IN_CONTENTION_FOR_MONITOR";		//$NON-NLS-1$
+	public static final String IMG_OVR_IN_DEADLOCK = "IMG_OVR_IN_DEADLOCK"; //$NON-NLS-1$
+	
+	public static final String IMG_OBJS_EXCEPTION_BRKPT_TYPE = "IMG_OBJS_EXCEPTION_BRKPT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_LINE_BRKPT_TYPE = "IMG_OBJS_LINE_BRKPT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_CLASSLOAD_BRKPT_TYPE = "IMG_OBJS_CLASSLOAD_BRKPT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_WATCHPOINT_TYPE = "IMG_OBJS_WATCHPOINT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_JSP_BRKPT_TYPE = "IMG_OBJS_JSP_BRKPT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_METHOD_BRKPT_TYPE = "IMG_OBJS_METHOD_BRKPT_TYPE";  //$NON-NLS-1$
+	public static final String IMG_OBJS_THREAD_GROUP = "IMG_OBJS_THREAD_GROUP";  //$NON-NLS-1$	
+	
+	public static final String IMG_OBJS_CLASSPATH = "IMG_OBJS_CLASSPATH"; //$NON-NLS-1$
+	
+	public static final String IMG_OVR_OUT_OF_SYNCH = "IMG_OVR_OUT_OF_SYNCH"; //$NON-NLS-1$
+	public static final String IMG_OVR_MAY_BE_OUT_OF_SYNCH = "IMG_OVR_MAY_BE_OUT_OF_SYNCH"; //$NON-NLS-1$
+	public static final String IMG_OVR_SYNCHRONIZED = "IMG_OVR_SYNCHRONIZED"; //$NON-NLS-1$
+	
+	public static final String IMG_WIZBAN_NEWSCRAPPAGE = "IMG_WIZBAN_NEWSCRAPPAGE"; //$NON-NLS-1$
+	public static final String IMG_WIZBAN_LIBRARY = "IMG_WIZBAN_LIBRARY"; //$NON-NLS-1$
+	public static final String IMG_TOOL_TERMSNIPPET = "IMG_TOOL_TERMSNIPPET"; //$NON-NLS-1$
+	public static final String IMG_TOOL_TERMSNIPPET_HOVER = "IMG_TOOL_TERMSNIPPET_HOVER"; //$NON-NLS-1$
+	public static final String IMG_TOOL_TERMSNIPPET_DISABLED = "IMG_TOOL_TERMSNIPPET_DISABLED"; //$NON-NLS-1$
+	public static final String IMG_OBJ_JAVA_INSPECT_EXPRESSION = "IMG_OBJ_JAVA_INSPECT_EXPRESSION"; //$NON-NLS-1$
+	
+	/*
+	 * Set of predefined Image Descriptors.
+	 */
+	private static final String T_OBJ= ICONS_PATH + "obj16/"; 		//$NON-NLS-1$
+	private static final String T_OVR= ICONS_PATH + "ovr16/"; 		//$NON-NLS-1$
+	private static final String T_WIZBAN= ICONS_PATH + "wizban/"; 	//$NON-NLS-1$
+	private static final String T_EVIEW= ICONS_PATH + "eview16/"; 	//$NON-NLS-1$
+	private static final String T_DLCL= ICONS_PATH + "dtool16/"; 	//$NON-NLS-1$
+	private static final String T_ELCL= ICONS_PATH + "etool16/"; 	//$NON-NLS-1$
+
+
+	
+	/**
+	 * Returns the image managed under the given key in this registry.
+	 * 
+	 * @param key the image's key
+	 * @return the image managed under the given key
+	 */ 
+	public static Image get(String key) {
+		return getImageRegistry().get(key);
+	}
+	
+	/**
+	 * Returns the <code>ImageDescriptor</code> identified by the given key,
+	 * or <code>null</code> if it does not exist.
+	 */
+	public static ImageDescriptor getImageDescriptor(String key) {
+		return getImageRegistry().getDescriptor(key);
+	}	
+	
+	/*
+	 * Helper method to access the image registry from the JDIDebugUIPlugin class.
+	 */
+	/* package */ static ImageRegistry getImageRegistry() {
+		if (fgImageRegistry == null) {
+			initializeImageRegistry();
+		}
+		return fgImageRegistry;
+	}
+	
+	private static void initializeImageRegistry() {
+		fgImageRegistry= new ImageRegistry(DLTKDebugUIPlugin.getStandardDisplay());
+		declareImages();
+	}
+	
+	private static void declareImages() {
+		declareRegistryImage(IMG_OBJS_EXCEPTION, T_OBJ + "jexception_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_EXCEPTION_DISABLED, T_OBJ + "jexceptiond_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_BREAKPOINT_INSTALLED, T_OVR + "installed_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_BREAKPOINT_INSTALLED_DISABLED, T_OVR + "installed_ovr_disabled.gif"); //$NON-NLS-1$
+			
+		declareRegistryImage(IMG_OBJS_LOCAL_VARIABLE, T_OBJ + "localvariable_obj.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OVR_METHOD_BREAKPOINT_ENTRY, T_OVR + "entry_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_METHOD_BREAKPOINT_ENTRY_DISABLED, T_OVR + "entry_ovr_disabled.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_METHOD_BREAKPOINT_EXIT, T_OVR + "exit_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_METHOD_BREAKPOINT_EXIT_DISABLED, T_OVR + "exit_ovr_disabled.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OVR_CONDITIONAL_BREAKPOINT, T_OVR + "conditional_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_CONDITIONAL_BREAKPOINT_DISABLED, T_OVR + "conditional_ovr_disabled.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OVR_SCOPED_BREAKPOINT, T_OVR + "scoped_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_SCOPED_BREAKPOINT_DISABLED, T_OVR + "scoped_ovr_disabled.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OVR_UNCAUGHT_BREAKPOINT, T_OVR + "uncaught_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_UNCAUGHT_BREAKPOINT_DISABLED, T_OVR + "uncaught_ovr_disabled.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OVR_CAUGHT_BREAKPOINT, T_OVR + "caught_ovr.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_CAUGHT_BREAKPOINT_DISABLED, T_OVR + "caught_ovr_disabled.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OBJS_ERROR, T_OBJ + "jrtexception_obj.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OBJS_SNIPPET_EVALUATING, T_OBJ + "jsbook_run_obj.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_VIEW_ARGUMENTS_TAB, T_EVIEW + "variable_tab.gif"); //$NON-NLS-1$
+
+		declareRegistryImage(IMG_OVR_OUT_OF_SYNCH, T_OVR + "error_co.gif");			//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_MAY_BE_OUT_OF_SYNCH, T_OVR + "warning_co.gif");		//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_SYNCHRONIZED, T_OVR + "sync_ovr.gif");				//$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OBJS_MONITOR, T_OBJ + "monitor_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_OWNED, T_OVR + "owned_ovr.gif");			//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_OWNS_MONITOR, T_OVR +  "ownsmonitor_ovr.gif");		//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_IN_CONTENTION, T_OVR + "contention_ovr.gif");			//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_IN_CONTENTION_FOR_MONITOR, T_OVR + "contentionformonitor_ovr.gif");		//$NON-NLS-1$
+		declareRegistryImage(IMG_OVR_IN_DEADLOCK, T_OVR + "deadlock_ovr.gif");		//$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_CONTENDED_MONITOR, T_OBJ + "contended_monitor_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_OWNED_MONITOR, T_OBJ + "owned_monitor_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_THREAD_GROUP, T_OBJ + "threadgroup_obj.gif"); //$NON-NLS-1$
+				
+		declareRegistryImage(IMG_WIZBAN_NEWSCRAPPAGE, T_WIZBAN + "newsbook_wiz.png");		//$NON-NLS-1$
+		declareRegistryImage(IMG_WIZBAN_LIBRARY, T_WIZBAN + "library_wiz.png"); 	//$NON-NLS-1$
+				
+		declareRegistryImage(IMG_TOOL_TERMSNIPPET, T_ELCL + "term_sbook.gif"); 			//$NON-NLS-1$
+		declareRegistryImage(IMG_TOOL_TERMSNIPPET_HOVER, T_ELCL + "term_sbook.gif"); 			//$NON-NLS-1$
+		declareRegistryImage(IMG_TOOL_TERMSNIPPET_DISABLED, T_DLCL + "term_sbook.gif"); 			//$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OBJ_JAVA_INSPECT_EXPRESSION, T_OBJ + "insp_sbook.gif"); 			//$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_CLASSPATH, T_OBJ + "classpath_obj.gif"); //$NON-NLS-1$
+		
+		declareRegistryImage(IMG_OBJS_EXCEPTION_BRKPT_TYPE, T_OBJ + "jexcept_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_LINE_BRKPT_TYPE, T_OBJ + "jline_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_CLASSLOAD_BRKPT_TYPE, T_OBJ + "jload_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_METHOD_BRKPT_TYPE, T_OBJ + "jmeth_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_JSP_BRKPT_TYPE, T_OBJ + "jspbrkpt_obj.gif"); //$NON-NLS-1$
+		declareRegistryImage(IMG_OBJS_WATCHPOINT_TYPE, T_OBJ + "jwatch_obj.gif"); //$NON-NLS-1$
+		
+	}
+	
+    
+
+    /**
+     * Declare an Image in the registry table.
+     * @param key   The key to use when registering the image
+     * @param path  The path where the image can be found. This path is relative to where
+     *              this plugin class is found (i.e. typically the packages directory)
+     */
+    private final static void declareRegistryImage(String key, String path) {
+        ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
+        Bundle bundle = Platform.getBundle(DLTKDebugUIPlugin.getUniqueIdentifier());
+        URL url = null;
+        if (bundle != null){
+            url = FileLocator.find(bundle, new Path(path), null);
+            desc = ImageDescriptor.createFromURL(url);
+        }
+        fgImageRegistry.put(key, desc);
+    }
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DbgpServiceNotAvailableStatusHandler.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DbgpServiceNotAvailableStatusHandler.java
new file mode 100644
index 0000000..1ea4536
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DbgpServiceNotAvailableStatusHandler.java
@@ -0,0 +1,25 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+public class DbgpServiceNotAvailableStatusHandler implements IStatusHandler {
+	public Object handleStatus(IStatus status, Object source)
+			throws CoreException {
+		
+		DLTKDebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
+			public void run() {
+				String title = "Dbgp service not avaialble";
+				String message = "Dbgp service not avaialble. Check port settings";
+				
+				MessageDialog.openError(DLTKDebugUIPlugin
+						.getActiveWorkbenchShell(), title, message);
+			}
+		});
+		
+		return null;
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebugImageDescriptor.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebugImageDescriptor.java
new file mode 100644
index 0000000..e9c5393
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebugImageDescriptor.java
@@ -0,0 +1,288 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+public class DebugImageDescriptor extends CompositeImageDescriptor {
+
+	/** Flag to render the is out of synch adornment */
+	public final static int IS_OUT_OF_SYNCH = 0x0001;
+	/** Flag to render the may be out of synch adornment */
+	public final static int MAY_BE_OUT_OF_SYNCH = 0x0002;
+	/** Flag to render the installed breakpoint adornment */
+	public final static int INSTALLED = 0x0004;
+	/** Flag to render the entry method breakpoint adornment */
+	public final static int ENTRY = 0x0008;
+	/** Flag to render the exit method breakpoint adornment */
+	public final static int EXIT = 0x0010;
+	/** Flag to render the enabled breakpoint adornment */
+	public final static int ENABLED = 0x0020;
+	/** Flag to render the conditional breakpoint adornment */
+	public final static int CONDITIONAL = 0x0040;
+	/** Flag to render the caught breakpoint adornment */
+	public final static int CAUGHT = 0x0080;
+	/** Flag to render the uncaught breakpoint adornment */
+	public final static int UNCAUGHT = 0x0100;
+	/** Flag to render the scoped breakpoint adornment */
+	public final static int SCOPED = 0x0200;
+
+	/** Flag to render the owning a monitor thread adornment */
+	public final static int OWNS_MONITOR = 0x0400;
+	/** Flag to render the owned monitor adornment */
+	public final static int OWNED_MONITOR = 0x0800;
+	/** Flag to render the in contention monitor adornment */
+	public final static int CONTENTED_MONITOR = 0x1000;
+	/** Flag to render the in contention for monitor thread adornment */
+	public final static int IN_CONTENTION_FOR_MONITOR = 0x2000;
+	/** Flag to render the in deadlock adornment */
+	public final static int IN_DEADLOCK = 0x8000;
+
+	/** Flag to render the synchronized stack frame adornment */
+	public final static int SYNCHRONIZED = 0x4000;
+
+	private ImageDescriptor fBaseImage;
+	private int fFlags;
+	private Point fSize;
+
+	/**
+	 * Create a new JDIImageDescriptor.
+	 * 
+	 * @param baseImage
+	 *            an image descriptor used as the base image
+	 * @param flags
+	 *            flags indicating which adornments are to be rendered
+	 * 
+	 */
+	public DebugImageDescriptor(ImageDescriptor baseImage, int flags) {
+		setBaseImage(baseImage);
+		setFlags(flags);
+	}
+
+	/**
+	 * @see CompositeImageDescriptor#getSize()
+	 */
+	protected Point getSize() {
+		if (fSize == null) {
+			ImageData data = getBaseImage().getImageData();
+			setSize(new Point(data.width, data.height));
+		}
+		return fSize;
+	}
+
+	/**
+	 * @see Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object object) {
+		if (!(object instanceof DebugImageDescriptor)) {
+			return false;
+		}
+
+		DebugImageDescriptor other = (DebugImageDescriptor) object;
+		return (getBaseImage().equals(other.getBaseImage()) && getFlags() == other
+				.getFlags());
+	}
+
+	/**
+	 * @see Object#hashCode()
+	 */
+	public int hashCode() {
+		return getBaseImage().hashCode() | getFlags();
+	}
+
+	/**
+	 * @see CompositeImageDescriptor#drawCompositeImage(int, int)
+	 */
+	protected void drawCompositeImage(int width, int height) {
+		ImageData bg = getBaseImage().getImageData();
+		if (bg == null) {
+			bg = DEFAULT_IMAGE_DATA;
+		}
+		drawImage(bg, 0, 0);
+		drawOverlays();
+	}
+
+	private ImageData getImageData(String imageDescriptorKey) {
+		return DLTKDebugImages.getImageDescriptor(imageDescriptorKey)
+				.getImageData();
+	}
+
+	/**
+	 * Add any overlays to the image as specified in the flags.
+	 */
+	protected void drawOverlays() {
+		int flags = getFlags();
+		int x = 0;
+		int y = 0;
+		ImageData data = null;
+		if ((flags & IS_OUT_OF_SYNCH) != 0) {
+			x = getSize().x;
+			y = 0;
+			data = getImageData(DLTKDebugImages.IMG_OVR_OUT_OF_SYNCH);
+			x -= data.width;
+			drawImage(data, x, y);
+		} else if ((flags & MAY_BE_OUT_OF_SYNCH) != 0) {
+			x = getSize().x;
+			y = 0;
+			data = getImageData(DLTKDebugImages.IMG_OVR_MAY_BE_OUT_OF_SYNCH);
+			x -= data.width;
+			drawImage(data, x, y);
+		} else if ((flags & SYNCHRONIZED) != 0) {
+			x = getSize().x;
+			y = 0;
+			data = getImageData(DLTKDebugImages.IMG_OVR_SYNCHRONIZED);
+			x -= data.width;
+			drawImage(data, x, y);
+		} else {
+			if ((flags & IN_DEADLOCK) != 0) {
+				x = 0;
+				y = 0;
+				data = getImageData(DLTKDebugImages.IMG_OVR_IN_DEADLOCK);
+				drawImage(data, x, y);
+			}
+			if ((flags & OWNED_MONITOR) != 0) {
+				x = getSize().x;
+				y = getSize().y;
+				data = getImageData(DLTKDebugImages.IMG_OVR_OWNED);
+				x -= data.width;
+				y -= data.height;
+				drawImage(data, x, y);
+			} else if ((flags & CONTENTED_MONITOR) != 0) {
+				x = getSize().x;
+				y = getSize().y;
+				data = getImageData(DLTKDebugImages.IMG_OVR_IN_CONTENTION);
+				x -= data.width;
+				y -= data.height;
+				drawImage(data, x, y);
+			} else if ((flags & OWNS_MONITOR) != 0) {
+				x = getSize().x;
+				y = 0;
+				data = getImageData(DLTKDebugImages.IMG_OVR_OWNS_MONITOR);
+				x -= data.width;
+				drawImage(data, x, y);
+			} else if ((flags & IN_CONTENTION_FOR_MONITOR) != 0) {
+				x = getSize().x;
+				y = 0;
+				data = getImageData(DLTKDebugImages.IMG_OVR_IN_CONTENTION_FOR_MONITOR);
+				x -= data.width;
+				drawImage(data, x, y);
+			} else {
+				drawBreakpointOverlays();
+			}
+		}
+	}
+
+	protected void drawBreakpointOverlays() {
+		int flags = getFlags();
+		int x = 0;
+		int y = 0;
+		ImageData data = null;
+		if ((flags & INSTALLED) != 0) {
+			x = 0;
+			y = getSize().y;
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_BREAKPOINT_INSTALLED);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_BREAKPOINT_INSTALLED_DISABLED);
+			}
+
+			y -= data.height;
+			drawImage(data, x, y);
+		}
+		if ((flags & CAUGHT) != 0) {
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_CAUGHT_BREAKPOINT);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_CAUGHT_BREAKPOINT_DISABLED);
+			}
+			x = 0;
+			y = 0;
+			drawImage(data, x, y);
+		}
+		if ((flags & UNCAUGHT) != 0) {
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_UNCAUGHT_BREAKPOINT_DISABLED);
+			}
+			x = data.width;
+			y = data.height;
+			drawImage(data, x, y);
+		}
+		if ((flags & SCOPED) != 0) {
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_SCOPED_BREAKPOINT);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_SCOPED_BREAKPOINT_DISABLED);
+			}
+			x = 0;
+			y = getSize().y;
+			y -= data.height;
+			drawImage(data, x, y);
+		}
+		if ((flags & CONDITIONAL) != 0) {
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_CONDITIONAL_BREAKPOINT_DISABLED);
+			}
+			x = 0;
+			y = 0;
+			drawImage(data, x, y);
+		}
+		if ((flags & ENTRY) != 0) {
+			x = getSize().x;
+			y = 0;
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_METHOD_BREAKPOINT_ENTRY_DISABLED);
+			}
+			x -= data.width;
+			drawImage(data, x, y);
+		}
+		if ((flags & EXIT) != 0) {
+			x = getSize().x;
+			y = getSize().y;
+			if ((flags & ENABLED) != 0) {
+				data = getImageData(DLTKDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT);
+			} else {
+				data = getImageData(DLTKDebugImages.IMG_OVR_METHOD_BREAKPOINT_EXIT_DISABLED);
+			}
+			x -= data.width;
+			y -= data.height;
+			drawImage(data, x, y);
+		}
+	}
+
+	protected ImageDescriptor getBaseImage() {
+		return fBaseImage;
+	}
+
+	protected void setBaseImage(ImageDescriptor baseImage) {
+		fBaseImage = baseImage;
+	}
+
+	protected int getFlags() {
+		return fFlags;
+	}
+
+	protected void setFlags(int flags) {
+		fFlags = flags;
+	}
+
+	protected void setSize(Point size) {
+		fSize = size;
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotConnectedStatusHandler.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotConnectedStatusHandler.java
new file mode 100644
index 0000000..8ca5543
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotConnectedStatusHandler.java
@@ -0,0 +1,25 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+public class DebuggingEngineNotConnectedStatusHandler implements IStatusHandler {
+	public Object handleStatus(IStatus status, Object source)
+			throws CoreException {
+
+		DLTKDebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
+			public void run() {
+				String title = "Debugging engine not avaialble";
+				String message = "Debugging engine cannot connect to dbgp service during period of time";
+
+				MessageDialog.openError(DLTKDebugUIPlugin
+						.getActiveWorkbenchShell(), title, message);
+			}
+		});
+
+		return null;
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotStartedStatusHandler.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotStartedStatusHandler.java
new file mode 100644
index 0000000..0631aac
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DebuggingEngineNotStartedStatusHandler.java
@@ -0,0 +1,25 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+public class DebuggingEngineNotStartedStatusHandler implements IStatusHandler {
+	public Object handleStatus(IStatus status, Object source)
+			throws CoreException {
+
+		DLTKDebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
+			public void run() {
+				String title = "Debugging engine not started";
+				String message = "Debugging engine not started. Please check its settings.";
+
+				MessageDialog.openError(DLTKDebugUIPlugin
+						.getActiveWorkbenchShell(), title, message);
+			}
+		});
+
+		return null;
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRetargettableActionAdapterFactory.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRetargettableActionAdapterFactory.java
new file mode 100644
index 0000000..23e5ceb
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRetargettableActionAdapterFactory.java
@@ -0,0 +1,23 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.debug.ui.actions.IRunToLineTarget;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
+
+public class DltkRetargettableActionAdapterFactory implements IAdapterFactory {
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		if (adapterType == IRunToLineTarget.class) {
+			return new DltkRunToLineAdapter();
+		}
+		else if (adapterType == IToggleBreakpointsTarget.class) {
+			return new DltkToggleBreakpointAdapter();
+		}
+		
+		return null;
+	}
+
+	public Class[] getAdapterList() {
+		return new Class[] { IRunToLineTarget.class,
+				IToggleBreakpointsTarget.class };
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRunToLineAdapter.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRunToLineAdapter.java
new file mode 100644
index 0000000..92c3509
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkRunToLineAdapter.java
@@ -0,0 +1,71 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import java.net.URI;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.ISuspendResume;
+import org.eclipse.debug.ui.actions.IRunToLineTarget;
+import org.eclipse.dltk.debug.core.model.IScriptDebugTarget;
+import org.eclipse.dltk.debug.internal.core.model.ScriptLineBreakpoint;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class DltkRunToLineAdapter implements IRunToLineTarget {
+
+	protected ITextEditor getPartEditor(IWorkbenchPart part) {
+		if (part instanceof ITextEditor) {
+			return (ITextEditor) part;
+		}
+
+		return null;
+	}
+
+	protected IResource getPartResource(IWorkbenchPart part) {
+		ITextEditor textEditor = getPartEditor(part);
+		if (textEditor != null) {
+			IResource resource = (IResource) textEditor.getEditorInput()
+					.getAdapter(IResource.class);
+			return resource;
+		}
+
+		return null;
+	}
+
+	public DltkRunToLineAdapter() {
+
+	}
+
+	public boolean canRunToLine(IWorkbenchPart part, ISelection selection,
+			ISuspendResume target) {				
+		return true;
+	}
+
+	public void runToLine(IWorkbenchPart part, ISelection selection,
+			ISuspendResume target) throws CoreException {
+
+		if (selection instanceof ITextSelection) {
+			ITextSelection textSelection = (ITextSelection) selection;
+
+			IResource resource = getPartResource(part);
+
+			URI uri = ScriptLineBreakpoint.makeUri(resource);
+
+			int lineNumber = textSelection.getStartLine() + 1; // one based
+
+			if (target instanceof IDebugElement) {
+				IDebugTarget debugTarget = ((IDebugElement) target)
+						.getDebugTarget();
+				if (debugTarget instanceof IScriptDebugTarget) {
+					((IScriptDebugTarget) debugTarget).runToLine(uri,
+							lineNumber);
+					target.resume();
+				}
+			}
+		}
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkToggleBreakpointAdapter.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkToggleBreakpointAdapter.java
new file mode 100644
index 0000000..d240d16
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DltkToggleBreakpointAdapter.java
@@ -0,0 +1,99 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
+import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
+import org.eclipse.dltk.debug.internal.core.model.ScriptModelConstants;
+import org.eclipse.dltk.debug.ui.BreakpointUtils;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public class DltkToggleBreakpointAdapter implements IToggleBreakpointsTarget {
+	
+	protected ITextEditor getPartEditor(IWorkbenchPart part) {
+		if (part instanceof ITextEditor) {
+			return (ITextEditor) part;
+		}
+
+		return null;
+	}
+
+	protected IResource getPartResource(IWorkbenchPart part) {
+		ITextEditor textEditor = getPartEditor(part);
+		if (textEditor != null) {
+			IResource resource = (IResource) textEditor.getEditorInput()
+					.getAdapter(IResource.class);
+			return resource;
+		}
+
+		return null;
+	}
+
+	public DltkToggleBreakpointAdapter() {
+
+	}
+
+	public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection)
+			throws CoreException {
+		if (selection instanceof ITextSelection) {
+
+			ITextSelection textSelection = (ITextSelection) selection;			
+			int lineNumber = textSelection.getStartLine() + 1; //one based
+				
+			//System.out.println("Selection: " + textSelection);
+			//System.out.println("Line number: " + lineNumber);
+			//System.out.println("Offset: " + textSelection.getOffset());
+			//System.out.println("Length: " + textSelection.getLength());
+			
+			IResource resource = getPartResource(part);
+
+			if (resource != null) {
+				IBreakpoint[] breakpoints = DebugPlugin.getDefault()
+						.getBreakpointManager().getBreakpoints(
+								ScriptModelConstants.MODEL_ID);
+
+				for (int i = 0; i < breakpoints.length; i++) {
+					IBreakpoint breakpoint = breakpoints[i];
+					if (resource.equals(breakpoint.getMarker().getResource())) {
+						if (((ILineBreakpoint) breakpoint).getLineNumber() == lineNumber) {
+							// delete existing breakpoint
+							breakpoint.delete();
+							return;
+						}
+					}
+				}
+				
+				BreakpointUtils.addLineBreakpoint(getPartEditor(part), lineNumber);
+			}
+		} 
+	}
+
+	public boolean canToggleLineBreakpoints(IWorkbenchPart part,
+			ISelection selection) {
+		return getPartResource(part) != null;
+	}
+
+	public void toggleMethodBreakpoints(IWorkbenchPart part,
+			ISelection selection) throws CoreException {
+	}
+
+	public boolean canToggleMethodBreakpoints(IWorkbenchPart part,
+			ISelection selection) {
+		return false;
+	}
+
+	public void toggleWatchpoints(IWorkbenchPart part, ISelection selection)
+			throws CoreException {
+	}
+
+	public boolean canToggleWatchpoints(IWorkbenchPart part,
+			ISelection selection) {
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/IDLTKDebugHelpContextIds.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/IDLTKDebugHelpContextIds.java
new file mode 100644
index 0000000..d945643
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/IDLTKDebugHelpContextIds.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui;
+
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+
+
+/**
+ * Help context ids for the Script Debug UI.
+ * <p>
+ * This interface contains constants only; it is not intended to be implemented
+ * or extended.
+ * </p>
+ * 
+ */
+public interface IDLTKDebugHelpContextIds {
+	
+	public static final String PREFIX= DLTKDebugUIPlugin.PLUGIN_ID + '.';
+
+	// view parts
+	public static final String DISPLAY_VIEW= PREFIX + "display_view_context"; //$NON-NLS-1$
+	public static final String STACK_TRACE_CONSOLE = PREFIX + "stack_trace_console_context"; //$NON-NLS-1$
+
+	//dialogs
+	public static final String EDIT_INTERPRETER_DIALOG= PREFIX + "edit_interpreter_dialog_context"; //$NON-NLS-1$
+	public static final String INTERPRETER_DETAILS_DIALOG= PREFIX + "interpreter_details_dialog_context"; //$NON-NLS-1$
+	public static final String MAIN_TYPE_SELECTION_DIALOG= PREFIX + "main_type_selection_dialog_context"; //$NON-NLS-1$
+	public static final String EDIT_DETAIL_FORMATTER_DIALOG= PREFIX + "edit_detail_formatter_dialog_context"; //$NON-NLS-1$
+	public static final String INSTANCE_BREAKPOINT_SELECTION_DIALOG= PREFIX + "instance_breakpoint_selection_dialog_context"; //$NON-NLS-1$
+	public static final String SNIPPET_IMPORTS_DIALOG= PREFIX + "snippet_imports_dialog_context"; //$NON-NLS-1$
+	public static final String ADD_EXCEPTION_DIALOG= PREFIX + "add_exception_dialog_context"; //$NON-NLS-1$
+	public static final String DETAIL_DISPLAY_OPTIONS_DIALOG= PREFIX + "detail_options_dialog_context"; //$NON-NLS-1$
+
+	// Preference/Property pages
+	public static final String INTERPRETER_PREFERENCE_PAGE= PREFIX + "interpreter_preference_page_context"; //$NON-NLS-1$
+	public static final String INTERPRETER_PROFILES_PAGE= PREFIX + "interpreter_profiles_page_context"; //$NON-NLS-1$
+	public static final String LAUNCH_INTERPRETER_PROPERTY_PAGE= PREFIX + "launch_interpreter_property_page_context"; //$NON-NLS-1$
+	public static final String SCRIPT_DEBUG_PREFERENCE_PAGE= PREFIX + "script_debug_preference_page_context"; //$NON-NLS-1$	
+	public static final String SCRIPT_STEP_FILTER_PREFERENCE_PAGE= PREFIX + "script_step_filter_preference_page_context"; //$NON-NLS-1$
+	public static final String SCRIPT_BREAKPOINT_PREFERENCE_PAGE= PREFIX + "script_breakpoint_preference_page_context"; //$NON-NLS-1$
+	public static final String SCRIPT_DETAIL_FORMATTER_PREFERENCE_PAGE= PREFIX + "script_detail_formatter_preference_page_context"; //$NON-NLS-1$
+	public static final String SCRIPT_PRIMITIVES_PREFERENCE_PAGE= PREFIX + "script_primitives_preference_page_context"; //$NON-NLS-1$
+	
+	// reused ui-blocks
+	public static final String SOURCE_ATTACHMENT_BLOCK= PREFIX + "source_attachment_context"; //$NON-NLS-1$
+	public static final String WORKING_DIRECTORY_BLOCK= PREFIX + "working_directory_context"; //$NON-NLS-1$
+
+	// application launch configuration dialog tabs
+	public static final String LAUNCH_CONFIGURATION_DIALOG_ARGUMENTS_TAB= PREFIX + "launch_configuration_dialog_arguments_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_CLASSPATH_TAB= PREFIX + "launch_configuration_dialog_classpath_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_CONNECT_TAB= PREFIX + "launch_configuration_dialog_connect_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_INTERPRETER_TAB= PREFIX + "launch_configuration_dialog_interpreter_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB= PREFIX + "launch_configuration_dialog_main_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_SOURCE_TAB= PREFIX + "launch_configuration_dialog_source_tab"; //$NON-NLS-1$
+	
+	// applet launch configuration dialog tabs
+	public static final String LAUNCH_CONFIGURATION_DIALOG_APPLET_MAIN_TAB= PREFIX + "launch_configuration_dialog_applet_main_tab"; //$NON-NLS-1$
+	public static final String LAUNCH_CONFIGURATION_DIALOG_APPLET_ARGUMENTS_TAB= PREFIX + "launch_configuration_dialog_applet_arguments_tab"; //$NON-NLS-1$
+
+	//actions
+	public static final String STEP_INTO_SELECTION_ACTION = PREFIX + "step_into_selection_action"; //$NON-NLS-1$
+	public static final String SHOW_STATICS_ACTION = PREFIX + "show_static_action_context"; //$NON-NLS-1$
+	public static final String SHOW_CONSTANTS_ACTION = PREFIX + "show_constants_action_context"; //$NON-NLS-1$
+	public static final String CLEAR_DISPLAY_VIEW_ACTION = PREFIX + "clear_display_view_action_context"; //$NON-NLS-1$
+	public static final String TERMINATE_SCRAPBOOK_Interpreter_ACTION = PREFIX + "terminate_scrapbook_Interpreter_action_context"; //$NON-NLS-1$
+	public static final String SCRAPBOOK_IMPORTS_ACTION = PREFIX + "scrapbook_imports_action_context"; //$NON-NLS-1$
+	
+	public static final String NEW_SNIPPET_WIZARD_PAGE= PREFIX + "new_snippet_wizard_page_context"; //$NON-NLS-1$
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ImageDescriptorRegistry.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ImageDescriptorRegistry.java
new file mode 100644
index 0000000..b9b5ce8
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ImageDescriptorRegistry.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui;
+
+ 
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+
+/**
+ * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
+ */
+public class ImageDescriptorRegistry {
+
+	private HashMap fRegistry= new HashMap(10);
+	private Display fDisplay;
+	
+	/**
+	 * Creates a new image descriptor registry for the current or default display,
+	 * respectively.
+	 */
+	public ImageDescriptorRegistry() {
+		this(DLTKDebugUIPlugin.getStandardDisplay());
+	}
+	
+	/**
+	 * Creates a new image descriptor registry for the given display. All images
+	 * managed by this registry will be disposed when the display gets disposed.
+	 * 
+	 * @param display the display the images managed by this registry are allocated for 
+	 */
+	public ImageDescriptorRegistry(Display display) {
+		fDisplay= display;
+		Assert.isNotNull(fDisplay);
+		hookDisplay();
+	}
+	
+	/**
+	 * Returns the image associated with the given image descriptor.
+	 * 
+	 * @param descriptor the image descriptor for which the registry manages an image
+	 * @return the image associated with the image descriptor or <code>null</code>
+	 *  if the image descriptor can't create the requested image.
+	 */
+	public Image get(ImageDescriptor descriptor) {
+		if (descriptor == null)
+			descriptor= ImageDescriptor.getMissingImageDescriptor();
+			
+		Image result= (Image)fRegistry.get(descriptor);
+		if (result != null)
+			return result;
+	
+		Assert.isTrue(fDisplay == DLTKDebugUIPlugin.getStandardDisplay(), "DebugUIMessages.ImageDescriptorRegistry_Allocating_image_for_wrong_display_1"); 
+		result= descriptor.createImage();
+		if (result != null)
+			fRegistry.put(descriptor, result);
+		return result;
+	}
+
+	/**
+	 * Disposes all images managed by this registry.
+	 */	
+	public void dispose() {
+		for (Iterator iter= fRegistry.values().iterator(); iter.hasNext(); ) {
+			Image image= (Image)iter.next();
+			image.dispose();
+		}
+		fRegistry.clear();
+	}
+	
+	private void hookDisplay() {
+		fDisplay.asyncExec(new Runnable() {
+			public void run() {
+			fDisplay.disposeExec(new Runnable() {
+				public void run() {
+					dispose();
+				}	
+			});			
+			}
+		});
+
+	}
+}
+
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugOptionsManager.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugOptionsManager.java
new file mode 100644
index 0000000..29a96c4
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugOptionsManager.java
@@ -0,0 +1,143 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointsListener;
+import org.eclipse.debug.core.IDebugEventSetListener;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchListener;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.debug.core.model.IScriptBreakpoint;
+import org.eclipse.dltk.debug.core.model.IScriptBreakpointListener;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+
+public class ScriptDebugOptionsManager implements IDebugEventSetListener,
+		IPropertyChangeListener, IScriptBreakpointListener, ILaunchListener,
+		IBreakpointsListener {
+
+	private static ScriptDebugOptionsManager fgOptionsManager;
+
+	/**
+	 * A label provider
+	 */
+	private static ILabelProvider fLabelProvider = DebugUITools
+			.newDebugModelPresentation();
+
+	public void handleDebugEvents(DebugEvent[] events) {
+	}
+
+	public void launchAdded(ILaunch launch) {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void launchChanged(ILaunch launch) {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void launchRemoved(ILaunch launch) {
+		// TODO Auto-generated method stub
+
+	}
+
+	public void breakpointsAdded(IBreakpoint[] breakpoints) {
+		// if a breakpoint is added, but already has a message, do not update it
+		List update = new ArrayList();
+		for (int i = 0; i < breakpoints.length; i++) {
+			IBreakpoint breakpoint = breakpoints[i];
+			try {
+				if (breakpoint instanceof IScriptBreakpoint
+						&& breakpoint.getMarker().getAttribute(IMarker.MESSAGE) == null) {
+					update.add(breakpoint);
+				}
+			} catch (CoreException e) {
+				DLTKDebugUIPlugin.log(e);
+			}
+		}
+		if (!update.isEmpty()) {
+			updateBreakpointMessages((IBreakpoint[]) update
+					.toArray(new IBreakpoint[update.size()]));
+		}
+	}
+
+	public void breakpointsChanged(IBreakpoint[] breakpoints,
+			IMarkerDelta[] deltas) {
+		updateBreakpointMessages(breakpoints);
+
+	}
+
+	private void updateBreakpointMessages(final IBreakpoint[] breakpoints) {
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				for (int i = 0; i < breakpoints.length; i++) {
+					IBreakpoint breakpoint = breakpoints[i];
+					if (breakpoint instanceof IScriptBreakpoint) {
+						String info = fLabelProvider.getText(breakpoint);
+						breakpoint.getMarker().setAttribute(IMarker.MESSAGE,
+								info);
+					}
+				}
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, null, 0, null);
+		} catch (CoreException e) {
+			DLTKDebugUIPlugin.log(e);
+		}
+	}
+
+	public void breakpointsRemoved(IBreakpoint[] breakpoints,
+			IMarkerDelta[] deltas) {
+		if (DLTKCore.DEBUG) {
+			System.out.println("Removed breakpoints.");
+		}
+	}
+
+	public static ScriptDebugOptionsManager getDefault() {
+		if (fgOptionsManager == null) {
+			fgOptionsManager = new ScriptDebugOptionsManager();
+		}
+		return fgOptionsManager;
+	}
+
+	public void startup() {
+		// lazy initialization will occur on the first launch
+		DebugPlugin debugPlugin = DebugPlugin.getDefault();
+		debugPlugin.getLaunchManager().addLaunchListener(this);
+		debugPlugin.getBreakpointManager().addBreakpointListener(this);
+	}
+
+	public void shutdown() {
+		DebugPlugin debugPlugin = DebugPlugin.getDefault();
+		debugPlugin.removeDebugEventListener(this);
+		debugPlugin.getLaunchManager().removeLaunchListener(this);
+		debugPlugin.getBreakpointManager().removeBreakpointListener(this);
+		if (!DLTKDebugUIPlugin.getDefault().isShuttingDown()) {
+			// avert restoring the preference store at shutdown
+			DLTKDebugUIPlugin.getDefault().getPreferenceStore()
+					.removePropertyChangeListener(this);
+		}
+		// ScriptDebugModel.removeJavaBreakpointListener(this);
+		System.getProperties().remove(
+				DLTKDebugUIPlugin.getUniqueIdentifier() + ".debuggerActive"); //$NON-NLS-1$
+	}
+
+	public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
+		// TODO Auto-generated method stub
+		System.out.println("Propety changed.");
+	}
+}
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterComboBlock.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterComboBlock.java
new file mode 100644
index 0000000..af0b99b
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterComboBlock.java
@@ -0,0 +1,557 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.IDLTKDebugUIConstants;
+import org.eclipse.dltk.debug.ui.actions.ControlAccessibleListener;
+import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
+import org.eclipse.dltk.internal.ui.util.SWTUtil;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.IInterpreterInstallType;
+import org.eclipse.dltk.launching.InterpreterStandin;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * A composite that displays installed InterpreterEnvironment's in a combo box, with a 'manage...'
+ * button to modify installed InterpreterEnvironments.
+ * <p>
+ * This block implements ISelectionProvider - it sends selection change events
+ * when the checked InterpreterEnvironment in the table changes, or when the "use default" button
+ * check state changes.
+ * </p>
+ */
+public abstract class AbstractInterpreterComboBlock {
+	
+	public static final String PROPERTY_INTERPRETER = "PROPERTY_INTERPRETER"; //$NON-NLS-1$
+	
+	/**
+	 * This block's control
+	 */
+	private Composite fControl;
+	
+	/**
+	 * Interpreters being displayed
+	 */
+	private List fInterpreters = new ArrayList(); 
+	
+	/**
+	 * The main control
+	 */ 
+	private Combo fCombo;
+	
+	// Action buttons
+	private Button fManageButton;
+		
+	/**
+	 * InterpreterEnvironment change listeners
+	 */
+	private ListenerList fListeners = new ListenerList();
+	
+	/**
+	 * Default InterpreterEnvironment descriptor or <code>null</code> if none.
+	 */
+	private InterpreterDescriptor fDefaultDescriptor = null;
+	
+	/**
+	 * Specific InterpreterEnvironment descriptor or <code>null</code> if none.
+	 */
+	private InterpreterDescriptor fSpecificDescriptor = null;
+
+	/**
+	 * Default InterpreterEnvironment radio button or <code>null</code> if none
+	 */
+	private Button fDefaultButton = null;
+	
+	/**
+	 * Selected InterpreterEnvironment radio button
+	 */
+	private Button fSpecificButton = null;
+	
+	/**
+	 * The title used for the InterpreterEnvironment block
+	 */
+	private String fTitle = null;
+	
+	private IStatus fStatus = OK_STATUS;
+	
+	private static IStatus OK_STATUS = new Status(IStatus.OK, 
+			DLTKDebugUIPlugin.getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
+
+	public void addPropertyChangeListener(IPropertyChangeListener listener) {
+		fListeners.add(listener);
+	}
+	
+	public void removePropertyChangeListener(IPropertyChangeListener listener) {
+		fListeners.remove(listener);
+	}
+	
+	private void firePropertyChange() {
+		PropertyChangeEvent event = new PropertyChangeEvent(this, PROPERTY_INTERPRETER, null, getPath());
+		Object[] listeners = fListeners.getListeners();
+		for (int i = 0; i < listeners.length; i++) {
+			IPropertyChangeListener listener = (IPropertyChangeListener) listeners[i];
+			listener.propertyChange(event);
+		}
+	}
+	
+	/**
+	 * Creates this block's control in the given control.
+	 * 
+	 * @param anscestor containing control
+	 */
+	public void createControl(Composite ancestor) {
+		Font font = ancestor.getFont();
+		Composite comp = new Composite(ancestor, SWT.NONE);
+		GridLayout layout= new GridLayout();
+		comp.setLayout(new GridLayout());
+		comp.setLayoutData(new GridData(GridData.FILL_BOTH));
+		fControl = comp;
+		comp.setFont(font);
+		
+		Group group= new Group(comp, SWT.NULL);
+		layout= new GridLayout();
+		layout.numColumns= 3;
+		group.setLayout(layout);
+		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		group.setFont(font);	
+		
+		GridData data;
+		
+		if (fTitle == null) {
+			fTitle = InterpretersMessages.InterpretersComboBlock_3; 
+		}
+		group.setText(fTitle);
+		
+		// display a 'use default InterpreterEnvironment' check box
+		if (fDefaultDescriptor != null) {
+			fDefaultButton = new Button(group, SWT.RADIO);
+			fDefaultButton.setText(fDefaultDescriptor.getDescription());
+			fDefaultButton.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					if (fDefaultButton.getSelection()) {
+						setUseDefaultInterpreter();
+						if (fInterpreters.isEmpty()) {
+							setStatus (new Status(IStatus.ERROR, 
+									DLTKLaunchingPlugin.getUniqueIdentifier(), 
+									IDLTKLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, 
+									InterpretersMessages.InterpretersComboBlock_0, 
+									null));
+						} else {
+							setStatus(OK_STATUS);
+						}	
+						firePropertyChange();
+					}
+				}
+			});
+			data = new GridData();
+			data.horizontalSpan = 3;
+			fDefaultButton.setLayoutData(data);
+			fDefaultButton.setFont(font);
+		}
+		
+		fSpecificButton = new Button(group, SWT.RADIO);
+		if (fSpecificDescriptor != null) {
+			fSpecificButton.setText(fSpecificDescriptor.getDescription());
+		} else {
+			fSpecificButton.setText(InterpretersMessages.InterpretersComboBlock_1); 
+		}
+		fSpecificButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (fSpecificButton.getSelection()) {
+					fCombo.setEnabled(true);
+					if (fCombo.getText().length() == 0 && !fInterpreters.isEmpty()) {
+						fCombo.select(0);
+					}
+					if (fInterpreters.isEmpty()) {
+						setStatus (new Status(IStatus.ERROR, 
+								DLTKLaunchingPlugin.getUniqueIdentifier(), 
+								IDLTKLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, 
+								InterpretersMessages.InterpretersComboBlock_0, 
+								null));
+					} else {
+						setStatus(OK_STATUS);
+					}					
+					firePropertyChange();
+				}
+			}
+		});
+		fSpecificButton.setFont(font);
+		data = new GridData(GridData.BEGINNING);
+		fSpecificButton.setLayoutData(data);
+		
+		fCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
+		fCombo.setFont(font);
+		data= new GridData(GridData.FILL_HORIZONTAL);
+		data.horizontalSpan = 1;
+		fCombo.setLayoutData(data);
+		ControlAccessibleListener.addListener(fCombo, fSpecificButton.getText());
+		
+		fCombo.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				firePropertyChange();
+			}
+		});
+				
+		fManageButton = createPushButton(group, InterpretersMessages.InterpretersComboBlock_2); 
+		fManageButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event event) {
+				showInterpreterPreferencePage();				
+			}
+		});
+		
+		fillWithWorkspaceInterpreters();
+		if (fInterpreters.isEmpty()) {			
+			setStatus (new Status(IStatus.ERROR, 
+					DLTKLaunchingPlugin.getUniqueIdentifier(), 
+					IDLTKLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, 
+					InterpretersMessages.InterpretersComboBlock_0, 
+					null));
+		} else {
+			setStatus(OK_STATUS);
+		}
+		
+	}
+	
+	
+	
+	/**
+	 * Opens the given preference page, and updates when closed.
+	 * 
+	 * @param id pref page id
+	 * @param page pref page
+	 */
+	protected void showPrefPage(String id, IPreferencePage page) {
+		DLTKDebugUIPlugin.showPreferencePage(id, page);
+		refreshInterpreters();	
+	}
+	
+	private void restoreCombo(List elements, Object element, Combo combo) {
+		int index = -1;
+		if (element != null) {
+			index = elements.indexOf(element);
+		}
+		if (index >= 0) {
+			combo.select(index);
+		} else {
+			combo.select(0);
+		}
+	}
+	
+	protected Button createPushButton(Composite parent, String label) {
+		return SWTUtil.createPushButton(parent, label, null);
+	}
+	
+	/**
+	 * Returns this block's control
+	 * 
+	 * @return control
+	 */
+	public Control getControl() {
+		return fControl;
+	}
+	
+	/**
+	 * Sets the InterpreterEnvironments to be displayed in this block
+	 * 
+	 * @param Interpreters InterpreterEnvironments to be displayed
+	 */
+	protected void setInterpreters(List InterpreterEnvironments) {
+		fInterpreters.clear();
+		fInterpreters.addAll(InterpreterEnvironments);
+		// sort by name
+		Collections.sort(fInterpreters, new Comparator() {
+			public int compare(Object o1, Object o2) {
+				IInterpreterInstall left = (IInterpreterInstall)o1;
+				IInterpreterInstall right = (IInterpreterInstall)o2;
+				return left.getName().compareToIgnoreCase(right.getName());
+			}
+
+			public boolean equals(Object obj) {
+				return obj == this;
+			}
+		});
+		// now make an array of names
+		String[] names = new String[fInterpreters.size()];
+		Iterator iter = fInterpreters.iterator();
+		int i = 0;
+		while (iter.hasNext()) {
+			IInterpreterInstall Interpreter = (IInterpreterInstall)iter.next();
+			names[i] = Interpreter.getName();
+			i++;
+		}
+		fCombo.setItems(names);
+		fCombo.setVisibleItemCount(Math.min(names.length, 20));
+	}
+	
+	protected Shell getShell() {
+		return getControl().getShell();
+	}
+
+	/**
+	 * Selects a specific InterpreterEnvironment based on type/name.
+	 * 
+	 * @param Interpreter InterpreterEnvironment
+	 */
+	private void selectInterpreter(IInterpreterInstall Interpreter) {
+		fSpecificButton.setSelection(true);
+		fDefaultButton.setSelection(false);
+		fCombo.setEnabled(true);
+		int index = fInterpreters.indexOf(Interpreter);
+		if (index >= 0) {
+			fCombo.select(index);		
+		}
+		firePropertyChange();
+	}
+	
+	
+	/**
+	 * Returns the selected InterpreterEnvironment or <code>null</code> if none.
+	 * 
+	 * @return the selected InterpreterEnvironment or <code>null</code> if none
+	 */
+	public IInterpreterInstall getInterpreter() {
+		int index = fCombo.getSelectionIndex();
+		if (index >= 0) {
+			return (IInterpreterInstall)fInterpreters.get(index);
+		}
+		return null;
+	}
+	
+	
+	
+	
+	/**
+	 * Sets the Default InterpreterEnvironment Descriptor for this block.
+	 * 
+	 * @param descriptor default InterpreterEnvironment descriptor
+	 */
+	public void setDefaultInterpreterDescriptor(InterpreterDescriptor descriptor) {
+		fDefaultDescriptor = descriptor;
+		setButtonTextFromDescriptor(fDefaultButton, descriptor);
+	}
+	
+	private void setButtonTextFromDescriptor(Button button, InterpreterDescriptor descriptor) {
+		if (button != null) {
+			//update the description & InterpreterEnvironment in case it has changed
+			String currentText = button.getText();
+			String newText = descriptor.getDescription();
+			if (!newText.equals(currentText)) {
+				button.setText(newText);
+				fControl.layout();
+			}
+		}
+	}
+
+	/**
+	 * Sets the specific InterpreterEnvironment Descriptor for this block.
+	 * 
+	 * @param descriptor specific InterpreterEnvironment descriptor
+	 */
+	public void setSpecificInterpreterDescriptor(InterpreterDescriptor descriptor) {
+		fSpecificDescriptor = descriptor;
+		setButtonTextFromDescriptor(fSpecificButton, descriptor);
+	}
+	
+	/**
+	 * Returns whether the 'use default InterpreterEnvironment' button is checked.
+	 * 
+	 * @return whether the 'use default InterpreterEnvironment' button is checked
+	 */
+	public boolean isDefaultInterpreter() {
+		if (fDefaultButton != null) {
+			return fDefaultButton.getSelection();
+		}
+		return false;
+	}
+	
+	/**
+	 * Sets this control to use the 'default' InterpreterEnvironment.
+	 */
+	public void setUseDefaultInterpreter() {
+		if (fDefaultDescriptor != null) {
+			fDefaultButton.setSelection(true);
+			fSpecificButton.setSelection(false);
+			fCombo.setEnabled(false);
+			firePropertyChange();
+		}
+	}
+	
+	/**
+	 * Sets the title used for this InterpreterEnvironment block
+	 * 
+	 * @param title title for this InterpreterEnvironment block 
+	 */
+	public void setTitle(String title) {
+		fTitle = title;
+	}
+
+	/**
+	 * Refresh the default InterpreterEnvironment description.
+	 */
+	public void refresh() {
+		setDefaultInterpreterDescriptor(fDefaultDescriptor);
+	}
+	
+	public void refreshInterpreters () {
+		IInterpreterInstall prevInterpreterEnvironment = getInterpreter();
+		fillWithWorkspaceInterpreters();
+		if (fInterpreters.isEmpty()) {			
+			setStatus (new Status(IStatus.ERROR, 
+					DLTKLaunchingPlugin.getUniqueIdentifier(), 
+					IDLTKLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, 
+					InterpretersMessages.InterpretersComboBlock_0, 
+					null));
+		} else {
+			setStatus(OK_STATUS);
+		}
+		restoreCombo(fInterpreters, prevInterpreterEnvironment, fCombo);
+		
+		// update text
+		setDefaultInterpreterDescriptor(fDefaultDescriptor);
+		if (isDefaultInterpreter()) {
+			// reset in case default has changed
+			setUseDefaultInterpreter();
+		}
+		setPath(getPath());
+		firePropertyChange();
+	}
+	
+	/**
+	 * Returns a buildpath container path identifying the selected InterpreterEnvironment.
+	 * 
+	 * @return buildpath container path or <code>null</code>
+
+	 */
+	public IPath getPath() {
+		if (fSpecificButton.getSelection()) {
+			int index = fCombo.getSelectionIndex();
+			if (index >= 0) {
+				IInterpreterInstall Interpreter = (IInterpreterInstall) fInterpreters.get(index);
+				return ScriptRuntime.newInterpreterContainerPath(Interpreter); 
+			}
+			return null;
+		}
+		return ScriptRuntime.newDefaultInterpreterContainerPath();
+	}
+	
+	/**
+	 * Sets the selection based on the given container path and returns
+	 * a status indicating if the selection was successful.
+	 * 
+	 * @param containerPath
+	 * @return status 
+	 */
+	public void setPath(IPath containerPath) {
+		if (fInterpreters.isEmpty()) {			
+			setStatus (new Status(IStatus.ERROR, 
+					DLTKLaunchingPlugin.getUniqueIdentifier(), 
+					IDLTKLaunchConfigurationConstants.ERR_NO_DEFAULT_INTERPRETER_INSTALL, 
+					InterpretersMessages.InterpretersComboBlock_0, 
+					null));
+		} else {
+			setStatus(OK_STATUS);
+		}
+		if (ScriptRuntime.newDefaultInterpreterContainerPath().equals(containerPath)) {
+			setUseDefaultInterpreter();			
+		} else {			
+			IInterpreterInstall install = ScriptRuntime.getInterpreterInstall(getCurrentLanguageNature(), containerPath);
+			if (install == null) {
+				setError(InterpretersMessages.InterpretersComboBlock_8);				
+			} else {
+				selectInterpreter(install);
+				File location = install.getInstallLocation();
+				if (location == null) {
+					setError(InterpretersMessages.InterpretersComboBlock_12); 
+				} else if (!location.exists()) {
+					setError(InterpretersMessages.InterpretersComboBlock_13); 
+				}							
+			}
+			
+		}
+	}
+	
+	private void setError(String message) {
+		setStatus(new Status(IStatus.ERROR, DLTKDebugUIPlugin.getUniqueIdentifier(),
+				IDLTKDebugUIConstants.INTERNAL_ERROR, message, null));		
+	}
+	
+	/**
+	 * Returns the status of the interpreter selection.
+	 * 
+	 * @return status
+	 */
+	public IStatus getStatus() {
+		return fStatus;
+	}
+	
+	private void setStatus(IStatus status) {
+		fStatus = status;
+	}
+	
+	/**
+	 * Shows window with appropriate language preference page.
+	 *
+	 */
+	protected abstract void showInterpreterPreferencePage ();
+
+	protected void fillWithWorkspaceInterpreters() {
+		//		 fill with interpreters
+		List standins = new ArrayList();
+		IInterpreterInstallType[] types = ScriptRuntime.getInterpreterInstallTypes();
+		for (int i = 0; i < types.length; i++) {
+			IInterpreterInstallType type = types[i];
+			
+			//filter
+			if (type.getNatureId() != getCurrentLanguageNature ())
+				continue;
+			
+			IInterpreterInstall[] installs = type.getInterpreterInstalls();
+			for (int j = 0; j < installs.length; j++) {
+				IInterpreterInstall install = installs[j];
+				standins.add(new InterpreterStandin(install));
+			}
+		}
+		setInterpreters(standins);	
+	}
+	
+	protected abstract String getCurrentLanguageNature ();
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterContainerWizardPage.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterContainerWizardPage.java
new file mode 100644
index 0000000..5b62090
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterContainerWizardPage.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.IBuildpathEntry;
+import org.eclipse.dltk.internal.debug.ui.DLTKDebugImages;
+import org.eclipse.dltk.internal.ui.wizards.IBuildpathContainerPage;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+
+/**
+ * Extension to allow a user to associate a InterpreterEnvironment with a Script project.
+ */
+public abstract class AbstractInterpreterContainerWizardPage extends WizardPage implements IBuildpathContainerPage {
+	
+	/**
+	 * The buildpath entry to be created.
+	 */
+	private IBuildpathEntry fSelection;
+	
+	/**
+	 * InterpreterEnvironment control
+	 */
+	private AbstractInterpreterComboBlock fInterpreterEnvironmentBlock;
+	
+	/**
+	 * Constructs a new page.
+	 */
+	public AbstractInterpreterContainerWizardPage() {
+		super(InterpretersMessages.InterpreterContainerWizardPage_Interpreter_System_Library_1); 
+	}
+
+	public boolean finish() {
+		IStatus status = fInterpreterEnvironmentBlock.getStatus();
+		if (!status.isOK()) {
+			return false;
+		}
+		IPath path = fInterpreterEnvironmentBlock.getPath();
+		fSelection = DLTKCore.newContainerEntry(path);		
+		return true;
+	}
+	
+	public IBuildpathEntry getSelection() {
+		return fSelection;
+	}
+
+	public void setSelection(IBuildpathEntry containerEntry) {
+		fSelection = containerEntry;
+		initializeFromSelection();
+	}
+
+	/**
+	 * Initlaizes the InterpreterEnvironment selection
+	 */
+	protected void initializeFromSelection() {
+		if (getControl() != null) {
+			if (fSelection == null) {
+				fInterpreterEnvironmentBlock.setUseDefaultInterpreter();
+			} else {
+				fInterpreterEnvironmentBlock.setPath(fSelection.getPath());				
+			}
+			IStatus status = fInterpreterEnvironmentBlock.getStatus();
+			if (!status.isOK()) {
+				setErrorMessage(status.getMessage());
+				try {
+					IStatusHandler handler = DebugPlugin.getDefault().getStatusHandler(status);
+					if (handler != null) {
+						Boolean b = (Boolean)handler.handleStatus(status, this);
+						if (b.booleanValue()) {
+							fInterpreterEnvironmentBlock.refreshInterpreters();
+						}
+					}
+				} catch (CoreException e) {
+				}
+			}
+		}
+	}
+	
+	protected abstract AbstractInterpreterComboBlock getInterpreterBlock ();
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		composite.setLayout(layout);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(gd);
+		composite.setFont(parent.getFont());
+		fInterpreterEnvironmentBlock = getInterpreterBlock();
+		fInterpreterEnvironmentBlock.setDefaultInterpreterDescriptor(new BuildInterpreterDescriptor(getInterpreterBlock ().getCurrentLanguageNature()));
+		fInterpreterEnvironmentBlock.setTitle(InterpretersMessages.InterpreterContainerWizardPage_3); 
+		fInterpreterEnvironmentBlock.createControl(composite);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fInterpreterEnvironmentBlock.getControl().setLayoutData(gd);
+		setControl(composite);
+		fInterpreterEnvironmentBlock.addPropertyChangeListener(new IPropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent event) {
+				IStatus status = fInterpreterEnvironmentBlock.getStatus();
+				if (status.isOK()) {
+					setErrorMessage(null);
+				} else {
+					setErrorMessage(status.getMessage());
+				}
+			}
+		});
+		
+		setTitle(InterpretersMessages.InterpreterContainerWizardPage_Interpreter_System_Library_1); 
+		setMessage(InterpretersMessages.InterpreterContainerWizardPage_Select_the_Interpreter_used_to_build_this_project__4); 
+				
+		initializeFromSelection();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
+	 */
+	public Image getImage() {
+		return DLTKDebugImages.get(DLTKDebugImages.IMG_WIZBAN_LIBRARY);
+	}
+
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterLibraryBlock.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterLibraryBlock.java
new file mode 100644
index 0000000..ea1fda9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AbstractInterpreterLibraryBlock.java
@@ -0,0 +1,393 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+
+import java.io.File;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.IDLTKDebugUIConstants;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.IInterpreterInstallType;
+import org.eclipse.dltk.launching.LibraryLocation;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+
+
+/**
+ * Control used to edit the libraries associated with a Interpreter install
+ */
+public abstract class AbstractInterpreterLibraryBlock implements SelectionListener, ISelectionChangedListener {
+
+	/**
+	 * Attribute name for the last path used to open a file/directory chooser
+	 * dialog.
+	 */
+	protected static final String LAST_PATH_SETTING = "LAST_PATH_SETTING"; //$NON-NLS-1$
+
+	/**
+	 * the prefix for dialog setting pertaining to this block
+	 */
+	protected static final String DIALOG_SETTINGS_PREFIX = "AbstractInterpreterLibraryBlock"; //$NON-NLS-1$
+
+	protected boolean fInCallback = false;
+	protected IInterpreterInstall fInterpreterInstall;
+	protected IInterpreterInstallType fInterpreterInstallType;
+	protected File fHome;
+
+	//widgets
+	protected LibraryContentProvider fLibraryContentProvider;
+	protected TreeViewer fLibraryViewer;
+	private Button fUpButton;
+	private Button fDownButton;
+	private Button fRemoveButton;
+	private Button fAddButton;
+	protected Button fDefaultButton;
+
+	protected AddDLTKInterpreterDialog fDialog;
+
+    protected AbstractInterpreterLibraryBlock(AddDLTKInterpreterDialog dialog)
+    {
+        this.fDialog = dialog;
+    }
+
+	/**
+	 * Creates and returns the source lookup control.
+	 *
+	 * @param parent the parent widget of this control
+	 */
+	public Control createControl(Composite parent) {
+		Font font = parent.getFont();
+
+		Composite comp = new Composite(parent, SWT.NONE);
+		GridLayout topLayout = new GridLayout();
+		topLayout.numColumns = 2;
+		topLayout.marginHeight = 0;
+		topLayout.marginWidth = 0;
+		comp.setLayout(topLayout);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		comp.setLayoutData(gd);
+
+		fLibraryViewer= new TreeViewer(comp);
+		gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 6;
+		fLibraryViewer.getControl().setLayoutData(gd);
+		fLibraryContentProvider= new LibraryContentProvider();
+		fLibraryViewer.setContentProvider(fLibraryContentProvider);
+		fLibraryViewer.setLabelProvider(getLabelProvider());
+		fLibraryViewer.setInput(this);
+		fLibraryViewer.addSelectionChangedListener(this);
+
+		Composite pathButtonComp = new Composite(comp, SWT.NONE);
+		GridLayout pathButtonLayout = new GridLayout();
+		pathButtonLayout.marginHeight = 0;
+		pathButtonLayout.marginWidth = 0;
+		pathButtonComp.setLayout(pathButtonLayout);
+		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
+		pathButtonComp.setLayoutData(gd);
+		pathButtonComp.setFont(font);
+
+		fAddButton= createPushButton(pathButtonComp, InterpretersMessages.InterpreterLibraryBlock_7);
+		fAddButton.addSelectionListener(this);
+
+		fRemoveButton= createPushButton(pathButtonComp, InterpretersMessages.InterpreterLibraryBlock_6);
+		fRemoveButton.addSelectionListener(this);
+
+		fUpButton= createPushButton(pathButtonComp, InterpretersMessages.InterpreterLibraryBlock_4);
+		fUpButton.addSelectionListener(this);
+
+		fDownButton= createPushButton(pathButtonComp, InterpretersMessages.InterpreterLibraryBlock_5);
+		fDownButton.addSelectionListener(this);
+
+		fDefaultButton= createPushButton(pathButtonComp, InterpretersMessages.InterpreterLibraryBlock_9);
+		fDefaultButton.addSelectionListener(this);
+
+		return comp;
+	}
+
+	/**
+	 * The "default" button has been toggled
+	 */
+	public void restoreDefaultLibraries()  {
+		LibraryLocation[] libs = null;
+		File installLocation = getHomeDirectory();
+		if (installLocation == null) {
+			libs = new LibraryLocation[0];
+		} else {
+			libs = getInterpreterInstallType().getDefaultLibraryLocations(installLocation);
+		}
+		if (libs != null)
+			fLibraryContentProvider.setLibraries(libs);
+		update();
+	}
+	/**
+	 * Creates and returns a button
+	 *
+	 * @param parent parent widget
+	 * @param label label
+	 * @return Button
+	 */
+	protected Button createPushButton(Composite parent, String label) {
+		Button button = new Button(parent, SWT.PUSH);
+		button.setFont(parent.getFont());
+		button.setText(label);
+		setButtonLayoutData(button);
+		return button;
+	}
+
+	/**
+	 * Create some empty space
+	 */
+	protected void createVerticalSpacer(Composite comp, int colSpan) {
+		Label label = new Label(comp, SWT.NONE);
+		GridData gd = new GridData();
+		gd.horizontalSpan = colSpan;
+		label.setLayoutData(gd);
+	}
+
+
+	/**
+	 * Sets the home directory of the Interpreter Install the user has chosen
+	 */
+	public void setHomeDirectory(File file) {
+		fHome = file;
+	}
+
+	/**
+	 * Returns the home directory
+	 */
+	protected File getHomeDirectory() {
+		return fHome;
+	}
+
+	/**
+	 * Updates buttons and status based on current libraries
+	 */
+	public void update() {
+		updateButtons();
+		IStatus status = Status.OK_STATUS;
+		if (fLibraryContentProvider.getLibraries().length == 0) { // && !isDefaultSystemLibrary()) {
+			status = new Status(IStatus.ERROR, DLTKDebugUIPlugin.getUniqueIdentifier(), IDLTKDebugUIConstants.INTERNAL_ERROR,
+				InterpretersMessages.InterpreterLibraryBlock_Libraries_cannot_be_empty__1, null);
+		}
+		LibraryStandin[] standins = fLibraryContentProvider.getStandins();
+		for (int i = 0; i < standins.length; i++) {
+			IStatus st = standins[i].validate();
+			if (!st.isOK()) {
+				status = st;
+				break;
+			}
+		}
+		updateDialogStatus (status);
+	}
+
+	/**
+	 * Saves settings in the given working copy
+	 */
+	public void performApply(IInterpreterInstall Interpreter) {
+		if (isDefaultLocations()) {
+			Interpreter.setLibraryLocations(null);
+		} else {
+			LibraryLocation[] libs = fLibraryContentProvider.getLibraries();
+			Interpreter.setLibraryLocations(libs);
+		}
+	}
+
+	/**
+	 * Determines if the present setup is the default location s for this InterpreterEnvironment
+	 * @return true if the current set of locations are the defaults, false otherwise
+	 */
+	protected boolean isDefaultLocations() {
+		LibraryLocation[] libraryLocations = fLibraryContentProvider.getLibraries();
+        IInterpreterInstall install = getInterpreterInstall();
+
+		if (install == null || libraryLocations == null) {
+			return true;
+		}
+		File installLocation = install.getInstallLocation();
+		if (installLocation != null) {
+			LibraryLocation[] def = getInterpreterInstallType().getDefaultLibraryLocations(installLocation);
+			if (def.length == libraryLocations.length) {
+				for (int i = 0; i < def.length; i++) {
+					if (!def[i].equals(libraryLocations[i])) {
+						return false;
+					}
+				}
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns the Interpreter install associated with this library block.
+	 *
+	 * @return Interpreter install
+	 */
+	protected IInterpreterInstall getInterpreterInstall() {
+		return fInterpreterInstall;
+	}
+
+	/**
+	 * Returns the Interpreter install type associated with this library block.
+	 *
+	 * @return Interpreter install
+	 */
+	protected IInterpreterInstallType getInterpreterInstallType() {
+		return fInterpreterInstallType;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetSelected(SelectionEvent e) {
+		Object source= e.getSource();
+		if (source == fUpButton) {
+			fLibraryContentProvider.up((IStructuredSelection) fLibraryViewer.getSelection());
+		} else if (source == fDownButton) {
+			fLibraryContentProvider.down((IStructuredSelection) fLibraryViewer.getSelection());
+		} else if (source == fRemoveButton) {
+			fLibraryContentProvider.remove((IStructuredSelection) fLibraryViewer.getSelection());
+		} else if (source == fAddButton) {
+			add((IStructuredSelection) fLibraryViewer.getSelection());
+		}
+		else if (source == fDefaultButton) {
+			restoreDefaultLibraries();
+		}
+		update();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+	 */
+	public void widgetDefaultSelected(SelectionEvent e) {}
+
+
+	private void add(IStructuredSelection selection) {
+		LibraryLocation libs = add();
+		if (libs == null)
+			return;
+		fLibraryContentProvider.add(new LibraryLocation[] {libs}, selection);
+		update ();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		updateButtons();
+	}
+
+	/**
+	 * Refresh the enable/disable state for the buttons.
+	 */
+	private void updateButtons() {
+		IStructuredSelection selection = (IStructuredSelection) fLibraryViewer.getSelection();
+		fRemoveButton.setEnabled(!selection.isEmpty());
+		boolean enableUp = true,
+				enableDown = true;
+		Object[] libraries = fLibraryContentProvider.getElements(null);
+		if (selection.isEmpty() || libraries.length == 0) {
+			enableUp = false;
+			enableDown = false;
+		} else {
+			Object first = libraries[0];
+			Object last = libraries[libraries.length - 1];
+			for (Iterator iter= selection.iterator(); iter.hasNext();) {
+				Object element= iter.next();
+				Object lib;
+				lib = element;
+				if (lib == first) {
+					enableUp = false;
+				}
+				if (lib == last) {
+					enableDown = false;
+				}
+			}
+		}
+		fUpButton.setEnabled(enableUp);
+		fDownButton.setEnabled(enableDown);
+	}
+
+	/**
+	 * Initializes this control based on the settings in the given
+	 * Interpreter install and type.
+	 *
+	 * @param Interpreter Interpreter or <code>null</code> if none
+	 * @param type type of Interpreter install
+	 */
+
+	public void initializeFrom(IInterpreterInstall Interpreter, IInterpreterInstallType type)  {
+		fInterpreterInstall = Interpreter;
+		fInterpreterInstallType = type;
+		if (Interpreter != null) {
+			setHomeDirectory(Interpreter.getInstallLocation());
+			fLibraryContentProvider.setLibraries(ScriptRuntime.getLibraryLocations(getInterpreterInstall()));
+		}
+		update();
+	}
+	protected abstract IBaseLabelProvider getLabelProvider();
+
+	protected void updateDialogStatus(IStatus status) {
+		fDialog.setSystemLibraryStatus(status);
+		fDialog.updateStatusLine();
+	}
+
+	protected void setButtonLayoutData(Button button) {
+		fDialog.setButtonLayoutData(button);
+	}
+
+	protected abstract IDialogSettings getDialogSettions();
+	protected LibraryLocation add() {
+		IDialogSettings dialogSettings= getDialogSettions();
+		String lastUsedPath= dialogSettings.get(LAST_PATH_SETTING);
+		if (lastUsedPath == null) {
+			lastUsedPath= ""; //$NON-NLS-1$
+		}
+		DirectoryDialog dialog= new DirectoryDialog(fLibraryViewer.getControl().getShell(), SWT.MULTI);
+		dialog.setMessage(InterpretersMessages.InterpreterLibraryBlock_10);
+		dialog.setFilterPath(lastUsedPath);
+		String res= dialog.open();
+		if (res == null) {
+			return null;
+		}
+
+		IPath path= new Path(res);
+		LibraryLocation lib= new LibraryLocation(path.makeAbsolute());
+		dialogSettings.put(LAST_PATH_SETTING, path.toOSString());
+		return lib;
+	}
+
+
+
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AddDLTKInterpreterDialog.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AddDLTKInterpreterDialog.java
new file mode 100644
index 0000000..4306457
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/AddDLTKInterpreterDialog.java
@@ -0,0 +1,457 @@
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.internal.ui.dialogs.StatusInfo;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.ComboDialogField;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.DialogField;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.IDialogFieldListener;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.IStringButtonAdapter;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringButtonDialogField;
+import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringDialogField;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.IInterpreterInstallType;
+import org.eclipse.dltk.launching.InterpreterStandin;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+
+public abstract class AddDLTKInterpreterDialog extends StatusDialog {
+	
+	private IAddInterpreterDialogRequestor fRequestor;
+	
+	private IInterpreterInstallType[] fInterpreterTypes;
+	
+	private IInterpreterInstallType fSelectedInterpreterType;
+	
+	private ComboDialogField fInterpreterTypeCombo;
+	
+	private IInterpreterInstall fEditedInterpreter;
+
+	private AbstractInterpreterLibraryBlock fLibraryBlock;
+	
+	private StringButtonDialogField fInterpreterPath;
+	
+	private StringDialogField fInterpreterName;
+	
+	private StringDialogField fInterpreterArgs;
+
+	private IStatus[] fStati;
+	private int fPrevIndex = -1;
+	
+	protected boolean useInterpreterArgs() {
+		return true;
+	}
+		
+	public AddDLTKInterpreterDialog(IAddInterpreterDialogRequestor requestor, Shell shell,
+			IInterpreterInstallType[] interpreterInstallTypes, IInterpreterInstall editedInterpreter) {
+		super(shell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		fRequestor= requestor;
+		fStati= new IStatus[5];
+		for (int i= 0; i < fStati.length; i++) {
+			fStati[i]= new StatusInfo();
+		}
+		
+		fInterpreterTypes= interpreterInstallTypes;
+		fSelectedInterpreterType= editedInterpreter != null ? editedInterpreter.getInterpreterInstallType() : interpreterInstallTypes[0];
+		
+		fEditedInterpreter = editedInterpreter;
+	}
+	
+	/**
+	 * @see Windows#configureShell
+	 */
+	protected void configureShell(Shell newShell) {
+		super.configureShell(newShell);
+		//PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IScriptDebugHelpContextIds.EDIT_InterpreterEnvironment_DIALOG);
+	}		
+	
+	protected void createDialogFields() {
+		fInterpreterTypeCombo= new ComboDialogField(SWT.READ_ONLY);
+		fInterpreterTypeCombo.setLabelText(InterpretersMessages.addInterpreterDialog_InterpreterEnvironmentType); 
+		fInterpreterTypeCombo.setItems(getInterpreterTypeNames());
+	
+		fInterpreterName= new StringDialogField();
+		fInterpreterName.setLabelText(InterpretersMessages.addInterpreterDialog_InterpreterEnvironmentName); 
+		
+		fInterpreterPath= new StringButtonDialogField(new IStringButtonAdapter() {
+			public void changeControlPressed(DialogField field) {
+				browseForInstallation();
+			}
+		});
+		fInterpreterPath.setLabelText(InterpretersMessages.addInterpreterDialog_InterpreterExecutableName); 
+		fInterpreterPath.setButtonLabel(InterpretersMessages.addInterpreterDialog_browse1); 
+			 
+		if( this.useInterpreterArgs() ) {
+			fInterpreterArgs= new StringDialogField();
+			fInterpreterArgs.setLabelText(InterpretersMessages.AddInterpreterDialog_iArgs);
+		}
+	}
+	
+	protected void createFieldListeners() {
+		
+		fInterpreterTypeCombo.setDialogFieldListener(new IDialogFieldListener() {
+			public void dialogFieldChanged(DialogField field) {
+				updateInterpreterType();
+			}
+		});
+		
+		fInterpreterName.setDialogFieldListener(new IDialogFieldListener() {
+			public void dialogFieldChanged(DialogField field) {
+				setInterpreterNameStatus(validateInterpreterName());
+				updateStatusLine();
+			}
+		});
+		
+		fInterpreterPath.setDialogFieldListener(new IDialogFieldListener() {
+			public void dialogFieldChanged(DialogField field) {
+				setInterpreterLocationStatus(validateInterpreterLocation());
+				updateStatusLine();
+			}
+		});
+	
+	}
+	
+	protected String getInterpreterName() {
+		return fInterpreterName.getText();
+	}
+		
+	protected File getInstallLocation() {
+		return new File(fInterpreterPath.getText());
+	}
+		
+	protected abstract AbstractInterpreterLibraryBlock createLibraryBlock(AddDLTKInterpreterDialog dialog);
+	protected Control createDialogArea(Composite ancestor) {
+		createDialogFields();
+		Composite parent = (Composite)super.createDialogArea(ancestor);
+		((GridLayout)parent.getLayout()).numColumns= 3;
+		
+		fInterpreterTypeCombo.doFillIntoGrid(parent, 3);
+		((GridData)fInterpreterTypeCombo.getComboControl(null).getLayoutData()).widthHint= convertWidthInCharsToPixels(50);
+		
+		fInterpreterName.doFillIntoGrid(parent, 3);
+	
+		fInterpreterPath.doFillIntoGrid(parent, 3);
+		
+		if( this.useInterpreterArgs() ) {
+			fInterpreterArgs.doFillIntoGrid(parent, 3);
+			((GridData)fInterpreterArgs.getTextControl(null).getLayoutData()).widthHint= convertWidthInCharsToPixels(50);
+		}
+		
+		
+		Label l = new Label(parent, SWT.NONE);
+		l.setText(InterpretersMessages.AddInterpreterDialog_Interpreter_system_libraries__1); 
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = 3;
+		l.setLayoutData(gd);	
+		
+		fLibraryBlock = createLibraryBlock(this);
+		Control block = fLibraryBlock.createControl(parent);
+		gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = 3;
+		block.setLayoutData(gd);
+		
+		Text t= fInterpreterPath.getTextControl(parent);
+		gd= (GridData)t.getLayoutData();
+		gd.grabExcessHorizontalSpace=true;
+		gd.widthHint= convertWidthInCharsToPixels(50);
+		
+		initializeFields();
+		createFieldListeners();
+		applyDialogFont(parent);
+		return parent;
+	}
+	
+	private void updateInterpreterType() {
+		int selIndex= fInterpreterTypeCombo.getSelectionIndex();
+		if (selIndex == fPrevIndex) {
+			return;
+		}
+		fPrevIndex = selIndex;
+		if (selIndex >= 0 && selIndex < fInterpreterTypes.length) {
+			fSelectedInterpreterType= fInterpreterTypes[selIndex];
+		}
+		setInterpreterLocationStatus(validateInterpreterLocation());
+		fLibraryBlock.initializeFrom(fEditedInterpreter, fSelectedInterpreterType);
+		updateStatusLine();
+	}	
+	
+	public void create() {
+		super.create();
+		fInterpreterName.setFocus();
+		selectInterpreterType();  
+	}
+	
+	private String[] getInterpreterTypeNames() {
+		String[] names=  new String[fInterpreterTypes.length];
+		for (int i= 0; i < fInterpreterTypes.length; i++) {
+			names[i]= fInterpreterTypes[i].getName();
+		}
+		return names;
+	}
+	
+	private void selectInterpreterType() {
+		for (int i= 0; i < fInterpreterTypes.length; i++) {
+			if (fSelectedInterpreterType == fInterpreterTypes[i]) {
+				fInterpreterTypeCombo.selectItem(i);
+				return;
+			}
+		}
+	}
+
+	private void initializeFields() {
+		fInterpreterTypeCombo.setItems(getInterpreterTypeNames());
+		if (fEditedInterpreter == null) {
+			fInterpreterName.setText(""); //$NON-NLS-1$
+			fInterpreterPath.setText(""); //$NON-NLS-1$
+			fLibraryBlock.initializeFrom(null, fSelectedInterpreterType);
+			if( this.useInterpreterArgs() ) {
+				fInterpreterArgs.setText(""); //$NON-NLS-1$
+			}
+		} else {
+			fInterpreterTypeCombo.setEnabled(false);
+			fInterpreterName.setText(fEditedInterpreter.getName());
+			fInterpreterPath.setText(fEditedInterpreter.getInstallLocation().getAbsolutePath());
+			fLibraryBlock.initializeFrom(fEditedInterpreter, fSelectedInterpreterType);
+			String InterpreterArgs = fEditedInterpreter.getInterpreterArgs();
+			if (InterpreterArgs != null) {
+				fInterpreterArgs.setText(InterpreterArgs);
+			}			 
+		}
+		setInterpreterNameStatus(validateInterpreterName());
+		updateStatusLine();
+	}
+
+
+	private IInterpreterInstallType getInterpreterType() {
+		return fSelectedInterpreterType;
+	}
+
+
+	private IStatus validateInterpreterLocation() {
+		String locationName= fInterpreterPath.getText();
+		IStatus s = null;
+		File file = null;
+		if (locationName.length() == 0) {
+			s = new StatusInfo(IStatus.INFO, InterpretersMessages.addInterpreterDialog_enterLocation); 
+		} else {
+			file= new File(locationName);
+			if (!file.exists()) {
+				s = new StatusInfo(IStatus.ERROR, InterpretersMessages.addInterpreterDialog_locationNotExists); 
+			} else {
+				final IStatus[] temp = new IStatus[1];
+				final File tempFile = file; 
+				Runnable r = new Runnable() {
+					/**
+					 * @see java.lang.Runnable#run()
+					 */
+					public void run() {
+						temp[0] = getInterpreterType().validateInstallLocation(tempFile);
+					}
+				};
+				BusyIndicator.showWhile(getShell().getDisplay(), r);
+				s = temp[0];
+			}
+		}
+		if (s.isOK()) {
+			fLibraryBlock.setHomeDirectory(file);
+			String name = fInterpreterName.getText();
+			if (name == null || name.trim().length() == 0) {
+				// auto-generate interpreter name
+				try {
+					String genName = null;
+					IPath path = new Path(file.getCanonicalPath());
+					int segs = path.segmentCount();
+					if (segs == 1) {
+						genName = path.segment(0);
+					} else if (segs >= 2) {
+						String last = path.lastSegment();
+						genName = last;						
+					}
+					if (genName != null) {
+						fInterpreterName.setText(genName);
+					}
+				} catch (IOException e) {}
+			}
+		} else {
+			fLibraryBlock.setHomeDirectory(null);
+		}
+		fLibraryBlock.restoreDefaultLibraries();		
+		return s;
+	}
+	
+
+	private IStatus validateInterpreterName() {
+		StatusInfo status= new StatusInfo();
+		String name= fInterpreterName.getText();
+		if (name == null || name.trim().length() == 0) {
+			status.setInfo(InterpretersMessages.addInterpreterDialog_enterName); 
+		} else {
+			if (fRequestor.isDuplicateName(name) && (fEditedInterpreter == null || !name.equals(fEditedInterpreter.getName()))) {
+				status.setError(InterpretersMessages.addInterpreterDialog_duplicateName); 
+			} 
+		}
+		return status;
+	}
+	
+	public void updateStatusLine() {
+		IStatus max= null;
+		for (int i= 0; i < fStati.length; i++) {
+			IStatus curr= fStati[i];
+			if (curr.matches(IStatus.ERROR)) {
+				updateStatus(curr);
+				return;
+			}
+			if (max == null || curr.getSeverity() > max.getSeverity()) {
+				max= curr;
+			}
+		}
+		updateStatus(max);
+	}
+			
+	private void browseForInstallation() {
+		
+		FileDialog dialog= new FileDialog(getShell());
+		dialog.setFilterPath(fInterpreterPath.getText());
+		if (Platform.getOS().equals(Platform.OS_WIN32))
+			dialog.setFilterExtensions(new String[] {"*.exe"});
+		else
+			dialog.setFilterExtensions(new String[] {"*"});
+		dialog.setFilterNames(new String[] {"Executables"});
+		String newPath= dialog.open();
+		if (newPath != null) {
+			fInterpreterPath.setText(newPath);
+		}
+	}
+	
+	
+	protected void okPressed() {
+		doOkPressed();
+		super.okPressed();
+	}
+	
+	private void doOkPressed() {
+		if (fEditedInterpreter == null) {
+			IInterpreterInstall Interpreter= new InterpreterStandin(fSelectedInterpreterType, createUniqueId(fSelectedInterpreterType));
+			setFieldValuesToInterpreter(Interpreter);
+			fRequestor.interpreterAdded(Interpreter);
+		} else {
+			setFieldValuesToInterpreter(fEditedInterpreter);
+		}
+	}
+	
+	private String createUniqueId(IInterpreterInstallType InterpreterType) {
+		String id= null;
+		do {
+			id= String.valueOf(System.currentTimeMillis());
+		} while (InterpreterType.findInterpreterInstall(id) != null);
+		return id;
+	}
+	
+	protected void setFieldValuesToInterpreter(IInterpreterInstall Interpreter) {
+		File dir = new File(fInterpreterPath.getText());
+		try {
+			Interpreter.setInstallLocation(dir.getCanonicalFile());
+		} catch (IOException e) {
+			Interpreter.setInstallLocation(dir.getAbsoluteFile());
+		}
+		Interpreter.setName(fInterpreterName.getText());
+		
+		if(this.useInterpreterArgs() ) {
+			String argString = fInterpreterArgs.getText().trim();
+
+			if (argString != null && argString.length() >0) {
+				Interpreter.setInterpreterArgs(argString);			
+			} else {
+				Interpreter.setInterpreterArgs(null);
+			}
+		}
+		else {
+			Interpreter.setInterpreterArgs(null);
+		}
+
+		fLibraryBlock.performApply(Interpreter);
+	}
+	
+	protected File getAbsoluteFileOrEmpty(String path) {
+		if (path == null || path.length() == 0) {
+			return new File(""); //$NON-NLS-1$
+		}
+		return new File(path).getAbsoluteFile();
+	}
+	
+	private void setInterpreterNameStatus(IStatus status) {
+		fStati[0]= status;
+	}
+	
+	private void setInterpreterLocationStatus(IStatus status) {
+		fStati[1]= status;
+	}
+	
+	protected IStatus getSystemLibraryStatus() {
+		return fStati[3];
+	}
+	
+	public void setSystemLibraryStatus(IStatus status) {
+		fStati[3]= status;
+	}
+	
+	/**
+	 * Updates the status of the ok button to reflect the given status.
+	 * Subclasses may override this method to update additional buttons.
+	 * @param status the status.
+	 */
+	protected void updateButtonsEnableState(IStatus status) {
+		Button ok = getButton(IDialogConstants.OK_ID);
+		if (ok != null && !ok.isDisposed())
+			ok.setEnabled(status.getSeverity() == IStatus.OK);
+	}	
+	
+	/**
+	 * @see org.eclipse.jface.dialogs.Dialog#setButtonLayoutData(org.eclipse.swt.widgets.Button)
+	 */
+	public void setButtonLayoutData(Button button) {
+		super.setButtonLayoutData(button);
+	}
+	
+	/**
+	 * Returns the name of the section that this dialog stores its settings in
+	 * 
+	 * @return String
+	 */
+	protected String getDialogSettingsSectionName() {
+		return "ADD_INTERPRETER_DIALOG_SECTION"; //$NON-NLS-1$
+	}
+	
+	 /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings()
+     */
+    protected IDialogSettings getDialogBoundsSettings() {
+    	 IDialogSettings settings = DLTKDebugUIPlugin.getDefault().getDialogSettings();
+         IDialogSettings section = settings.getSection(getDialogSettingsSectionName());
+         if (section == null) {
+             section = settings.addNewSection(getDialogSettingsSectionName());
+         } 
+         return section;
+    }
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/BuildInterpreterDescriptor.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/BuildInterpreterDescriptor.java
new file mode 100644
index 0000000..0a574d9
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/BuildInterpreterDescriptor.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.ScriptRuntime;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * Interpreter Descriptor used for the Interpreter container wizard page.
+ */
+public class BuildInterpreterDescriptor extends InterpreterDescriptor {
+	
+	private String fNature;
+	
+	public BuildInterpreterDescriptor(String nature) {
+		fNature = nature;
+	}
+		
+	public String getDescription() {
+		String name = DLTKLaunchMessages.InterpreterTab_7;
+		IInterpreterInstall Interpreter = ScriptRuntime.getDefaultInterpreterInstall(fNature);
+		if (Interpreter != null) {
+			name = Interpreter.getName();
+		}
+		return MessageFormat.format(DLTKLaunchMessages.InterpreterTab_8, new String[] {
+			name
+		});
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/IAddInterpreterDialogRequestor.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/IAddInterpreterDialogRequestor.java
new file mode 100644
index 0000000..18001b2
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/IAddInterpreterDialogRequestor.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+
+import org.eclipse.dltk.launching.IInterpreterInstall;
+
+/**
+ * This interface is implemented by clients of the <code>AddInterpreterDialog</code>.
+ */
+public interface IAddInterpreterDialogRequestor {
+
+	/**
+	 * Reply whether or not a new Interpreter of the specified name would
+	 * constitute a duplicate.
+	 * 
+	 * @param name the name of a potential new Interpreter
+	 * @return whether a new Interpreter with the specified name would be a duplicate Interpreter
+	 */
+	public boolean isDuplicateName(String name);
+	
+	/**
+	 * Notification that a Interpreter has been added from the <code>AddInterpreterDialog</code>.
+	 * 
+	 * @param Interpreter the added Interpreter
+	 */
+	public void interpreterAdded(IInterpreterInstall Interpreter);
+	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterDescriptor.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterDescriptor.java
new file mode 100644
index 0000000..99e79b7
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterDescriptor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+
+/**
+ * Used to provide a description for interpreter selections in the 
+ * installed interpreters block.
+ */
+public abstract class InterpreterDescriptor {
+
+	/**
+	 * Returns a description of the interpreter setting.
+	 * 
+	 * @return description of the interpeter setting
+	 */
+	public abstract String getDescription();
+	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterPreferencePage.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterPreferencePage.java
new file mode 100644
index 0000000..1a7d6c3
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpreterPreferencePage.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+
+import java.io.File;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.IScriptModel;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.IDLTKDebugUIConstants;
+import org.eclipse.dltk.internal.debug.ui.IDLTKDebugHelpContextIds;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.LibraryLocation;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+
+/**
+ * The Installed InterpreterEnvironments preference page.
+ * 
+	 *
+ */
+public abstract class InterpreterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+							
+	// InterpreterEnvironment Block
+	private InterpretersBlock fInterpretersBlock;									
+		
+	public InterpreterPreferencePage() {
+		super();
+		
+		// only used when page is shown programatically
+		setTitle(InterpretersMessages.InterpretersPreferencePage_1);	 
+		
+		setDescription(InterpretersMessages.InterpretersPreferencePage_2); 
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+	
+	public abstract InterpretersBlock createInterpretersBlock ();  
+	
+	/**
+	 * Find & verify the default interpreter.
+	 */
+	private void initDefaultInterpreter() {
+		IInterpreterInstall realDefault;
+		realDefault = ScriptRuntime.getDefaultInterpreterInstall(fInterpretersBlock.getCurrentNature());
+		boolean verified = false;
+		if (realDefault != null) {
+			IInterpreterInstall[] Interpreters= fInterpretersBlock.getInterpreters();
+			for (int i = 0; i < Interpreters.length; i++) {
+				IInterpreterInstall fakeInterpreter= Interpreters[i];
+				if (fakeInterpreter.equals(realDefault)) {
+					verified = true;
+					verifyDefaultInterpreter(fakeInterpreter);
+					break;
+				}
+			}
+		}
+		
+		if (!verified) {
+			if (fInterpretersBlock.getInterpreters().length > 0)
+				setErrorMessage(InterpretersMessages.InterpreterPreferencePage_pleaseSetDefaultInterpreter);
+			else
+				setErrorMessage(InterpretersMessages.InterpreterPreferencePage_addInterpreter);
+		}		
+	}	
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	protected Control createContents(Composite ancestor) {
+		initializeDialogUnits(ancestor);
+		
+		noDefaultAndApplyButton();
+		
+		GridLayout layout= new GridLayout();
+		layout.numColumns= 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		ancestor.setLayout(layout);
+					
+		fInterpretersBlock = createInterpretersBlock();
+		fInterpretersBlock.createControl(ancestor);
+		Control control = fInterpretersBlock.getControl();
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.horizontalSpan = 1;
+		control.setLayoutData(data);
+		
+		fInterpretersBlock.restoreColumnSettings(DLTKDebugUIPlugin.getDefault().getDialogSettings(), 
+				IDLTKDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE);
+						
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(ancestor, IDLTKDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE);		
+		initDefaultInterpreter();
+		fInterpretersBlock.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				IInterpreterInstall install = getCurrentDefaultInterpreter();
+				if (install == null) {
+					if (fInterpretersBlock.getInterpreters().length > 0)
+						setErrorMessage(InterpretersMessages.InterpreterPreferencePage_pleaseSetDefaultInterpreter);
+					else
+						setErrorMessage(InterpretersMessages.InterpreterPreferencePage_addInterpreter);
+				} else {
+					setErrorMessage(null);
+				}
+			}
+		});	
+		applyDialogFont(ancestor);
+		return ancestor;
+	}
+			
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		final boolean[] canceled = new boolean[] {false};
+		BusyIndicator.showWhile(null, new Runnable() {
+			public void run() {
+				IInterpreterInstall defaultInterpreter = getCurrentDefaultInterpreter();
+				IInterpreterInstall[] Interpreters = fInterpretersBlock.getInterpreters();
+				InterpretersUpdater updater = new InterpretersUpdater();
+				if (!updater.updateInterpreterSettings(fInterpretersBlock.getCurrentNature(), Interpreters, defaultInterpreter)) {
+					canceled[0] = true;
+				}
+			}
+		});
+		
+		if(canceled[0]) {
+			return false;
+		}
+		
+		// save column widths
+		IDialogSettings settings = DLTKDebugUIPlugin.getDefault().getDialogSettings();
+		fInterpretersBlock.saveColumnSettings(settings, IDLTKDebugHelpContextIds.INTERPRETER_PREFERENCE_PAGE);
+		
+		return super.performOk();
+	}	
+	
+	protected IScriptModel getScriptModel() {
+		return DLTKCore.create(ResourcesPlugin.getWorkspace().getRoot());
+	}
+	
+	/**
+	 * Verify that the specified Interpreter can be a valid default Interpreter.  This amounts to verifying
+	 * that all of the Interpreter's library locations exist on the file system.  If this fails,
+	 * remove the Interpreter from the table and try to set another default.
+	 */
+	private void verifyDefaultInterpreter(IInterpreterInstall Interpreter) {
+		if (Interpreter != null) {			
+			// Verify that all of the specified Interpreter's library locations actually exist
+			LibraryLocation[] locations= ScriptRuntime.getLibraryLocations(Interpreter);
+			boolean exist = true;
+			for (int i = 0; i < locations.length; i++) {
+				exist = exist && new File(locations[i].getSystemLibraryPath().toOSString()).exists();
+			}
+			
+			// If all library locations exist, check the corresponding entry in the list,
+			// otherwise remove the Interpreter
+			if (exist) {
+				fInterpretersBlock.setCheckedInterpreter(Interpreter);
+			} else {
+				fInterpretersBlock.removeInterpreters(new IInterpreterInstall[]{Interpreter});
+				IInterpreterInstall def = null;
+				def = ScriptRuntime.getDefaultInterpreterInstall(fInterpretersBlock.getCurrentNature());
+				if (def == null) {
+					fInterpretersBlock.setCheckedInterpreter(null);
+				} else {
+					fInterpretersBlock.setCheckedInterpreter(def);
+				}
+				ErrorDialog.openError(getControl().getShell(), InterpretersMessages.InterpretersPreferencePage_1, 
+						InterpretersMessages.InterpretersPreferencePage_10, new Status(IStatus.ERROR, 
+								DLTKDebugUIPlugin.PLUGIN_ID, 
+								IDLTKDebugUIConstants.INTERNAL_ERROR, 
+								InterpretersMessages.InterpretersPreferencePage_11, null)); //  
+				return;
+			}
+		} else {
+			fInterpretersBlock.setCheckedInterpreter(null);
+		}
+	}
+
+	private IInterpreterInstall getCurrentDefaultInterpreter() {
+		return fInterpretersBlock.getCheckedInterpreter();
+	}
+	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersBlock.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersBlock.java
new file mode 100644
index 0000000..9a3af9f
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersBlock.java
@@ -0,0 +1,988 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.internal.ui.util.SWTUtil;
+import org.eclipse.dltk.internal.ui.util.TableLayoutComposite;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.IInterpreterInstallType;
+import org.eclipse.dltk.launching.InterpreterStandin;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.dltk.ui.util.PixelConverter;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+import com.ibm.icu.text.MessageFormat;
+
+/**
+ * A composite that displays installed InterpreterEnvironment's in a table. InterpreterEnvironments can be 
+ * added, removed, edited, and searched for.
+ * <p>
+ * This block implements ISelectionProvider - it sends selection change events
+ * when the checked InterpreterEnvironment in the table changes, or when the "use default" button
+ * check state changes.
+ * </p>
+ */
+public abstract class InterpretersBlock implements IAddInterpreterDialogRequestor, ISelectionProvider {
+	
+	/**
+	 * This block's control
+	 */
+	private Composite fControl;
+	
+	/**
+	 * Interpreters being displayed
+	 */
+	protected List fInterpreters = new ArrayList(); 
+	
+	/**
+	 * The main list control
+	 */ 
+	protected CheckboxTableViewer fInterpreterList;
+	
+	// Action buttons
+	private Button fAddButton;
+	private Button fRemoveButton;
+	private Button fEditButton;
+	private Button fCopyButton;
+	private Button fSearchButton;	
+    
+	// index of column used for sorting
+	private int fSortColumn = 0;
+	
+	/**
+	 * Selection listeners (checked InterpreterEnvironment changes)
+	 */
+	private ListenerList fSelectionListeners = new ListenerList();
+	
+	/**
+	 * Previous selection
+	 */
+	private ISelection fPrevSelection = new StructuredSelection();
+
+    private Table fTable;
+			
+		
+	
+	/** 
+	 * Content provider to show a list of InterpreterEnvironments
+	 */ 
+	class InterpretersContentProvider implements IStructuredContentProvider {		
+		public Object[] getElements(Object input) {
+			return fInterpreters.toArray();
+		}
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+		public void dispose() {
+		}
+	}
+	
+	/**
+	 * Label provider for installed InterpreterEnvironments table.
+	 */
+	class InterpreterLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+		/**
+		 * @see ITableLabelProvider#getColumnText(Object, int)
+		 */
+		public String getColumnText(Object element, int columnIndex) {
+			if (element instanceof IInterpreterInstall) {
+				IInterpreterInstall interp = (IInterpreterInstall)element;
+				switch(columnIndex) {
+					case 0:						
+						return interp.getName();
+					case 1:
+						return interp.getInterpreterInstallType().getName();	
+					case 2: 						
+						return interp.getInstallLocation().getAbsolutePath();
+				}
+			}
+			return element.toString();
+		}
+
+		/**
+		 * @see ITableLabelProvider#getColumnImage(Object, int)
+		 */
+		public Image getColumnImage(Object element, int columnIndex) {
+			if (columnIndex == 0) {
+				//TODO: instert interpreter logo here
+			}
+			return null;
+		}
+
+	}	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+	 */
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		fSelectionListeners.add(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+	 */
+	public ISelection getSelection() {
+		return new StructuredSelection(fInterpreterList.getCheckedElements());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+	 */
+	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+		fSelectionListeners.remove(listener);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+	 */
+	public void setSelection(ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			if (!selection.equals(fPrevSelection)) {
+				fPrevSelection = selection;
+				Object interp = ((IStructuredSelection)selection).getFirstElement();
+				if (interp == null) {
+					fInterpreterList.setCheckedElements(new Object[0]);
+				} else {
+					fInterpreterList.setCheckedElements(new Object[]{interp});
+					fInterpreterList.reveal(interp);
+				}
+				fireSelectionChanged();
+			}
+		}
+	}
+
+	/**
+	 * Creates this block's control in the given control.
+	 * 
+	 * @param ancestor containing control
+	 * @param useManageButton whether to present a single 'manage...' button to
+	 *  the user that opens the installed InterpreterEnvironments pref page for InterpreterEnvironment management,
+	 *  or to provide 'add, remove, edit, and search' buttons.
+	 */
+	public void createControl(Composite ancestor) {
+		
+		Composite parent= new Composite(ancestor, SWT.NULL);
+		GridLayout layout= new GridLayout();
+		layout.numColumns= 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		
+		Font font = ancestor.getFont();
+		parent.setFont(font);	
+		parent.setLayout(layout);
+		
+		fControl = parent;	
+		
+		GridData data;
+				
+		Label tableLabel = new Label(parent, SWT.NONE);
+		tableLabel.setText(InterpretersMessages.InstalledInterpretersBlock_15); 
+		data = new GridData();
+		data.horizontalSpan = 2;
+		tableLabel.setLayoutData(data);
+		tableLabel.setFont(font);
+		
+		
+		PixelConverter conv = new PixelConverter(parent);
+		data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = conv.convertWidthInCharsToPixels(50);
+		TableLayoutComposite tblComposite = new TableLayoutComposite(parent, SWT.NONE);
+		tblComposite.setLayoutData(data);
+		fTable = new Table(tblComposite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
+				
+		
+		
+		data= new GridData(GridData.FILL_BOTH);
+        data.widthHint = 450;
+		fTable.setLayoutData(data);
+		fTable.setFont(font);
+				
+		fTable.setHeaderVisible(true);
+		fTable.setLinesVisible(true);		
+
+		TableColumn column1= new TableColumn(fTable, SWT.NULL);
+		column1.setText(InterpretersMessages.InstalledInterpretersBlock_0); 
+		column1.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				sortByName();
+			}
+		});
+	
+		TableColumn column2= new TableColumn(fTable, SWT.NULL);
+		column2.setText(InterpretersMessages.InstalledInterpretersBlock_2); 
+		column2.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {				
+				sortByType();
+			}
+		});
+		
+		TableColumn column3= new TableColumn(fTable, SWT.NULL);
+		column3.setText(InterpretersMessages.InstalledInterpretersBlock_1); 
+		column3.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				sortByLocation();
+			}
+		});
+
+		fInterpreterList= new CheckboxTableViewer(fTable);			
+		fInterpreterList.setLabelProvider(new InterpreterLabelProvider());
+		fInterpreterList.setContentProvider(new InterpretersContentProvider());
+		// by default, sort by name
+		sortByName();
+		
+		fInterpreterList.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent evt) {
+				enableButtons();
+			}
+		});
+		
+		fInterpreterList.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				if (event.getChecked()) {
+					setCheckedInterpreter((IInterpreterInstall)event.getElement());
+				} else {
+					setCheckedInterpreter(null);
+				}
+			}
+		});
+		
+		fInterpreterList.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent e) {
+				if (!fInterpreterList.getSelection().isEmpty()) {
+					editInterpreter();
+				}
+			}
+		});
+		fTable.addKeyListener(new KeyAdapter() {
+			public void keyPressed(KeyEvent event) {
+				if (event.character == SWT.DEL && event.stateMask == 0) {
+					if (fRemoveButton.getEnabled())
+						removeInterpreters();
+				}
+			}
+		});			
+		
+		Composite buttons= new Composite(parent, SWT.NULL);
+		buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+		layout= new GridLayout();
+		layout.marginHeight= 0;
+		layout.marginWidth= 0;
+		buttons.setLayout(layout);
+		buttons.setFont(font);
+		
+		fAddButton = createPushButton(buttons, InterpretersMessages.InstalledInterpretersBlock_3); 
+		fAddButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event evt) {
+				addInterpreter();
+			}
+		});
+		
+		fEditButton= createPushButton(buttons, InterpretersMessages.InstalledInterpretersBlock_4); 
+		fEditButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event evt) {
+				editInterpreter();
+			}
+		});
+		
+		fCopyButton = createPushButton(buttons, InterpretersMessages.InstalledInterpretersBlock_16); 
+		fCopyButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event evt) {
+				copyInterpreter();
+			}
+		});
+		
+		fRemoveButton= createPushButton(buttons, InterpretersMessages.InstalledInterpretersBlock_5); 
+		fRemoveButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event evt) {
+				removeInterpreters();
+			}
+		});
+		
+		// copied from ListDialogField.CreateSeparator()
+		Label separator= new Label(buttons, SWT.NONE);
+		separator.setVisible(false);
+		GridData gd= new GridData();
+		gd.horizontalAlignment= GridData.FILL;
+		gd.verticalAlignment= GridData.BEGINNING;
+		gd.heightHint= 4;
+		separator.setLayoutData(gd);
+		
+		fSearchButton = createPushButton(buttons, InterpretersMessages.InstalledInterpretersBlock_6); 
+		fSearchButton.addListener(SWT.Selection, new Listener() {
+			public void handleEvent(Event evt) {
+				search();
+			}
+		});		
+		
+		fillWithWorkspaceInterpreters();
+		enableButtons();
+		fAddButton.setEnabled(ScriptRuntime.getInterpreterInstallTypes(getCurrentNature()).length > 0);
+	}
+	
+	
+	
+	/**
+	 * Fire current selection
+	 */
+	private void fireSelectionChanged() {
+		SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
+		Object[] listeners = fSelectionListeners.getListeners();
+		for (int i = 0; i < listeners.length; i++) {
+			ISelectionChangedListener listener = (ISelectionChangedListener)listeners[i];
+			listener.selectionChanged(event);
+		}	
+	}
+
+	
+	/**
+	 * Sorts by Interpreter type, and name within type.
+	 */
+	private void sortByType() {
+		fInterpreterList.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object e1, Object e2) {
+				if ((e1 instanceof IInterpreterInstall) && (e2 instanceof IInterpreterInstall)) {
+					IInterpreterInstall left= (IInterpreterInstall)e1;
+					IInterpreterInstall right= (IInterpreterInstall)e2;
+					String leftType= left.getInterpreterInstallType().getName();
+					String rightType= right.getInterpreterInstallType().getName();
+					int res= leftType.compareToIgnoreCase(rightType);
+					if (res != 0) {
+						return res;
+					}
+					return left.getName().compareToIgnoreCase(right.getName());
+				}
+				return super.compare(viewer, e1, e2);
+			}
+			
+			public boolean isSorterProperty(Object element, String property) {
+				return true;
+			}
+		});	
+		fSortColumn = 3;			
+	}
+	
+	/**
+	 * Sorts by Interpreter name.
+	 */
+	private void sortByName() {
+		fInterpreterList.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object e1, Object e2) {
+				if ((e1 instanceof IInterpreterInstall) && (e2 instanceof IInterpreterInstall)) {
+					IInterpreterInstall left= (IInterpreterInstall)e1;
+					IInterpreterInstall right= (IInterpreterInstall)e2;
+					return left.getName().compareToIgnoreCase(right.getName());
+				}
+				return super.compare(viewer, e1, e2);
+			}
+			
+			public boolean isSorterProperty(Object element, String property) {
+				return true;
+			}
+		});		
+		fSortColumn = 1;		
+	}
+	
+	/**
+	 * Sorts by Interpreter location.
+	 */
+	private void sortByLocation() {
+		fInterpreterList.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object e1, Object e2) {
+				if ((e1 instanceof IInterpreterInstall) && (e2 instanceof IInterpreterInstall)) {
+					IInterpreterInstall left= (IInterpreterInstall)e1;
+					IInterpreterInstall right= (IInterpreterInstall)e2;
+					return left.getInstallLocation().getAbsolutePath().compareToIgnoreCase(right.getInstallLocation().getAbsolutePath());
+				}
+				return super.compare(viewer, e1, e2);
+			}
+			
+			public boolean isSorterProperty(Object element, String property) {
+				return true;
+			}
+		});		
+		fSortColumn = 2;		
+	}
+		
+	private void enableButtons() {
+		IStructuredSelection selection = (IStructuredSelection) fInterpreterList.getSelection();
+		int selectionCount= selection.size();
+		fEditButton.setEnabled(selectionCount == 1);
+		fCopyButton.setEnabled(selectionCount > 0);		
+		if (selectionCount > 0) {
+			Iterator iterator = selection.iterator();
+			while (iterator.hasNext()) {
+				IInterpreterInstall install = (IInterpreterInstall)iterator.next();
+				if (isContributed(install)) {
+					fRemoveButton.setEnabled(false);
+					return;
+				}
+			}
+			fRemoveButton.setEnabled(true);
+		} else {
+			fRemoveButton.setEnabled(false);
+		}
+	}	
+	
+	protected Button createPushButton(Composite parent, String label) {
+		return SWTUtil.createPushButton(parent, label, null);
+	}
+	
+	private boolean isContributed(IInterpreterInstall install) {
+		return ScriptRuntime.isContributedInterpreterInstall(install.getId());
+	}
+	
+	/**
+	 * Returns this block's control
+	 * 
+	 * @return control
+	 */
+	public Control getControl() {
+		return fControl;
+	}
+	
+	/**
+	 * Sets the InterpreterEnvironments to be displayed in this block
+	 * 
+	 * @param Interpreters InterpreterEnvironments to be displayed
+	 */
+	protected void setInterpreters(IInterpreterInstall[] Interpreters) {
+		fInterpreters.clear();
+		for (int i = 0; i < Interpreters.length; i++) {
+			fInterpreters.add(Interpreters[i]);
+		}
+		fInterpreterList.setInput(fInterpreters);
+		fInterpreterList.refresh();
+	}
+	
+	/**
+	 * Returns the InterpreterEnvironments currently being displayed in this block
+	 * 
+	 * @return InterpreterEnvironments currently being displayed in this block
+	 */
+	public IInterpreterInstall[] getInterpreters() {
+		return (IInterpreterInstall[])fInterpreters.toArray(new IInterpreterInstall[fInterpreters.size()]);
+	}
+	
+	
+	
+	/**
+	 * @see IAddInterpreterDialogRequestor#isDuplicateName(String)
+	 */
+	public boolean isDuplicateName(String name) {
+		for (int i= 0; i < fInterpreters.size(); i++) {
+			IInterpreterInstall Interpreter = (IInterpreterInstall)fInterpreters.get(i);
+			if (Interpreter.getName().equals(name)) {
+				return true;
+			}
+		}
+		return false;
+	}	
+		
+	private void removeInterpreters() {
+		IStructuredSelection selection= (IStructuredSelection)fInterpreterList.getSelection();
+		IInterpreterInstall[] Interpreters = new IInterpreterInstall[selection.size()];
+		Iterator iter = selection.iterator();
+		int i = 0;
+		while (iter.hasNext()) {
+			Interpreters[i] = (IInterpreterInstall)iter.next();
+			i++;
+		}
+		removeInterpreters(Interpreters);
+	}	
+	
+	/**
+	 * Removes the given Interpreters from the table.
+	 * 
+	 * @param Interpreters
+	 */
+	public void removeInterpreters(IInterpreterInstall[] Interpreters) {
+		IStructuredSelection prev = (IStructuredSelection) getSelection();
+		for (int i = 0; i < Interpreters.length; i++) {
+			fInterpreters.remove(Interpreters[i]);
+		}
+		fInterpreterList.refresh();
+		IStructuredSelection curr = (IStructuredSelection) getSelection();
+		if (!curr.equals(prev)) {
+			IInterpreterInstall[] installs = getInterpreters();
+			if (curr.size() == 0 && installs.length == 1) {
+				// pick a default Interpreter automatically
+				setSelection(new StructuredSelection(installs[0]));
+			} else {
+				fireSelectionChanged();
+			}
+		}
+	}
+	
+	/**
+	 * Search for installed interpreters in the file system
+	 */
+	protected void search() {
+
+		// choose a root directory for the search 
+		/*DirectoryDialog dialog = new DirectoryDialog(getShell());
+		dialog.setMessage(InterpretersMessages.InstalledInterpreterEnvironmentsBlock_9); 
+		dialog.setText(InterpretersMessages.InstalledInterpreterEnvironmentsBlock_10); 
+		String path = dialog.open();
+		if (path == null) {
+			return;
+		}*/
+		
+		// ignore installed locations
+		final Set exstingLocations = new HashSet();
+		Iterator iter = fInterpreters.iterator();
+		while (iter.hasNext()) {
+			exstingLocations.add(((IInterpreterInstall)iter.next()).getInstallLocation());
+		}
+		
+		// search
+		//final File rootDir = new File(path);
+		final List locations = new ArrayList();
+		final List types = new ArrayList();
+
+		IRunnableWithProgress r = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) {
+				monitor.beginTask(InterpretersMessages.InstalledInterpretersBlock_11, IProgressMonitor.UNKNOWN); 
+				//search(rootDir, locations, types, exstingLocations, monitor, -1);
+				searchFast(locations, types, exstingLocations, monitor);
+				monitor.done();
+			}
+		};
+		
+		try {
+            ProgressMonitorDialog progress = new ProgressMonitorDialog(getShell());
+            progress.run(true, true, r);
+		} catch (InvocationTargetException e) {
+			DLTKDebugUIPlugin.log(e);
+		} catch (InterruptedException e) {
+			// cancelled
+			return;
+		}
+		
+		if (locations.isEmpty()) {
+			//MessageDialog.openInformation(getShell(), InterpretersMessages.InstalledInterpreterEnvironmentsBlock_12, MessageFormat.format(InterpretersMessages.InstalledInterpreterEnvironmentsBlock_13, new String[]{path})); // 
+			MessageDialog.openInformation(getShell(), InterpretersMessages.InstalledInterpretersBlock_12, InterpretersMessages.InstalledInterpretersBlock_113); //
+		} else {
+			iter = locations.iterator();
+			Iterator iter2 = types.iterator();
+			while (iter.hasNext()) {
+				File location = (File)iter.next();
+				IInterpreterInstallType type = (IInterpreterInstallType)iter2.next();			
+				IInterpreterInstall Interpreter = new InterpreterStandin(type, createUniqueId(type));
+				String name = location.getName();
+				String nameCopy = new String(name);
+				int i = 1;
+				while (isDuplicateName(nameCopy)) {
+					nameCopy = name + '(' + i++ + ')'; 
+				}
+				Interpreter.setName(nameCopy);
+				Interpreter.setInstallLocation(location);
+				interpreterAdded(Interpreter);
+			}
+		}
+	}
+	
+	
+	protected Shell getShell() {
+		return getControl().getShell();
+	}
+	
+	/**
+	 * Searches in PATH 
+	 * @param found
+	 * @param types
+	 * @param ignore
+	 * @param monitor
+	 */
+	protected void searchFast (List found, List types, Set ignore, IProgressMonitor monitor) {
+		if (monitor.isCanceled()) {
+			return;
+		}
+		// get system environment
+		Map systemEnv = DebugPlugin.getDefault().getLaunchManager().getNativeEnvironmentCasePreserved();
+		String pName = null;
+		Set varNames = systemEnv.keySet();
+		for (Iterator iter = varNames.iterator(); iter.hasNext();) {
+			String var = (String) iter.next();
+			if (var.compareToIgnoreCase("path") == 0) {
+				pName = var;
+				break;
+			}
+		}
+		if (pName == null)
+			return;
+		String path = (String)systemEnv.get(pName);
+		
+		ArrayList folders = new ArrayList ();
+		
+		//split path
+		if (Platform.getOS().equals(Platform.OS_WIN32)) { 
+			String[] res = path.split(";");
+			for (int i = 0; i < res.length; i++) {
+				folders.add(Path.fromOSString(res[i]));
+			}
+		} else {
+			String[] res = path.split(":");
+			for (int i = 0; i < res.length; i++) {
+				folders.add(Path.fromOSString(res[i]));
+			}
+		}
+		
+		for (Iterator iter = folders.iterator(); iter.hasNext();) {
+			Path folder = (Path) iter.next();
+			if (folder != null) {
+				File f = folder.toFile();
+				if (f !=null && f.isDirectory())
+					search(f, found, types, ignore, monitor, 1);
+			}
+			
+		}
+		
+	}
+	
+	/**
+	 * Searches the specified directory recursively for installed Interpreters, adding each
+	 * detected Interpreter to the <code>found</code> list. Any directories specified in
+	 * the <code>ignore</code> are not traversed.
+	 * 
+	 * @param directory
+	 * @param found
+	 * @param types
+	 * @param ignore
+	 * @param deep deepness of search. -1 if infinite.
+	 */
+	protected void search(File directory, List found, List types, Set ignore, IProgressMonitor monitor, int deep) {
+		if (deep == 0)
+			return;
+		if (monitor.isCanceled()) {
+			return;
+		}
+
+		String[] names = directory.list();
+		if (names == null) {
+			return;
+		}
+		List subDirs = new ArrayList();
+		for (int i = 0; i < names.length; i++) {
+			if (monitor.isCanceled()) {
+				return;
+			}
+			File file = new File(directory, names[i]);
+						
+			try {
+				monitor.subTask(MessageFormat.format(InterpretersMessages.InstalledInterpretersBlock_14, new String[]{Integer.toString(found.size()), file.getCanonicalPath()}));
+				//	check if file is a symlink
+				if (file.isDirectory() && (!file.getCanonicalPath().equals(file.getAbsolutePath())))
+					continue;
+			} catch (IOException e) {
+			}		
+			IInterpreterInstallType[] InterpreterTypes = ScriptRuntime.getInterpreterInstallTypes(getCurrentNature());	
+
+			if (!ignore.contains(file)) {
+				boolean validLocation = false;
+				// Take the first Interpreter install type that claims the location as a
+				// valid Interpreter install.  Interpreter install types should be smart enough to not
+				// claim another type's Interpreter, but just in case...
+				for (int j = 0; j < InterpreterTypes.length; j++) {
+					if (monitor.isCanceled()) {
+						return;
+					}
+					IInterpreterInstallType type = InterpreterTypes[j];					
+					IStatus status = type.validateInstallLocation(file);
+					if (status.isOK()) {
+						found.add(file);
+						types.add(type);
+						validLocation = true;
+						break;
+					}
+				}
+				if (file.isDirectory() && !validLocation) {
+					subDirs.add(file);
+				} 
+			}
+			
+		}
+		while (!subDirs.isEmpty()) {
+			File subDir = (File)subDirs.remove(0);
+			search(subDir, found, types, ignore, monitor, deep - 1);
+			if (monitor.isCanceled()) {
+				return;
+			}
+		}
+		
+	}	
+	
+	/**
+	 * Sets the checked InterpreterEnvironment, possible <code>null</code>
+	 * 
+	 * @param Interpreter InterpreterEnvironment or <code>null</code>
+	 */
+	public void setCheckedInterpreter(IInterpreterInstall Interpreter) {
+		if (Interpreter == null) {
+			setSelection(new StructuredSelection());
+		} else {
+			setSelection(new StructuredSelection(Interpreter));
+		}
+	}
+	
+	/**
+	 * Returns the checked Interpreter or <code>null</code> if none.
+	 * 
+	 * @return the checked Interpreter or <code>null</code> if none
+	 */
+	public IInterpreterInstall getCheckedInterpreter() {
+		Object[] objects = fInterpreterList.getCheckedElements();
+		if (objects.length == 0) {
+			return null;
+		}
+		return (IInterpreterInstall)objects[0];
+	}
+	
+	/**
+	 * Persist table settings into the give dialog store, prefixed
+	 * with the given key.
+	 * 
+	 * @param settings dialog store
+	 * @param qualifier key qualifier
+	 */
+	public void saveColumnSettings(IDialogSettings settings, String qualifier) {
+        int columnCount = fTable.getColumnCount();
+		for (int i = 0; i < columnCount; i++) {
+			settings.put(qualifier + ".columnWidth" + i, fTable.getColumn(i).getWidth());	 //$NON-NLS-1$
+		}
+		settings.put(qualifier + ".sortColumn", fSortColumn); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Restore table settings from the given dialog store using the
+	 * given key.
+	 * 
+	 * @param settings dialog settings store
+	 * @param qualifier key to restore settings from
+	 */
+	public void restoreColumnSettings(IDialogSettings settings, String qualifier) {
+		fInterpreterList.getTable().layout(true);
+        restoreColumnWidths(settings, qualifier);
+		try {
+			fSortColumn = settings.getInt(qualifier + ".sortColumn"); //$NON-NLS-1$
+		} catch (NumberFormatException e) {
+			fSortColumn = 1;
+		}
+		switch (fSortColumn) {
+			case 1:
+				sortByName();
+				break;
+			case 2:
+				sortByLocation();
+				break;
+			case 3:
+				sortByType();
+				break;
+		}
+	}
+	
+	private void restoreColumnWidths(IDialogSettings settings, String qualifier) {
+        int columnCount = fTable.getColumnCount();
+        for (int i = 0; i < columnCount; i++) {
+            int width = -1;
+            
+            try {
+                width = settings.getInt(qualifier + ".columnWidth" + i); //$NON-NLS-1$
+            } catch (NumberFormatException e) {}
+            
+            if (width <= 0) {
+                fTable.getColumn(i).pack();
+            } else {
+                fTable.getColumn(i).setWidth(width);
+            }
+        }
+	}
+		
+	/**
+	 * Populates the InterpreterEnvironment table with existing InterpreterEnvironments defined in the workspace.
+	 */
+	protected void fillWithWorkspaceInterpreters() {
+		//		 fill with interpreters
+		List standins = new ArrayList();
+		IInterpreterInstallType[] types = ScriptRuntime.getInterpreterInstallTypes(getCurrentNature());
+		for (int i = 0; i < types.length; i++) {
+			IInterpreterInstallType type = types[i];
+			IInterpreterInstall[] installs = type.getInterpreterInstalls();
+			if (installs != null)
+				for (int j = 0; j < installs.length; j++) {
+					IInterpreterInstall install = installs[j];
+					standins.add(new InterpreterStandin(install));
+				}
+		}
+		setInterpreters((IInterpreterInstall[])standins.toArray(new IInterpreterInstall[standins.size()]));	
+	}
+	public void interpreterAdded(IInterpreterInstall Interpreter) {
+		fInterpreters.add(Interpreter);
+		fInterpreterList.refresh();
+				
+		IInterpreterInstall[] installs = getInterpreters();
+		if (installs.length == 1) {
+			// pick a default Interpreter automatically
+			setSelection(new StructuredSelection(installs[0]));
+		} 
+		fireSelectionChanged();				
+	}
+	
+	//	 Make sure that InterpreterStandin ids are unique if multiple calls to System.currentTimeMillis()
+	// happen very quickly
+	private static String fgLastUsedID;
+	
+	/**
+	 * Find a unique Interpreter id.  Check existing 'real' Interpreters, as well as the last id used for
+	 * a InterpreterStandin.
+	 */
+	protected String createUniqueId(IInterpreterInstallType InterpreterType) {
+		String id= null;
+		do {
+			id= String.valueOf(System.currentTimeMillis());
+		} while (InterpreterType.findInterpreterInstall(id) != null || id.equals(fgLastUsedID));
+		fgLastUsedID = id;
+		return id;
+	}	
+	
+	/**
+	 * Compares the given name against current names and adds the appropriate numerical 
+	 * suffix to ensure that it is unique.
+	 * @param name the name with which to ensure uniqueness 
+	 * @return the unique version of the given name
+	 *
+	 */
+	protected String generateName(String name){
+            if (!isDuplicateName(name)) {
+                return name;
+            }
+            
+            if (name.matches(".*\\(\\d*\\)")) { //$NON-NLS-1$
+                int start = name.lastIndexOf('(');
+                int end = name.lastIndexOf(')');
+                String stringInt = name.substring(start+1, end);
+                int numericValue = Integer.parseInt(stringInt);
+                String newName = name.substring(0, start+1) + (numericValue+1) + ")"; //$NON-NLS-1$
+                return generateName(newName);
+            } else {
+                return generateName(name + " (1)"); //$NON-NLS-1$
+            }
+        }
+	
+	abstract protected String getCurrentNature();
+
+	protected abstract AddDLTKInterpreterDialog createInterpreterDialog(IInterpreterInstall standin);
+
+	protected void copyInterpreter() {
+	    IStructuredSelection selection = (IStructuredSelection) fInterpreterList.getSelection();
+	    Iterator it = selection.iterator();
+	
+	    ArrayList newEntries = new ArrayList();
+	    while (it.hasNext()) {
+	        IInterpreterInstall selectedInterpreter = (IInterpreterInstall) it.next();
+	
+	        // duplicate & add Interpreter
+	        InterpreterStandin standin = new InterpreterStandin(selectedInterpreter, createUniqueId(selectedInterpreter.getInterpreterInstallType()));
+	        standin.setName(generateName(selectedInterpreter.getName()));            
+	        AddDLTKInterpreterDialog dialog = createInterpreterDialog(standin);
+	        dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_18);
+	        if (dialog.open() != Window.OK) {
+	            return;
+	        }
+	        newEntries.add(standin);
+	        fInterpreters.add(standin);
+	    }
+	    fInterpreterList.refresh();
+	    fInterpreterList.setSelection(new StructuredSelection(newEntries.toArray()));
+	}
+
+	/**
+	 * Bring up a dialog that lets the user create a new Interpreter definition.
+	 */
+	protected void addInterpreter() {
+		AddDLTKInterpreterDialog dialog= createInterpreterDialog(null);
+		dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_7); 
+		if (dialog.open() != Window.OK) {
+			return;
+		}
+		fInterpreterList.refresh();		
+	}
+
+	protected void editInterpreter() {
+		IStructuredSelection selection= (IStructuredSelection)fInterpreterList.getSelection();
+		IInterpreterInstall Interpreter= (IInterpreterInstall)selection.getFirstElement();
+		if (Interpreter == null) {
+			return;
+		}
+	
+		AddDLTKInterpreterDialog dialog= createInterpreterDialog(Interpreter);
+		dialog.setTitle(InterpretersMessages.InstalledInterpretersBlock_8); 
+		if (dialog.open() != Window.OK) {
+			return;
+		}
+		fInterpreterList.refresh(Interpreter);
+		
+	}	
+}
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.java
new file mode 100644
index 0000000..7747def
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.java
@@ -0,0 +1,80 @@
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import org.eclipse.osgi.util.NLS;
+
+public class InterpretersMessages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.dltk.internal.debug.ui.interpreters.InterpretersMessages";//$NON-NLS-1$
+	public static String addInterpreterDialog_InterpreterEnvironmentName;
+	public static String InterpretersPreferencePage_1;
+	public static String InterpretersPreferencePage_2;
+	public static String InstalledInterpretersBlock_15;
+	public static String InstalledInterpretersBlock_0;
+	public static String InstalledInterpretersBlock_1;
+	public static String InstalledInterpretersBlock_2;
+	public static String InstalledInterpretersBlock_3;
+	public static String InstalledInterpretersBlock_4;
+	public static String InstalledInterpretersBlock_16;
+	public static String InstalledInterpretersBlock_5;
+	public static String InstalledInterpretersBlock_6;
+	public static String InstalledInterpretersBlock_18;
+	public static String InstalledInterpretersBlock_8;
+	public static String InstalledInterpretersBlock_7;
+	public static String addInterpreterDialog_InterpreterExecutableName;
+	public static String addInterpreterDialog_browse1;
+	public static String AddInterpreterDialog_23;
+	public static String AddInterpreterDialog_Interpreter_system_libraries__1;
+	public static String addInterpreterDialog_enterLocation;
+	public static String addInterpreterDialog_locationNotExists;
+	public static String addInterpreterDialog_enterName;
+	public static String addInterpreterDialog_duplicateName;
+	public static String addInterpreterDialog_pickInterpreterRootDialog_message;
+	public static String InterpretersComboBlock_3;
+	public static String InterpretersComboBlock_1;
+	public static String InterpretersComboBlock_0;
+	public static String InterpretersComboBlock_2;
+	public static String InterpretersComboBlock_12;
+	public static String InterpretersComboBlock_13;
+	public static String InterpretersComboBlock_11;
+	public static String InterpretersComboBlock_10;
+	public static String InterpretersComboBlock_9;
+	public static String InterpretersComboBlock_8;
+	public static String addInterpreterDialog_InterpreterEnvironmentType;
+	public static String LibraryStandin_0;
+	public static String InterpreterLibraryBlock_0;
+	public static String InterpreterLibraryBlock_7;
+	public static String InterpreterLibraryBlock_6;
+	public static String InterpreterLibraryBlock_4;
+	public static String InterpreterLibraryBlock_5;
+	public static String InterpreterLibraryBlock_9;
+	public static String InterpreterLibraryBlock_Libraries_cannot_be_empty__1;
+	public static String InterpreterLibraryBlock_10;
+	public static String InterpretersPreferencePage_11;
+	public static String InterpretersPreferencePage_10;
+	public static String InterpretersUpdater_0;
+	public static String InstalledInterpretersBlock_11;
+	public static String InstalledInterpretersBlock_12;
+	public static String InstalledInterpretersBlock_13;
+	public static String InstalledInterpretersBlock_9;
+	public static String InstalledInterpretersBlock_10;
+	public static String InstalledInterpretersBlock_14;
+	public static String InterpreterPreferencePage_addInterpreter;
+	public static String InterpreterPreferencePage_pleaseSetDefaultInterpreter;
+	public static String InterpreterContainerWizardPage_3;
+	public static String InterpreterContainerWizardPage_Interpreter_System_Library_1;
+	public static String InterpreterContainerWizardPage_Select_the_Interpreter_used_to_build_this_project__4;
+	public static String BuildInterpreterDescriptor_0;
+	public static String InstalledInterpretersBlock_113;
+	public static String statusFetchingLibs;
+	public static String AddInterpreterDialog_iArgs;
+	
+
+	
+	
+	private InterpretersMessages() {
+	// dont instatiate
+	}
+	static {
+		// load message values from bundle file
+		NLS.initializeMessages(BUNDLE_NAME, InterpretersMessages.class);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.properties b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.properties
new file mode 100644
index 0000000..7786120
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersMessages.properties
@@ -0,0 +1,110 @@
+###############################################################################
+# Copyright (c) 2000, 2006 IBM Corporation and others.
+# 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+
+#AbstractScriptCommandTab_1=Interpreter executable:
+#AbstractScriptCommandTab_2=D&efault ({0})
+#AbstractScriptCommandTab_3=Standard command
+#AbstractScriptCommandTab_4=&Alternate
+#AbstractScriptCommandTab_Script_executable_must_be_specified_5=Executable must be specified
+
+BuildInterpreterDescriptor_0=Workspace &default interpreter ({0})
+
+InstalledInterpretersBlock_0=Name
+InstalledInterpretersBlock_1=Location
+InstalledInterpretersBlock_2=Type
+InstalledInterpretersBlock_3=&Add...
+InstalledInterpretersBlock_4=&Edit...
+InstalledInterpretersBlock_5=&Remove
+InstalledInterpretersBlock_6=&Search...
+InstalledInterpretersBlock_7=Add interpreter
+InstalledInterpretersBlock_8=Edit interpreter
+InstalledInterpretersBlock_9=Select a directory to search in:
+InstalledInterpretersBlock_10=Directory Selection
+InstalledInterpretersBlock_11=Searching...
+InstalledInterpretersBlock_12=Information
+InstalledInterpretersBlock_13=No interpreters found in {0}
+InstalledInterpretersBlock_113=No interpreters found
+InstalledInterpretersBlock_14=Found {0} - Searching {1}
+InstalledInterpretersBlock_15=Installed &interpreters:
+InstalledInterpretersBlock_16=&Copy...
+InstalledInterpretersBlock_18=Copy interpreter
+#InstalledInterpretersBlock_19={0} (locked)
+
+InterpretersComboBlock_1=Alternate &interpreter:
+InterpretersComboBlock_10=Interpreter name not specified for interpreter type: {0}
+InterpretersComboBlock_11=Unable to resolve interpreter: {0} ({1})
+InterpretersComboBlock_12=Interpreter path not specified
+InterpretersComboBlock_13=Interpreter path does not exist
+#InterpretersComboBlock_14=Envir&onments...
+InterpretersComboBlock_2=&Installed interpreters...
+InterpretersComboBlock_3=Runtime interpreter:
+InterpretersComboBlock_0=No interpreters defined in workspace
+#InterpretersComboBlock_4=E&xecution Environment:
+#InterpretersComboBlock_5=No execution environments defined in workspace
+#InterpretersComboBlock_6=Unknown execution environment specified: {0}
+#InterpretersComboBlock_7=No interpreters in workspace compatible with specified execution environment: {0}
+InterpretersComboBlock_8=interpreter type not specified
+InterpretersComboBlock_9=Unknown interpreter type specified: {0}
+
+InterpreterContainerWizardPage_Interpreter_System_Library_1=System Library
+InterpreterContainerWizardPage_Select_the_Interpreter_used_to_build_this_project__4=Select a interpreter to add to the buildpath.
+InterpreterContainerWizardPage_3=System library
+
+InterpretersPreferencePage_1=Installed interpreters
+InterpretersPreferencePage_2=Add, remove or edit interpreter definitions.\nChecked interpreter is a default interpreter used for newly created projects.\nAlso you may specify interpreteter on project level using project options.
+InterpretersPreferencePage_10=Installed interpreter location no longer exists. Interpreter will be removed.
+InterpretersPreferencePage_11=Interpreter removed
+
+addInterpreterDialog_browse1=&Browse...
+addInterpreterDialog_duplicateName=The name is already used.
+addInterpreterDialog_enterLocation=Enter the location of the interpreter.
+addInterpreterDialog_enterName=Enter a name for the interpreter.
+addInterpreterDialog_InterpreterExecutableName=&Interpreter executable:
+addInterpreterDialog_InterpreterEnvironmentName=Interpreter &name:
+addInterpreterDialog_InterpreterEnvironmentType=Interpreter &type:
+addInterpreterDialog_locationNotExists=The location does not exist.
+AddInterpreterDialog_iArgs=Interpreter arguments:
+addInterpreterDialog_pickInterpreterRootDialog_message=Select the root directory of the interpreter installation:
+AddInterpreterDialog_Interpreter_system_libraries__1=Interpreter system libraries:
+#AddInterpreterDialog_Interpreter_name_must_be_a_valid_file_name___0__1=Interpreter name must be a valid file name: {0}
+AddInterpreterDialog_23=Default &interpreter Arguments:
+#AddInterpreterDialog_0=interpreter
+
+InterpreterLibraryBlock_Libraries_cannot_be_empty__1=Libraries cannot be empty.
+
+InterpretersUpdater_0=Save Interpreter Definitions
+InterpreterLibraryBlock_0=Source attachment:
+I#nterpreterLibraryBlock_1=(none)
+InterpreterLibraryBlock_10=Library Selection
+#InterpreterDetailsDialog_0=Interpreter Details
+InterpreterLibraryBlock_4=U&p
+InterpreterLibraryBlock_5=&Down
+InterpreterLibraryBlock_6=Re&move
+InterpreterLibraryBlock_7=Add E&xternal libraries...
+#InterpreterLibraryBlock_8=Ed&it...
+InterpreterLibraryBlock_9=&Restore Default
+LibraryStandin_0=System library does not exist: {0}
+LibraryStandin_1=Source attachment does not exist: {0}
+
+
+InterpreterPreferencePage_addInterpreter=Add interpreters, if you want to launch anything
+InterpreterPreferencePage_pleaseSetDefaultInterpreter=Select a default interpreter
+InterpreterContainerWizardPage_Interpreter_System_Library_1=Interpreter System Library
+InterpreterContainerWizardPage_3=System library
+InterpreterContainerWizardPage_Interpreter_System_Library_1=Interpreter system library
+InterpreterContainerWizardPage_Select_the_Interpreter_used_to_build_this_project__4=Select an interpreter
+BuildInterpreterDescriptor_0=Workspace &default interpreter ({0})
+
+statusFetchingLibs=Fetching default interpreter library locations...
+
+
+#GenericPythonArgumentsTab_1=Interpreters arguments:
+#GenericPythonArgumentsTab_2
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersUpdater.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersUpdater.java
new file mode 100644
index 0000000..9b193ed
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/InterpretersUpdater.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.internal.launching.InterpreterDefinitionsContainer;
+import org.eclipse.dltk.launching.IInterpreterInstall;
+import org.eclipse.dltk.launching.IInterpreterInstallType;
+import org.eclipse.dltk.launching.ScriptRuntime;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+
+
+/**
+ * Processes add/removed/changed Interpreters.
+ */
+public class InterpretersUpdater {
+	
+	// the Interpreters defined when this updated is instantiated
+	private InterpreterDefinitionsContainer fOriginalInterpreters;	
+	
+	/**
+	 * Contstructs a new Interpreter updater to update Interpreter install settings.
+	 */
+	public InterpretersUpdater() {
+		saveCurrentAsOriginal ();
+	}
+	
+	private void saveCurrentAsOriginal () {
+		fOriginalInterpreters = new InterpreterDefinitionsContainer();
+		IInterpreterInstall def = null;
+		
+		String natures[] = ScriptRuntime.getInterpreterNatures();
+		for (int i = 0; i < natures.length; i++) {
+			def = ScriptRuntime.getDefaultInterpreterInstall(natures[i]);
+			
+			if (def != null) {
+				fOriginalInterpreters.setDefaultInterpreterInstallCompositeID(natures[i], ScriptRuntime.getCompositeIdFromInterpreter(def));
+			}
+		}
+		
+	
+		IInterpreterInstallType[] types = ScriptRuntime.getInterpreterInstallTypes();
+		for (int i = 0; i < types.length; i++) {
+			IInterpreterInstall[] Interpreters = types[i].getInterpreterInstalls();
+			if (Interpreters != null)
+				for (int j = 0; j < Interpreters.length; j++) {
+					fOriginalInterpreters.addInterpreter(Interpreters[j]);
+				}
+		}
+	}
+	
+	/**
+	 * Updates Interpreter settings and returns whether the update was successful.
+	 * 
+	 * @param InterpreterEnvironments new installed InterpreterEnvironments
+	 * @param defaultInterp new default Interpreter
+	 * @return whether the update was successful
+	 */
+	public boolean updateInterpreterSettings(String nature, IInterpreterInstall[] InterpreterEnvironments, IInterpreterInstall defaultInterp) {
+		
+		// Create a Interpreter definition container
+		InterpreterDefinitionsContainer InterpreterContainer = new InterpreterDefinitionsContainer();
+		
+		// Set the default Interpreter Id on the container
+		if (defaultInterp != null) {
+			String defaultInterpId = ScriptRuntime.getCompositeIdFromInterpreter(defaultInterp);
+			InterpreterContainer.setDefaultInterpreterInstallCompositeID(nature, defaultInterpId);
+		} else {
+			InterpreterContainer.setDefaultInterpreterInstallCompositeID(nature, null);
+		}
+		
+		
+		// Set the Interpreters on the container
+		for (int i = 0; i < InterpreterEnvironments.length; i++) {
+			InterpreterContainer.addInterpreter(InterpreterEnvironments[i]);
+		}
+		
+		//get old other lang interpreters
+		List oldList = fOriginalInterpreters.getInterpreterList();
+		String[] natures = fOriginalInterpreters.getInterpreterNatures();
+		for (Iterator iter = oldList.iterator(); iter.hasNext();) {
+			IInterpreterInstall ii = (IInterpreterInstall) iter.next();
+			if (!ii.getInterpreterInstallType().getNatureId().equals(nature)) {
+				InterpreterContainer.addInterpreter(ii);
+			}
+		}
+		for (int i = 0; i < natures.length; i++) {
+			if (!nature.equals(natures[i])) {
+				String sid = fOriginalInterpreters.getDefaultInterpreterInstallCompositeID(natures[i]);
+				InterpreterContainer.setDefaultInterpreterInstallCompositeID(natures[i], sid);				
+			}
+		}
+		
+		
+		// Generate XML for the Interpreter defs and save it as the new value of the Interpreter preference
+		saveInterpreterDefinitions(InterpreterContainer);
+		
+		saveCurrentAsOriginal ();
+		
+		return true;
+	}
+	
+	private void saveInterpreterDefinitions(final InterpreterDefinitionsContainer container) {
+		IRunnableWithProgress runnable = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+				try {
+					monitor.beginTask(InterpretersMessages.InterpretersUpdater_0, 100); 
+					String InterpreterDefXML = container.getAsXML();
+					monitor.worked(40);
+					ScriptRuntime.getPreferences().setValue(ScriptRuntime.PREF_INTERPRETER_XML, InterpreterDefXML);
+					monitor.worked(30);
+					ScriptRuntime.savePreferences();
+					monitor.worked(30);
+				} catch (IOException ioe) {
+					DLTKDebugUIPlugin.log(ioe);
+				} catch (ParserConfigurationException e) {
+					DLTKDebugUIPlugin.log(e);
+				} catch (TransformerException e) {
+					DLTKDebugUIPlugin.log(e);
+				} finally {
+					monitor.done();
+				}
+				
+			}
+		};
+		try {
+			DLTKDebugUIPlugin.getDefault().getWorkbench().getProgressService().busyCursorWhile(runnable);			
+		} catch (InvocationTargetException e) {
+			DLTKDebugUIPlugin.log(e);
+		} catch (InterruptedException e) {
+			DLTKDebugUIPlugin.log(e);
+		} 
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryContentProvider.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryContentProvider.java
new file mode 100644
index 0000000..4ae2ffb
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryContentProvider.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.dltk.launching.LibraryLocation;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+
+
+public class LibraryContentProvider implements ITreeContentProvider {
+	
+	private Viewer fViewer;
+	
+	private LibraryStandin[] fLibraries= new LibraryStandin[0];
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+	 */
+	public void dispose() {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+	 */
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		fViewer = viewer;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+	 */
+	public Object[] getElements(Object inputElement) {
+		return fLibraries;
+	}
+
+
+	public void setLibraries(LibraryLocation[] libs) {
+		fLibraries = new LibraryStandin[libs.length];
+		for (int i = 0; i < libs.length; i++) {
+			fLibraries[i] = new LibraryStandin(libs[i]);
+		}
+		fViewer.refresh();
+	}
+
+	public LibraryLocation[] getLibraries() {
+		LibraryLocation[] locations = new LibraryLocation[fLibraries.length];
+		for (int i = 0; i < locations.length; i++) {
+			locations[i] = fLibraries[i].toLibraryLocation();
+		}
+		return locations;
+	}
+
+	/**
+	 * Returns the list of libraries in the given selection. SubElements
+	 * are replaced by their parent libraries.
+	 */
+	private Set getSelectedLibraries(IStructuredSelection selection) {
+		Set libraries= new HashSet();
+		for (Iterator iter= selection.iterator(); iter.hasNext();) {
+			Object element= iter.next();
+			if (element instanceof LibraryStandin) {
+				libraries.add(element);
+			}
+		}
+		return libraries;
+	}
+
+	/**
+	 * Move the libraries of the given selection up.
+	 */
+	public void up(IStructuredSelection selection) {
+		Set libraries= getSelectedLibraries(selection);
+		for (int i= 0; i < fLibraries.length - 1; i++) {
+			if (libraries.contains(fLibraries[i + 1])) {
+				LibraryStandin temp= fLibraries[i];
+				fLibraries[i]= fLibraries[i + 1];
+				fLibraries[i + 1]= temp;
+			}
+		}
+		fViewer.refresh();
+		fViewer.setSelection(selection);
+	}
+
+	/**
+	 * Move the libraries of the given selection down.
+	 */
+	public void down(IStructuredSelection selection) {
+		Set libraries= getSelectedLibraries(selection);
+		for (int i= fLibraries.length - 1; i > 0; i--) {
+			if (libraries.contains(fLibraries[i - 1])) {
+				LibraryStandin temp= fLibraries[i];
+				fLibraries[i]= fLibraries[i - 1];
+				fLibraries[i - 1]= temp;
+			}
+		}
+		fViewer.refresh();
+		fViewer.setSelection(selection);
+	}
+
+	/**
+	 * Remove the libraries contained in the given selection.
+	 */
+	public void remove(IStructuredSelection selection) {
+		List newLibraries = new ArrayList();
+		for (int i = 0; i < fLibraries.length; i++) {
+			newLibraries.add(fLibraries[i]);
+		}
+		Iterator iterator = selection.iterator();
+		while (iterator.hasNext()) {
+			Object element = iterator.next();
+			if (element instanceof LibraryStandin) {
+				newLibraries.remove(element);
+			} 
+		}
+		fLibraries= (LibraryStandin[]) newLibraries.toArray(new LibraryStandin[newLibraries.size()]);
+		fViewer.refresh();
+	}
+
+	/**
+	 * Add the given libraries before the selection, or after the existing libraries
+	 * if the selection is empty.
+	 */
+	public void add(LibraryLocation[] libs, IStructuredSelection selection) {
+		List newLibraries = new ArrayList(fLibraries.length + libs.length);
+		for (int i = 0; i < fLibraries.length; i++) {
+			newLibraries.add(fLibraries[i]);
+		}
+		List toAdd = new ArrayList(libs.length);
+		for (int i = 0; i < libs.length; i++) {
+			toAdd.add(new LibraryStandin(libs[i]));
+		}
+		if (selection.isEmpty()) {
+			newLibraries.addAll(toAdd);
+		} else {
+			Object element= selection.getFirstElement();
+			LibraryStandin firstLib = (LibraryStandin) element;			 
+			int index = newLibraries.indexOf(firstLib);
+			newLibraries.addAll(index, toAdd);
+		}
+		fLibraries= (LibraryStandin[]) newLibraries.toArray(new LibraryStandin[newLibraries.size()]);
+		fViewer.refresh();
+		fViewer.setSelection(new StructuredSelection(libs), true);
+	}
+
+	/**
+	 * Returns the standin libraries being edited.
+	 * 
+	 * @return standins
+	 */
+	public LibraryStandin[] getStandins() {
+		return fLibraries;
+	}
+
+	public Object[] getChildren(Object parentElement) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public Object getParent(Object element) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public boolean hasChildren(Object element) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+	
+}
\ No newline at end of file
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryLabelProvider.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryLabelProvider.java
new file mode 100644
index 0000000..f36e0c1
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryLabelProvider.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.internal.debug.ui.DebugImageDescriptor;
+import org.eclipse.dltk.ui.DLTKPluginImages;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+
+public class LibraryLabelProvider extends LabelProvider {
+
+	public Image getImage(Object element) {
+		if (element instanceof LibraryStandin) {
+			LibraryStandin library= (LibraryStandin) element;
+			String key = null;
+			key = DLTKPluginImages.IMG_OBJS_EXTJAR;
+			IStatus status = library.validate();
+			if (!status.isOK()) {
+				ImageDescriptor base = DLTKPluginImages.getDescriptor(key);
+				DebugImageDescriptor descriptor= new DebugImageDescriptor(base, DebugImageDescriptor.IS_OUT_OF_SYNCH);
+				return DLTKDebugUIPlugin.getImageDescriptorRegistry().get(descriptor);
+			}
+			return DLTKPluginImages.get(key);
+		} 
+		return null;
+	}
+
+	public String getText(Object element) {
+		if (element instanceof LibraryStandin) {
+			return ((LibraryStandin)element).getSystemLibraryPath().toOSString();
+		} 
+		return null;
+	}
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryStandin.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryStandin.java
new file mode 100644
index 0000000..f6073c3
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/interpreters/LibraryStandin.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.interpreters;
+
+import java.io.File;
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.IDLTKDebugUIConstants;
+import org.eclipse.dltk.launching.LibraryLocation;
+
+
+
+/**
+ * Wrapper for an original library location, to support editing.
+ * 
+ */
+public final class LibraryStandin {
+	private IPath fSystemLibrary;
+		
+	/**
+	 * Creates a new library standin on the given library location.
+	 */	
+	public LibraryStandin(LibraryLocation libraryLocation) {
+		fSystemLibrary= libraryLocation.getSystemLibraryPath();
+	}		
+		
+	/**
+	 * Returns the InterpreterEnvironment library archive location.
+	 * 
+	 * @return The InterpreterEnvironment library archive location.
+	 */
+	public IPath getSystemLibraryPath() {
+		return fSystemLibrary;
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj) {
+		if (obj instanceof LibraryStandin) {
+			LibraryStandin lib = (LibraryStandin)obj;
+			return getSystemLibraryPath().equals(lib.getSystemLibraryPath());
+		} 
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode() {
+		return getSystemLibraryPath().hashCode();
+	}
+	
+	/**
+	 * Returns whether the given paths are equal - either may be <code>null</code>.
+	 * @param path1 path to be compared
+	 * @param path2 path to be compared
+	 * @return whether the given paths are equal
+	 */
+	protected boolean equals(IPath path1, IPath path2) {
+		return equalsOrNull(path1, path2);
+	}
+	
+	/**
+	 * Returns whether the given objects are equal - either may be <code>null</code>.
+	 * @param o1 object to be compared
+	 * @param o2 object to be compared
+	 * @return whether the given objects are equal or both null
+	 *
+	 */	
+	private boolean equalsOrNull(Object o1, Object o2) {
+		if (o1 == null) {
+			return o2 == null;
+		}
+		if (o2 == null) {
+			return false;
+		}
+		return o1.equals(o2);
+	}
+
+	
+	/**
+	 * Returns an equivalent library location.
+	 * 
+	 * @return library location
+	 */
+	public LibraryLocation toLibraryLocation() {
+		return new LibraryLocation(getSystemLibraryPath());
+	}
+	
+	/**
+	 * Returns a status for this library describing any error states
+	 * 
+	 * @return
+	 */
+	public IStatus validate() {
+		File f = getSystemLibraryPath().toFile();
+		if (!f.exists()) {
+			IPath path = getSystemLibraryPath();
+			String message = "Path is empty";
+			if( path != null ) {
+				message = path.toOSString();
+			}
+			return new Status(IStatus.ERROR, DLTKDebugUIPlugin.PLUGIN_ID, IDLTKDebugUIConstants.INTERNAL_ERROR, 
+					MessageFormat.format(InterpretersMessages.LibraryStandin_0, new String[]{message}), null);
+		}	
+		return Status.OK_STATUS;
+	}
+	
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/AbstractNoInterpreterStatusHandler.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/AbstractNoInterpreterStatusHandler.java
new file mode 100644
index 0000000..5cd8261
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/AbstractNoInterpreterStatusHandler.java
@@ -0,0 +1,57 @@
+package org.eclipse.dltk.internal.debug.ui.launcher;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.launching.LaunchingMessages;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferencePage;
+
+
+public abstract class AbstractNoInterpreterStatusHandler implements IStatusHandler
+{
+    /*
+     * @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
+     */
+    public Object handleStatus(IStatus status, Object source)
+    {
+        final boolean[] result = new boolean[1];
+        DLTKDebugUIPlugin.getStandardDisplay().syncExec(new Runnable()
+            {
+                public void run()
+                {
+                    String title = LaunchingMessages.NoDefaultInterpreterStatusHandler_title;
+                    String message =
+                        LaunchingMessages.NoDefaultInterpreterStatusHandler_message;
+                    result[0] =
+                        (MessageDialog.openQuestion(DLTKDebugUIPlugin.getActiveWorkbenchShell(),
+                                title, message));
+                    if (result[0])
+                    {
+                        // show preference page
+                        showInterpreterPreferencePage();
+                    }
+                }
+            });
+        return new Boolean(result[0]);
+    }
+
+    /**
+     * shows the interpreter preference page
+     *
+     * <p>sub-classes should create their intepreter specific preference page and then make
+     * a call to @link {@link #showPrefPage(String, IPreferencePage)} to render the page.</p>
+     */
+    protected abstract void showInterpreterPreferencePage();
+
+    /**
+     * cause the reference page to appear
+     *
+     * @param id preference page id
+     * @param page preference page
+     */
+    protected final void showPrefPage(String id, IPreferencePage page)
+    {
+        DLTKDebugUIPlugin.showPreferencePage(id, page);
+    }
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/InterpreterArgumentsBlock.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/InterpreterArgumentsBlock.java
new file mode 100644
index 0000000..37c16ff
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/InterpreterArgumentsBlock.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.launcher;
+
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.StringVariableSelectionDialog;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.actions.ControlAccessibleListener;
+import org.eclipse.dltk.debug.ui.launchConfigurations.CommonScriptLaunchTab;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+
+
+/**
+ * Editor for Interpreter arguments of a Script launch configuration.
+ */
+public class InterpreterArgumentsBlock extends CommonScriptLaunchTab {
+
+	// Interpreter arguments widgets
+	protected Text fInterpreterArgumentsText;
+	private Button fPgrmArgVariableButton;
+	
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
+	 */
+	public void createControl(Composite parent) {
+		Font font = parent.getFont();
+
+		Group group = new Group(parent, SWT.NONE);
+		setControl(group);
+		GridLayout topLayout = new GridLayout();
+		group.setLayout(topLayout);	
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		group.setLayoutData(gd);
+		group.setFont(font);
+		group.setText(DLTKLaunchMessages.InterpreterArgumentsTab_Interpreter_ar_guments__6); 
+		
+		fInterpreterArgumentsText = new Text(group, SWT.MULTI | SWT.WRAP| SWT.BORDER | SWT.V_SCROLL);
+		gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 40;
+		gd.widthHint = 100;
+		fInterpreterArgumentsText.setLayoutData(gd);
+		fInterpreterArgumentsText.setFont(font);
+		fInterpreterArgumentsText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent evt) {
+				updateLaunchConfigurationDialog();
+			}
+		});	
+		ControlAccessibleListener.addListener(fInterpreterArgumentsText, group.getText());
+				
+		fPgrmArgVariableButton = createPushButton(group, DLTKLaunchMessages.InterpreterArgumentsBlock_4, null);
+		fPgrmArgVariableButton.setFont(font);
+		fPgrmArgVariableButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		fPgrmArgVariableButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
+				dialog.open();
+				String variable = dialog.getVariableExpression();
+				if (variable != null) {
+					fInterpreterArgumentsText.insert(variable);
+				}
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+			
+		});
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_INTERPRETER_ARGUMENTS, (String)null);		
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		try {
+			fInterpreterArgumentsText.setText(configuration.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_INTERPRETER_ARGUMENTS, "")); //$NON-NLS-1$
+		} catch (CoreException e) {
+			setErrorMessage(DLTKLaunchMessages.InterpreterArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage()); 
+			DLTKDebugUIPlugin.log(e);			
+		}
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_INTERPRETER_ARGUMENTS, getAttributeValueFrom(fInterpreterArgumentsText));
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return DLTKLaunchMessages.InterpreterArgumentsBlock_Interpreter_Arguments; 
+	}
+	
+	/**
+	 * Retuns the string in the text widget, or <code>null</code> if empty.
+	 * 
+	 * @return text or <code>null</code>
+	 */
+	protected String getAttributeValueFrom(Text text) {
+		String content = text.getText().trim();
+		if (content.length() > 0) {
+			return content;
+		}
+		return null;
+	}	
+	
+	public void setEnabled(boolean enabled) {
+		fInterpreterArgumentsText.setEnabled(enabled);
+		fPgrmArgVariableButton.setEnabled(enabled);
+	}
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/ScriptLaunchShortcut.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/ScriptLaunchShortcut.java
new file mode 100644
index 0000000..779501c
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/ScriptLaunchShortcut.java
@@ -0,0 +1,323 @@
+package org.eclipse.dltk.internal.debug.ui.launcher;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+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.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.ILaunchShortcut;
+import org.eclipse.dltk.core.IModelElement;
+import org.eclipse.dltk.core.IParent;
+import org.eclipse.dltk.core.ISourceModule;
+import org.eclipse.dltk.core.ModelException;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
+import org.eclipse.dltk.launching.LaunchingMessages;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+
+
+public abstract class ScriptLaunchShortcut implements ILaunchShortcut {
+	public void launch(ISelection selection, String mode) {
+		if (selection instanceof IStructuredSelection) {
+			searchAndLaunch(((IStructuredSelection)selection).toArray(), mode, getScriptSelectionTitle(), getSelectionEmptyMessage());
+		}
+	}
+
+	/**
+	 * @param search the elements to search for a main script
+	 * @param mode the mode to launch in
+	 */
+	public void searchAndLaunch(Object[] search, String mode, String selectMessage, String emptyMessage) {
+		IResource[] scripts = null;
+		try {
+			scripts = findScripts(search, PlatformUI.getWorkbench().getProgressService());
+		} catch (InterruptedException e) {
+			return;
+		} catch (CoreException e) {
+			MessageDialog.openError(getShell(), LaunchingMessages.ScriptLaunchShortcut_0, e.getMessage());
+			return;
+		}
+		IResource script = null;
+		if (scripts.length == 0) {
+			MessageDialog.openError(getShell(), LaunchingMessages.ScriptLaunchShortcut_1, emptyMessage);
+		} else if (scripts.length > 1) {
+			try {
+				script = chooseScript(scripts, selectMessage);
+			} catch (ModelException e) {
+				reportErorr(e);
+				return;
+			}
+		} else {
+			script = scripts[0];
+		}
+		if (script != null) {
+			launch(script, mode);
+		}
+	}
+
+	/**
+	 * Prompts the user to select a type from the given types.
+	 *
+	 * @param types the types to choose from
+	 * @param title the selection dialog title
+	 *
+	 * @return the selected type or <code>null</code> if none.
+	 */
+	protected IResource chooseScript(IResource[] scripts, String title) throws ModelException {
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog (getShell(), new WorkbenchLabelProvider() );
+		dialog.setElements(scripts);
+		dialog.setMessage(LaunchingMessages.ScriptLaunchShortcut_Choose_a_main_script_to_launch);
+		dialog.setTitle(title);
+		if (dialog.open() == Window.OK) {
+			return (IResource)dialog.getResult()[0];
+		}
+		return null;
+	}
+
+	/**
+	 * Opens an error dialog on the given excpetion.
+	 *
+	 * @param exception
+	 */
+	protected void reportErorr(CoreException exception) {
+		MessageDialog.openError(getShell(), LaunchingMessages.ScriptLaunchShortcut_3, exception.getStatus().getMessage());
+	}
+
+	public void launch(IEditorPart editor, String mode) {
+		IEditorInput editorInput = editor.getEditorInput();
+		if (editorInput == null)
+			return;
+		IResource script = ((IFileEditorInput) editorInput).getFile();
+		if (script != null)
+			launch(script, mode);
+	}
+
+	protected void launch (IResource script, String mode) {
+		ILaunchConfiguration config = findLaunchConfiguration(script, getConfigurationType());
+		if (config != null) {
+			DebugUITools.launch(config, mode);
+		}
+	}
+
+	protected ILaunchManager getLaunchManager() {
+		return DebugPlugin.getDefault().getLaunchManager();
+	}
+
+	/**
+	 * Returns the type of configuration this shortcut is applicable to.
+	 *
+	 * @return the type of configuration this shortcut is applicable to
+	 */
+	protected abstract ILaunchConfigurationType getConfigurationType();
+
+	/**
+	 * Locate a configuration to relaunch for the given type.  If one cannot be found, create one.
+	 *
+	 * @return a re-useable config or <code>null</code> if none
+	 */
+	protected ILaunchConfiguration findLaunchConfiguration(IResource script, ILaunchConfigurationType configType) {
+		List candidateConfigs = Collections.EMPTY_LIST;
+		try {
+			ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(configType);
+			candidateConfigs = new ArrayList(configs.length);
+			for (int i = 0; i < configs.length; i++) {
+				ILaunchConfiguration config = configs[i];
+				if (config.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_MAIN_SCRIPT_NAME, "").equals(script.getProjectRelativePath().toString())) { //$NON-NLS-1$
+						candidateConfigs.add(config);
+				}
+			}
+		} catch (CoreException e) {
+			DLTKLaunchingPlugin.log(e);
+		}
+
+		// If there are no existing configs associated with the script, create one.
+		// If there is exactly one config associated with the script, return it.
+		// Otherwise, if there is more than one config associated with the script, prompt the
+		// user to choose one.
+		int candidateCount = candidateConfigs.size();
+		if (candidateCount < 1) {
+			return createConfiguration(script);
+		} else if (candidateCount == 1) {
+			return (ILaunchConfiguration) candidateConfigs.get(0);
+		} else {
+			// Prompt the user to choose a config.  A null result means the user
+			// cancelled the dialog, in which case this method returns null,
+			// since cancelling the dialog should also cancel launching anything.
+			ILaunchConfiguration config = chooseConfiguration(candidateConfigs);
+			if (config != null) {
+				return config;
+			}
+		}
+
+		return null;
+	}
+
+    protected abstract String getNature();
+
+    protected ILaunchConfiguration createConfiguration(IResource script) {
+        ILaunchConfiguration config = null;
+        ILaunchConfigurationWorkingCopy wc = null;
+        try {
+            ILaunchConfigurationType configType = getConfigurationType();
+            wc = configType.newInstance(null, getLaunchManager().generateUniqueLaunchConfigurationNameFrom(script.getName()));
+            wc.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_NATURE, getNature());
+            wc.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_PROJECT_NAME, script.getProject().getName());
+            wc.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_MAIN_SCRIPT_NAME, script.getProjectRelativePath().toPortableString()/*script.getFullPath().toPortableString()*/);
+            wc.setMappedResources(new IResource[] {script.getProject()});
+            config = wc.doSave();
+        } catch (CoreException exception) {
+            exception.printStackTrace();
+        }
+        return config;
+    }
+
+
+	/**
+	 * Convenience method to get the window that owns this action's Shell.
+	 */
+	protected Shell getShell() {
+		return DLTKDebugUIPlugin.getActiveWorkbenchShell();
+	}
+
+
+	/**
+	 * Show a selection dialog that allows the user to choose one of the specified
+	 * launch configurations.  Return the chosen config, or <code>null</code> if the
+	 * user cancelled the dialog.
+	 */
+	protected ILaunchConfiguration chooseConfiguration(List configList) {
+		IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
+		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
+		dialog.setElements(configList.toArray());
+		dialog.setTitle(DLTKLaunchMessages.scriptLaunchShortcut2_title);
+		dialog.setMessage(DLTKLaunchMessages.scriptLaunchShortcut2);
+		dialog.setMultipleSelection(false);
+		int result = dialog.open();
+		labelProvider.dispose();
+		if (result == Window.OK) {
+			return (ILaunchConfiguration) dialog.getFirstResult();
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the model elements corresponding to the given objects.
+	 *
+	 * @param objects selected objects
+	 * @return corresponding Script elements
+	 */
+	private IResource[] getScriptResources(Object[] objects, IProgressMonitor pm) {
+		List list= new ArrayList(objects.length);
+		for (int i = 0; i < objects.length; i++) {
+			Object object = objects[i];
+			try {
+				if (object instanceof IFile) {
+					IFile f = (IFile)object;
+					if (!f.getName().startsWith("."))
+						list.add(object);
+				} else
+				if (object instanceof IContainer) {
+					IContainer f = (IContainer)object;
+					IResource mem[] = f.members();
+					IResource res[] = getScriptResources(mem, pm);
+					for (int j = 0; j < res.length; j++) {
+						list.add(res[j]);
+					}
+				} else
+				if (object instanceof IModelElement) {
+					IModelElement elem = (IModelElement) object;
+					if (elem instanceof ISourceModule) {
+						IResource res = ((ISourceModule)elem).getCorrespondingResource();
+						if (res != null)
+							list.add(res);
+					}
+					else if (elem instanceof IParent) {
+						IParent proj = (IParent)elem;
+						IResource res[] = getScriptResources(proj.getChildren(), pm);
+						for (int j = 0; j < res.length; j++) {
+							list.add(res[j]);
+						}
+					}
+	 			}
+			} catch (CoreException e) {
+			}
+		}
+		return (IResource[]) list.toArray(new IResource[list.size()]);
+	}
+
+	/**
+	 * Finds and returns the launchable scripts in the given selection of elements.
+	 *
+	 * @param elements scope to search for launchable types
+	 * @param context progess reporting context
+	 * @return launchable types, possibly empty
+	 * @exception InterruptedException if the search is cancelled
+	 * @exception org.eclipse.core.runtime.CoreException if the search fails
+	 */
+	protected IResource[] findScripts(final Object[] elements, IRunnableContext context) throws InterruptedException, CoreException {
+		try {
+			final IResource[][] res= new IResource[1][];
+
+			IRunnableWithProgress runnable= new IRunnableWithProgress() {
+				public void run(IProgressMonitor pm) throws InvocationTargetException {
+					pm.beginTask(LaunchingMessages.LaunchShortcut_searchingForScripts, 1);
+					res[0] = getScriptResources(elements, pm);
+					pm.done();
+				}
+			};
+			context.run(true, true, runnable);
+
+			return res[0];
+		} catch (InvocationTargetException e) {
+			throw (CoreException)e.getTargetException();
+		}
+	}
+
+	/**
+	 * Returns the title for type selection dialog for this launch shortcut.
+	 *
+	 * @return type selection dialog title
+	 */
+	protected String getScriptSelectionTitle() {
+		return LaunchingMessages.LaunchShortcut_selectScriptToLaunch;
+	}
+
+	/**
+	 * Returns an error message to use when the selection does not contain a launchable type.
+	 *
+	 * @return error message
+	 */
+	protected String getSelectionEmptyMessage() {
+		return LaunchingMessages.LaunchShortcut_selectionContainsNoScript;
+	}
+
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/WorkingDirectoryBlock.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/WorkingDirectoryBlock.java
new file mode 100644
index 0000000..330eca5
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/launcher/WorkingDirectoryBlock.java
@@ -0,0 +1,456 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
+ * 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.dltk.internal.debug.ui.launcher;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.variables.IStringVariableManager;
+import org.eclipse.core.variables.VariablesPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.StringVariableSelectionDialog;
+import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.IDLTKProject;
+import org.eclipse.dltk.debug.ui.launchConfigurations.CommonScriptLaunchTab;
+import org.eclipse.dltk.debug.ui.messages.DLTKLaunchMessages;
+import org.eclipse.dltk.internal.launching.DLTKLaunchingPlugin;
+import org.eclipse.dltk.launching.IDLTKLaunchConfigurationConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+
+/**
+ * A control for setting the working directory associated with a launch
+ * configuration.
+ */
+public class WorkingDirectoryBlock extends CommonScriptLaunchTab {
+			
+	// Local directory
+	private Button fWorkspaceButton;
+	private Button fFileSystemButton;
+	private Button fVariablesButton;
+	
+	//bug 29565 fix
+	private Button fUseDefaultDirButton = null;
+	private Button fUseOtherDirButton = null;
+	private Text fOtherWorkingText = null;
+	private Text fWorkingDirText;
+	
+	/**
+	 * The last launch config this tab was initialized from
+	 */
+	private ILaunchConfiguration fLaunchConfiguration;
+	
+	/**
+	 * A listener to update for text changes and widget selection
+	 */
+	private class WidgetListener extends SelectionAdapter implements ModifyListener {
+		public void modifyText(ModifyEvent e) {
+			updateLaunchConfigurationDialog();
+		}//end modifyText
+		public void widgetSelected(SelectionEvent e) {
+			Object source= e.getSource();
+			if (source == fWorkspaceButton) {
+				handleWorkspaceDirBrowseButtonSelected();
+			}//end if
+			else if (source == fFileSystemButton) {
+				handleWorkingDirBrowseButtonSelected();
+			}//end if 
+			else if (source == fVariablesButton) {
+				handleWorkingDirVariablesButtonSelected();
+			}//end if 
+			else if(source == fUseDefaultDirButton) {
+				//only perform the action if this is the button that was selected
+				if(fUseDefaultDirButton.getSelection()) {
+					setDefaultWorkingDir();
+				}//end if
+			}//end if 
+			else if(source == fUseOtherDirButton) {
+				//only perform the action if this is the button that was selected
+				if(fUseOtherDirButton.getSelection()) {
+					handleUseOtherWorkingDirButtonSelected();
+				}//end if
+			}//end if
+		}//end widgetSelected
+	}//end WidgetListener class
+	
+	private WidgetListener fListener = new WidgetListener();
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		Font font = parent.getFont();
+				
+		Group group = new Group(parent, SWT.NONE);
+		//PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IScriptDebugHelpContextIds.WORKING_DIRECTORY_BLOCK);		
+		GridLayout workingDirLayout = new GridLayout();
+		workingDirLayout.numColumns = 2;
+		workingDirLayout.makeColumnsEqualWidth = false;
+		group.setLayout(workingDirLayout);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		group.setLayoutData(gd);
+		group.setFont(font);
+		setControl(group);
+		
+		group.setText(DLTKLaunchMessages.WorkingDirectoryBlock_12); 
+		
+		fUseDefaultDirButton = new Button(group, SWT.RADIO);
+		fUseDefaultDirButton.setText(DLTKLaunchMessages.WorkingDirectoryBlock_18);
+		fUseDefaultDirButton.setFont(font);
+		fUseDefaultDirButton.addSelectionListener(fListener);
+		fWorkingDirText = new Text(group, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fWorkingDirText.setLayoutData(gd);
+		fWorkingDirText.setFont(font);
+		fWorkingDirText.addModifyListener(fListener);
+		fWorkingDirText.setEnabled(false);
+		
+		fUseOtherDirButton = new Button(group, SWT.RADIO);
+		fUseOtherDirButton.setText(DLTKLaunchMessages.WorkingDirectoryBlock_19);
+		fUseOtherDirButton.setFont(font);
+		fUseOtherDirButton.addSelectionListener(fListener);
+		fOtherWorkingText = new Text(group, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		fOtherWorkingText.setLayoutData(gd);
+		fOtherWorkingText.setFont(font);
+		fOtherWorkingText.addModifyListener(fListener);
+		
+		Composite buttonComp = new Composite(group, SWT.NONE);
+		GridLayout layout = new GridLayout(3, false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		buttonComp.setLayout(layout);
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 2;
+		buttonComp.setLayoutData(gd);
+		buttonComp.setFont(font);		
+		fWorkspaceButton = createPushButton(buttonComp, DLTKLaunchMessages.WorkingDirectoryBlock_0, null); 
+		fWorkspaceButton.addSelectionListener(fListener);
+		
+		fFileSystemButton = createPushButton(buttonComp, DLTKLaunchMessages.WorkingDirectoryBlock_1, null); 
+		fFileSystemButton.addSelectionListener(fListener);
+		
+		fVariablesButton = createPushButton(buttonComp, DLTKLaunchMessages.WorkingDirectoryBlock_17, null); 
+		fVariablesButton.addSelectionListener(fListener);
+	}
+					
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
+	 */
+	public void dispose() {}
+		
+	/**
+	 * Show a dialog that lets the user select a working directory
+	 */
+	private void handleWorkingDirBrowseButtonSelected() {
+		DirectoryDialog dialog = new DirectoryDialog(getShell());
+		dialog.setMessage(DLTKLaunchMessages.WorkingDirectoryBlock_7); 
+		String currentWorkingDir = getWorkingDirectoryText();
+		if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$
+			File path = new File(currentWorkingDir);
+			if (path.exists()) {
+				dialog.setFilterPath(currentWorkingDir);
+			}//end if		
+		}//end if
+		String selectedDirectory = dialog.open();
+		if (selectedDirectory != null) {
+			fOtherWorkingText.setText(selectedDirectory);
+		}//end if		
+	}//end handleQWrokingDirBrowseBUttonSelected
+
+	/**
+	 * Show a dialog that lets the user select a working directory from 
+	 * the workspace
+	 */
+	private void handleWorkspaceDirBrowseButtonSelected() {
+	    IContainer currentContainer= getContainer();
+		if (currentContainer == null) {
+		    currentContainer = ResourcesPlugin.getWorkspace().getRoot();
+		}//end if 
+		ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(), currentContainer, false,	DLTKLaunchMessages.WorkingDirectoryBlock_4); 
+		dialog.showClosedProjects(false);
+		dialog.open();
+		Object[] results = dialog.getResult();		
+		if ((results != null) && (results.length > 0) && (results[0] instanceof IPath)) {
+			IPath path = (IPath)results[0];
+			String containerName = path.makeRelative().toString();
+			setOtherWorkingDirectoryText("${workspace_loc:" + containerName + "}"); //$NON-NLS-1$ //$NON-NLS-2$
+		}//end if			
+	}//end handleWorkspaceDirBrowseButtonSelected
+	
+	/**
+	 * Returns the selected workspace container,or <code>null</code>
+	 */
+	protected IContainer getContainer() {
+		String path = getWorkingDirectoryText();
+		if (path.length() > 0) {
+		    IResource res = null;
+		    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		    if (path.startsWith("${workspace_loc:")) { //$NON-NLS-1$
+		        IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
+			    try {
+                    path = manager.performStringSubstitution(path, false);
+                    IContainer[] containers = root.findContainersForLocation(new Path(path));
+                    if (containers.length > 0) {
+                        res = containers[0];
+                    }//end if
+                }//end try 
+			    catch (CoreException e) {}
+			}//end if 
+		    else {	    
+				res = root.findMember(path);
+			}//end else
+			if (res instanceof IContainer) {
+				return (IContainer)res;
+			}//end if
+		}//end if
+		return null;
+	}//end getContainer
+		
+	/**
+	 * The default working dir radio button has been selected.
+	 */
+	private void handleUseDefaultWorkingDirButtonSelected() {
+		fWorkspaceButton.setEnabled(false);
+		fOtherWorkingText.setEnabled(false);
+		fVariablesButton.setEnabled(false);
+		fFileSystemButton.setEnabled(false);
+		fUseOtherDirButton.setSelection(false);
+	}
+
+	/**
+	 * The other working dir radio button has been selected
+	 * 
+	 *
+	 */
+	private void handleUseOtherWorkingDirButtonSelected() {
+		fOtherWorkingText.setEnabled(true);
+		fWorkspaceButton.setEnabled(true);
+		fVariablesButton.setEnabled(true);
+		fFileSystemButton.setEnabled(true);
+		updateLaunchConfigurationDialog();
+	}
+
+	/**
+	 * The working dir variables button has been selected
+	 */
+	private void handleWorkingDirVariablesButtonSelected() {
+		StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
+		dialog.open();
+		String variableText = dialog.getVariableExpression();
+		if (variableText != null) {
+			fOtherWorkingText.insert(variableText);
+		}//end if
+	}//end handleWorkingDirVariablesButtonSelected
+	
+	/**
+	 * Convenience method to get the workspace root.
+	 */
+	protected IWorkspaceRoot getWorkspaceRoot() {
+		return ResourcesPlugin.getWorkspace().getRoot();
+	}
+	
+	/**
+	 * Sets the default working directory
+	 */
+	protected void setDefaultWorkingDir() {
+		try {
+			ILaunchConfiguration config = getLaunchConfiguration();
+			if (config != null) {
+				String projectName = config.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
+				if (!projectName.equals("")) {
+					IDLTKProject project = DLTKCore.create(getWorkspaceRoot()).getScriptProject(projectName);
+					if (project != null) {
+						setDefaultWorkingDirectoryText("${workspace_loc:" + project.getPath().makeRelative().toOSString() + "}");  //$NON-NLS-1$//$NON-NLS-2$
+						return;
+					}
+				}
+			}
+		} 
+		catch (CoreException ce) {}
+		setDefaultWorkingDirectoryText(System.getProperty("user.dir")); //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration config) {
+		setErrorMessage(null);
+		setMessage(null);
+		// if variables are present, we cannot resolve the directory
+		String workingDirPath = getWorkingDirectoryText();
+		if (workingDirPath.indexOf("${") >= 0) { //$NON-NLS-1$
+			IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager();
+			try {
+				manager.validateStringVariables(workingDirPath);
+			}//end try
+			catch (CoreException e) {
+				setErrorMessage(e.getMessage());
+				return false;
+			}//end catch
+		}//end if 
+		else if (workingDirPath.length() > 0) {
+			IContainer container = getContainer();
+			if (container == null) {
+				File dir = new File(workingDirPath);
+				if (dir.isDirectory()) {
+					return true;
+				}//end if
+				setErrorMessage(DLTKLaunchMessages.WorkingDirectoryBlock_10); 
+				return false;
+			}//end if
+		} else if (workingDirPath.length() == 0) {
+			setErrorMessage(DLTKLaunchMessages.WorkingDirectoryBlock_20);
+		}
+		return true;
+	}//end isValid
+
+	/**
+	 * Defaults are empty.
+	 * 
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+		config.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String)null);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		setLaunchConfiguration(configuration);
+		try {			
+			String wd = configuration.getAttribute(IDLTKLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String)null);
+			setDefaultWorkingDir();
+			if (wd != null) {
+				setOtherWorkingDirectoryText(wd);
+			}//end else
+		}//end try 
+		catch (CoreException e) {
+			setErrorMessage(DLTKLaunchMessages.ArgumentsTab_Exception_occurred_reading_configuration___15 + e.getStatus().getMessage()); 
+			DLTKLaunchingPlugin.log(e);
+		}//end catch
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		if(fUseDefaultDirButton.getSelection()) {
+			configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String)null);
+		}//end if
+		else {
+			configuration.setAttribute(IDLTKLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, getWorkingDirectoryText());
+		}//end else
+	}//end performApply
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return DLTKLaunchMessages.WorkingDirectoryBlock_Working_Directory_8; 
+	}//end getName
+	
+	/**
+	 * gets the path from the text box that is selected
+	 * @return the working directory the user wishes to use
+	 *
+	 */
+	protected String getWorkingDirectoryText() {
+		if(fUseDefaultDirButton.getSelection()) {
+			return fWorkingDirText.getText().trim();
+		}//end if
+		return fOtherWorkingText.getText().trim();
+	}//end getWorkingDirectoryPath
+	
+	/**
+	 * sets the default working directory text
+	 * @param dir the dir to set the widget to
+	 *
+	 */
+	protected void setDefaultWorkingDirectoryText(String dir) {
+		if(dir != null) {
+			fWorkingDirText.setText(dir);
+			fUseDefaultDirButton.setSelection(true);
+			handleUseDefaultWorkingDirButtonSelected();
+		}//end if
+	}//setDefaultWorkingDirectoryText
+	
+	/**
+	 * sets the other dir text
+	 * @param dir the new text
+	 *
+	 */
+	protected void setOtherWorkingDirectoryText(String dir) {
+		if(dir != null) {
+			fOtherWorkingText.setText(dir);
+			fUseDefaultDirButton.setSelection(false);
+			fUseOtherDirButton.setSelection(true);
+			handleUseOtherWorkingDirButtonSelected();
+		}//end if
+	}//end setOtherWorkingDirectoryText
+	
+	/**
+	 * Sets thescriptproject currently specified by the
+	 * given launch config, if any.
+	 */
+	protected void setLaunchConfiguration(ILaunchConfiguration config) {
+		fLaunchConfiguration = config;
+	}	
+	
+	/**
+	 * Returns the currentscriptproject context
+	 */
+	protected ILaunchConfiguration getLaunchConfiguration() {
+		return fLaunchConfiguration;
+	}
+	
+	/**
+	 * Allows this entire block to be enabled/disabled
+	 * @param enabled whether to enable it or not
+	 */
+	protected void setEnabled(boolean enabled) {
+		fUseDefaultDirButton.setEnabled(enabled);
+		fUseOtherDirButton.setEnabled(enabled);
+		if(fOtherWorkingText.isEnabled()) {
+			fOtherWorkingText.setEnabled(enabled);
+			fWorkspaceButton.setEnabled(enabled);
+			fVariablesButton.setEnabled(enabled);
+			fFileSystemButton.setEnabled(enabled);
+		}//end if
+		// in the case where the 'other' text is selected and we want to enable
+		if(fUseOtherDirButton.getSelection() && enabled == true) {
+			fOtherWorkingText.setEnabled(enabled);
+		}//end if
+	}//end setEnabled
+	
+}//end class
+
