Merged fix for bug 295771 from HEAD.
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java
index 1d0816d..9c37e61 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java
@@ -68,6 +68,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java
index b5eb53f..339a319 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java
@@ -65,6 +65,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java
index 5f68862..887a1ff 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java
@@ -71,6 +71,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java
index f4c0786..9da1d4b 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java
@@ -66,6 +66,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java
index 8e50289..7e4d2d2 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PresentationContextTests.java
@@ -48,6 +48,7 @@
         assertEquals("Wrong value restored", new Integer(1), context.getProperty("integer"));
         assertEquals("Wrong value restored", new Boolean(true), context.getProperty("boolean"));
         assertEquals("Wrong value restored", ResourcesPlugin.getWorkspace().getRoot(), context.getProperty("persistable"));
+        context.dispose();
     }
     
 }
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java
index aa11554..b6f725b 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java
@@ -69,6 +69,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
index 0044ac1..159327e 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
@@ -71,6 +71,7 @@
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
         fViewer.addStateUpdateListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
index eff52f4..7b981af 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
@@ -66,6 +66,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java
index 6afa8f6..93ec934 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java
@@ -68,6 +68,7 @@
         fViewer.removeLabelUpdateListener(fListener);
         fViewer.removeViewerUpdateListener(fListener);
         fViewer.removeModelChangedListener(fListener);
+        fViewer.getPresentationContext().dispose();
         
         // Close the shell and exit.
         fShell.close();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java
index e031944..4262489 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/BreakpointsExpandAllAction.java
@@ -11,10 +11,17 @@
  *******************************************************************************/
 package org.eclipse.debug.internal.ui.actions.breakpoints;
 
+import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer;
 import org.eclipse.debug.ui.AbstractDebugView;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IViewActionDelegate;
 import org.eclipse.ui.IViewPart;
 
@@ -24,6 +31,8 @@
 public class BreakpointsExpandAllAction implements IViewActionDelegate {	
 	
 	private AbstractDebugView fView;
+
+	private boolean fFinishedExpanding;
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
@@ -36,7 +45,34 @@
 	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
 	 */
 	public void run(IAction action) {
-		((TreeViewer) fView.getViewer()).expandAll();
+	    Display display = fView.getSite().getShell().getDisplay(); 
+	    
+	    VirtualTreeModelViewer virtualViewer = new VirtualTreeModelViewer(
+	        display, 0, ((ITreeModelViewer)fView.getViewer()).getPresentationContext());
+	    
+	    fFinishedExpanding = false;
+	    virtualViewer.setAutoExpandLevel(-1);
+	    virtualViewer.addViewerUpdateListener(new IViewerUpdateListener() {
+            public void viewerUpdatesComplete() {
+                fFinishedExpanding = true;
+            }
+            
+            public void viewerUpdatesBegin() {}
+            public void updateStarted(IViewerUpdate update) {}
+            public void updateComplete(IViewerUpdate update) {}
+        });
+	    
+	    virtualViewer.setInput(fView.getViewer().getInput());
+	    
+	    while (!fFinishedExpanding) {
+	       if (!display.readAndDispatch ()) display.sleep ();
+	    }
+
+	    ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE);
+	    virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.EXPAND);
+		((ITreeModelViewer) fView.getViewer()).updateViewer(stateDelta);
+		
+		virtualViewer.dispose();
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java
index c178e78..148a03b 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/AbstractBreakpointManagerInput.java
@@ -23,7 +23,7 @@
 	/**

 	 * The presentation context of the breakpoints view.

 	 */

-	final protected IPresentationContext fContext;

+	final private IPresentationContext fContext;

 	

 	/**

 	 * Constructor.

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java
index ee19e43..ae0ab52 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/elements/adapters/DefaultBreakpointManagerInput.java
@@ -34,8 +34,8 @@
 	 * @see java.lang.Object#hashCode()

 	 */

 	public int hashCode() {

-		if (fContext != null) {

-			return fContext.hashCode();

+		if (getContext() != null) {

+			return getContext().hashCode();

 		} else {

 			return 1;

 		}

@@ -48,9 +48,9 @@
 	public boolean equals(Object arg0) {

 		if ( (arg0 != null) && arg0.getClass().equals(this.getClass()) ) {

 

-			IPresentationContext context = ((DefaultBreakpointManagerInput) arg0).fContext;

-			if (fContext != null && context != null)

-				return fContext.equals(context);

+			IPresentationContext context = ((DefaultBreakpointManagerInput) arg0).getContext();

+			if (getContext() != null && context != null)

+				return getContext().equals(context);

 		} 

 		

 		return super.equals(arg0);				

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
index cacf33d..b37edca 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/memory/provisional/AbstractAsyncTableRendering.java
@@ -1875,6 +1875,10 @@
 			fTableViewer.dispose();
 		}
 		
+		if (fPresentationContext != null) {
+		    fPresentationContext.dispose();
+		}
+		
 		if (!fToolTipShell.isDisposed())
 		{
 			fToolTipShell.dispose();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java
index f761227..dbfeb3a 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/AbstractBreakpointManagerContentProvider.java
@@ -12,15 +12,16 @@
 

 import java.util.ArrayList;

 import java.util.Arrays;

+import java.util.Collections;

 import java.util.HashMap;

 import java.util.HashSet;

 import java.util.Iterator;

+import java.util.LinkedHashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.Set;

 

 import org.eclipse.core.resources.IMarkerDelta;

-import org.eclipse.core.runtime.Assert;

 import org.eclipse.core.runtime.CoreException;

 import org.eclipse.core.runtime.Platform;

 import org.eclipse.debug.core.DebugPlugin;

@@ -29,6 +30,7 @@
 import org.eclipse.debug.core.model.IBreakpoint;

 import org.eclipse.debug.internal.ui.DebugUIPlugin;

 import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;

+import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants;

 import org.eclipse.debug.internal.ui.elements.adapters.AbstractBreakpointManagerInput;

 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;

 import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;

@@ -37,9 +39,9 @@
 import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;

 import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer;

 import org.eclipse.debug.internal.ui.views.breakpoints.ElementComparator;

-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointFilterListener;

-import org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizerListener;

 import org.eclipse.debug.ui.IDebugUIConstants;

+import org.eclipse.jface.util.IPropertyChangeListener;

+import org.eclipse.jface.util.PropertyChangeEvent;

 import org.eclipse.jface.viewers.IStructuredSelection;

 

 /**

@@ -48,43 +50,36 @@
  * @since 3.6

  */

 public abstract class AbstractBreakpointManagerContentProvider extends ElementContentProvider 

-		implements IBreakpointFilterListener, IBreakpointOrganizerListener, IBreakpointsListener {

+		implements IBreakpointsListener {

 	

 	/**

 	 * Breakpoint input data. Contains all input specific data.

 	 * 

 	 * @since 3.6

 	 */

-	protected class InputData {

+	private class InputData {

 		/**

 		 * Breakpoint manager input

 		 */

-		AbstractBreakpointManagerInput fInput;

+		private AbstractBreakpointManagerInput fInput;

 		

 		/**

 		 * Model proxy of the input

 		 */

-		AbstractModelProxy fProxy;	

-		

-		/**

-		 * Selection filter, will be use to provide debug context filtering

-		 */

-		IStructuredSelection fSelectionFilter;

+		private List/*<AbstractModelProxy>*/ fProxies = new ArrayList(1);

 		

 		/**

 		 * Element comparator, use to compare the ordering of elements for the model

+		 * <br/> Note: We assume that the comparator does not change.  

 		 */

-		ElementComparator fComparator;

+		private ElementComparator fComparator;

 		

 		/**

-		 * A list of breakpoint organizers

+		 * The breakpoint root container.<br/>

+		 * Note: The final qualifier guarantees that fContainer will be 

+		 * initialized before the class is accessed on other threads.

 		 */

-		IBreakpointOrganizer[] fOrganizers;

-		

-		/**

-		 * The breakpoint root container

-		 */

-		BreakpointContainer fContainer;

+		final private BreakpointContainer fContainer;

 		

 		/**

 		 * Constructor

@@ -94,58 +89,172 @@
 		 * @param filter the debug context selection 

 		 * @param comparator the element comparator 

 		 */

-		InputData(AbstractBreakpointManagerInput input, AbstractModelProxy proxy, IStructuredSelection filter, ElementComparator comparator) {

+		InputData(AbstractBreakpointManagerInput input) {

 			fInput = input;

-			fProxy = proxy;

-			fSelectionFilter = filter;

-			fComparator = comparator;

+			fProxies = new ArrayList(1);

+			fComparator = (ElementComparator)

+			    input.getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR);

+			

+            IBreakpointOrganizer[] organizers = (IBreakpointOrganizer[])

+                input.getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS);

+

+            // Create the initial container.

+            ModelDelta initialDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

+            fContainer = createRootContainer(initialDelta, fInput, organizers, fBpManager);

 		}

 		

+		synchronized void proxyInstalled(AbstractModelProxy proxy) {

+		    fProxies.add(proxy);

+		    

+		    // Generate an install delta

+		    

+            ModelDelta rootDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

+            buildInstallDelta(rootDelta, fContainer);

+            proxy.fireModelChanged(rootDelta);

+		}

+

+		synchronized void proxyDisposed(AbstractModelProxy proxy) {

+		    fProxies.remove(proxy);

+		}

+

 		/**

 		 * Change the breakpoint organizers for the root container.

 		 * 

 		 * @param organizers the new organizers.

 		 */

 		synchronized void setOrganizers(IBreakpointOrganizer[] organizers) {

-			fOrganizers = organizers;

-			

-			if (fContainer == null) {

-				ModelDelta initialDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

-				fContainer = createRootContainer(initialDelta, fInput, fOrganizers, fBpManager);

-				initialDelta.setChildCount(fContainer.getChildren().length);

-				

-				// select the first breakpoint

-				IBreakpoint[] breakpoints = fContainer.getBreakpoints();

-				if (breakpoints.length > 0)

-					appendModelDeltaToElement(initialDelta, breakpoints[0], IModelDelta.SELECT);

-				

-				fireModelChanged(fInput, initialDelta, "Organizer Changed - Initial Container."); //$NON-NLS-1$

-			} else {

-				// create a reference container, use for deleting elements and adding elements

-				ModelDelta dummyDelta = new ModelDelta(null, IModelDelta.NO_CHANGE);				

-				BreakpointContainer refContainer = createRootContainer(dummyDelta, fInput, organizers, fBpManager);

+			// create a reference container, use for deleting elements and adding elements

+			ModelDelta dummyDelta = new ModelDelta(null, IModelDelta.NO_CHANGE);				

+			BreakpointContainer refContainer = createRootContainer(dummyDelta, fInput, organizers, fBpManager);

 

-				// delete the removed elements

-				ModelDelta deletedDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE);

-				deleteRemovedElements(fContainer, refContainer, deletedDelta);

-				fireModelChanged(fInput, deletedDelta, "setOrganizers - Delete removed elements"); //$NON-NLS-1$

-				

-				// adjust the old organizer with the reference organizer

-				BreakpointContainer.copyOrganizers(fContainer, refContainer);

-				

-				// insert the added elements

-				ModelDelta addedDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

-				IBreakpoint newBreakpoint = insertAddedElements(fContainer, refContainer, addedDelta);

-				addedDelta.setChildCount(fContainer.getChildren().length);

-				

-				// select the new breakpoint

-				if (newBreakpoint != null)

-					appendModelDeltaToElement(addedDelta, newBreakpoint, IModelDelta.SELECT);

-				

-				fireModelChanged(fInput, addedDelta, "setOrganizers - Insert added elements"); //$NON-NLS-1$

-			}

+			// delete the removed elements

+			ModelDelta deletedDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE);

+			deleteRemovedElements(fContainer, refContainer, deletedDelta);

+			fireModelChanged(fInput, deletedDelta, "setOrganizers - Delete removed elements"); //$NON-NLS-1$

+			

+			// adjust the old organizer with the reference organizer

+			BreakpointContainer.copyOrganizers(fContainer, refContainer);

+			

+			// insert the added elements

+			ModelDelta addedDelta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

+			IBreakpoint newBreakpoint = insertAddedElements(fContainer, refContainer, addedDelta);

+			addedDelta.setChildCount(fContainer.getChildren().length);

+			

+			// select the new breakpoint

+			if (newBreakpoint != null)

+				appendModelDeltaToElement(addedDelta, newBreakpoint, IModelDelta.SELECT);

+			

+			fireModelChanged(fInput, addedDelta, "setOrganizers - Insert added elements"); //$NON-NLS-1$

 		}

 

+		  /*

+	     * (non-Javadoc)

+	     * @see org.eclipse.debug.internal.ui.actions.breakpoints.IBreakpointFilterContentProvider#setFilterSelection(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.jface.viewers.IStructuredSelection)

+	     */

+	    synchronized public void setFilterSelection(IStructuredSelection ss) {

+            ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE);

+            

+            Set existingBreakpoints = new HashSet(Arrays.asList(fContainer.getBreakpoints()));

+            IBreakpoint[] allBreakpoints = fBpManager.getBreakpoints();

+            

+            for (int i = 0; i < allBreakpoints.length; ++i) {

+                boolean supported = supportsBreakpoint(ss, allBreakpoints[i]);

+                boolean contain = existingBreakpoints.contains(allBreakpoints[i]);                                  

+                    

+                if (supported) {

+                    if (!contain)

+                        fContainer.addBreakpoint(allBreakpoints[i], delta);

+                } else {

+                    if (contain)

+                        fContainer.removeBreakpoint(allBreakpoints[i], delta);

+                }

+                

+            }

+

+            fireModelChanged(fInput, delta, "setFilterSelection"); //$NON-NLS-1$

+	    }

+

+	    /**

+	     * Helper method to add breakpoints to the given input.

+	     * 

+	     * @param data the input to add the breakpoints

+	     * @param breakpoints the breakpoints

+	     */

+	    synchronized void breakpointsAdded(IBreakpoint[] breakpoints) {

+	        IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints);

+	        ModelDelta delta = new ModelDelta(fInput, 0, IModelDelta.NO_CHANGE, -1);

+	        for (int i = 0; i < filteredBreakpoints.length; ++i) {

+	            fContainer.addBreakpoint(filteredBreakpoints[i], delta);

+	        }

+	        delta.setChildCount(fContainer.getChildren().length);

+	        

+	        // select the breakpoint

+	        if (filteredBreakpoints.length > 0) {

+	            appendModelDeltaToElement(delta, filteredBreakpoints[0], IModelDelta.SELECT);

+	        }

+	        

+	        fireModelChanged(fInput, delta, "breakpointsAddedInput"); //$NON-NLS-1$

+	    }

+

+	    /**

+	     * Helper method to remove breakpoints from a given input.

+	     * 

+	     * @param data the input to add the breakpoints

+	     * @param breakpoints the breakpoints

+	     */

+	    synchronized void breakpointsRemoved(IBreakpoint[] breakpoints) {

+	        IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints);

+	        ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE);

+	        for (int i = 0; i < filteredBreakpoints.length; ++i) {

+	            fContainer.removeBreakpoint(filteredBreakpoints[i], delta);

+	        }

+	        fireModelChanged(fInput, delta, "breakpointsRemovedInput"); //$NON-NLS-1$

+	    }

+	    

+	    synchronized void breakpointsChanged(IBreakpoint[] breakpoints) {

+            IBreakpoint[] filteredBreakpoints = filterBreakpoints(fInput, breakpoints);

+            

+            // If the change caused a breakpoint to be added (installed) or remove (un-installed) update accordingly.

+            List removed = new ArrayList();

+            List added = new ArrayList();

+            List filteredAsList = Arrays.asList(filteredBreakpoints);

+            for (int i = 0; i < breakpoints.length; i++) {

+                IBreakpoint bp = breakpoints[i];

+                boolean oldContainedBp = fContainer.contains(bp);

+                boolean newContained = filteredAsList.contains(bp);

+                if (oldContainedBp && !newContained) {

+                    removed.add(bp);

+                } else if (!oldContainedBp && newContained) {

+                    added.add(bp);

+                }                   

+            }

+            if (!added.isEmpty()) {

+                breakpointsAdded((IBreakpoint[]) added.toArray(new IBreakpoint[added.size()]));

+            }

+            if (!removed.isEmpty()) {

+                breakpointsRemoved((IBreakpoint[]) removed.toArray(new IBreakpoint[removed.size()]));

+            }                       

+            

+            ModelDelta delta = new ModelDelta(fInput, IModelDelta.NO_CHANGE);

+            for (int i = 0; i < filteredBreakpoints.length; ++i)

+                appendModelDelta(fContainer, delta, IModelDelta.STATE, filteredBreakpoints[i]);

+            fireModelChanged(fInput, delta, "breakpointsChanged");        //$NON-NLS-1$

+	    }

+

+	    

+		private void buildInstallDelta(ModelDelta delta, BreakpointContainer container) {

+            Object[] children = container.getChildren();

+            delta.setChildCount(children.length);

+            for (int i = 0; i < children.length; i++) {

+                ModelDelta childDelta = delta.addNode(children[i], i, IModelDelta.NO_CHANGE);

+                if (children[i] instanceof BreakpointContainer) {

+                    buildInstallDelta(childDelta, (BreakpointContainer)children[i]);

+                } else if (children[i] instanceof IBreakpoint) {

+                    childDelta.setFlags(IModelDelta.INSTALL);

+                }

+            }

+        }

+        

 		/**

 		 * Insert elements from the reference container to an existing container.

 		 * 

@@ -263,6 +372,32 @@
 		}		

 	}

 	

+	private class InputDataMap extends LinkedHashMap {

+        private static final long serialVersionUID = 1L;

+

+        public InputDataMap() {

+	        super(1, (float)0.75, true);

+        }

+	    

+	    protected boolean removeEldestEntry(java.util.Map.Entry arg0) {

+	        InputData data = (InputData)arg0.getValue();

+	        return size() > getMaxInputsCache() && data.fProxies.isEmpty(); 

+	    }

+	}

+	

+	private class PresentationContextListener implements IPropertyChangeListener {

+	    final private IPresentationContext fContext;

+	    

+	    PresentationContextListener(IPresentationContext context) {

+	        fContext = context;

+	        fContext.addPropertyChangeListener(this);

+	    }

+	    

+	    public void propertyChange(PropertyChangeEvent event) {

+	        contextPropertyChanged(fContext, event);

+	    }

+	}

+	

 	// debug flags

 	public static boolean DEBUG_BREAKPOINT_DELTAS = false;

 	

@@ -274,18 +409,22 @@
 	/**

 	 * A map of input to info data cache

 	 */

-	protected Map fInputToData;

+	final private Map fInputToData = Collections.synchronizedMap(new InputDataMap());

+	

+	/**

+	 * A map of presetnation context listeners.

+	 */

+	final private Map fContextListeners = Collections.synchronizedMap(new HashMap());

 	

 	/**

 	 * The breakpoint manager.

 	 */

-	protected IBreakpointManager fBpManager = null;

+	final private IBreakpointManager fBpManager;

 	

 	/**

 	 * Constructor.

 	 */

 	protected AbstractBreakpointManagerContentProvider() {

-		fInputToData = new HashMap();		

 		fBpManager = DebugPlugin.getDefault().getBreakpointManager();	

 	}

 	

@@ -308,6 +447,78 @@
 	protected abstract boolean supportsBreakpoint(IStructuredSelection ss, IBreakpoint breakpoint);

 	

 	/**

+	 * Maximum number of breakpoint manager input objects that this provider 

+	 * will cache data for.  This method is called once upon class creation 

+	 * when setting up the data cache.  Sub-classes may override to provide

+	 * a custom setting.

+	 * 

+	 * @return Maximum data cache size

+	 */

+	protected int getMaxInputsCache() {

+	    return 2;

+	}

+	

+    /**

+     * Handles the propety changed events in presentation contexts.

+     * Sub-classes may override to perform additional handling.

+     * 

+     * @param context Presetnation context that was disposed.

+     */

+	protected void contextPropertyChanged(IPresentationContext context, PropertyChangeEvent event) {

+	    if (IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS.equals(event.getProperty())) {

+	        IBreakpointOrganizer[] organizers = (IBreakpointOrganizer[])event.getNewValue();

+	        InputData[] contextDatas = getContextInputDatas(context);

+	        for (int i = 0; i < contextDatas.length; i++) {

+	            contextDatas[i].setOrganizers(organizers);

+	        }

+	    }

+	    else if (IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION.equals(event.getProperty())) {

+            IStructuredSelection selection = (IStructuredSelection)event.getNewValue();

+            InputData[] contextDatas = getContextInputDatas(context);

+            for (int i = 0; i < contextDatas.length; i++) {

+                contextDatas[i].setFilterSelection(selection);

+            }

+        }

+	}

+	

+	private InputData[] getContextInputDatas(IPresentationContext context) {

+	    List list = new ArrayList(fInputToData.size());

+	    synchronized (fInputToData) {

+            for (Iterator itr = fInputToData.values().iterator(); itr.hasNext();) {

+                InputData data = (InputData)itr.next();

+                if (context.equals( data.fInput.getContext() )) {

+                    list.add(data);

+                }

+            }

+	    }

+	    return (InputData[]) list.toArray(new InputData[list.size()]);

+	}

+	

+	/**

+	 * Handles the event when a presentation context is dispoed.

+	 * Sub-classes may override to perform additional cleanup.

+	 * 

+	 * @param context Presetnation context that was disposed.

+	 */

+	protected void contextDisposed(IPresentationContext context) {

+        synchronized (fInputToData) {

+            for (Iterator itr = fInputToData.entrySet().iterator(); itr.hasNext();) {

+                Map.Entry entry = (Map.Entry)itr.next();

+                IPresentationContext entryContext = ((AbstractBreakpointManagerInput)entry.getKey()).getContext();

+                if (context.equals(entryContext)) {

+                    itr.remove();

+                }

+            }

+        }

+        

+        // Remove the context listener.

+        PresentationContextListener listener = (PresentationContextListener)fContextListeners.remove(context);

+        if (listener != null) {

+            context.removePropertyChangeListener(listener);

+        }

+	}

+	

+	/**

 	 * Register the breakpoint manager input with this content provider.

 	 * 

 	 * @param input the breakpoint manager input to register.

@@ -316,18 +527,12 @@
 	 * @param selectionFilter the selection filter, can be <code>null</code>.

 	 * @param comparator the element comparator.

 	 */

-	public void registerModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy, 

-			IBreakpointOrganizer[] organizers, IStructuredSelection selectionFilter, ElementComparator comparator) {

-		

-		if (fInputToData.size() == 0)

+	public void registerModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy) {

+		if (fInputToData.isEmpty()) {

 			fBpManager.addBreakpointListener(this);

+		}

 		

-		InputData data = new InputData(input, proxy, selectionFilter, comparator);

-				

-		// cache the input and it's data

-		fInputToData.put(input, data);	

-		

-		data.setOrganizers(organizers);

+		getInputData(input).proxyInstalled(proxy);

 	}

 	

 	/**

@@ -335,23 +540,35 @@
 	 * 

 	 * @param input the breakpoint manager input to unregister.

 	 */

-	public void unregisterModelProxy(AbstractBreakpointManagerInput input) {

-		InputData data = (InputData) fInputToData.remove(input);

-		Assert.isNotNull(data);

+	public void unregisterModelProxy(AbstractBreakpointManagerInput input, AbstractModelProxy proxy) {

+        getInputData(input).proxyDisposed(proxy);

 		

-		if (fInputToData.size() == 0)

+		if (fInputToData.isEmpty()) {

 			fBpManager.removeBreakpointListener(this);

+		}

 	}	

 	

-	

-	/**

-	 * Returns the input data from the cache.

-	 * 

-	 * @param input the input.

-	 * @return the input data cache, can be <code>null</code>.

-	 */

-	protected InputData getInputData(Object input) {

-		return (InputData) fInputToData.get(input);

+	private InputData getInputData(AbstractBreakpointManagerInput input) {

+	    InputData data = null;

+	    synchronized (fInputToData) {

+    	    data = (InputData)fInputToData.get(input); 

+    	    if (data == null) {

+    	        data = new InputData(input);

+    	        fInputToData.put(input, data);

+    	    }

+	    }

+	    

+	    // Also make sure that we're listening to the presentation context properties

+	    synchronized (fContextListeners) {

+	        IPresentationContext context = input.getContext();

+	        if ( !Boolean.TRUE.equals(context.getProperty(IPresentationContext.PROPERTY_DISPOSED)) &&

+	             !fContextListeners.containsKey(context) )

+	        {

+	            fContextListeners.put(context, new PresentationContextListener(context));

+	        }

+	    }

+	    

+	    return data;

 	}

 	

 	/**

@@ -360,43 +577,21 @@
 	 * @param input the input.

 	 * @return the model proxy.

 	 */

-	public AbstractModelProxy getModelProxy(Object input) {

+	private List getModelProxies(AbstractBreakpointManagerInput input) {

 		InputData data = getInputData(input);

-		return data != null ? data.fProxy : null;

+		return data != null ? data.fProxies : null;

 	}	

 	

-//	/**

-//	 * Returns the root breakpoint container for the input.

-//	 * 

-//	 * @param input the input.

-//	 * @return the breakpoint container.

-//	 */

-//	public BreakpointContainer getBreakpointContainer(Object input) {

-//		InputData data = getInputData(input);

-//		return data != null ? data.fContainer : null;

-//	}

-//	

-//	/**

-//	 * Sets the breakpoint input root container.

-//	 * 

-//	 * @param input the input.

-//	 * @param container the breakpoint container.

-//	 */

-//	public void setBreakpointContainer(Object input, BreakpointContainer container) {

-//		InputData data = getInputData(input);

-//		if (data != null) {

-//			data.fContainer = container;

-//		}

-//	}

-	

 	/**

 	 * Returns the selection filter for the input.

 	 * 

 	 * @param input the selection.

 	 */

-	public IStructuredSelection getSelectionFilter(Object input) {

-		InputData data = getInputData(input);

-		return data != null ? data.fSelectionFilter : null;

+	protected IStructuredSelection getSelectionFilter(Object input) {

+	    if (input instanceof AbstractBreakpointManagerInput) {

+	        return (IStructuredSelection) ((AbstractBreakpointManagerInput)input).getContext().getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION);

+	    }

+	    return null;

 	}

 	

 	/**

@@ -406,13 +601,15 @@
 	 * @param delta the model delta.

 	 * @param debugReason the debug string.

 	 */

-	public void fireModelChanged(Object input, IModelDelta delta, String debugReason) {

-		AbstractModelProxy proxy = getModelProxy(input);

-		if (proxy != null) {

-			if (DEBUG_BREAKPOINT_DELTAS)

-				System.out.println("FIRE BREAKPOINT DELTA (" + debugReason + ")\n" + delta.toString()); //$NON-NLS-1$ //$NON-NLS-2$

-				

-			proxy.fireModelChanged(delta);				

+	protected void fireModelChanged(AbstractBreakpointManagerInput input, IModelDelta delta, String debugReason) {

+	    List proxies = getModelProxies(input);

+	    

+        if (DEBUG_BREAKPOINT_DELTAS && proxies.size() > 0) {

+            System.out.println("FIRE BREAKPOINT DELTA (" + debugReason + ")\n" + delta.toString()); //$NON-NLS-1$ //$NON-NLS-2$

+        }

+

+	    for (int i = 0; i < proxies.size(); i++) {

+	        ((AbstractModelProxy)proxies.get(i)).fireModelChanged(delta);

 		}		

 	}

 

@@ -427,10 +624,11 @@
 	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)

 	 */

 	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {

-		InputData data = getInputData(element);

-		if (data != null && data.fContainer != null)

-			return data.fContainer.getChildren().length;

-		

+	    Object input = monitor.getViewerInput();

+	    if (input instanceof AbstractBreakpointManagerInput) {

+	        AbstractBreakpointManagerInput bpManagerInput = (AbstractBreakpointManagerInput)input;

+    		return getInputData(bpManagerInput).fContainer.getChildren().length;

+	    }		

 		return 0;		

 	}	

 

@@ -438,166 +636,47 @@
 	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)

 	 */

 	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {

-		InputData data = getInputData(parent);

-		if (data != null && data.fContainer != null)

-			return getElements(data.fContainer.getChildren(), index, length);

+        Object input = monitor.getViewerInput();

+        if (input instanceof AbstractBreakpointManagerInput) {

+            AbstractBreakpointManagerInput bpManagerInput = (AbstractBreakpointManagerInput)input;

+            Object[] children =  getInputData(bpManagerInput).fContainer.getChildren();

+            return getElements(children, index, length);

+        }       

 				

 		return EMPTY;

 	}	

 

 	/*

 	 * (non-Javadoc)

-	 * @see org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizerListener#setOrganizers(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.views.breakpoints.IBreakpointOrganizer[])

-	 */

-	synchronized public void setOrganizers(Object input, IPresentationContext context, IBreakpointOrganizer[] organizers) {

-		InputData data = getInputData(input);

-		if (data != null)

-			data.setOrganizers(organizers);		

-	}

-	

-	/*

-	 * (non-Javadoc)

-	 * @see org.eclipse.debug.internal.ui.actions.breakpoints.IBreakpointFilterContentProvider#setFilterSelection(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.jface.viewers.IStructuredSelection)

-	 */

-	synchronized public void setFilterSelection(Object input, IPresentationContext context, IStructuredSelection ss) {

-		InputData data = getInputData(input);

-		if (data == null) return;

-		

-		data.fSelectionFilter = ss;

-		

-		BreakpointContainer container = data.fContainer;

-		if (container != null) {

-			ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE);

-			

-			Set existingBreakpoints = new HashSet(Arrays.asList(container.getBreakpoints()));

-			IBreakpoint[] allBreakpoints = fBpManager.getBreakpoints();

-			

-			for (int i = 0; i < allBreakpoints.length; ++i) {

-				boolean supported = supportsBreakpoint(ss, allBreakpoints[i]);

-				boolean contain = existingBreakpoints.contains(allBreakpoints[i]);									

-					

-				if (supported) {

-					if (!contain)

-						container.addBreakpoint(allBreakpoints[i], delta);

-				} else {

-					if (contain)

-						container.removeBreakpoint(allBreakpoints[i], delta);

-				}

-				

-			}

-

-			fireModelChanged(input, delta, "setFilterSelection"); //$NON-NLS-1$

-		}

-	}

-	

-	/**

-	 * Helper method to add breakpoints to the given input.

-	 * 

-	 * @param data the input to add the breakpoints

-	 * @param breakpoints the breakpoints

-	 */

-	private void breakpointsAddedInput(InputData data, IBreakpoint[] breakpoints) {

-		if (data == null || data.fContainer == null) {

-			return;

-		}

-		IBreakpoint[] filteredBreakpoints = filterBreakpoints(data.fInput, breakpoints);

-		ModelDelta delta = new ModelDelta(data.fInput, 0, IModelDelta.NO_CHANGE, -1);

-		for (int i = 0; i < filteredBreakpoints.length; ++i) {

-			data.fContainer.addBreakpoint(filteredBreakpoints[i], delta);

-		}

-		delta.setChildCount(data.fContainer.getChildren().length);

-		

-		// select the breakpoint

-		if (filteredBreakpoints.length > 0) {

-			appendModelDeltaToElement(delta, filteredBreakpoints[0], IModelDelta.SELECT);

-		}

-		

-		fireModelChanged(data.fInput, delta, "breakpointsAddedInput"); //$NON-NLS-1$

-	}

-	/*

-	 * (non-Javadoc)

 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])

 	 */

-	synchronized public void breakpointsAdded(IBreakpoint[] breakpoints) {		

-		Iterator it = fInputToData.keySet().iterator();

-		while (it.hasNext()) {

-			AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next();

-			InputData data = getInputData(input);

-			breakpointsAddedInput(data, breakpoints);

+	public void breakpointsAdded(IBreakpoint[] breakpoints) {

+	    InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]);

+	    for (int i = 0; i < datas.length; i++) {

+			datas[i].breakpointsAdded(breakpoints);

 		}				

 	}

 	

-	/**

-	 * Helper method to remove breakpoints from a given input.

-	 * 

-	 * @param data the input to add the breakpoints

-	 * @param breakpoints the breakpoints

-	 */

-	private void breakpointsRemovedInput(InputData data, IBreakpoint[] breakpoints) {

-		if (data == null || data.fContainer == null) {

-			return;	

-		}

-		

-		IBreakpoint[] filteredBreakpoints = filterBreakpoints(data.fInput, breakpoints);

-		ModelDelta delta = new ModelDelta(data.fInput, IModelDelta.NO_CHANGE);

-		for (int i = 0; i < filteredBreakpoints.length; ++i) {

-			data.fContainer.removeBreakpoint(filteredBreakpoints[i], delta);

-		}

-		fireModelChanged(data.fInput, delta, "breakpointsRemovedInput"); //$NON-NLS-1$

-		

-	}

 	/*

 	 * (non-Javadoc)

 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])

 	 */

-	synchronized public void breakpointsRemoved(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {

-		Iterator it = fInputToData.keySet().iterator();

-		while (it.hasNext()) {

-			AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next();

-			InputData data = getInputData(input);

-			breakpointsRemovedInput(data, breakpoints);

-		}

+	public void breakpointsRemoved(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {

+        InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]);

+        for (int i = 0; i < datas.length; i++) {

+            datas[i].breakpointsRemoved(breakpoints);

+        }               

 	}

 	

 	/*

 	 * (non-Javadoc)

 	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])

 	 */

-	synchronized public void breakpointsChanged(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {

-		Iterator it = fInputToData.keySet().iterator();

-		while (it.hasNext()) {

-			AbstractBreakpointManagerInput input = (AbstractBreakpointManagerInput) it.next();

-			InputData data = getInputData(input);

-			if (data == null || data.fContainer == null) continue;			

-				

-			IBreakpoint[] filteredBreakpoints = filterBreakpoints(input, breakpoints);

-			

-			// If the change caused a breakpoint to be added (installed) or remove (un-installed) update accordingly.

-			List removed = new ArrayList();

-			List added = new ArrayList();

-			List filteredAsList = Arrays.asList(filteredBreakpoints);

-			for (int i = 0; i < breakpoints.length; i++) {

-				IBreakpoint bp = breakpoints[i];

-				boolean oldContainedBp = data.fContainer.contains(bp);

-				boolean newContained = filteredAsList.contains(bp);

-				if (oldContainedBp && !newContained) {

-					removed.add(bp);

-				} else if (!oldContainedBp && newContained) {

-					added.add(bp);

-				}					

-			}

-			if (!added.isEmpty()) {

-				breakpointsAddedInput(data, (IBreakpoint[]) added.toArray(new IBreakpoint[added.size()]));

-			}

-			if (!removed.isEmpty()) {

-				breakpointsRemovedInput(data, (IBreakpoint[]) removed.toArray(new IBreakpoint[removed.size()]));

-			}						

-			

-			ModelDelta delta = new ModelDelta(input, IModelDelta.NO_CHANGE);

-			for (int i = 0; i < filteredBreakpoints.length; ++i)

-				appendModelDelta(data.fContainer, delta, IModelDelta.STATE, filteredBreakpoints[i]);

-			fireModelChanged(input, delta, "breakpointsChanged");		 //$NON-NLS-1$

-		}

+	public void breakpointsChanged(final IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {

+        InputData[] datas = (InputData[])fInputToData.values().toArray(new InputData[0]);

+        for (int i = 0; i < datas.length; i++) {

+            datas[i].breakpointsChanged(breakpoints);

+        }               

 	}	

 	/**

 	 * Appends the model delta flags to child containers that contains the breakpoint.

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
index d4e94bb..d734653 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalTreeModelViewer.java
@@ -165,16 +165,6 @@
 	private boolean fNotifyUnmap = true;
 	
 	/**
-	 * Flag indicating whether the viewer is a pop-up viewer.  A pop-up viewer 
-	 * is transient and does not automatically expand and select elements up
-	 * when requested by the model.  It also does not dispose the presentation 
-	 * context when its control is disposed. 
-	 * 
-	 * @since 3.5
-	 */
-	private boolean fIsPopup;
-	
-	/**
 	 * Persist column sizes when they change.
 	 * 
 	 * @since 3.2
@@ -1019,8 +1009,9 @@
 		setContentProvider(createContentProvider());
 		setLabelProvider(createLabelProvider());
 		
-		fIsPopup = (style & SWT.POP_UP) != 0;
-		if (fIsPopup) {
+		// A pop-up viewer is transient and does not automatically expand
+		// and select elements up when requested by the model  
+		if ((style & SWT.POP_UP) != 0) {
 		    ((ITreeModelContentProvider)getContentProvider()).setModelDeltaMask(
 		        ~ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS & ~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS);
 		}
@@ -1146,9 +1137,6 @@
 		}
 		fCellModifier.dispose();
 		
-		if (!fIsPopup) {
-		    fContext.dispose();
-		}
 		super.handleDispose(event);
 	}
 	
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
index c0c229b..8dfc928 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
@@ -951,7 +951,6 @@
         if (fColumnPresentation != null) {
             fColumnPresentation.dispose();
         }
-        fContext.dispose();
         
         if (fContentProvider != null) {
             fContentProvider.dispose();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java
index 780d18a..f8ef910 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IPresentationContext.java
@@ -22,13 +22,23 @@
  * @since 3.2
  */
 public interface IPresentationContext {
-	
+
 	/**
 	 * Property name used for property change notification when the columns
 	 * in a presentation context change.
 	 */
 	public static final String PROPERTY_COLUMNS = "PROPERTY_COLUMNS"; //$NON-NLS-1$
-    
+
+	/**
+	 * Property indicating whether the presentation context is disposed.
+	 * It is set to <code>Boolean.TRUE</code> after the presentation context 
+	 * is disposed. This property may be <code>null</code>, which indicates 
+	 * that context is not yet disposed.
+	 * 
+	 * @since 3.6
+	 */
+	public static final String PROPERTY_DISPOSED = "PROPERTY_DISPOSED"; //$NON-NLS-1$
+	
     /**
      * Returns identifiers of the visible columns in the order
      * labels should be provided, or <code>null</code> if columns
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java
index 22c7524..b79b678 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/PresentationContext.java
@@ -98,8 +98,9 @@
 	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext#dispose()
 	 */
 	public void dispose() {
+        fProperties.clear();
+        setProperty(PROPERTY_DISPOSED, Boolean.TRUE);
 		fListeners.clear();
-		fProperties.clear();
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java
index d926571..29a7254 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/update/BreakpointManagerProxy.java
@@ -10,16 +10,12 @@
  *****************************************************************/

 package org.eclipse.debug.internal.ui.viewers.update;

 

-import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;

-import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants;

 import org.eclipse.debug.internal.ui.elements.adapters.AbstractBreakpointManagerInput;

 import org.eclipse.debug.internal.ui.model.elements.AbstractBreakpointManagerContentProvider;

 import org.eclipse.debug.internal.ui.viewers.model.ViewerAdapterService;

 import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;

 import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;

 import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;

-import org.eclipse.debug.internal.ui.views.breakpoints.ElementComparator;

-import org.eclipse.jface.viewers.IStructuredSelection;

 import org.eclipse.jface.viewers.Viewer;

 

 /**

@@ -39,21 +35,6 @@
 	protected AbstractBreakpointManagerInput fInput;

 	

 	/**

-	 * The root breakpoint organizer for this model proxy

-	 */

-	protected IBreakpointOrganizer[] fOrganizers;

-	

-	/**

-	 * The element comparator for this model proxy

-	 */

-	protected ElementComparator fComparator;

-	

-	/**

-	 * The initial selection for this model proxy

-	 */

-	protected IStructuredSelection fSelection;

-

-	/**

 	 * Constructor.

 	 * 

 	 * @param input the breakpoint manager input

@@ -69,9 +50,6 @@
 			IElementContentProvider provider = ViewerAdapterService.getContentProvider(input);

 			if (provider instanceof AbstractBreakpointManagerContentProvider) {

 				fProvider = (AbstractBreakpointManagerContentProvider) provider;

-				fOrganizers = (IBreakpointOrganizer[]) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS);

-				fSelection = (IStructuredSelection) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION);

-				fComparator = (ElementComparator) context.getProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ELEMENT_COMPARATOR);

 			}

 		}

 	}

@@ -83,7 +61,7 @@
 	public void installed(Viewer viewer) {

 		super.installed(viewer);

 		if (fProvider != null) {

-			fProvider.registerModelProxy(fInput, this, fOrganizers, fSelection, fComparator);

+			fProvider.registerModelProxy(fInput, this);

 		}

 	}

 	

@@ -93,7 +71,7 @@
 	 */

 	public synchronized void dispose() {

 		if (fProvider != null) {

-			fProvider.unregisterModelProxy(fInput);

+			fProvider.unregisterModelProxy(fInput, this);

 		}

 		super.dispose();		

 	}

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
index 9d61e00..a032a73 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java
@@ -36,8 +36,6 @@
 import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointUIConstants;
 import org.eclipse.debug.internal.ui.elements.adapters.DefaultBreakpointManagerInput;
 import org.eclipse.debug.internal.ui.preferences.IDebugPreferenceConstants;
-import org.eclipse.debug.internal.ui.viewers.model.ViewerAdapterService;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
@@ -542,13 +540,6 @@
 		if (viewer != null) {
 			// update the presentation context organizer
 			viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS, fOrganizers);			
-
-			// notify input the organizer has changed
-			Object input = viewer.getInput();			
-			IElementContentProvider provider = ViewerAdapterService.getContentProvider(input);
-			if (provider instanceof IBreakpointOrganizerListener) {
-				((IBreakpointOrganizerListener) provider).setOrganizers(input, viewer.getPresentationContext(), organizers);				
-			}
 		}
 	}
 
@@ -564,13 +555,6 @@
 		if (viewer != null) {
 			// update the presentation context filter
 			viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION, fFilterSelection);
-			
-			// notify input the filter has changed
-			Object input = viewer.getInput();
-			IElementContentProvider provider = ViewerAdapterService.getContentProvider(input);
-			if (provider instanceof IBreakpointFilterListener) {				
-				((IBreakpointFilterListener) provider).setFilterSelection(input, viewer.getPresentationContext(), ss);
-			}
 		}
 	}
 	
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java
deleted file mode 100644
index b9a509a..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointFilterListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*****************************************************************

- * Copyright (c) 2009 Texas Instruments and others

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

- *     Patrick Chuong (Texas Instruments) - Initial API and implementation (Bug 238956)

- *****************************************************************/

-package org.eclipse.debug.internal.ui.views.breakpoints;

-

-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;

-import org.eclipse.jface.viewers.IStructuredSelection;

-

-/**

- * This interface can be implemented by a breakpoint manager content provider to provides filtering support.

- * 

- * @since 3.6

- */

-public interface IBreakpointFilterListener {

-	

-	/**

-	 * Sets the filter selection for the given input, the selection is the new selection of the debug view.

-	 *  

-	 * @param input the view input.

-	 * @param context the presentation context.

-	 * @param ss the selection.

-	 */

-	void setFilterSelection(Object input, IPresentationContext context, IStructuredSelection ss);

-	

-}

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java
deleted file mode 100644
index 189a580..0000000
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/IBreakpointOrganizerListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*****************************************************************

- * Copyright (c) 2009 Texas Instruments and others

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

- *     Patrick Chuong (Texas Instruments) - Initial API and implementation (Bug 238956)

- *****************************************************************/

-package org.eclipse.debug.internal.ui.views.breakpoints;

-

-import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer;

-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;

-

-/**

- * This interface can be implements by a breakpoint manager provider.

- * 

- * @since 3.6

- */

-public interface IBreakpointOrganizerListener {

-	

-	/**

-	 * Set the breakpoint organizers for the given input.

-	 * 

-	 * @param input the view input.

-	 * @param context the presentation context.

-	 * @param organizers the new organizers, can be <code>null</code>.

-	 */

-	void setOrganizers(Object input, IPresentationContext context, IBreakpointOrganizer[] organizers);	

-}

diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java
index 99293d4..5b3c899 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/WorkingSetCategory.java
@@ -133,5 +133,9 @@
     private boolean isDefault() {
         return fWorkingSet.equals(BreakpointSetOrganizer.getDefaultWorkingSet());
     }
+    
+    public String toString() {
+        return fWorkingSet.getName();
+    }
 }
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
index 327dfc8..b175757 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java
@@ -63,6 +63,7 @@
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
 import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
@@ -173,6 +174,8 @@
 	 */
 	private IDebugModelPresentation fPresentation = null;
 	
+	private IPresentationContext fPresentationContext;
+	
 	private EditLaunchConfigurationAction fEditConfigAction = null;
 	private AddToFavoritesAction fAddToFavoritesAction = null;
 	private EditSourceLookupPathAction fEditSourceAction = null;
@@ -771,9 +774,10 @@
 	 */
 	protected Viewer createViewer(Composite parent) {
 		fPresentation = new DelegatingModelPresentation();
+		fPresentationContext = new DebugModelPresentationContext(IDebugUIConstants.ID_DEBUG_VIEW, fPresentation);
 		TreeModelViewer viewer = new TreeModelViewer(parent,
 				SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL,
-				new DebugModelPresentationContext(IDebugUIConstants.ID_DEBUG_VIEW, fPresentation));
+				fPresentationContext);
         
         viewer.addSelectionChangedListener(fTreeViewerSelectionChangedListener);
         viewer.getControl().addKeyListener(new KeyAdapter() {
@@ -992,6 +996,9 @@
 			viewer.removeSelectionChangedListener(fTreeViewerSelectionChangedListener);
             ((TreeModelViewer)viewer).removeViewerUpdateListener(this);
 		}
+		if (fPresentationContext != null) {
+		    fPresentationContext.dispose();
+		}
 		IWorkbenchPage page = getSite().getPage();
 		page.removePartListener((IPartListener2) this);
 		IWorkbenchWindow window = getSite().getWorkbenchWindow();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
index 4862fde..a54b692 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java
@@ -32,6 +32,7 @@
 import org.eclipse.debug.internal.ui.DebugUIPlugin;
 import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
 import org.eclipse.debug.internal.ui.memory.provisional.MemoryViewPresentationContext;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.contexts.DebugContextEvent;
@@ -74,6 +75,7 @@
 	public static final String PANE_ID = DebugUIPlugin.getUniqueIdentifier() + ".MemoryView.MemoryBlocksTreeViewPane"; //$NON-NLS-1$
 	
 	private IViewPart fParent;
+	private IPresentationContext fPresentationContext;
 	private MemoryViewTreeViewer fTreeViewer;
 	protected IMemoryBlockRetrieval fRetrieval;
 	private ViewPaneSelectionProvider fSelectionProvider;
@@ -291,8 +293,8 @@
 		fLabel = label;
 		
 		IMemoryRenderingSite site = getMemoryRenderingSite();
-		MemoryViewPresentationContext presentationContext = new MemoryViewPresentationContext(site, this, null);
-		fTreeViewer = new MemoryViewTreeViewer(parent, style, presentationContext);
+		fPresentationContext = new MemoryViewPresentationContext(site, this, null);
+		fTreeViewer = new MemoryViewTreeViewer(parent, style, fPresentationContext);
 		
 		IAdaptable context = DebugUITools.getDebugContext();
 		IMemoryBlockRetrieval retrieval = MemoryViewUtil.getMemoryBlockRetrieval(context);
@@ -367,6 +369,7 @@
 		fAddMemoryBlockAction.dispose();
 		DebugUITools.getDebugContextManager().getContextService(fParent.getSite().getWorkbenchWindow()).removeDebugContextListener(fDebugContextListener);
 		fEvtHandler.dispose();	
+        fPresentationContext.dispose();
 	}
 
 	/* (non-Javadoc)
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
index b44d3ca..d43f4c7 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java
@@ -358,6 +358,11 @@
 	private SelectionProviderWrapper fSelectionProvider;
     
 	/**
+	 * Presentation context for this view.
+	 */
+	private IPresentationContext fPresentationContext;
+	
+	/**
 	 * Remove myself as a selection listener
 	 * and preference change listener.
 	 *
@@ -374,6 +379,10 @@
 			viewer.removeModelChangedListener(this);
 			viewer.removeViewerUpdateListener(this);
 		}
+		if (fPresentationContext != null) {
+		    fPresentationContext.dispose();
+		    fPresentationContext = null;
+		}
 		if (fDetailPane != null) fDetailPane.dispose();
         fInputService.dispose();
         fSelectionProvider.dispose();
@@ -581,8 +590,8 @@
 	protected TreeModelViewer createTreeViewer(Composite parent) {
 		
 		int style = getViewerStyle();
-		final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style,
-				new DebugModelPresentationContext(getPresentationContextId(), getModelPresentation()));
+		fPresentationContext = new DebugModelPresentationContext(getPresentationContextId(), fModelPresentation); 
+		final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style, fPresentationContext);
 		
 		variablesViewer.getControl().addFocusListener(new FocusAdapter() {
 			public void focusGained(FocusEvent e) {
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
index 2144d26..3c1eaa5 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/InspectPopupDialog.java
@@ -64,6 +64,7 @@
     private static final int MIN_WIDTH = 300;
     private static final int MIN_HEIGHT = 250;
 
+    private IPresentationContext fContext;
     private TreeModelViewer fViewer;
     private SashForm fSashForm;
     private Composite fDetailPaneComposite;
@@ -100,17 +101,17 @@
         fSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
 
         VariablesView view = getViewToEmulate();
-        IPresentationContext context = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW);
+        fContext = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW);
         if (view != null) {
         	// copy over properties
         	IPresentationContext copy = ((TreeModelViewer)view.getViewer()).getPresentationContext();
         	String[] properties = copy.getProperties();
         	for (int i = 0; i < properties.length; i++) {
 				String key = properties[i];
-				context.setProperty(key, copy.getProperty(key));
+				fContext.setProperty(key, copy.getProperty(key));
 			}
         }
-        fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, context);
+        fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, fContext);
         fViewer.setAutoExpandLevel(1);
 
         fDetailPaneComposite = SWTFactory.createComposite(fSashForm, 1, 1, GridData.FILL_BOTH);
@@ -253,6 +254,7 @@
     		fExpression.dispose();
     	}
     	fDetailPane.dispose();
+    	fContext.dispose();
 		return super.close();
 	}