diff --git a/org.eclipse.debug.core/buildnotes_platform-debug.html b/org.eclipse.debug.core/buildnotes_platform-debug.html
index f739bd2..c868da6 100644
--- a/org.eclipse.debug.core/buildnotes_platform-debug.html
+++ b/org.eclipse.debug.core/buildnotes_platform-debug.html
@@ -11,12 +11,33 @@
 <h1>
 Eclipse Platform Build Notes&nbsp;<br>
 Platform Debug</h1>
+September 7, 2004
+<h3>
+Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72986">72986</a>: ExpressionInformationControl leaks<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72000">72000</a>: Run as Application: duplicate menmonics<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72449">72449</a>: NPE in VariablesView.saveState<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73068">73068</a>: Support for ordering launch shortcuts<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73069">73069</a>: bogus extension point id in org.eclipse.debug.ui.launchShortcuts<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73110">73110</a>: IConsoleColorProvider is not disconnected<br> 
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72472">72472</a>: Remove unused dependancies<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72551">72551</a>: add System property to test suite to turn off workbench and console activation<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51562">51562</a>: console doesn't wrap input<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72317">72317</a>: IOConsole inserts extra line breaks when pasting<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72517">72517</a>: Replace &quot;Run As &gt;&quot; with context launch<br>  
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73272">73272</a>: NPE in ProcessConsoleManager when no process type<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70664">70664</a>: TVT3.0:   Improper characters combination &quot;Run As&quot;<br>
+
+<h1>
+Eclipse Platform Build Notes&nbsp;<br>
+Platform Debug</h1>
 August 31, 2004
 <h3>
 Problem Reports Fixed</h3>
 <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72300">72300</a>: Confirmation on RemoveAll actions<br> 
 <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72350">72350</a>: NPE in BreakpointsView.dispose<br>
 <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72881">72881</a>: LineTracker Test Failure<br>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=72483">72483</a>: NPE attempt to Inspect if never shown Variable view<br>
 
 <h1>
 Eclipse Platform Build Notes&nbsp;<br>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
index dae4502..3384b5f 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/Breakpoint.java
@@ -154,6 +154,9 @@
 	 * @see IBreakpoint#setGroup(String)
 	 */
 	public void setGroup(String group) throws CoreException {
+	    if (group.length() == 0) {
+	        group= null;
+	    }
 		setAttribute(GROUP, group);
 	}
 	
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
index 6213acb..98643f0 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
@@ -1632,11 +1632,11 @@
 				if (!file.delete()) {
 					file.deleteOnExit(); // if delete() fails try again on VM close
 				}
-				for (Enumeration enum = p.keys(); enum.hasMoreElements();) {
+				for (Enumeration enumeration = p.keys(); enumeration.hasMoreElements();) {
 					// Win32's environment vars are case insensitive. Put everything
 					// to uppercase so that (for example) the "PATH" variable will match
 					// "pAtH" correctly on Windows.
-					String key= ((String) enum.nextElement()).toUpperCase();
+					String key= ((String) enumeration.nextElement()).toUpperCase();
 					//no need to cast value
 					fgNativeEnv.put(key, p.get(key));
 				}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingInfo.java
index 0c5f66f..9c329e0 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingInfo.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingInfo.java
@@ -114,13 +114,13 @@
 	 */
 	public IConfigurationElement[] getAllProperties() {
 		
-		Enumeration enum = fProperties.elements();
+		Enumeration enumeration = fProperties.elements();
 		IConfigurationElement[] elements = new IConfigurationElement[fProperties.size()];
 		
 		int i=0;
-		while (enum.hasMoreElements())
+		while (enumeration.hasMoreElements())
 		{
-			elements[i] = (IConfigurationElement)enum.nextElement(); 
+			elements[i] = (IConfigurationElement)enumeration.nextElement(); 
 			i++;
 		}
 		
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingManager.java
index faad321..5894abf 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/memory/MemoryRenderingManager.java
@@ -807,11 +807,11 @@
 						addRenderingInfo(dynamicRenderingTypes);
 						
 						// now compare the returned list to what is orginally cached
-						Enumeration enum = fDynamicRenderingMap.keys();
+						Enumeration enumeration = fDynamicRenderingMap.keys();
 						
-						while (enum.hasMoreElements())
+						while (enumeration.hasMoreElements())
 						{
-							String dynamicRenderingId = (String)enum.nextElement();
+							String dynamicRenderingId = (String)enumeration.nextElement();
 							String staticRenderingId = (String)fDynamicRenderingMap.get(dynamicRenderingId);
 													
 							if (staticRenderingId.equals(rendering.getRenderingId()))
diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties
index e4edf28..410f613 100644
--- a/org.eclipse.debug.ui/plugin.properties
+++ b/org.eclipse.debug.ui/plugin.properties
@@ -42,7 +42,7 @@
 DebugPreferencePage.name=Run/Debug
 DebugView.name=Debug
 DebugViewsCategory.name=Debug
-DebugWithConfigurationAction.label=Debu&g
+DebugWithConfigurationAction.label=De&bug
 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
@@ -58,7 +58,7 @@
 LaunchConfigurationTypesPreferencePage.name=Launch Configuration Types
 LauncherPropertyPage.name=Launcher
 LaunchGroupsExtensionName=Launch Groups
-OpenDebugConfigurations.label=De&bug...
+OpenDebugConfigurations.label=Debu&g...
 OpenRunConfigurations.label=Ru&n...
 OpenProfileConfigurations.label=&Profile...
 processPropertyPageName=Process Information
@@ -88,8 +88,8 @@
 RunLaunchGroup.label=Ru&n
 RunLaunchGroup.title=Select or configure an application to run
 RunConfigurations.label=R&un Configurations...
-RunHistoryMenuAction.label=R&un History
-RunWithConfigurationAction.label=Ru&n
+RunHistoryMenuAction.label=Run His&tory
+RunWithConfigurationAction.label=R&un
 RunToLine.label=Run to &Line
 SelectAll.label=Select &All
 StepWithFiltersAction.label=Use Step &Filters
diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml
index a83f64c..207e241 100644
--- a/org.eclipse.debug.ui/plugin.xml
+++ b/org.eclipse.debug.ui/plugin.xml
@@ -291,6 +291,14 @@
             </separator>
          </menu>
          <action
+               definitionId="org.eclipse.debug.ui.commands.OpenRunConfigurations"
+               label="%OpenRunConfigurations.label"
+               helpContextId="open_run_configurations_action_context"
+               class="org.eclipse.debug.internal.ui.actions.OpenRunConfigurations"
+               menubarPath="org.eclipse.ui.run/runGroup"
+               id="org.eclipse.debug.ui.actions.OpenRunConfigurations">
+         </action>
+         <action
                label="%RunWithConfigurationAction.label"
                pulldown="true"
                helpContextId="run_with_configuration_action_context"
@@ -340,6 +348,14 @@
                pulldown="true">
          </action>
          <action
+               definitionId="org.eclipse.debug.ui.commands.OpenDebugConfigurations"
+               label="%OpenDebugConfigurations.label"
+               helpContextId="open_debug_configurations_action_context"
+               class="org.eclipse.debug.internal.ui.actions.OpenDebugConfigurations"
+               menubarPath="org.eclipse.ui.run/debugGroup"
+               id="org.eclipse.debug.ui.actions.OpenDebugConfigurations">
+         </action>
+         <action
                label="%DebugWithConfigurationAction.label"
                pulldown="true"
                helpContextId="debug_with_configuration_action_context"
@@ -459,6 +475,14 @@
                pulldown="true">
          </action>
          <action
+               definitionId="org.eclipse.debug.ui.commands.OpenProfileConfigurations"
+               label="%OpenProfileConfigurations.label"
+               helpContextId="open_profile_configurations_action_context"
+               class="org.eclipse.debug.internal.ui.actions.OpenProfileConfigurations"
+               menubarPath="org.eclipse.ui.run/profileGroup"
+               id="org.eclipse.debug.ui.actions.OpenProfileConfigurations">
+         </action>
+         <action
                label="%ProfileWithConfigurationAction.label"
                pulldown="true"
                helpContextId="profile_with_configuration_action_context"
@@ -504,7 +528,7 @@
       <viewContribution
             targetID="org.eclipse.debug.ui.DebugView"
             id="org.eclipse.debug.ui.debugview.toolbar">
-<!-- Thread Group -->
+      <!-- Thread Group -->
          <action
                id="org.eclipse.debug.ui.debugview.toolbar.removeAllTerminated"
                toolbarPath="threadGroup"
@@ -574,7 +598,7 @@
                   class="org.eclipse.debug.core.model.ISuspendResume">
             </selection>
          </action>
-<!-- Step Group -->
+      <!-- Step Group -->
          <action
                id="org.eclipse.debug.ui.debugview.toolbar.stepReturn"
                toolbarPath="stepReturnGroup"
@@ -620,7 +644,7 @@
                   class="org.eclipse.debug.core.model.IStep">
             </selection>
          </action>
-<!-- Render Group -->
+      <!-- Render Group -->
          <action
                id="org.eclipse.debug.ui.debugview.toolbar.toggleStepFilters"
                toolbarPath="renderGroup"
@@ -856,7 +880,7 @@
       <viewerContribution
             targetID="org.eclipse.debug.ui.DebugView"
             id="org.eclipse.debug.ui.debugview.popupMenu">
-<!-- Edit Group -->
+      <!-- Edit Group -->
          <action
                label="%CopyToClipboardAction.label"
                icon="icons/full/elcl16/copy_edit_co.gif"
@@ -868,7 +892,7 @@
                   class="org.eclipse.debug.core.model.IDebugElement">
             </selection>
          </action>
-<!-- Launch Group -->
+      <!-- Launch Group -->
          <action
                label="%TerminateAllAction.label"
                icon="icons/full/elcl16/terminate_all_co.gif"
@@ -896,7 +920,7 @@
                   class="org.eclipse.debug.core.model.ITerminate">
             </selection>
          </action>
-<!-- Thread Group -->
+      <!-- Thread Group -->
          <action
                label="%RemoveAllTerminatedAction.label"
                icon="icons/full/elcl16/rem_all_co.gif"
@@ -954,7 +978,7 @@
                   class="org.eclipse.debug.core.model.ISuspendResume">
             </selection>
          </action>
-<!-- Step Group -->
+      <!-- Step Group -->
          <action
                label="%StepReturnAction.label"
                icon="icons/full/elcl16/stepreturn_co.gif"
@@ -994,7 +1018,7 @@
                   class="org.eclipse.debug.core.model.IStep">
             </selection>
          </action>
-<!-- Render Group -->  
+      <!-- Render Group -->  
          <action
                label="%StepWithFiltersAction.label"
                icon="icons/full/elcl16/stepbystep_co.gif"
@@ -1011,13 +1035,43 @@
       <viewerContribution
             targetID="org.eclipse.debug.ui.BreakpointView"
             id="org.eclipse.debug.ui.breakpointview.popupMenu">
+         <menu
+               label="Select"
+               path="additions"
+               id="selectMenu">
+            <separator
+                  name="additions">
+            </separator>
+         </menu>
          <action
                label="%SelectAll.label"
                helpContextId="select_all_breakpoints_action_context"
                class="org.eclipse.debug.internal.ui.actions.SelectAllBreakpointsAction"
-               menubarPath="breakpointSelectGroup"
+               menubarPath="selectMenu/additions"
                id="org.eclipse.debug.ui.actions.SelectAllBreakpointsAction">
          </action>
+         <menu
+               label="Group All By"
+               path="additions"
+               id="groupAllByMenu">
+            <separator
+                  name="additions">
+            </separator>
+         </menu>
+         <action
+               label="File"
+               helpContextId="group_all_by_file_action_context"
+               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.GroupAllByFileAction"
+               menubarPath="groupAllByMenu/additions"
+               id="org.eclipse.debug.ui.actions.GroupAllByFileAction">
+         </action>
+         <action
+               label="Project"
+               helpContextId="group_all_by_project_action_context"
+               class="org.eclipse.debug.internal.ui.actions.breakpointGroups.GroupAllByProjectAction"
+               menubarPath="groupAllByMenu/additions"
+               id="org.eclipse.debug.ui.actions.GroupAllByProjectAction">
+         </action>
          <action
                label="%RemoveAllAction.label"
                icon="icons/full/elcl16/rem_all_co.gif"
@@ -1040,14 +1094,14 @@
                label="Select By Type"
                helpContextId="select_breakpoints_by_type_action_context"
                class="org.eclipse.debug.internal.ui.actions.breakpointGroups.SelectBreakpointsByTypeAction"
-               menubarPath="breakpointSelectGroup"
+               menubarPath="selectMenu/additions"
                id="org.eclipse.debug.ui.actions.SelectBreakpointsByType">
          </action>
          <action
                label="Select By File"
                helpContextId="select_breakpoints_by_file_action_context"
                class="org.eclipse.debug.internal.ui.actions.breakpointGroups.SelectBreakpointsByResourceAction"
-               menubarPath="breakpointSelectGroup"
+               menubarPath="selectMenu/additions"
                id="org.eclipse.debug.ui.actions.SelectBreakpointsByFile">
          </action>
          <action
@@ -1126,7 +1180,7 @@
       <viewerContribution
             targetID="org.eclipse.debug.ui.VariableView"
             id="org.eclipse.debug.ui.variablesView.popupMenu">
-<!-- Variable Group -->
+      <!-- Variable Group -->
          <action
                label="%CopyVariablesToClipboardAction.label"
                icon="icons/full/elcl16/copy_edit_co.gif"
@@ -1150,7 +1204,7 @@
       <viewerContribution
             targetID="org.eclipse.debug.ui.ExpressionView"
             id="org.eclipse.debug.ui.expressionView.popupMenu">
-<!-- Expression Group -->
+      <!-- Expression Group -->
          <action
                label="%RemoveAllAction.label"
                icon="icons/full/elcl16/rem_all_co.gif"
@@ -1195,7 +1249,7 @@
       <viewerContribution
             targetID="org.eclipse.debug.ui.RegistersView"
             id="org.eclipse.debug.ui.registersView.popupMenu">
-<!-- Variable Group -->
+      <!-- Variable Group -->
          <action
                menubarPath="variableGroup"
                class="org.eclipse.debug.internal.ui.actions.CopyVariablesToClipboardActionDelegate"
@@ -1968,6 +2022,12 @@
 			class="org.eclipse.debug.internal.ui.actions.LaunchablePropertyTester"
 			id="org.eclipse.debug.ui.propertyTesters.launchable">		
 	  </propertyTester>      
+      <propertyTester
+            namespace="org.eclipse.debug.ui"
+            type="org.eclipse.ui.console.IOConsole"
+            class="org.eclipse.debug.internal.ui.views.console.JavaConsoleTrackerPropertyTester"
+            properties="processTypeTest"
+            id="org.eclipse.jdt.debug.ui.JavaConsolePropertyTester"/>
    </extension>
 <!-- Context extensions -->
   <extension
@@ -2042,5 +2102,26 @@
 	            value="org.eclipse.debug.internal.ui.views.memory.HexRenderer">
 	        </rendering_property>
 	  </rendering>
+   </extension>
+   <extension
+         point="org.eclipse.ui.console.consolePatternMatchListener">
+      <consolePatternMatchListener
+            class="org.eclipse.debug.internal.ui.views.console.ConsoleLineNotifier"
+            id="org.eclipse.debug.ui.consoleLineNotifier"
+            regex=".*\r(\n?)|.*\n">
+         <enablement>
+            <instanceof value="org.eclipse.debug.internal.ui.views.console.ProcessConsole"/>
+         </enablement>
+      </consolePatternMatchListener>
+   </extension>
+   <extension
+         point="org.eclipse.ui.console.consolePageParticipant">
+      <consolePageParticipant
+            class="org.eclipse.debug.internal.ui.views.console.ProcessConsolePageParticipant"
+            id="org.eclipse.debug.ui.processConsolePageParticipant">
+         <enablement>
+            <instanceof value="org.eclipse.debug.internal.ui.views.console.ProcessConsole"/>
+         </enablement>
+      </consolePageParticipant>
    </extension>   
 </plugin>
\ No newline at end of file
diff --git a/org.eclipse.debug.ui/schema/launchShortcuts.exsd b/org.eclipse.debug.ui/schema/launchShortcuts.exsd
index f1a8d60..53c3b3a 100644
--- a/org.eclipse.debug.ui/schema/launchShortcuts.exsd
+++ b/org.eclipse.debug.ui/schema/launchShortcuts.exsd
@@ -3,7 +3,7 @@
 <schema targetNamespace="org.eclipse.debug.ui">
 <annotation>
       <appInfo>
-         <meta.schema plugin="org.eclipse.debug.ui" id="filaunchShortcuts" name="Launch Shortcuts"/>
+         <meta.schema plugin="org.eclipse.debug.ui" id="launchShortcuts" name="Launch Shortcuts"/>
       </appInfo>
       <documentation>
          This extension point provides support for selection sensitive launching.  Extensions register a shortcut which
@@ -110,10 +110,22 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="path" type="string">
+            <annotation>
+               <documentation>
+                  an optional menu path used to group launch shortcuts in menus. Launch shortcuts are grouped alphabetically based on the &lt;code&gt;path&lt;/code&gt; attribute, and then sorted alphabetically within groups based on the &lt;code&gt;label&lt;/code&gt; attribute. When unspecified, a shortcut appears in the last group. This attribute was added in the 3.0.1 release.
+               </documentation>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
    <element name="perspective">
+      <annotation>
+         <documentation>
+            The &lt;code&gt;perspective&lt;/code&gt; element has been &lt;b&gt;deprecated&lt;/b&gt; in the 3.1 release. The top level Run/Debug/Profile cascade menus now support contextual (selection sensitive) launching, and clients should provide a &lt;code&gt;contextualLaunch&lt;/code&gt; element instead.
+         </documentation>
+      </annotation>
       <complexType>
          <attribute name="id" type="string" use="required">
             <annotation>
@@ -128,7 +140,7 @@
    <element name="contextualLaunch">
       <annotation>
          <documentation>
-            Holds all descriptions for adding shortcuts to the Run context menu (pop-up).
+            Holds all descriptions for adding shortcuts to the selection sensitive Run/Debug/Profile cascade menus.
          </documentation>
       </annotation>
       <complexType>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
index 6b228aa..4cc29a9 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
@@ -418,7 +418,6 @@
 		
 		// work in progress TODO: remove
 		prefs.setDefault(DebugWorkInProgressPreferencePage.WIP_PREF_USE_LAUNCH_WIZARD, false);
-		prefs.setDefault(DebugWorkInProgressPreferencePage.WIP_PREF_CONTEXT_LAUNCH, false);
 	}
 
 	protected IProcess getProcessFromInput(Object input) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractGroupBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractGroupBreakpointsAction.java
new file mode 100644
index 0000000..d320e95
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractGroupBreakpointsAction.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.debug.internal.ui.actions.breakpointGroups;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.jface.action.IAction;
+
+/**
+ * 
+ */
+public abstract class AbstractGroupBreakpointsAction extends AbstractBreakpointsViewAction {
+
+    /* (non-Javadoc)
+     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+     */
+    public void run(IAction action) {
+        IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
+        for (int i = 0; i < breakpoints.length; i++) {
+            IBreakpoint breakpoint = breakpoints[i];
+            String group = getGroup(breakpoint);
+            try {                
+                breakpoint.setGroup(group);
+            } catch (CoreException e) {
+            }
+        }
+    }
+    
+    protected abstract String getGroup(IBreakpoint breakpoint);
+
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractSelectBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractSelectBreakpointsAction.java
index e96bab6..c4d4a0f 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractSelectBreakpointsAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/AbstractSelectBreakpointsAction.java
@@ -52,11 +52,11 @@
     public List chooseSimilarBreakpoints() {
         Set breakpointsToSelect= new HashSet();
         IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints();
-        for (int i = 0; i < fBreakpoints.length; i++) {
-            IBreakpoint selected = fBreakpoints[i];
-            for (int j = 0; j < breakpoints.length; j++) {
-                IBreakpoint breakpoint = breakpoints[j];
-                if (breakpointsMatch(selected, breakpoint)) {
+        for (int i = 0; i < breakpoints.length; i++) {
+            IBreakpoint breakpoint = breakpoints[i];
+            for (int j = 0; j < fBreakpoints.length; j++) {
+                IBreakpoint selected = fBreakpoints[j];
+                if (breakpointsMatch(breakpoint, selected)) {
                     breakpointsToSelect.add(breakpoint);
                 }
             }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByFileAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByFileAction.java
new file mode 100644
index 0000000..9d9e1ba
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByFileAction.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.debug.internal.ui.actions.breakpointGroups;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.debug.core.model.IBreakpoint;
+
+/**
+ * An action which groups all breakpoints according to their resource
+ */
+public class GroupAllByFileAction extends AbstractGroupBreakpointsAction {
+    
+    /**
+     * @param breakpoint
+     * @return
+     */
+    protected String getGroup(IBreakpoint breakpoint) {
+        String group= null;
+        IMarker marker = breakpoint.getMarker();
+        if (marker != null) {
+            IResource resource = marker.getResource();
+            group= resource.getName();
+        }
+        return group;
+    }
+
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByProjectAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByProjectAction.java
new file mode 100644
index 0000000..4bbd34e
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupAllByProjectAction.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *******************************************************************************/
+package org.eclipse.debug.internal.ui.actions.breakpointGroups;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.debug.core.model.IBreakpoint;
+
+/**
+ * An action which groups all breakpoints according to their project
+ */
+public class GroupAllByProjectAction extends AbstractGroupBreakpointsAction {
+
+    /**
+     * @param breakpoint
+     * @return
+     */
+    protected String getGroup(IBreakpoint breakpoint) {
+        String group= null;
+        IMarker marker = breakpoint.getMarker();
+        if (marker != null) {
+            IProject project = marker.getResource().getProject();
+            if (project != null) {
+                group = project.getName();
+            }
+        }
+        return group;
+    }
+
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
index 8e359cd..7ba3d74 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
@@ -737,21 +737,43 @@
 	 * @see Comparator#compare(Object, Object)
 	 */
 	public int compare(Object a, Object b) {
-		String labelA = ((LaunchShortcutExtension)a).getLabel();
-		String labelB = ((LaunchShortcutExtension)b).getLabel();
+		LaunchShortcutExtension shorcutA = (LaunchShortcutExtension)a;
+		String labelA = shorcutA.getLabel();
+		String pathA = shorcutA.getMenuPath();
+		LaunchShortcutExtension shortcutB = (LaunchShortcutExtension)b;
+		String labelB = shortcutB.getLabel();
+		String pathB = shortcutB.getMenuPath();
 		
-		// null labels sort last (i.e. highest)
-		if (labelA == labelB) {
-			return 0;
+		// group by path, then sort by label
+		// a null path sorts last (i.e. highest)
+		if (nullOrEqual(pathA, pathB)) {
+			// null labels sort last (i.e. highest)
+			if (labelA == labelB) {
+				return 0;
+			}
+			if (labelA == null) {
+				return 1;
+			}
+			if (labelB == null) {
+				return -1;
+			}
+			return labelA.compareToIgnoreCase(labelB);
 		}
-		if (labelA == null) {
+		// compare paths
+		if (pathA == null) {
 			return 1;
 		}
-		if (labelB == null) {
+		if (pathB == null) {
 			return -1;
 		}
-		
-		return labelA.compareToIgnoreCase(labelB);
+		return pathA.compareToIgnoreCase(pathB);
+	}
+	
+	private boolean nullOrEqual(String a, String b) {
+		if (a == null) {
+			return b == null;
+		}
+		return a.equals(b);
 	}
 
 }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java
index 483bded..caa975f 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutExtension.java
@@ -358,6 +358,16 @@
 		return fModes;
 	}
 	
+	/**
+	 * Returns the menu path attribute this shortcut, or <code>null</code> if none
+	 * 
+	 * @return the menu path attribute this shortcut, or <code>null</code> if none
+	 * @since 3.0.1
+	 */
+	public String getMenuPath() {
+		return getConfigurationElement().getAttribute("path"); //$NON-NLS-1$
+	}	
+	
 	/*
 	 * Only for debugging
 	 * @see java.lang.Object#toString()
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java
index 081b33d..1bfd5ad 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/PerspectiveManager.java
@@ -17,10 +17,12 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerException;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugPlugin;
@@ -34,10 +36,15 @@
 import org.eclipse.debug.core.model.IProcess;
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.debug.internal.ui.views.launch.LaunchView;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IPerspectiveDescriptor;
@@ -268,6 +275,18 @@
 		if (page != null) {
 			try {
 				page.showView(IDebugUIConstants.ID_DEBUG_VIEW, null, IWorkbenchPage.VIEW_VISIBLE);
+				final LaunchView view = (LaunchView) page.findView(IDebugUIConstants.ID_DEBUG_VIEW);
+				view.selectionChanged(new SelectionChangedEvent(new ISelectionProvider() {
+                    public void addSelectionChangedListener(ISelectionChangedListener listener) {
+                    }
+                    public ISelection getSelection() {
+                        return view.getViewer().getSelection();
+                    }
+                    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+                    }
+                    public void setSelection(ISelection selection) {
+                    }
+                }, view.getViewer().getSelection()));
 			} catch (PartInitException e) {
 				DebugUIPlugin.log(e);
 			}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugWorkInProgressPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugWorkInProgressPreferencePage.java
index 09511ab..a87c4a5 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugWorkInProgressPreferencePage.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/DebugWorkInProgressPreferencePage.java
@@ -25,7 +25,6 @@
 public class DebugWorkInProgressPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IDebugPreferenceConstants {
     
     public static final String WIP_PREF_USE_LAUNCH_WIZARD = DebugUIPlugin.getUniqueIdentifier() + ".WIP_PREF_USE_LAUNCH_WIZARD"; //$NON-NLS-1$
-    public static final String WIP_PREF_CONTEXT_LAUNCH = DebugUIPlugin.getUniqueIdentifier() + ".WIP_PREF_CONTEXT_LAUNCH"; //$NON-NLS-1$
 	
 	public DebugWorkInProgressPreferencePage() {
 		super(GRID);
@@ -47,7 +46,6 @@
 	 */
 	protected void createFieldEditors() {
 		addField(new BooleanFieldEditor(WIP_PREF_USE_LAUNCH_WIZARD, "Use launch wizard instead of launch dialog", SWT.NONE, getFieldEditorParent())); //$NON-NLS-1$
-		addField(new BooleanFieldEditor(WIP_PREF_CONTEXT_LAUNCH, "Use contextual launch in top-level run menus", SWT.NONE, getFieldEditorParent())); //$NON-NLS-1$
 	}
 
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java
deleted file mode 100644
index 30a078c..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/BreakPartition.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * A partition in a console document that represents a break after an input
- * partition. This represents a hard break that the user cannot backspace/delete.
- */
-public class BreakPartition extends StreamPartition {
-
-	/**
-	 * Partition type
-	 */
-	public static final String BREAK_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".BREAK_PARTITION_TYPE"; //$NON-NLS-1$
-	
-	
-	public BreakPartition(String streamIdentifier, int offset, int length) {
-		super(streamIdentifier, offset, length, BREAK_PARTITION_TYPE);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int)
-	 */
-	public StreamPartition createNewPartition(String streamIdentifier, int offset, int length) {
-		return new BreakPartition(streamIdentifier, offset, length);
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java
deleted file mode 100644
index 6b37c3f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocument.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.ui.console.IConsoleColorProvider;
-import org.eclipse.jface.text.AbstractDocument;
-import org.eclipse.jface.text.DefaultLineTracker;
-import org.eclipse.jface.text.ITextStore;
-
-public class ConsoleDocument extends AbstractDocument {
-	
-	private IConsoleColorProvider fColorProvider;
-	
-	public ConsoleDocument(IConsoleColorProvider colorProvider) {
-		fColorProvider = colorProvider;
-		setTextStore(newTextStore());	
-		setLineTracker(new DefaultLineTracker());
-		completeInitialization();
-	}
-    	
-	/**
-	 * Returns whether this document is read-only.
-	 */
-	public boolean isReadOnly() {
-		return fColorProvider.isReadOnly();
-	}
-	
-	/**
-	 * Creates a new text store for this document.
-	 */
-	protected ITextStore newTextStore() {
-		return new ConsoleOutputTextStore(2500);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java
deleted file mode 100644
index 2fa82933..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentManager.java
+++ /dev/null
@@ -1,370 +0,0 @@
-///*******************************************************************************
-// * Copyright (c) 2000, 2004 IBM Corporation and others.
-// * All rights reserved. This program and the accompanying materials 
-// * are made available under the terms of the Common Public License v1.0
-// * which accompanies this distribution, and is available at
-// * http://www.eclipse.org/legal/cpl-v10.html
-// * 
-// * Contributors:
-// *     IBM Corporation - initial API and implementation
-// *******************************************************************************/
-//package org.eclipse.debug.internal.ui.views.console;
-//
-//
-//import java.text.MessageFormat;
-//import java.util.ArrayList;
-//import java.util.HashMap;
-//import java.util.Iterator;
-//import java.util.List;
-//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.Platform;
-//import org.eclipse.debug.core.DebugPlugin;
-//import org.eclipse.debug.core.ILaunch;
-//import org.eclipse.debug.core.ILaunchListener;
-//import org.eclipse.debug.core.ILaunchManager;
-//import org.eclipse.debug.core.model.IProcess;
-//import org.eclipse.debug.internal.ui.DebugUIPlugin;
-//import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-//import org.eclipse.debug.ui.IDebugUIConstants;
-//import org.eclipse.debug.ui.console.IConsoleColorProvider;
-//import org.eclipse.debug.ui.console.IConsoleLineTracker;
-//import org.eclipse.jface.text.IDocument;
-//import org.eclipse.ui.console.ConsolePlugin;
-//import org.eclipse.ui.console.IConsole;
-//import org.eclipse.ui.console.IConsoleManager;
-//import org.eclipse.ui.texteditor.IDocumentProvider;
-//
-///**
-// * Creates documents for processes as they are registered with a launch.
-// * The singleton manager is accessible from the debug UI plugin.
-// */
-//public class ConsoleDocumentManager implements ILaunchListener {
-//	
-//	/**
-//	 * Console document content provider extensions, keyed by extension id
-//	 */
-//	private Map fColorProviders;
-//	
-//	/**
-//	 * Console line trackers; keyed by process type to list of trackers (1:N) 
-//	 */
-//	private Map fLineTrackers;
-//	
-//	/**
-//	 * Default document provider.
-//	 */
-//	protected IDocumentProvider fDefaultDocumentProvider = null;
-//	
-//	/**
-//	 * Map of processes for a launch to compute removed processes
-//	 */
-//	private Map fProcesses;
-//	
-//	/**
-//	 * @see ILaunchListener#launchRemoved(ILaunch)
-//	 */
-//	public void launchRemoved(ILaunch launch) {
-//		removeLaunch(launch);
-//	}
-//	
-//	protected void removeLaunch(ILaunch launch) {
-//		IProcess[] processes= launch.getProcesses(); 
-//		for (int i= 0; i < processes.length; i++) {
-//			IProcess iProcess = processes[i];
-//			removeProcess(iProcess);
-//		}		
-//		if (fProcesses != null) {
-//			fProcesses.remove(launch);
-//		}
-//	}
-//	
-//	/**
-//	 * Removes the console and document associated with the given process.
-//	 * 
-//	 * @param iProcess process to clean up
-//	 */
-//	private void removeProcess(IProcess iProcess) {
-//		IConsole console = getConsole(iProcess);
-//		if (console != null) {
-//			IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
-//			manager.removeConsoles(new IConsole[]{console});
-//		}
-//		IDocumentProvider provider = getDocumentProvider();
-//		provider.disconnect(iProcess);
-//	}
-//
-//	/**
-//	 * Returns the console for the given process, or <code>null</code> if none.
-//	 * 
-//	 * @param process
-//	 * @return the console for the given process, or <code>null</code> if none
-//	 */
-//	public IConsole getConsole(IProcess process) {
-//		IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); 
-//		IConsole[] consoles = manager.getConsoles();
-//		for (int i = 0; i < consoles.length; i++) {
-//			IConsole console = consoles[i];
-//			if (console instanceof ProcessConsole) {
-//				ProcessConsole pc = (ProcessConsole)console;
-//				if (pc.getProcess().equals(process)) {
-//					return pc;
-//				}
-//			}
-//		}
-//		return null;
-//	}
-//
-//	/**
-//	 * @see ILaunchListener#launchAdded(ILaunch)
-//	 */
-//	public void launchAdded(ILaunch launch) {
-//		launchChanged(launch);
-//	}
-//
-//	/**
-//	 * @see ILaunchListener#launchChanged(ILaunch)
-//	 */
-//	public void launchChanged(final ILaunch launch) {
-//		DebugUIPlugin.getStandardDisplay().syncExec(new Runnable () {
-//			public void run() {
-//				IProcess[] processes= launch.getProcesses();
-//				for (int i= 0; i < processes.length; i++) {
-//					if (getConsoleDocument(processes[i]) == null) {
-//						// create new document
-//						IProcess process = processes[i];
-//						IDocumentProvider provider = getDocumentProvider();
-//						try {
-//							provider.connect(process);
-//						} catch (CoreException e) {
-//						}
-//						ProcessConsole pc = new ProcessConsole(process);
-//						ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc});
-//					}
-//				}
-//				List removed = getRemovedProcesses(launch);
-//				if (removed != null) {
-//					Iterator iterator = removed.iterator();
-//					while (iterator.hasNext()) {
-//						IProcess p = (IProcess) iterator.next();
-//						removeProcess(p);
-//					}
-//				}
-//			}
-//		});
-//	}
-//	
-//	/**
-//	 * Returns the document for the process, or <code>null</code>
-//	 * if none.
-//	 */
-//	public IDocument getConsoleDocument(IProcess process) {
-//		IDocumentProvider provider = getDocumentProvider();
-//		return provider.getDocument(process);
-//	} 
-//	
-//	/**
-//	 * Returns the document provider.
-//	 * 
-//	 * @return document provider
-//	 */
-//	private IDocumentProvider getDocumentProvider() {
-//		if (fDefaultDocumentProvider == null) {
-//			fDefaultDocumentProvider = new ConsoleDocumentProvider();
-//		}
-//		return fDefaultDocumentProvider;
-//	}
-//		
-//	/**
-//	 * Called by the debug ui plug-in on startup.
-//	 * The console document manager starts listening for
-//	 * launches to be registered and initializes if any launches
-//	 * already exist.
-//	 */
-//	public void startup() {
-//		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-//		launchManager.addLaunchListener(this);	
-//
-//		//set up the docs for launches already registered
-//		ILaunch[] launches= launchManager.getLaunches();
-//		for (int i = 0; i < launches.length; i++) {
-//			launchAdded(launches[i]);
-//		}
-//	}
-//	
-//	/**
-//	 * Called by the debug ui plug-in on shutdown.
-//	 * The console document manager de-registers as a 
-//	 * launch listener and kills all existing console documents.
-//	 */
-//	public void shutdown() {
-//		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-//		ILaunch[] launches = launchManager.getLaunches();
-//		for (int i = 0; i < launches.length; i++) {
-//			ILaunch launch = launches[i];
-//			removeLaunch(launch);
-//		}
-//		launchManager.removeLaunchListener(this);
-//		if (fProcesses != null) {
-//			fProcesses.clear();
-//		}
-//	}
-//	
-//	/**
-//	 * Notifies the console document manager that system err is about to be written
-//	 * to the console. The manager will open the console if the preference is
-//	 * set to show the console on system err.
-//	 */
-//	protected void aboutToWriteSystemErr(IProcess process) {
-//		if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_ERR)) {
-//			showConsole(process);
-//		}
-//	}
-//	
-//	/**
-//	 * Notifies the console document manager that system out is about to be written
-//	 * to the console. The manager will open the console if the preference is
-//	 * set to show the console on system out and the console document being written 
-//	 * is associated with the current process.
-//	 */	
-//	protected void aboutToWriteSystemOut(IProcess process) {
-//		if (DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN_ON_OUT)) {
-//			showConsole(process);
-//		}
-//	}
-//	
-//	/**
-//	 * Opens the console view. If the view is already open, it is brought to the front.
-//	 */
-//	protected void showConsole(final IProcess process) {
-//		ConsolePlugin.getDefault().getConsoleManager().showConsoleView(getConsole(process));
-//	}
-//	
-//	/**
-//	 * Returns a new console document color provider extension for the given
-//	 * process type, or <code>null</code> if none.
-//	 * 
-//	 * @param type corresponds to <code>IProcess.ATTR_PROCESS_TYPE</code>
-//	 * @return IConsoleColorProvider
-//	 */
-//	public IConsoleColorProvider getColorProvider(String type) {
-//		if (fColorProviders == null) {
-//			fColorProviders = new HashMap();
-//			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_COLOR_PROVIDERS);
-//			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-//			for (int i = 0; i < elements.length; i++) {
-//				IConfigurationElement extension = elements[i];
-//				fColorProviders.put(extension.getAttributeAsIs("processType"), extension); //$NON-NLS-1$
-//			}
-//		}
-//		IConfigurationElement extension = (IConfigurationElement)fColorProviders.get(type);
-//		if (extension != null) {
-//			try {
-//				Object colorProvider = extension.createExecutableExtension("class"); //$NON-NLS-1$
-//				if (colorProvider instanceof IConsoleColorProvider) {
-//					return (IConsoleColorProvider)colorProvider;
-//				} 
-//				DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.1"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()} )); //$NON-NLS-1$
-//			} catch (CoreException e) {
-//				DebugUIPlugin.log(e);
-//			}
-//		}
-//		return null;
-//	} 
-//	
-//	/**
-//	 * Creates and retuns a new line notifier for the given type of process, or
-//	 * <code>null</code> if none. The notifier will be seeded with new console
-//	 * line listeners registered for the given process type.
-//	 * 
-//	 * @param type process type
-//	 * @return line notifier or <code>null</code>
-//	 */
-//	public ConsoleLineNotifier newLineNotifier(String type) {
-//		if (fLineTrackers == null) {
-//			fLineTrackers = new HashMap();
-//			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_LINE_TRACKERS);
-//			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-//			for (int i = 0; i < elements.length; i++) {
-//				IConfigurationElement extension = elements[i];
-//				String processType = extension.getAttributeAsIs("processType"); //$NON-NLS-1$
-//				List list = (List)fLineTrackers.get(processType);
-//				if (list == null) {
-//					list = new ArrayList();
-//					fLineTrackers.put(processType, list);
-//				}
-//				list.add(extension);
-//			}
-//		}
-//		List extensions = (List)fLineTrackers.get(type);
-//		ConsoleLineNotifier lineNotifier = null;
-//		if (extensions != null) {
-//			lineNotifier = new ConsoleLineNotifier();
-//			Iterator iter = extensions.iterator();
-//			while (iter.hasNext()) {
-//				IConfigurationElement extension = (IConfigurationElement)iter.next();
-//				try {
-//					Object tracker = extension.createExecutableExtension("class"); //$NON-NLS-1$
-//					if (tracker instanceof IConsoleLineTracker) {
-//						lineNotifier.addConsoleListener((IConsoleLineTracker)tracker);
-//					} else {
-//						DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.2"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()})); //$NON-NLS-1$
-//					}
-//				} catch (CoreException e) {
-//					DebugUIPlugin.log(e);
-//				}
-//			}
-//		}
-//		return lineNotifier;		
-//	}
-//	
-//	/**
-//	 * Returns the processes that have been removed from the given
-//	 * launch, or <code>null</code> if none.
-//	 * 
-//	 * @param launch launch that has changed
-//	 * @return removed processes or <code>null</code>
-//	 */
-//	private List getRemovedProcesses(ILaunch launch) {
-//		List removed = null;
-//		if (fProcesses == null) {
-//			fProcesses = new HashMap();
-//		}
-//		IProcess[] old = (IProcess[]) fProcesses.get(launch);
-//		IProcess[] curr = launch.getProcesses();
-//		if (old != null) {
-//			for (int i = 0; i < old.length; i++) {
-//				IProcess process = old[i];
-//				if (!contains(curr, process)) {
-//					if (removed == null) {
-//						removed = new ArrayList();
-//					}
-//					removed.add(process);
-//				}
-//			}
-//		}
-//		// update cache with current processes
-//		fProcesses.put(launch, curr);
-//		return removed;
-//	}
-//	
-//	/**
-//	 * Returns whether the given object is contained in the list.
-//	 * 
-//	 * @param list list to search
-//	 * @param object object to search for
-//	 * @return whether the given object is contained in the list
-//	 */
-//	private boolean contains(Object[] list, Object object) {
-//		for (int i = 0; i < list.length; i++) {
-//			Object object2 = list[i];
-//			if (object2.equals(object)) {
-//				return true;
-//			}
-//		}
-//		return false;
-//	}
-//}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java
deleted file mode 100644
index ab6d5b9..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentPartitioner.java
+++ /dev/null
@@ -1,1003 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.IStreamListener;
-import org.eclipse.debug.core.model.IFlushableStreamMonitor;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamMonitor;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.debug.ui.console.IConsole;
-import org.eclipse.debug.ui.console.IConsoleColorProvider;
-import org.eclipse.debug.ui.console.IConsoleHyperlink;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.BadPositionCategoryException;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentPartitioner;
-import org.eclipse.jface.text.IDocumentPartitionerExtension;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IPatternMatchListener;
-
-/**
- * Default console document partitioner. Partitions a document into
- * color regions for standard in, out, err.
- */
-public class ConsoleDocumentPartitioner implements IDocumentPartitioner, IDocumentPartitionerExtension, IPropertyChangeListener, IConsole, IDebugEventSetListener {
-
-	protected IProcess fProcess;
-	protected IConsoleColorProvider fColorProvider;
-	private IStreamsProxy fProxy;
-	protected List fStreamListeners = new ArrayList(2);
-	
-	private String[] fSortedLineDelimiters;
-	
-	// high and low water marks for buffering output
-	private boolean fUpdatingBuffer = false;
-	private int fLowWaterMark;
-	private int fHighWaterMark;
-	
-	// max amount of output (characters) processed per poll
-	private int fMaxAppendSize;
-	
-	class StreamEntry {
-		/**
-		 * Identifier of the stream written to.
-		 */
-		private String fStreamIdentifier;
-		/**
-		 * The text written
-		 */
-		private String fText = null;
-		
-		StreamEntry(String text, String streamIdentifier) {
-			fText = text;
-			fStreamIdentifier = streamIdentifier;
-		}
-		
-		/**
-		 * Returns the stream identifier
-		 */
-		public String getStreamIdentifier() {
-			return fStreamIdentifier;
-		}
-		
-		/**
-		 * Returns the text written
-		 */
-		public String getText() {
-			return fText;
-		}
-		
-		public boolean isClosedEntry() {
-			return false;
-		}
-	}
-	
-	/**
-	 * A stream entry representing stream closure
-	 */
-	class StreamsClosedEntry extends StreamEntry {
-		StreamsClosedEntry() {
-			super("", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		
-		public boolean isClosedEntry() {
-			return true;
-		}
-	}
-	
-	class StreamListener implements IStreamListener {
-		
-		private String fStreamIdentifier;
-		private IStreamMonitor fStreamMonitor;
-		private boolean fIsSystemOut = false;
-		private boolean fIsSystemErr = false;
-	
-		public StreamListener(String streamIdentifier, IStreamMonitor streamMonitor) {
-			fStreamIdentifier = streamIdentifier;
-			fStreamMonitor = streamMonitor;
-			fIsSystemOut = IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM.equals(streamIdentifier);
-			fIsSystemErr = IDebugUIConstants.ID_STANDARD_ERROR_STREAM.equals(streamIdentifier); 
-		}
-		
-		public void streamAppended(String newText, IStreamMonitor monitor) {
-			if (fIsSystemOut) {
-				DebugUIPlugin.getDefault().getProcessConsoleManager().aboutToWriteSystemOut(getProcess());
-			} else if (fIsSystemErr) {
-				DebugUIPlugin.getDefault().getProcessConsoleManager().aboutToWriteSystemErr(getProcess());
-			}
-			ConsoleDocumentPartitioner.this.streamAppended(newText, fStreamIdentifier);
-		}
-		
-		public void streamClosed(IStreamMonitor monitor) {
-			//ConsoleDocumentPartitioner.this.streamClosed(fStreamIdentifier);
-		}
-		
-		public void connect() {
-			fStreamMonitor.addListener(this);
-			String contents= fStreamMonitor.getContents();
-			if (fStreamMonitor instanceof IFlushableStreamMonitor) {
-				// flush the underlying buffer and do not duplicate storage
-				IFlushableStreamMonitor flushableStreamMonitor = (IFlushableStreamMonitor)fStreamMonitor;
-				flushableStreamMonitor.flushContents();
-				flushableStreamMonitor.setBuffered(false);
-			}
-			if (contents.length() > 0) {
-				streamAppended(contents, fStreamMonitor);
-			}
-		}
-		
-		public void disconnect() {
-			fStreamMonitor.removeListener(this);
-		}
-	}
-
-	
-	/**
-	 * A queue of stream entries written to standard out and standard err.
-	 * Entries appended to the end of the queue and removed from the front.
-	 * Intentionally a vector to obtain synchronization as entries are
-	 * added and removed.
-	 */
-	private Vector fQueue = new Vector(10);
-	
-	/**
-	 * Thread that polls the queue for new output
-	 */
-	private Thread fPollingThread = null;
-	
-	/**
-	 * Whether an append is still in  progress or to be run
-	 */
-	private boolean fAppending = false;
-	
-	/**
-	 * Whether the console has been killed/disconnected
-	 */
-	private boolean fKilled = false;
-	
-	/**
-	 * Whether to keep polling
-	 */
-	private boolean fPoll = false;
-	
-	/**
-	 * Whether the streams coonnected to the associated process are closed
-	 */
-	private boolean fClosed= false;
-	
-	/**
-	 * The associated document
-	 */
-	private IDocument fDocument = null;
-	
-	/**
-	 * The length of the current line
-	 */
-	private int fLineLength = 0;
-	
-	/** 
-	 * Maximum line length before wrapping.
-	 */
-	private int fMaxLineLength = 80;
-	
-	/**
-	 * Whether using auto-wrap mode
-	 */
-	private boolean fWrap = false;
-	
-	/**
-	 * List of partitions
-	 */
-	private List fPartitions = new ArrayList(5);
-	
-	/**
-	 * The base number of milliseconds to pause
-	 * between polls.
-	 */
-	private static final long BASE_DELAY= 100L;
-	
-	/**
-	 * The identifier of the stream that was last appended to
-	 */
-	private String fLastStreamIdentifier= null;
-	
-	/**
-	 * Keyboard input buffer
-	 */
-	private StringBuffer fInputBuffer = new StringBuffer();
-	
-	/**
-	 * Queue of hyperlinks to be added to the console
-	 */
-	private Vector fPendingLinks = new Vector();
-	
-	/**
-	 * The line notifier associated with this partitioner or <code>null</code> if none 
-	 */
-	private ConsoleLineNotifier fLineNotifier = null;
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#connect(org.eclipse.jface.text.IDocument)
-	 */
-	public void connect(IDocument document) {
-		fDocument = document;
-		fDocument.addPositionCategory(HyperlinkPosition.HYPER_LINK_CATEGORY);
-		document.setDocumentPartitioner(this);
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		fWrap = store.getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP);
-		fMaxLineLength = store.getInt(IDebugPreferenceConstants.CONSOLE_WIDTH);
-		store.addPropertyChangeListener(this);		
-		fColorProvider.connect(fProcess, this);
-		DebugPlugin.getDefault().addDebugEventListener(this);
-		if (fProcess.isTerminated()) {
-			// it is possible the terminate event will have been fired before the
-			// document is connected - in this case, ensure we have closed the streams
-			// and notified the line tracker
-			streamsClosed();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#disconnect()
-	 */
-	public void disconnect() {
-		kill();
-		if (fLineNotifier != null) {
-			fLineNotifier.disconnect();
-		}
-		fColorProvider.disconnect();
-		fDocument.setDocumentPartitioner(null);
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public void documentAboutToBeChanged(DocumentEvent event) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#documentChanged(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public boolean documentChanged(DocumentEvent event) {
-		return documentChanged2(event) != null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getLegalContentTypes()
-	 */
-	public String[] getLegalContentTypes() {
-		return new String[] {InputPartition.INPUT_PARTITION_TYPE, OutputPartition.OUTPUT_PARTITION_TYPE, BreakPartition.BREAK_PARTITION_TYPE};
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getContentType(int)
-	 */
-	public String getContentType(int offset) {
-		ITypedRegion partition = getPartition(offset);
-		if (partition != null) {
-			return partition.getType();
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#computePartitioning(int, int)
-	 */
-	public ITypedRegion[] computePartitioning(int offset, int length) {
-		if (offset == 0 && length == fDocument.getLength()) {
-			return (ITypedRegion[])fPartitions.toArray(new ITypedRegion[fPartitions.size()]);
-		} 
-		int end = offset + length;
-		List list = new ArrayList();
-		for (int i = 0; i < fPartitions.size(); i++) {
-			ITypedRegion partition = (ITypedRegion)fPartitions.get(i);
-			int partitionStart = partition.getOffset();
-			int partitionEnd = partitionStart + partition.getLength();
-			if ((offset >= partitionStart && offset <= partitionEnd) ||
-				(offset < partitionStart && end >= partitionStart)) {
-					list.add(partition);
-			} 
-		}
-		return (ITypedRegion[])list.toArray(new ITypedRegion[list.size()]);
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitioner#getPartition(int)
-	 */
-	public ITypedRegion getPartition(int offset) {
-		for (int i = 0; i < fPartitions.size(); i++) {
-			ITypedRegion partition = (ITypedRegion)fPartitions.get(i);
-			int start = partition.getOffset();
-			int end = start + partition.getLength();
-			if (offset >= start && offset < end) {
-				return partition;
-			} 
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.text.IDocumentPartitionerExtension#documentChanged2(org.eclipse.jface.text.DocumentEvent)
-	 */
-	public IRegion documentChanged2(DocumentEvent event) {
-		if (fUpdatingBuffer) {
-			return new Region(0, fDocument.getLength());
-		}
-		addPendingLinks();
-		String text = event.getText();
-		if (isAppendInProgress()) {
-			// stream input
-			addPartition(new OutputPartition(fLastStreamIdentifier, event.getOffset(), text.length()));
-//			if (fLineNotifier != null) {
-//				fLineNotifier.consoleChanged(event);
-//			}
-		} else {
-			// console keyboard input
-			int amountDeleted = event.getLength() - text.length();
-			int docLength = fDocument.getLength();
-			int bufferStartOffset = docLength + amountDeleted - fInputBuffer.length();
-			int bufferModifyOffset = event.getOffset() - bufferStartOffset;
-			int bufferModifyOffsetEnd = bufferModifyOffset + event.getLength();
-			
-			if (docLength == 0) {
-				// cleared
-				fQueue.clear();
-				fInputBuffer.setLength(0);
-				fPartitions.clear();
-				// reset lines processed to 0
-//				if (fLineNotifier != null) {
-//					fLineNotifier.setLinesProcessed(0);
-//				}
-				// remove existing positions
-				try {
-					Position[] positions = fDocument.getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY);
-					for (int i = 0; i < positions.length; i++) {
-						Position position = positions[i];
-						fDocument.removePosition(HyperlinkPosition.HYPER_LINK_CATEGORY, position);
-					}
-				} catch (BadPositionCategoryException e) {
-				}
-				return new Region(0,0);
-			}
-						
-			if (amountDeleted > 0) {
-				// deletion
-				fInputBuffer.replace(bufferModifyOffset, bufferModifyOffsetEnd, text);
-				// replace the last partition
-				InputPartition partition = new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, bufferStartOffset, fInputBuffer.length());
-				fPartitions.set(fPartitions.size() - 1, partition);
-			} else {
-				// insert/replace - must process entire buffer in case of
-				// line delimiter insertion in middle of buffer
-				
-				// parse for line delimiters (indicate chunks to write to standard in)
-				String[] lineDelimiters= getLegalLineDelimiters();
-				StringBuffer temp =new StringBuffer(fInputBuffer.toString());
-				temp.replace(bufferModifyOffset, bufferModifyOffsetEnd, text); 
-				String remaining = temp.toString();
-				int partitionOffset = bufferStartOffset;
-				fInputBuffer.setLength(0);
-				boolean includesLF = false;
-				// line delimiters are sorted by length (compare longest ones first)
-				for (int i= lineDelimiters.length - 1; i >= 0; i--) {
-					int lf = remaining.indexOf(lineDelimiters[i]);
-					while (lf >= 0) {
-						includesLF = true;
-						int split = lf + lineDelimiters[i].length();
-						fInputBuffer.append(remaining.substring(0, split));
-						remaining = remaining.substring(split);
-						String buffer = fInputBuffer.toString();
-						fInputBuffer.setLength(0);
-						InputPartition written = (InputPartition)addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, split));
-						written.setReadOnly(true);
-						partitionOffset += split;
-						addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, 0));
-						if (fProxy != null) {
-							try {
-								fProxy.write(buffer);
-							} catch (IOException ioe) {
-								DebugUIPlugin.log(ioe);
-							}
-						}
-						lf = remaining.indexOf(lineDelimiters[i]);
-					}
-					if (includesLF) {
-						break;
-					}
-				}	
-				if (remaining.length() > 0) {
-					fInputBuffer.append(remaining);
-					addPartition(new InputPartition(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, partitionOffset, remaining.length()));
-				}
-			}
-		}
-		ITypedRegion[] affectedRegions = computePartitioning(event.getOffset(), text.length());
-		if (affectedRegions.length == 0) {
-			return null;
-		}
-		if (affectedRegions.length == 1) {
-			return affectedRegions[0];
-		}
-		int affectedLength = affectedRegions[0].getLength();
-		for (int i = 1; i < affectedRegions.length; i++) {
-			ITypedRegion region = affectedRegions[i];
-			affectedLength += region.getLength();
-		}
-		return new Region(affectedRegions[0].getOffset(), affectedLength);
-	}
-
-	/**
-	 * Adds a new colored input partition, combining with the previous partition if
-	 * possible.
-	 */
-	protected StreamPartition addPartition(StreamPartition partition) {
-		if (fPartitions.isEmpty()) {
-			fPartitions.add(partition);
-		} else {
-			int index = fPartitions.size() - 1;
-			StreamPartition last = (StreamPartition)fPartitions.get(index);
-			if (last.canBeCombinedWith(partition)) {
-				// replace with a single partition
-				partition = last.combineWith(partition);
-				fPartitions.set(index, partition);
-			} else {
-				// different kinds - add a new parition
-				fPartitions.add(partition);
-			}
-		}
-		return partition;
-	}	
-	
-	/**
-	 * Add any pending links to the document that are now within the document's
-	 * bounds.
-	 */
-	protected void addPendingLinks() {
-		synchronized (fPendingLinks) {
-			if (fPendingLinks.isEmpty()) {
-				return;
-			}
-			Iterator links = fPendingLinks.iterator();
-			while (links.hasNext()) {
-				HyperlinkPosition link = (HyperlinkPosition)links.next();
-				if ((link.getOffset() + link.getLength()) <= fDocument.getLength()) {
-					links.remove();
-					addLink(link.getHyperLink(), link.getOffset(), link.getLength());
-				}
-			}
-		}
-	}
-	
-	public ConsoleDocumentPartitioner(IProcess process, IConsoleColorProvider colorProvider) {
-		fProcess= process;
-		fColorProvider = colorProvider;
-		IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore();
-		boolean limit = store.getBoolean(IDebugPreferenceConstants.CONSOLE_LIMIT_CONSOLE_OUTPUT);
-		if (limit) {
-			fLowWaterMark = store.getInt(IDebugPreferenceConstants.CONSOLE_LOW_WATER_MARK);
-			fHighWaterMark = store.getInt(IDebugPreferenceConstants.CONSOLE_HIGH_WATER_MARK);
-			fMaxAppendSize = fLowWaterMark;
-		} else {
-			fLowWaterMark = -1;
-			fHighWaterMark = -1;
-			fMaxAppendSize = 80000;
-		}
-	}
-	
-	/**
-	 * Stops reading/polling immediately
-	 */
-	public synchronized void kill() {
-		if (!fKilled) {
-			fKilled = true;
-			if (fPollingThread != null && fPollingThread.isAlive()) {
-				fPollingThread.interrupt();
-			}
-			fPoll = false;
-			Iterator iter = fStreamListeners.iterator();
-			while (iter.hasNext()) {
-				StreamListener listener = (StreamListener)iter.next();
-				listener.disconnect();
-			}
-			DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		}
-	}
-
-	public synchronized void startReading() {
-		if (fPollingThread != null) {
-			// already polling
-			return;
-		}
-		Runnable r = new Runnable() {
-			public void run() {
-				pollAndSleep();
-			}
-		};
-		fPoll = true;
-		fPollingThread = new Thread(r, "Console Polling Thread"); //$NON-NLS-1$
-		fPollingThread.start();
-	}
-	
-	/**
-	 * Polls and sleeps until closed or the associated
-	 * process terminates
-	 */
-	protected void pollAndSleep() {
-		while (!fKilled && fPoll && (!isClosed() || !fQueue.isEmpty())) {
-			poll();
-			try {
-				Thread.sleep(BASE_DELAY);
-			} catch (InterruptedException e) {
-			}
-		}
-	}
-	
-	/**
-	 * Polls the queue for new output and updates this document
-	 */
-	protected void poll() {
-		if (isAppendInProgress()) {
-			return;
-		}
-		synchronized(fQueue) {
-			StringBuffer buffer = null;
-			StreamEntry prev = null;
-			int processed = 0;
-			int amount = 0;
-			String[] lds = fDocument.getLegalLineDelimiters();
-			boolean closed= false;
-			while (!fKilled && !closed && processed < fQueue.size() && amount < fMaxAppendSize) {
-				StreamEntry entry = (StreamEntry)fQueue.get(processed);
-				if (entry.isClosedEntry()) {
-					closed = true;
-					processed++;
-				} else if (prev == null || prev.getStreamIdentifier().equals(entry.getStreamIdentifier())) {
-					String text = entry.getText();
-					if (buffer == null) {
-						buffer = new StringBuffer(text.length());
-					}
-					if (isWrap()) {
-						for (int i = 0; i < text.length(); i++) {
-							if (fLineLength >= fMaxLineLength) {
-								String d = getLineDelimiter(text, i, lds);
-								if (d == null) {
-									buffer.append(lds[0]);
-								} else {
-									buffer.append(d);
-									i = i + d.length();
-								}
-								fLineLength = 0;
-							}			
-							if (i < text.length()) {										
-								String lineDelimiter = getLineDelimiter(text, i, lds);				
-								if (lineDelimiter == null) { 
-									buffer.append(text.charAt(i));
-									fLineLength++;
-								} else {
-									buffer.append(lineDelimiter);
-									fLineLength = 0;
-									i = i + lineDelimiter.length() - 1;
-								}
-							}
-						} 
-					} else {
-						buffer.append(text);
-					}
-					prev = entry;
-					processed++;
-					amount+= entry.getText().length();
-				} else {
-					// change streams - write the contents of the current stream
-					// and start processing the next stream
-					if (buffer != null) {
-						appendToDocument(buffer.toString(), prev.getStreamIdentifier());
-						buffer.setLength(0);
-						prev = null;
-					}
-				}
-			}
-			if (buffer != null) {
-				appendToDocument(buffer.toString(), prev.getStreamIdentifier());
-			}
-			if (closed) {
-				Display display= DebugUIPlugin.getStandardDisplay(); 
-				if (display != null) {
-					display.asyncExec(new Runnable() {
-						public void run() {
-							if (fLineNotifier != null) {
-								fLineNotifier.streamsClosed();
-							}
-						}
-					});
-				}
-			}
-			for (int i = 0; i < processed; i++) {
-				fQueue.remove(0);
-			}
-		}
-	}
-
-	/**
-	 * Returns the longest line delimiter at the given position in the given text,
-	 * or <code>null</code> if none.
-	 * 
-	 * @param text the text in which to look for a line delimiter
-	 * @param pos the position at which to look for a line delimiter
-	 * @param lineDelimiters the line delimiters to look for
-	 */
-	protected String getLineDelimiter(String text, int pos, String[] lineDelimiters) {
-		String ld = null;
-		for (int i = 0; i < lineDelimiters.length; i++) {					
-			if (text.regionMatches(pos, lineDelimiters[i], 0, lineDelimiters[i].length())) {
-				if (ld == null) {
-					ld = lineDelimiters[i];
-				} else {
-					if (ld.length() < lineDelimiters[i].length()) {
-						ld = lineDelimiters[i];
-					}
-				}
-			}
-		}	
-		return ld;	
-	}
-	
-	/**
-	 * Returns whether this console document is performing auto-wrap
-	 */
-	protected boolean isWrap() {
-		return fWrap;
-	}
-	
-	/**
-	 * The stream with the given identifier has had text appended to it.
-	 * Adds the new text to the document.
-	 * 
-	 * @see IStreamListener#streamAppended(String, IStreamMonitor)
-	 */
-	protected void appendToDocument(final String text, final String streamIdentifier) {
-		Runnable r = new Runnable() {
-			public void run() {
-				setAppendInProgress(true);
-				fLastStreamIdentifier = streamIdentifier;
-				try {
-					fDocument.replace(fDocument.getLength(), 0, text);
-					warnOfContentChange();
-				} catch (BadLocationException e) {
-				}
-				setAppendInProgress(false);
-				checkOverflow();
-			}
-		};
-		Display display = DebugUIPlugin.getStandardDisplay();
-		if (display != null) {
-			display.asyncExec(r);
-		}
-	}
-	
-	/**
-	 * Checks to see if the console buffer has overflowed, and empties the
-	 * overflow if needed, updating partitions and hyperlink positions.
-	 */
-	protected void checkOverflow() {
-		if (fHighWaterMark >= 0) {
-			if (fDocument.getLength() > fHighWaterMark) {
-//				int lineDifference = 0;
-				if (fLineNotifier != null) {
-//					int processed = fLineNotifier.getLinesProcessed();
-//					int numLines = fDocument.getNumberOfLines();
-//					lineDifference = numLines - processed;
-				}
-				int overflow = fDocument.getLength() - fLowWaterMark; 
-				fUpdatingBuffer = true;
-				try {
-					// update partitions
-					List newParitions = new ArrayList(fPartitions.size());
-					Iterator partitions = fPartitions.iterator();
-					while (partitions.hasNext()) {
-						ITypedRegion region = (ITypedRegion)partitions.next();
-						if (region instanceof StreamPartition) {
-							StreamPartition streamPartition = (StreamPartition)region;
-							ITypedRegion newPartition = null;
-							int offset = region.getOffset();
-							if (offset < overflow) {
-								int endOffset = offset + region.getLength();
-								if (endOffset < overflow) {
-									// remove partition
-								} else {
-									// split partition
-									int length = endOffset - overflow;
-									newPartition = streamPartition.createNewPartition(streamPartition.getStreamIdentifier(), 0, length);
-								}
-							} else {
-								// modify parition offset
-								newPartition = streamPartition.createNewPartition(streamPartition.getStreamIdentifier(), streamPartition.getOffset() - overflow, streamPartition.getLength());
-							}
-							if (newPartition != null) {
-								newParitions.add(newPartition);
-							}
-						}
-					}
-					fPartitions = newParitions;
-					// update hyperlinks
-					try {
-						Position[] hyperlinks = fDocument.getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY);
-						for (int i = 0; i < hyperlinks.length; i++) {
-							HyperlinkPosition position = (HyperlinkPosition)hyperlinks[i];
-							// remove old the position
-							fDocument.removePosition(HyperlinkPosition.HYPER_LINK_CATEGORY, position);
-							if (position.getOffset() >= overflow) {
-								// add new poisition
-								try {
-									fDocument.addPosition(HyperlinkPosition.HYPER_LINK_CATEGORY, new HyperlinkPosition(position.getHyperLink(), position.getOffset() - overflow, position.getLength()));
-								} catch (BadLocationException e) {
-								}
-							}
-						}
-					} catch (BadPositionCategoryException e) {
-					}
-					synchronized (fPendingLinks) {
-						// update pending hyperlinks
-						Vector newPendingLinks = new Vector(fPendingLinks.size());
-						Iterator pendingLinks = fPendingLinks.iterator();
-						while (pendingLinks.hasNext()) {
-							HyperlinkPosition position = (HyperlinkPosition)pendingLinks.next();
-							if (position.getOffset() >= overflow) {
-								newPendingLinks.add(new HyperlinkPosition(position.getHyperLink(), position.getOffset() - overflow, position.getLength()));
-							}
-						}
-						fPendingLinks = newPendingLinks;
-					}
-					
-					// remove overflow text
-					try {
-						fDocument.replace(0, overflow, ""); //$NON-NLS-1$
-					} catch (BadLocationException e) {
-						DebugUIPlugin.log(e);
-					}
-				} finally {
-					// update number of lines processed
-					if (fLineNotifier != null) {
-//						fLineNotifier.setLinesProcessed(fDocument.getNumberOfLines() - lineDifference);
-					}
-					fUpdatingBuffer = false;
-				}
-			}
-		}
-	}
-	
-	/**
-	 * The stream with the given identifier has had text appended to it.
-	 * Adds a new entry to the queue.
-	 */
-	protected void streamAppended(String text, String streamIdentifier) {
-		synchronized (fQueue) {
-			if (fClosed) {
-				// ERROR - attempt to append after console is closed
-				DebugUIPlugin.logErrorMessage("An attempt was made to append text to the console, after it was closed."); //$NON-NLS-1$
-			} else {
-				fQueue.add(new StreamEntry(text, streamIdentifier));
-			}
-		}
-	}
-	
-	/**
-	 * The streams associated with this process have been closed.
-	 * Adds a new "stream closed" entry to the queue.
-	 */
-	protected void streamsClosed() {
-		synchronized (fQueue) {
-			if (!fClosed) {
-				fQueue.add(new StreamsClosedEntry());
-				fClosed = true;
-			}
-		}
-	}	
-					
-	/**
-	 * Sets whether a runnable has been submitted to update the console
-	 * document.
-	 */
-	protected void setAppendInProgress(boolean appending) {
-		fAppending = appending;
-	}
-
-	/**
-	 * Returns whether a runnable has been submitted to update the console
-	 * document.
-	 */
-	protected boolean isAppendInProgress() {
-		return fAppending;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().equals(IDebugPreferenceConstants.CONSOLE_WRAP)) {
-			fWrap = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_WRAP);
-		} else if (event.getProperty().equals(IDebugPreferenceConstants.CONSOLE_WIDTH)) {
-			fMaxLineLength = DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugPreferenceConstants.CONSOLE_WIDTH);
-		}
-	}
-	
-	/**
-	 * Returns a collection of legal line delimiters for this partitioner's
-	 * associated document, sorted by length in descending order.
-	 */
-	protected String[] getLegalLineDelimiters() {
-		if (fSortedLineDelimiters == null) {
-			String[] lineDelimiters = fDocument.getLegalLineDelimiters();
-			List list = new ArrayList(lineDelimiters.length);
-			for (int i = 0; i < lineDelimiters.length; i++) {
-				list.add(lineDelimiters[i]);
-			}
-			Comparator comparator = new Comparator() {
-				/**
-				 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-				 */
-				public int compare(Object a, Object b) {
-					String s1 = (String)a;
-					String s2 = (String)b;
-					return s2.length() - s1.length();
-				}
-	
-			};
-			Collections.sort(list, comparator);		
-			fSortedLineDelimiters = (String[])list.toArray(new String[lineDelimiters.length]);
-		}
-		return fSortedLineDelimiters;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamMonitor, java.lang.String)
-	 */
-	public void connect(IStreamMonitor streamMonitor, String streamIdentifer) {
-		if (streamMonitor != null) {
-			StreamListener listener = new StreamListener(streamIdentifer, streamMonitor);
-			fStreamListeners.add(listener);
-			listener.connect();
-			// ensure we start polling for output
-			startReading();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#connect(org.eclipse.debug.core.model.IStreamsProxy)
-	 */
-	public void connect(IStreamsProxy streamsProxy) {
-		fProxy = streamsProxy;
-		connect(streamsProxy.getOutputStreamMonitor(), IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM);
-		connect(streamsProxy.getErrorStreamMonitor(), IDebugUIConstants.ID_STANDARD_ERROR_STREAM);
-	}
-	
-	/**
-	 * Returns whether the streams assocaited with this console's process
-	 * have been closed.
-	 */
-	protected boolean isClosed() {
-		return fClosed;
-	}
-
-	protected IConsoleColorProvider getColorProvider() {
-		return fColorProvider;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#addLink(org.eclipse.debug.ui.console.IConsoleHyperlink, int, int)
-	 */
-	public void addLink(IConsoleHyperlink link, int offset, int length) {
-		HyperlinkPosition hyperlinkPosition = new HyperlinkPosition(link, offset, length); 
-		try {
-			fDocument.addPosition(HyperlinkPosition.HYPER_LINK_CATEGORY, hyperlinkPosition);
-		} catch (BadPositionCategoryException e) {
-			// internal error
-			DebugUIPlugin.log(e);
-		} catch (BadLocationException e) {
-			// queue the link
-			fPendingLinks.add(hyperlinkPosition);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#getDocument()
-	 */
-	public IDocument getDocument() {
-		return fDocument;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#getProcess()
-	 */
-	public IProcess getProcess() {
-		return fProcess;
-	}
-	
-	/**
-	 * Connects the given line notifier to this console document partitioner
-	 * 
-	 * @param lineNotifier
-	 */
-	public void connectLineNotifier(ConsoleLineNotifier lineNotifier) {
-		fLineNotifier = lineNotifier;
-		lineNotifier.connect(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.console.IConsole#getRegion(org.eclipse.debug.ui.console.IConsoleHyperlink)
-	 */
-	public IRegion getRegion(IConsoleHyperlink link) {
-		try {
-			Position[] positions = getDocument().getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY);
-			for (int i = 0; i < positions.length; i++) {
-				HyperlinkPosition position = (HyperlinkPosition)positions[i];
-				if (position.getHyperLink().equals(link)) {
-					return new Region(position.getOffset(), position.getLength());
-				}
-			}
-		} catch (BadPositionCategoryException e) {
-		}
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
-			if (event.getKind() == DebugEvent.TERMINATE && event.getSource().equals(getProcess())) {
-				DebugPlugin.getDefault().removeDebugEventListener(this);
-				streamsClosed();
-			}
-		}
-
-	}
-
-	private void warnOfContentChange() {
-		ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(DebugUITools.getConsole(fProcess));
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.debug.ui.console.IConsole#addPatternMatchHandler(org.eclipse.ui.console.IPatternMatchListener)
-     */
-	public void addPatternMatchListener(IPatternMatchListener matchHandler) {
-        //
-    }
-	public void removePatternMatchListener(IPatternMatchListener matchHandler) {
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java
deleted file mode 100644
index f102a0f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleDocumentProvider.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.console.ConsoleColorProvider;
-import org.eclipse.debug.ui.console.IConsoleColorProvider;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.source.IAnnotationModel;
-
-import org.eclipse.ui.texteditor.AbstractDocumentProvider;
-
-/**
- * Default document provider for the processes. By default a document is created
- * which is connected to the streams proxy of the associated process.
- */
-public class ConsoleDocumentProvider extends AbstractDocumentProvider {
-	
-	/** 
-	 * The runnable context for that provider.
-	 * @since 3.0
-	 */
-	private WorkspaceOperationRunner fOperationRunner;
-
-	/**
-	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createDocument(java.lang.Object)
-	 */
-	protected IDocument createDocument(Object element) {
-		if (element instanceof IProcess) {
-			IProcess process = (IProcess)element;
-			IConsoleColorProvider colorProvider = getColorProvider(process);
-			ConsoleDocument doc= new ConsoleDocument(colorProvider);
-			ConsoleDocumentPartitioner partitioner = new ConsoleDocumentPartitioner(process, colorProvider);
-			ConsoleLineNotifier lineNotifier = getLineNotifier(process);
-			partitioner.connect(doc);
-			if (lineNotifier != null) {
-				partitioner.connectLineNotifier(lineNotifier);
-			}
-			return doc;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createAnnotationModel(java.lang.Object)
-	 */
-	protected IAnnotationModel createAnnotationModel(Object element) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor, java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
-	 */
-	protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#disposeElementInfo(java.lang.Object, org.eclipse.ui.texteditor.AbstractDocumentProvider.ElementInfo)
-	 */
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		ConsoleDocument document = (ConsoleDocument)info.fDocument; 
-		document.getDocumentPartitioner().disconnect();
-		super.disposeElementInfo(element, info);
-	}
-
-	/**
-	 * Returns a color provider for the given process.
-	 *  
-	 * @param process
-	 * @return IConsoleColorProvider
-	 */
-	protected IConsoleColorProvider getColorProvider(IProcess process) {
-		String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE);
-		IConsoleColorProvider colorProvider = null;
-		if (type != null) {
-			colorProvider = getProcessConsoleManager().getColorProvider(type);
-		}
-		if (colorProvider == null) {
-			colorProvider = new ConsoleColorProvider();
-		}
-		return colorProvider;
-	}
-	
-	/**
-	 * Returns the line notifier for this console, or <code>null</code> if none.
-	 * 
-	 * @param process
-	 * @return line notifier, or <code>null</code>
-	 */
-	protected ConsoleLineNotifier getLineNotifier(IProcess process) {
-		String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE);
-		if (type != null) {
-			return getProcessConsoleManager().newLineNotifier(type);
-		}
-		return null;
-	}
-	
-	/**
-	 * Convenience accessor
-	 * 
-	 * @return ConsoleDocumentManager
-	 */
-	private ProcessConsoleManager getProcessConsoleManager() {
-		return DebugUIPlugin.getDefault().getProcessConsoleManager();
-	}
-	
-	/*
-	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#getOperationRunner(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-		if (fOperationRunner == null)
-			fOperationRunner = new WorkspaceOperationRunner();
-		fOperationRunner.setProgressMonitor(monitor);
-		return fOperationRunner;
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java
index 1622a7a..cf82c6d 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleLineNotifier.java
@@ -11,22 +11,26 @@
 package org.eclipse.debug.internal.ui.views.console;
 
 
-import org.eclipse.debug.ui.console.IConsole;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.ui.console.IConsoleLineTracker;
 import org.eclipse.debug.ui.console.IConsoleLineTrackerExtension;
 import org.eclipse.jface.text.BadLocationException;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.Region;
+import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.ListenerList;
-import org.eclipse.ui.console.IPatternMatchListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IOConsole;
+import org.eclipse.ui.console.IPatternMatchListenerDelegate;
 import org.eclipse.ui.console.PatternMatchEvent;
 
 /**
  * Tracks text appended to the console and notifies listeners in terms of whole
  * lines.
  */
-public class ConsoleLineNotifier implements IPatternMatchListener {
+public class ConsoleLineNotifier implements IPatternMatchListenerDelegate, IPropertyChangeListener {
 	/**
 	 * Console listeners
 	 */
@@ -35,7 +39,7 @@
 	/**
 	 * The console this notifier is tracking 
 	 */
-	private IConsole fConsole = null;
+	private ProcessConsole fConsole = null;
 	
 	/**
 	 * Connects this notifier to the given console.
@@ -43,13 +47,17 @@
 	 * @param console
 	 */
 	public void connect(IConsole console) {
-		fConsole = console;
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i];
-			listener.init(console);
-		}
-		fConsole.addPatternMatchListener(this);
+	    if (console instanceof ProcessConsole) {
+	        fConsole = (ProcessConsole)console;
+
+	        IConsoleLineTracker[] lineTrackers = DebugUIPlugin.getDefault().getProcessConsoleManager().getLineTrackers(fConsole.getProcess());
+	        for (int i = 0; i < lineTrackers.length; i++) {
+	            lineTrackers[i].init(fConsole);
+                addConsoleListener(lineTrackers[i]);
+            }
+	        
+	        fConsole.addPropertyChangeListener(this);
+	    }
 	}
 	
 	/**
@@ -59,12 +67,15 @@
 	    if (fConsole == null) {
 	        return; //already disconnected
 	    }
-	    fConsole.removePatternMatchListener(this);
+
 	    Object[] listeners = fListeners.getListeners();
 	    for (int i = 0; i < listeners.length; i++) {
 	        IConsoleLineTracker listener = (IConsoleLineTracker)listeners[i];
 	        listener.dispose();
 	    }
+	
+	    fConsole.removePropertyChangeListener(this);
+	    
 	    fListeners = null;
 	    fConsole = null;
 	}
@@ -106,20 +117,6 @@
 	public void addConsoleListener(IConsoleLineTracker listener) {
 		fListeners.add(listener);
 	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.console.IPatternMatchListener#getPattern()
-     */
-    public String getPattern() {
-    	return ".*\r(\n?)|.*\n"; //$NON-NLS-1$
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IPatternMatchListener#getModifiers()
-	 */
-	public int getCompilerFlags() {
-		return 0;
-	}
 	
     /* (non-Javadoc)
      * @see org.eclipse.ui.console.IPatternMatchListener#matchFound(org.eclipse.ui.console.PatternMatchEvent)
@@ -152,5 +149,13 @@
         }
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event) {
+        if(event.getProperty().equals(IOConsole.P_CONSOLE_OUTPUT_COMPLETE)) {
+            streamsClosed();
+        }
+    }
 
 }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties
index d6d5d3a..726bfa1 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleMessages.properties
@@ -9,9 +9,6 @@
 #     IBM Corporation - initial API and implementation
 ###############################################################################
 
-ConsoleDocumentManager.1=Invalid extension {0} - class must be an instance of IConsoleColorProvider.
-ConsoleDocumentManager.2=Invalid extension {0} - class must be an instance of IConsoleLineTracker
-
 ConsoleRemoveAllTerminatedAction.0=&Remove All Terminated
 ConsoleRemoveAllTerminatedAction.1=Remove All Terminated Launches
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java
deleted file mode 100644
index c98fb89..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleOutputTextStore.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.jface.text.ITextStore;
-
-public class ConsoleOutputTextStore implements ITextStore {
-
-	private StringBuffer fBuffer;
-
-	public ConsoleOutputTextStore(int bufferSize) {
-		fBuffer= new StringBuffer(bufferSize);
-	}
-
-	/**
-	 * @see ITextStore#get(int)
-	 */
-	public char get(int pos) {
-		return fBuffer.charAt(pos);
-	}
-
-	/**
-	 * @see ITextStore#get(int, int)
-	 */
-	public String get(int pos, int length) {
-		return fBuffer.substring(pos, pos + length);
-	}
-
-	/**
-	 * @see ITextStore#getLength()
-	 */
-	 public int getLength() {
-		return fBuffer.length();
-	}
-
-	/**
-	 * @see ITextStore#replace(int, int, String)
-	 */
-	 public void replace(int pos, int length, String text) {
-		if (text == null) {
-			text= ""; //$NON-NLS-1$
-		}
-		fBuffer.replace(pos, pos + length, text);
-	}
-
-	/**
-	 * @see ITextStore#set(String)
-	 */
-	 public void set(String text) {
-		fBuffer= new StringBuffer(text);
-	}
-
-	/**
-	 * @see StringBuffer#ensureCapacity(int)
-	 */
-	public void setMinimalBufferSize(int bufferSize) {
-		fBuffer.ensureCapacity(bufferSize);
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java
deleted file mode 100644
index a6fc968..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ConsoleViewer.java
+++ /dev/null
@@ -1,489 +0,0 @@
-///*******************************************************************************
-// * Copyright (c) 2000, 2004 IBM Corporation and others.
-// * All rights reserved. This program and the accompanying materials
-// * are made available under the terms of the Common Public License v1.0
-// * which accompanies this distribution, and is available at
-// * http://www.eclipse.org/legal/cpl-v10.html
-// * 
-// * Contributors:
-// *     IBM Corporation - initial API and implementation
-// *******************************************************************************/
-//package org.eclipse.debug.internal.ui.views.console;
-//
-//
-//import org.eclipse.debug.internal.ui.DebugUIPlugin;
-//import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-//import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-//import org.eclipse.debug.ui.console.IConsoleColorProvider;
-//import org.eclipse.debug.ui.console.IConsoleHyperlink;
-//import org.eclipse.jface.resource.JFaceResources;
-//import org.eclipse.jface.text.BadLocationException;
-//import org.eclipse.jface.text.BadPositionCategoryException;
-//import org.eclipse.jface.text.DocumentEvent;
-//import org.eclipse.jface.text.IDocument;
-//import org.eclipse.jface.text.IDocumentListener;
-//import org.eclipse.jface.text.IDocumentPartitioner;
-//import org.eclipse.jface.text.IRegion;
-//import org.eclipse.jface.text.ITypedRegion;
-//import org.eclipse.jface.text.Position;
-//import org.eclipse.jface.text.TextViewer;
-//import org.eclipse.jface.util.IPropertyChangeListener;
-//import org.eclipse.jface.util.PropertyChangeEvent;
-//import org.eclipse.swt.SWT;
-//import org.eclipse.swt.custom.LineStyleEvent;
-//import org.eclipse.swt.custom.LineStyleListener;
-//import org.eclipse.swt.custom.StyleRange;
-//import org.eclipse.swt.custom.StyledText;
-//import org.eclipse.swt.events.MouseEvent;
-//import org.eclipse.swt.events.MouseListener;
-//import org.eclipse.swt.events.MouseMoveListener;
-//import org.eclipse.swt.events.MouseTrackListener;
-//import org.eclipse.swt.events.PaintEvent;
-//import org.eclipse.swt.events.PaintListener;
-//import org.eclipse.swt.events.VerifyEvent;
-//import org.eclipse.swt.graphics.Color;
-//import org.eclipse.swt.graphics.Cursor;
-//import org.eclipse.swt.graphics.FontMetrics;
-//import org.eclipse.swt.graphics.Point;
-//import org.eclipse.swt.widgets.Composite;
-//import org.eclipse.swt.widgets.Control;
-//import org.eclipse.swt.widgets.Event;
-//import org.eclipse.swt.widgets.Listener;
-//import org.eclipse.ui.console.IConsoleConstants;
-//
-//public class ConsoleViewer extends TextViewer implements IPropertyChangeListener, MouseTrackListener, MouseMoveListener, MouseListener, PaintListener, LineStyleListener, Listener {
-//	
-//	/**
-//	 * Hand cursor
-//	 */
-//	private Cursor fHandCursor;
-//	
-//	/**
-//	 * Text cursor
-//	 */
-//	private Cursor fTextCursor;
-//	
-//	/**
-//	 * The active hyperlink, or <code>null</code>
-//	 */
-//	private IConsoleHyperlink fHyperLink = null;
-//		
-//	protected InternalDocumentListener fInternalDocumentListener= new InternalDocumentListener();
-//	
-//	/**
-//	 * Whether the console scrolls as output is appended.
-//	 */
-//	private boolean fAutoScroll = true;
-//	
-//	/**
-//	 * Internal document listener.
-//	 */
-//	class InternalDocumentListener implements IDocumentListener {
-//		/**
-//		 * @see IDocumentListener#documentAboutToBeChanged(DocumentEvent)
-//		 */
-//		public void documentAboutToBeChanged(DocumentEvent e) {
-//		}
-//		
-//		/**
-//		 * @see IDocumentListener#documentChanged(DocumentEvent)
-//		 */
-//		public void documentChanged(DocumentEvent e) {
-//			ConsoleDocument doc= (ConsoleDocument)getDocument();
-//			if (doc == null) {
-//				getTextWidget().setEditable(false);
-//				return;
-//			}
-//			getTextWidget().setEditable(!doc.isReadOnly());
-//			revealEndOfDocument();
-//		}
-//	}
-//	
-//	/**
-//	 * Creates a new console viewer and adds verification checking
-//	 * to only allow text modification if the text is being modified
-//	 * in the editable portion of the underlying document.
-//	 *
-//	 * @see org.eclipse.swt.events.VerifyListener
-//	 */	
-//	public ConsoleViewer(Composite parent) {
-//		super(parent, getSWTStyles());
-//		
-//		getTextWidget().setDoubleClickEnabled(true);
-//		
-//		DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-//		JFaceResources.getFontRegistry().addListener(this);
-//
-//		getTextWidget().setFont(JFaceResources.getFont(IConsoleConstants.CONSOLE_FONT));
-//		getTextWidget().addMouseTrackListener(this);
-//		getTextWidget().addPaintListener(this);
-//		getTextWidget().addLineStyleListener(this);
-//		getTextWidget().addListener(SWT.KeyUp, this);
-//		getTextWidget().setTabs(DebugUIPlugin.getDefault().getPluginPreferences().getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH));
-//	}
-//	
-//	/**
-//	 * Returns the SWT style flags used when instantiating this viewer
-//	 */
-//	private static int getSWTStyles() {
-//		int styles= SWT.H_SCROLL | SWT.V_SCROLL;
-//		return styles;
-//	}
-//
-//	/**
-//	 * Reveals (makes visible) the end of the current document
-//	 */
-//	protected void revealEndOfDocument() {
-//		if (isAutoScroll()) {
-//			IDocument doc = getDocument();
-//			int lines = doc.getNumberOfLines();
-//			try {
-//				// lines are 0-based
-//				int lineStartOffset = doc.getLineOffset(lines - 1);
-//				StyledText widget= getTextWidget();
-//				if (lineStartOffset > 0) {
-//					widget.setCaretOffset(lineStartOffset);
-//					widget.showSelection();
-//				}
-//				int lineEndOffset = lineStartOffset + doc.getLineLength(lines - 1);
-//				if (lineEndOffset > 0) {
-//					widget.setCaretOffset(lineEndOffset);
-//				}
-//			} catch (BadLocationException e) {
-//			}
-//		}
-//	}
-//
-//	/**
-//	 * @see ITextViewer#setDocument(IDocument)
-//	 */
-//	public void setDocument(IDocument doc) {
-//		IDocument oldDoc= getDocument();
-//		IDocument document= doc;
-//		if (oldDoc == null && document == null) {
-//			return;
-//		}
-//		if (oldDoc != null) {
-//			oldDoc.removeDocumentListener(fInternalDocumentListener);
-//			if (oldDoc.equals(document)) {
-//				document.addDocumentListener(fInternalDocumentListener);
-//				return;
-//			}
-//		}
-//
-//		super.setDocument(document);
-//		if (document != null) {
-//			revealEndOfDocument();
-//			document.addDocumentListener(fInternalDocumentListener);
-//		}
-//	}
-//	
-//	/**
-//	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-//	 */
-//	public void propertyChange(PropertyChangeEvent event) {
-//		String propertyName= event.getProperty();
-//		if (propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_IN_COLOR) ||
-//			propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_OUT_COLOR) ||
-//			propertyName.equals(IDebugPreferenceConstants.CONSOLE_SYS_ERR_COLOR)) {
-//				getTextWidget().redraw();
-//		} else if (propertyName.equals(IConsoleConstants.CONSOLE_FONT)) {
-//			getTextWidget().setFont(JFaceResources.getFont(IConsoleConstants.CONSOLE_FONT));
-//		} else if (propertyName.equals(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH)) {
-//			getTextWidget().setTabs(DebugUIPlugin.getDefault().getPluginPreferences().getInt(IDebugPreferenceConstants.CONSOLE_TAB_WIDTH));
-//		} else if (propertyName.equals(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)) {
-//			setAutoScroll(!DebugUIPlugin.getDefault().getPluginPreferences().getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK));
-//		}
-//	}
-//	
-//	/**
-//	 * Dispose this viewer and resources
-//	 */
-//	public void dispose() {
-//		Control control = getTextWidget();
-//		if (control != null) {
-//			control.removeMouseTrackListener(this);
-//			control.removePaintListener(this);
-//		}
-//		if (fHandCursor != null) {
-//			fHandCursor.dispose();
-//		}
-//		if (fTextCursor != null) {
-//			fTextCursor.dispose();
-//		}
-//		DebugUIPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-//		JFaceResources.getFontRegistry().removeListener(this);
-//	}
-//	
-//	/**
-//	 * Only allow text to be typed at the end of the document.
-//	 * 
-//	 * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent)
-//	 */
-//	protected void handleVerifyEvent(VerifyEvent e) {
-//		ConsoleDocument doc= (ConsoleDocument)getDocument();
-//		if (doc != null) {
-//			if (doc.isReadOnly()) {
-//				e.doit = false;
-//				return;
-//			}
-//			IDocumentPartitioner partitioner = doc.getDocumentPartitioner();
-//			if (partitioner != null) {
-//				int length = doc.getLength();
-//				ITypedRegion[] partitions = partitioner.computePartitioning(length, 0);
-//				if (partitions.length == 0) {
-//				} else {
-//					ITypedRegion partition = partitions[partitions.length - 1];
-//					if (partition.getType().equals(InputPartition.INPUT_PARTITION_TYPE)) {
-//						// > 1 char in the input buffer
-//						e.doit = (e.start >= partition.getOffset()) && (e.end <= (partition.getLength() + partition.getOffset()));
-//					} else {
-//						// first character in the input buffer
-//						e.doit = length == e.start;
-//					}
-//				}
-//			}
-//		}
-//	}
-//	
-//	/**
-//	 * @see org.eclipse.swt.events.MouseTrackListener#mouseEnter(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseEnter(MouseEvent e) {
-//		getTextWidget().addMouseMoveListener(this);
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseTrackListener#mouseExit(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseExit(MouseEvent e) {
-//		getTextWidget().removeMouseMoveListener(this);
-//		if (fHyperLink != null) {
-//			linkExited(fHyperLink);
-//		}
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseTrackListener#mouseHover(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseHover(MouseEvent e) {
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseMove(MouseEvent e) {
-//		int offset = -1;
-//		try {
-//			Point p = new Point(e.x, e.y);
-//			offset = getTextWidget().getOffsetAtLocation(p);
-//		} catch (IllegalArgumentException ex) {
-//			// out of the document range
-//		}
-//		updateLinks(offset);	
-//	}
-//
-//	public IConsoleHyperlink getHyperlink(int offset) {
-//		if (offset >= 0 && getDocument() != null) {
-//			Position[] positions = null;
-//			try {
-//				positions = getDocument().getPositions(HyperlinkPosition.HYPER_LINK_CATEGORY);
-//			} catch (BadPositionCategoryException ex) {
-//				// no links have been added
-//				return null;
-//			}
-//			for (int i = 0; i < positions.length; i++) {
-//				Position position = positions[i];
-//				if (offset >= position.getOffset() && offset <= (position.getOffset() + position.getLength())) {
-//					return ((HyperlinkPosition)position).getHyperLink();
-//				}
-//			}
-//		}
-//		return null;
-//	}
-//
-//	protected void linkEntered(IConsoleHyperlink link) {
-//		Control control = getTextWidget();
-//		control.setRedraw(false);
-//		if (fHyperLink != null) {
-//			linkExited(fHyperLink);
-//		}
-//		fHyperLink = link;
-//		fHyperLink.linkEntered();
-//		control.setCursor(getHandCursor());
-//		control.setRedraw(true);
-//		control.redraw();
-//		control.addMouseListener(this);
-//	}
-//	
-//	protected void linkExited(IConsoleHyperlink link) {
-//		link.linkExited();
-//		fHyperLink = null;
-//		Control control = getTextWidget();
-//		control.setCursor(getTextCursor());
-//		control.redraw();
-//		control.removeMouseListener(this);
-//	}
-//	/**
-//	 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
-//	 */
-//	public void paintControl(PaintEvent e) {
-//		if (fHyperLink != null) {
-//			IDocument doc = getDocument();
-//			if (doc == null) {
-//				return;
-//			}
-//			ConsoleDocumentPartitioner partitioner = (ConsoleDocumentPartitioner)doc.getDocumentPartitioner();
-//			if (partitioner == null) {
-//				return;
-//			}
-//			IRegion linkRegion = partitioner.getRegion(fHyperLink);
-//			if (linkRegion != null) {
-//				int start = linkRegion.getOffset();
-//				int end = start + linkRegion.getLength();
-//				IConsoleColorProvider colorProvider = partitioner.getColorProvider();
-//				try {
-//					ITypedRegion partition = doc.getPartition(start);
-//					Color fontColor = e.gc.getForeground();
-//					if (partition instanceof StreamPartition) {
-//						StreamPartition streamPartition = (StreamPartition)partition;
-//						fontColor = colorProvider.getColor(streamPartition.getStreamIdentifier());
-//					}
-//					int startLine = doc.getLineOfOffset(start);
-//					int endLine = doc.getLineOfOffset(end);
-//					for (int i = startLine; i <= endLine; i++) {
-//						IRegion lineRegion = doc.getLineInformation(i);
-//						int lineStart = lineRegion.getOffset();
-//						int lineEnd = lineStart + lineRegion.getLength();
-//						Color color = e.gc.getForeground();
-//						e.gc.setForeground(fontColor);
-//						if (lineStart < end) {
-//							lineStart = Math.max(start, lineStart);
-//							lineEnd = Math.min(end, lineEnd);
-//							Point p1 = getTextWidget().getLocationAtOffset(lineStart);
-//							Point p2 = getTextWidget().getLocationAtOffset(lineEnd);
-//							FontMetrics metrics = e.gc.getFontMetrics();
-//							int height = metrics.getHeight();
-//							e.gc.drawLine(p1.x, p1.y + height, p2.x, p2.y + height);
-//						}
-//						e.gc.setForeground(color);
-//					}
-//				} catch (BadLocationException ex) {
-//				}
-//			}
-//		}
-//	}
-//	
-//	protected Cursor getHandCursor() {
-//		if (fHandCursor == null) {
-//			fHandCursor = new Cursor(DebugUIPlugin.getStandardDisplay(), SWT.CURSOR_HAND);
-//		}
-//		return fHandCursor;
-//	}
-//	
-//	protected Cursor getTextCursor() {
-//		if (fTextCursor == null) {
-//			fTextCursor = new Cursor(DebugUIPlugin.getStandardDisplay(), SWT.CURSOR_IBEAM);
-//		}
-//		return fTextCursor;
-//	}	
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseDoubleClick(MouseEvent e) {
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseDown(MouseEvent e) {
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-//	 */
-//	public void mouseUp(MouseEvent e) {
-//		if (fHyperLink != null) {
-//			String selection = getTextWidget().getSelectionText();
-//			if (selection.length() <= 0) {
-//				if (e.button == 1) {
-//					fHyperLink.linkActivated();
-//				}
-//			}
-//		}
-//	}
-//
-//	/**
-//	 * @see org.eclipse.swt.custom.LineStyleListener#lineGetStyle(org.eclipse.swt.custom.LineStyleEvent)
-//	 */
-//	public void lineGetStyle(LineStyleEvent event) {
-//		IDocument document = getDocument();
-//		if (document != null) {
-//			ConsoleDocumentPartitioner partitioner = (ConsoleDocumentPartitioner)document.getDocumentPartitioner();
-//			if (partitioner != null) {
-//				IConsoleColorProvider colorProvider = partitioner.getColorProvider();
-//				ITypedRegion[] regions = partitioner.computePartitioning(event.lineOffset, event.lineOffset + event.lineText.length());
-//				StyleRange[] styles = new StyleRange[regions.length];
-//				for (int i = 0; i < regions.length; i++) {
-//					StreamPartition partition = (StreamPartition)regions[i];
-//					Color color = colorProvider.getColor(partition.getStreamIdentifier());
-//					styles[i] = new StyleRange(partition.getOffset(), partition.getLength(), color, null);
-//				}	
-//				event.styles = styles;
-//			}
-//		}
-//	}
-//	
-//	/**
-//	 * Sets whether this viewer should auto-scroll as output is appended to the
-//	 * document.
-//	 * 
-//	 * @param scroll
-//	 */
-//	public void setAutoScroll(boolean scroll) {
-//		fAutoScroll = scroll;
-//	}
-//	
-//	/**
-//	 * Returns whether this viewer should auto-scroll as output is appended to
-//	 * the document.
-//	 */
-//	public boolean isAutoScroll() {
-//		return fAutoScroll;
-//	}	
-//
-//	/**
-//	 * On KeyUp events, see if we need to enter/exit a link.
-//	 * 
-//	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-//	 */
-//	public void handleEvent(Event event) {
-//		int offset = getTextWidget().getCaretOffset();
-//		updateLinks(offset);
-//	}
-//	
-//	/**
-//	 * The cursor has just be moved to the given offset, the mouse has
-//	 * hovered over the given offset. Update link rendering.
-//	 * 
-//	 * @param offset
-//	 */
-//	protected void updateLinks(int offset) {
-//		if (offset >= 0) {
-//			IConsoleHyperlink link = getHyperlink(offset);
-//			if (link != null) {
-//				if (link.equals(fHyperLink)) {
-//					return;
-//				} 
-//				linkEntered(link);
-//				return;
-//			}
-//		}
-//		if (fHyperLink != null) {
-//			linkExited(fHyperLink);
-//		}		
-//	}
-//
-//}
-//
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java
deleted file mode 100644
index 1d2dce4..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/HyperlinkPosition.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.ui.console.IConsoleHyperlink;
-import org.eclipse.jface.text.Position;
-
-/**
- */
-public class HyperlinkPosition extends Position {
-	
-	public static final String HYPER_LINK_CATEGORY = DebugUIPlugin.getUniqueIdentifier() + ".HYPER_LINK"; //$NON-NLS-1$
-	
-	private IConsoleHyperlink fLink = null;
-
-	/**
-	 * 
-	 */
-	public HyperlinkPosition(IConsoleHyperlink link, int offset, int length) {
-		super(offset, length);
-		fLink = link;
-	}
-	
-	public IConsoleHyperlink getHyperLink() {
-		return fLink;
-	}
-
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object arg) {
-		return arg instanceof HyperlinkPosition && super.equals(arg) && getHyperLink().equals(((HyperlinkPosition)arg).getHyperLink());
-	}
-
-	/**
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return super.hashCode() + getHyperLink().hashCode();
-	}
-
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java
deleted file mode 100644
index 3d6f8f0..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/InputPartition.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * A partition in a console document that contains input from the keyboard.
- */
-public class InputPartition extends StreamPartition {
-	
-	/**
-	 * Once an input partition has been written to standard-in, it cannot
-	 * be modified.
-	 */
-	private boolean fReadOnly = false;
-
-	/**
-	 * Partition type
-	 */
-	public static final String INPUT_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".INPUT_PARTITION_TYPE"; //$NON-NLS-1$
-	
-	
-	public InputPartition(String streamIdentifier, int offset, int length) {
-		super(streamIdentifier, offset, length, INPUT_PARTITION_TYPE);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int)
-	 */
-	public StreamPartition createNewPartition(String streamIdentifier, int offset, int length) {
-		return new InputPartition(streamIdentifier, offset, length);
-	}	
-	
-	/**
-	 * Sets whether this partition is read-only.
-	 * 
-	 * @param readOnly whether this partition is read-only
-	 */
-	public void setReadOnly(boolean readOnly) {
-		fReadOnly = readOnly; 
-	}
-	
-	/**
-	 * Returns whether this partition is read-only.
-	 * 
-	 * @return whether this partition is read-only
-	 */
-	public boolean isReadOnly() {
-		return fReadOnly;
-	}
-	
-	/**
-	 * Returns whether this partition is allowed to be combined with the
-	 * given partition. Once read-only, this partition cannot be combined.
-	 * 
-	 * @param partition
-	 * @return boolean
-	 */
-	public boolean canBeCombinedWith(StreamPartition partition) {
-		return (!isReadOnly() && super.canBeCombinedWith(partition));
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java
deleted file mode 100644
index ed8ad1f..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/OutputPartition.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-
-/**
- * A partition in a console document that contains output from a process.
- */
-public class OutputPartition extends StreamPartition {
-
-	/**
-	 * Partition type
-	 */
-	public static final String OUTPUT_PARTITION_TYPE = DebugUIPlugin.getUniqueIdentifier() + ".OUTPUT_PARTITION_TYPE"; //$NON-NLS-1$
-	
-	
-	public OutputPartition(String streamIdentifier, int offset, int length) {
-		super(streamIdentifier, offset, length, OUTPUT_PARTITION_TYPE);
-	}
-	
-	/**
-	 * @see org.eclipse.debug.internal.ui.views.console.StreamPartition#createNewPartition(String, int, int)
-	 */
-	public StreamPartition createNewPartition(String streamIdetifier, int offset, int length) {
-		return new OutputPartition(streamIdetifier, offset, length);
-	}	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
index d69b03d..2407b15 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java
@@ -47,11 +47,10 @@
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.ui.console.ConsolePlugin;
-import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.console.IHyperlink;
 import org.eclipse.ui.console.IOConsole;
 import org.eclipse.ui.console.IOConsoleInputStream;
 import org.eclipse.ui.console.IOConsoleOutputStream;
-import org.eclipse.ui.part.IPageBookViewPage;
 
 /**
  * A console for a system process
@@ -62,18 +61,17 @@
  * @since 3.0
  */
 public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSetListener, IPropertyChangeListener {
-	
 	private IProcess fProcess = null;
 	private List streamListeners = new ArrayList();
     private IConsoleColorProvider fColorProvider;
 	private IOConsoleInputStream in;
-    private ConsoleLineNotifier fLineNotifier;
+   
 	
 	/**
 	 * Proxy to a console document
 	 */
 	public ProcessConsole(IProcess process, IConsoleColorProvider colorProvider) {
-		super("", null); //$NON-NLS-1$
+		super("", IDebugUIConstants.ID_PROCESS_CONSOLE_TYPE, null); //$NON-NLS-1$
 		fProcess = process;
 		
 		fColorProvider = colorProvider;
@@ -87,14 +85,6 @@
 		in.setColor(color);
 		
 	}
-    
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IConsole#createPage(org.eclipse.ui.console.IConsoleView)
-	 */
-	public IPageBookViewPage createPage(IConsoleView view) {
-		return new ProcessConsolePage(view, this);
-	}
 
 	/**
 	 * Computes and returns the image descriptor for this console.
@@ -245,6 +235,8 @@
 	protected void dispose() {
 		super.dispose();
 		
+		fColorProvider.disconnect();
+		
 		synchronized(streamListeners) {
 		    for(Iterator i = streamListeners.iterator(); i.hasNext(); ) {
 		        StreamListener listener = (StreamListener) i.next();
@@ -281,36 +273,27 @@
 	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
 	 */
 	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
-			if (event.getSource().equals(getProcess())) {
-			    
-			    if (event.getKind() == DebugEvent.TERMINATE) {
-			        setFinished();
-					DebugPlugin.getDefault().removeDebugEventListener(this);
-			    }
-			    
-				Runnable r = new Runnable() {
-					public void run() {
-						setName(computeName());
-						warnOfContentChange();
-					}
-				};	
-				DebugUIPlugin.getStandardDisplay().asyncExec(r);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.console.IOConsole#partitionerFinished()
-	 */
-	public void partitionerFinished() {
-	    super.partitionerFinished();
-	    if (fLineNotifier != null) {
-	        fLineNotifier.streamsClosed();
+	    for (int i = 0; i < events.length; i++) {
+	        DebugEvent event = events[i];
+	        if (event.getSource().equals(getProcess())) {
+	            
+	            if (event.getKind() == DebugEvent.TERMINATE) {
+	                setFinished();
+	                DebugPlugin.getDefault().removeDebugEventListener(this);
+	            }
+	            
+	            Runnable r = new Runnable() {
+	                public void run() {
+	                    setName(computeName());
+	                    warnOfContentChange();
+	                }
+	            };	
+	            DebugUIPlugin.getStandardDisplay().asyncExec(r);
+	        }
 	    }
 	}
 	
+	
 	private void warnOfContentChange() {
 		ConsolePlugin.getDefault().getConsoleManager().warnOfContentChange(DebugUITools.getConsole(fProcess));
 	}
@@ -360,6 +343,16 @@
         }
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.debug.ui.console.IConsole#addLink(org.eclipse.ui.console.IHyperlink, int, int)
+     */
+    public void addLink(IHyperlink link, int offset, int length) {
+        try {
+            addHyperlink(link, offset, length);
+        } catch (BadLocationException e) {
+            DebugUIPlugin.log(e);
+        }
+    }
 
     /* (non-Javadoc)
      * @see org.eclipse.debug.ui.console.IConsole#getRegion(org.eclipse.debug.ui.console.IConsoleHyperlink)
@@ -435,17 +428,4 @@
             return Status.OK_STATUS;
         }
     }
-
-
-    /**
-     * @param lineNotifier
-     */
-    public void setLineNotifier(ConsoleLineNotifier lineNotifier) {
-        fLineNotifier = lineNotifier;
-        fLineNotifier.connect(this);
-        if (fProcess.isTerminated()) {
-            setFinished();
-        }
-    }
-
 }
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java
index 30884a4..094c6c8 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsoleManager.java
@@ -50,7 +50,8 @@
 	private Map fColorProviders;
 	
 	/**
-	 * 
+	 * The default color provider. Used if no color provider is contributed
+	 * for the given process type.
 	 */
 	private IConsoleColorProvider fDefaultColorProvider;
 	
@@ -92,11 +93,6 @@
 	private void removeProcess(IProcess iProcess) {
 		IConsole console = getConsole(iProcess);
 		
-		ConsoleLineNotifier lineNotifier = getLineNotifier(iProcess);
-		if (lineNotifier != null) {
-		    lineNotifier.disconnect();
-		}
-		
 		if (console != null) {
 			IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
 			manager.removeConsoles(new IConsole[]{console});
@@ -141,14 +137,13 @@
 				for (int i= 0; i < processes.length; i++) {
 					if (getConsoleDocument(processes[i]) == null) {
 						IProcess process = processes[i];
+						if (process.getStreamsProxy() == null) {
+							continue;
+						}
 						//create a new console.
 						IConsoleColorProvider colorProvider = getColorProvider(process.getAttribute(IProcess.ATTR_PROCESS_TYPE));
 						ProcessConsole pc = new ProcessConsole(process, colorProvider);
-						//connect Line Notifier
-						ConsoleLineNotifier lineNotifier = getLineNotifier(process);
-						if(lineNotifier != null) {
-						    pc.setLineNotifier(lineNotifier);
-						}
+						pc.setAttribute(IDebugUIConstants.ATTR_CONSOLE_PROCESS, process);
 						//add new console to console manager.
 						ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{pc});
 					}
@@ -275,30 +270,14 @@
 		return fDefaultColorProvider;
 	} 
 	
-	
 	/**
-	 * Returns the line notifier for this console, or <code>null</code> if none.
-	 * 
-	 * @param process
-	 * @return line notifier, or <code>null</code>
+	 * Returns the Line Trackers for a given process type.
+	 * @param process The process for which line trackers are required.
+	 * @return An array of line trackers which match the given process type.
 	 */
-	protected ConsoleLineNotifier getLineNotifier(IProcess process) {
+	public IConsoleLineTracker[] getLineTrackers(IProcess process) {
 		String type = process.getAttribute(IProcess.ATTR_PROCESS_TYPE);
-		if (type != null) {
-			return newLineNotifier(type);
-		}
-		return null;
-	}
-	
-	/**
-	 * Creates and retuns a new line notifier for the given type of process, or
-	 * <code>null</code> if none. The notifier will be seeded with new console
-	 * line listeners registered for the given process type.
-	 * 
-	 * @param type process type
-	 * @return line notifier or <code>null</code>
-	 */
-	public ConsoleLineNotifier newLineNotifier(String type) {
+
 		if (fLineTrackers == null) {
 			fLineTrackers = new HashMap();
 			IExtensionPoint extensionPoint= Platform.getExtensionRegistry().getExtensionPoint(DebugUIPlugin.getUniqueIdentifier(), IDebugUIConstants.EXTENSION_POINT_CONSOLE_LINE_TRACKERS);
@@ -314,26 +293,22 @@
 				list.add(extension);
 			}
 		}
-		List extensions = (List)fLineTrackers.get(type);
-		ConsoleLineNotifier lineNotifier = null;
-		if (extensions != null) {
-			lineNotifier = new ConsoleLineNotifier();
-			Iterator iter = extensions.iterator();
-			while (iter.hasNext()) {
-				IConfigurationElement extension = (IConfigurationElement)iter.next();
-				try {
-					Object tracker = extension.createExecutableExtension("class"); //$NON-NLS-1$
-					if (tracker instanceof IConsoleLineTracker) {
-						lineNotifier.addConsoleListener((IConsoleLineTracker)tracker);
-					} else {
-						DebugUIPlugin.logErrorMessage(MessageFormat.format(ConsoleMessages.getString("ConsoleDocumentManager.2"),new String[]{extension.getDeclaringExtension().getUniqueIdentifier()})); //$NON-NLS-1$
-					}
-				} catch (CoreException e) {
-					DebugUIPlugin.log(e);
-				}
-			}
+		
+		ArrayList trackers = new ArrayList();
+		if (type != null) {
+		    List lineTrackerExtensions = (List) fLineTrackers.get(type);
+		    if(lineTrackerExtensions != null) {   
+		        for(Iterator i = lineTrackerExtensions.iterator(); i.hasNext(); ) {
+		            IConfigurationElement element = (IConfigurationElement) i.next();
+		            try {
+		                trackers.add(element.createExecutableExtension("class")); //$NON-NLS-1$
+		            } catch (CoreException e) {
+		                DebugUIPlugin.log(e);
+		            }
+		        }
+		    }
 		}
-		return lineNotifier;		
+		return (IConsoleLineTracker[]) trackers.toArray(new IConsoleLineTracker[0]);
 	}
 	
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePage.java
deleted file mode 100644
index 7c7c6f3..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePage.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.console.IConsoleView;
-import org.eclipse.ui.internal.console.IOConsolePage;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTargetList;
-import org.eclipse.ui.part.ShowInContext;
-
-/**
- * A page for a console connected to I/O streams of a process
- * 
- * @since 3.0
- */
-public class ProcessConsolePage extends IOConsolePage implements  IShowInSource, IShowInTargetList, IDebugEventSetListener, ISelectionListener {
-
-	// scroll lock
-	private boolean fIsLocked = DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK);
-	
-	// actions
-	private ConsoleTerminateAction fTerminate;
-	private ConsoleRemoveAllTerminatedAction fRemoveTerminated;
-
-	
-	
-	/**
-	 * Constructs a new process page 
-	 */
-	public ProcessConsolePage(IConsoleView view, ProcessConsole console) {
-	    super(console, view);
-	    setAutoScroll(!fIsLocked);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-	    super.createControl(parent);	    
-		getSite().getPage().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-	}
-
-	/**
-	 * Fill the context menu
-	 * 
-	 * @param menu menu
-	 */
-	protected void contextMenuAboutToShow(IMenuManager menu) {
-	    super.contextMenuAboutToShow(menu);
-		menu.add(fTerminate);	
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IPage#dispose()
-	 */
-	public void dispose() {
-	    super.dispose();
-		DebugPlugin.getDefault().removeDebugEventListener(this);
-		getSite().getPage().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
-
-		if (fRemoveTerminated != null) {
-			fRemoveTerminated.dispose();
-		}
-	}
-
-	protected void createActions() {
-	    super.createActions();
-		fRemoveTerminated = new ConsoleRemoveAllTerminatedAction();
-		ProcessConsole console = (ProcessConsole) getConsole();
-		fTerminate = new ConsoleTerminateAction(console);
-		DebugPlugin.getDefault().addDebugEventListener(this);
-	}
-			
-		
-	protected void configureToolBar(IToolBarManager mgr) {
-	    super.configureToolBar(mgr);
-		mgr.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fTerminate);
-		mgr.appendToGroup(IConsoleConstants.LAUNCH_GROUP, fRemoveTerminated);
-	}
-
-	/**
-	 * Returns the process associated with this page
-	 * 
-	 * @return the process associated with this page
-	 */
-	protected IProcess getProcess() {
-		return ((ProcessConsole)getConsole()).getProcess();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (getProcess().equals(DebugUITools.getCurrentProcess())) {
-			getConsoleView().display(getConsole());
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class required) {
-	    Object adapter = super.getAdapter(required);
-	    if (adapter == null) {
-			if (IShowInSource.class.equals(required)) {
-				return this;
-			}
-			if (IShowInTargetList.class.equals(required)) {
-				return this; 
-			}
-	    }
-		return null;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInSource#getShowInContext()
-	 */
-	public ShowInContext getShowInContext() {
-		IProcess process = getProcess();
-		if (process == null) {
-			return null;
-		} 
-		IDebugTarget target = (IDebugTarget)process.getAdapter(IDebugTarget.class);
-		ISelection selection = null;
-		if (target == null) {
-			selection = new StructuredSelection(process);
-		} else {
-			selection = new StructuredSelection(target);
-		}
-		return new ShowInContext(null, selection);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInTargetList#getShowInTargetIds()
-	 */
-	public String[] getShowInTargetIds() {
-		return new String[] {IDebugUIConstants.ID_DEBUG_VIEW};
-	}
-	
-	/**
-	 * Update terminate action.
-	 * 
-	 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent event = events[i];
-			if (event.getSource().equals(getProcess())) {
-				Runnable r = new Runnable() {
-					public void run() {
-						if (isAvailable()) {
-							fTerminate.update();
-						}				
-					}
-				};
-				if (isAvailable()) {				
-					getControl().getDisplay().asyncExec(r);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns whether this page's controls are available.
-	 * 
-	 * @return whether this page's controls are available
-	 */
-	protected boolean isAvailable() {
-		return getControl() != null;
-	}
-	
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java
deleted file mode 100644
index c42f199..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ScrollLockAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.debug.internal.ui.DebugPluginImages;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.internal.ui.actions.ActionMessages;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * Toggles console auto-scroll
- */
-public class ScrollLockAction extends Action implements IPropertyChangeListener {
-
-	private IPreferenceStore fStore = DebugUIPlugin.getDefault().getPreferenceStore();
-	
-	public ScrollLockAction() {
-		super(ActionMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$
-		setToolTipText(ActionMessages.getString("ScrollLockAction.Scroll_Lock_1")); //$NON-NLS-1$
-		setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_LOCK));		
-		setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_LOCK));
-		setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_LOCK));
-		WorkbenchHelp.setHelp(
-			this,
-			IDebugHelpContextIds.CONSOLE_SCROLL_LOCK_ACTION);
-		setChecked(DebugUIPlugin.getDefault().getPreferenceStore().getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK));
-		fStore.addPropertyChangeListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		fStore.setValue(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK, isChecked());
-	}
-	
-	public void dispose() {
-		fStore.removePropertyChangeListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event.getProperty().equals(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK)) {
-			setChecked(fStore.getBoolean(IInternalDebugUIConstants.PREF_CONSOLE_SCROLL_LOCK));
-		}
-		
-	}
-}
-
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java
deleted file mode 100644
index b121244..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/StreamPartition.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.debug.internal.ui.views.console;
-
-
-import org.eclipse.jface.text.TypedRegion;
-
-/**
- * A partition from an input/output stream connected to the console. 
- */
-public abstract class StreamPartition extends TypedRegion {
-	
-	/**
-	 * Stream identifier
-	 */
-	private String fStreamIdentifier;
-	
-	public StreamPartition(String streamIdentifier, int offset, int length, String type) {
-		super(offset, length, type);
-		fStreamIdentifier = streamIdentifier;
-	}
-	
-	
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object partition) {
-		if (super.equals(partition)) {
-			fStreamIdentifier.equals(((StreamPartition)partition).getStreamIdentifier());
-		}
-		return false;
-	}
-
-	/**
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return super.hashCode() + fStreamIdentifier.hashCode();
-	}
-
-	/**
-	 * Returns this partition's stream identifier
-	 * 
-	 * @return this partition's stream identifier
- 	 */
-	public String getStreamIdentifier() {
-		return fStreamIdentifier;
-	}
-	
-	/**
-	 * Returns whether this partition is allowed to be combined with the
-	 * given partition.
-	 * 
-	 * @param partition
-	 * @return boolean
-	 */
-	public boolean canBeCombinedWith(StreamPartition partition) {
-		int start = getOffset();
-		int end = start + getLength();
-		int otherStart = partition.getOffset();
-		int otherEnd = otherStart + partition.getLength();
-		boolean overlap = (otherStart >= start && otherStart <= end) || (start >= otherStart && start <= otherEnd);
-		return overlap && getType().equals(partition.getType()) && getStreamIdentifier().equals(partition.getStreamIdentifier());
-	}
-	
-	/**
-	 * Returns a new partition representing this and the given parition
-	 * combined.
-	 * 
-	 * @param partition
-	 * @return partition
- 	 */
-	public StreamPartition combineWith(StreamPartition partition) {
-		int start = getOffset();
-		int end = start + getLength();
-		int otherStart = partition.getOffset();
-		int otherEnd = otherStart + partition.getLength();
-		int theStart = Math.min(start, otherStart);
-		int theEnd = Math.max(end, otherEnd);
-		return createNewPartition(getStreamIdentifier(), theStart, theEnd - theStart);
-	}
-	
-	/**
-	 * Creates a new patition of this type with the given color, offset, 
-	 * and length.
-	 * 
-	 * @param streamIdentifer
-	 * @param offset
-	 * @param length
-	 * @return ColorPartition
-	 */
-	public abstract StreamPartition createNewPartition(String streamIdentifier, int offset, int length);
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java
deleted file mode 100644
index e8a97ab..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/WorkspaceOperationRunner.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.debug.internal.ui.views.console;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
-import org.eclipse.ui.texteditor.ISchedulingRuleProvider;
-
-/**
- * @since 3.0
- */
-class WorkspaceOperationRunner implements IRunnableContext {
-	
-	private IProgressMonitor fProgressMonitor;
-	
-	public WorkspaceOperationRunner() {
-	}
-	
-	/**
-	 * Sets the progress monitor.
-	 * 
-	 * @param progressMonitor the progress monitor to set
-	 */
-	public void setProgressMonitor(IProgressMonitor progressMonitor) {
-		fProgressMonitor= progressMonitor;
-	}
-
-	/**
-	 * Returns the progress monitor. It there is no progress monitor the monitor\
-	 * is set to the <code>NullProgressMonitor</code>.
-	 * 
-	 * @return the progress monitor
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		if (fProgressMonitor == null)
-			fProgressMonitor= new NullProgressMonitor();
-		return fProgressMonitor;
-	}
-
-	/*
-	 * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
-	 */
-	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException {
-		if (runnable instanceof ISchedulingRuleProvider)
-			run(fork, cancelable, runnable, ((ISchedulingRuleProvider)runnable).getSchedulingRule());
-		else
-			run(fork, cancelable, runnable, ResourcesPlugin.getWorkspace().getRoot());
-	}
-	
-	/*
-	 * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
-	 */
-	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable, ISchedulingRule schedulingRule) throws InvocationTargetException, InterruptedException {
-		WorkspaceModifyDelegatingOperation operation= new WorkspaceModifyDelegatingOperation(runnable, schedulingRule);
-		operation.run(getProgressMonitor());
-	}
-}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/PopupInformationControl.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/PopupInformationControl.java
index d3b6be9..b0580bf 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/PopupInformationControl.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/PopupInformationControl.java
@@ -21,7 +21,6 @@
 import org.eclipse.jface.text.IInformationControl;
 import org.eclipse.jface.text.IInformationControlExtension;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.graphics.Color;
@@ -121,12 +120,6 @@
 		shell.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
 		shell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
 		
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				dispose();
-			}
-		});		
-		
 		GridLayout layout= new GridLayout(1, false);
 		layout.marginHeight= 0;
 		layout.marginWidth= 0;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlockViewSynchronizer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlockViewSynchronizer.java
index c9b51ef..ce83f5b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlockViewSynchronizer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlockViewSynchronizer.java
@@ -167,11 +167,11 @@
 	{
 		if (fSynchronizeInfo != null)
 		{	
-			Enumeration enum = fSynchronizeInfo.elements();
+			Enumeration enumeration = fSynchronizeInfo.elements();
 			
 			// clean up all synchronize info objects
-			while (enum.hasMoreElements()){
-				SynchronizeInfo info = (SynchronizeInfo)enum.nextElement();
+			while (enumeration.hasMoreElements()){
+				SynchronizeInfo info = (SynchronizeInfo)enumeration.nextElement();
 				info.delete();
 			}
 			
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java
index fd19f75..b8aa799 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryView.java
@@ -561,10 +561,10 @@
 				// find memory from other folder and dispose the view tab
 				if (!foundTab)
 				{
-					Enumeration enum = tabFolderHashtable.elements();
-					while (enum.hasMoreElements())
+					Enumeration enumeration = tabFolderHashtable.elements();
+					while (enumeration.hasMoreElements())
 					{
-						tabFolder = (TabFolder) enum.nextElement();
+						tabFolder = (TabFolder) enumeration.nextElement();
 						tabs = tabFolder.getItems();
 						IMemoryViewTab viewTab = null;
 						for (int i = 0; i < tabs.length; i++)
@@ -629,11 +629,11 @@
 		try {
 			
 			if (tabFolderHashtable != null) {
-				Enumeration enum = tabFolderHashtable.elements();
+				Enumeration enumeration = tabFolderHashtable.elements();
 				
-				while (enum.hasMoreElements())
+				while (enumeration.hasMoreElements())
 				{
-					TabFolder tabFolder = (TabFolder)enum.nextElement();
+					TabFolder tabFolder = (TabFolder)enumeration.nextElement();
 					
 					if (tabFolder.isDisposed())
 						continue;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewContentProvider.java
index db8d595..6dbf9cb 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewContentProvider.java
@@ -767,11 +767,11 @@
 	 */
 	public void resetDeltas()
 	{
-		Enumeration enum = contentCache.elements();
+		Enumeration enumeration = contentCache.elements();
 		
-		while (enum.hasMoreElements())
+		while (enumeration.hasMoreElements())
 		{
-			MemoryViewLine line = (MemoryViewLine)enum.nextElement();
+			MemoryViewLine line = (MemoryViewLine)enumeration.nextElement();
 			line.unmarkDeltas();
 		}
 	}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java
index f78e895..269e1b4 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SynchronizeInfo.java
@@ -216,11 +216,11 @@
 				Object value = fProperties.get(propertyId);
 				if (value != null)
 				{				
-					Enumeration enum = fPropertyListeners.elements();
+					Enumeration enumeration = fPropertyListeners.elements();
 					
-					while(enum.hasMoreElements())
+					while(enumeration.hasMoreElements())
 					{
-						PropertyListener listener = (PropertyListener)enum.nextElement();
+						PropertyListener listener = (PropertyListener)enumeration.nextElement();
 						
 						ISynchronizedMemoryBlockView view = listener.getView();
 						
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java
index 6f28597..1db945a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java
@@ -112,7 +112,12 @@
 	 * Debug perspective identifier (value <code>"org.eclipse.debug.ui.DebugPerspective"</code>).
 	 */
 	public static final String ID_DEBUG_PERSPECTIVE = PLUGIN_ID + ".DebugPerspective"; //$NON-NLS-1$
-			
+	
+	/**
+	 * Console type identifier (value <code>"org.eclipse.debug.ui.ProcessConsoleType"</code>).
+	 */
+	public static final String ID_PROCESS_CONSOLE_TYPE = PLUGIN_ID + ".ProcessConsoleType"; //$NON-NLS-1$
+	
 	/**
 	 * Constant for referring to no perspective.
 	 */
@@ -792,6 +797,13 @@
 	 */
 	public static final String ATTR_LAUNCH_IN_BACKGROUND = PLUGIN_ID + ".ATTR_LAUNCH_IN_BACKGROUND"; //$NON-NLS-1$
 	
+	/**
+	 * ProcessConsole attribute - references the process that was launched.
+	 * 
+	 * @since 3.1 
+	 */
+	public static final String ATTR_CONSOLE_PROCESS = PLUGIN_ID + ".ATTR_CONSOLE_PROCESS"; //$NON-NLS-1$
+	
 	// Extension points
 	
 	/**
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java
index e5668c4..b4c310c 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/AbstractLaunchToolbarAction.java
@@ -14,7 +14,6 @@
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.launchConfigurations.OrganizeFavoritesAction;
-import org.eclipse.debug.internal.ui.preferences.DebugWorkInProgressPreferencePage;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.StructuredSelection;
@@ -54,16 +53,15 @@
 			addSeparator(menu);
 		}
 
-		// TODO: work in progress cleanup
-		if (DebugUIPlugin.getDefault().getPluginPreferences().getBoolean(DebugWorkInProgressPreferencePage.WIP_PREF_CONTEXT_LAUNCH)) {
-			addToMenu(menu, new LaunchShortcutsAction(getLaunchGroupIdentifier()), -1);
-		} else {
-			addToMenu(menu, new LaunchAsAction(getLaunchGroupIdentifier()), -1);
-			addToMenu(menu, new OpenLaunchDialogAction(getLaunchGroupIdentifier()), -1);
-		}
+		addToMenu(menu, new LaunchShortcutsAction(getLaunchGroupIdentifier()), -1);
+		addToMenu(menu, getOpenDialogAction(), -1);
 		addToMenu(menu, new OrganizeFavoritesAction(getLaunchGroupIdentifier()), -1);
 	}
 	
+	protected IAction getOpenDialogAction() {
+		return new OpenLaunchDialogAction(getLaunchGroupIdentifier());
+	}
+
 	/**
 	 * Launch the last launch, or open the launch config dialog if none.
 	 * 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java
index ec4562a..2627d36 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchAsAction.java
@@ -44,6 +44,9 @@
  * launch group.
  * 
  * @since 2.1
+ * @deprecated The use of perspective based launch shorcuts has been deprecated
+ *  in the 3.1 release. Instead, selection sensitive launch is supported in the top level
+ *  menus. Use <code>LaunchShorcutsAction</code> instead.
  */
 public class LaunchAsAction extends Action implements IMenuCreator, IWorkbenchWindowPulldownDelegate2 {
 	
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java
index bcac9af..c848523 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/LaunchShortcutsAction.java
@@ -22,6 +22,7 @@
 import org.eclipse.core.expressions.IEvaluationContext;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfigurationType;
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.actions.LaunchShortcutAction;
 import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationManager;
@@ -66,6 +67,11 @@
 	 * Launch group
 	 */
 	private ILaunchGroup fGroup;
+	
+	/**
+	 * Whether this actions enablement has been initialized
+	 */
+	private boolean fInitialized = false;
 		
 	/**
 	 * Creates a cascading menu action to populate with shortcuts in the given
@@ -78,6 +84,7 @@
 		fGroup = DebugUIPlugin.getDefault().getLaunchConfigurationManager().getLaunchGroup(launchGroupIdentifier);
 		setText(DebugPlugin.getDefault().getLaunchManager().getLaunchMode(fGroup.getMode()).getLabel());
 		setMenuCreator(this);
+		setEnabled(existsConfigTypesForMode());
 	}
 	
 	/**
@@ -279,9 +286,6 @@
 	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
 	 */
 	public void init(IWorkbenchWindow window) {
-//		if (window instanceof WorkbenchWindow) {
-//			fKeyBindingService= ((WorkbenchWindow)window).getKeyBindingService();
-//		}
 	}
 
 	/**
@@ -295,8 +299,28 @@
 	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
 	 */
 	public void selectionChanged(IAction action, ISelection selection) {
-	    // nothing to do
+	    if (!fInitialized) {
+	        action.setEnabled(existsConfigTypesForMode());
+	        fInitialized = true;
+	    }
 	}
 
+	/**
+	 * Return whether there are any registered launch configuration types for
+	 * the mode of this action.
+	 * 
+	 * @return whether there are any registered launch configuration types for
+	 * the mode of this action
+	 */
+	private boolean existsConfigTypesForMode() {
+		ILaunchConfigurationType[] configTypes = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes();
+		for (int i = 0; i < configTypes.length; i++) {
+			ILaunchConfigurationType configType = configTypes[i];
+			if (configType.supportsMode(getMode())) {
+				return true;
+			}
+		}		
+		return false;
+	}
 }
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
index 4b259d5..d648b0e 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java
@@ -24,6 +24,7 @@
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.console.IHyperlink;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.texteditor.IDocumentProvider;
 import org.eclipse.ui.texteditor.ITextEditor;
@@ -36,7 +37,7 @@
  * </p>
  * @since 2.1
  */
-public class FileLink implements IConsoleHyperlink {
+public class FileLink implements IHyperlink {
 
 	private IFile fFile;
 	private int fFileOffset;
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java
index aac360a..b4e11dd 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsole.java
@@ -16,6 +16,7 @@
 import org.eclipse.debug.core.model.IStreamsProxy;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.IRegion;
+import org.eclipse.ui.console.IHyperlink;
 import org.eclipse.ui.console.IPatternMatchListener;
 
 /**
@@ -61,8 +62,25 @@
 	 * @param offset the character offset within the console document where the
 	 * text assoicated with the hyperlink begins
 	 * @param length the length of the associated hyperlink text
+	 * @deprecated replaced with addLink(IHyperlink link, int offset, int length)
 	 */
 	public void addLink(IConsoleHyperlink link, int offset, int length);
+
+	/**
+	 * Adds the given hyperlink to this console. The link will be notified when
+	 * entered, exited, and activated.
+	 * <p>
+	 * If the link's region (offset/length) is within the console's document
+	 * current bounds, it is added immediately. Otherwise, the link is added
+	 * when the console's document grows to contain the link's region.
+	 * </p>
+	 * @param link the hyperlink to add 
+	 * @param offset the character offset within the console document where the
+	 * text assoicated with the hyperlink begins
+	 * @param length the length of the associated hyperlink text
+	 * @ since 3.1
+	 */
+	public void addLink(IHyperlink link, int offset, int length);
 	
 	/**
 	 * Returns the region of text associated with the given hyperlink, or
@@ -71,10 +89,22 @@
 	 * 
 	 * @param link a console hyperlink
 	 * @return region of text associated with the hyperlink, or <code>null</code>
+	 * @deprecated replaced with getRegion(IHyperlink link) instead
 	 */
 	public IRegion getRegion(IConsoleHyperlink link);
 
 	/**
+	 * Returns the region of text associated with the given hyperlink, or
+	 * <code>null</code> if the given hyperlink is not contained in this
+	 * console.
+	 * 
+	 * @param link a console hyperlink
+	 * @return region of text associated with the hyperlink, or <code>null</code>
+	 * @since 3.1
+	 */
+	public IRegion getRegion(IHyperlink link);
+	
+	/**
 	 * Returns the document associated with this console.
 	 * 
 	 * @return document
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java
index b85284b..672ffa5 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/IConsoleHyperlink.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials 
  * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,7 +19,7 @@
  * Clients may implement this interface.
  * </p>
  * @since 2.1
- * @deprecated replaced by org.eclipse.ui.console.IConsoleHyperlink
+ * @deprecated replaced by org.eclipse.ui.console.IHyperlink
  */
 public interface IConsoleHyperlink extends IHyperlink {
 }
