[95960] many more fixes, details in bug
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapter.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapter.java
index d787f9e..d2afb19 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapter.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapter.java
@@ -56,7 +56,8 @@
 
 	INodeNotifier getTarget();
 
+	/** @deprecated not used? use release() **/
 	public void release(Object key);
-
-
+	
+	public void release();
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterFactory.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterFactory.java
index 61a13f1..f68cf14 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterFactory.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterFactory.java
@@ -56,7 +56,6 @@
 			if (node.getNodeType() == Node.DOCUMENT_NODE) {
 				result = getAdapterInstance(target);
 				ContentSettingsChangeSubject.getSubject().addListener(result);
-
 			}
 
 		}
@@ -66,6 +65,7 @@
 	public void release() {
 		if (pageDirectiveAdapterInstance != null) {
 			ContentSettingsChangeSubject.getSubject().removeListener(pageDirectiveAdapterInstance);
+			pageDirectiveAdapterInstance.release();
 		}
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
index aa4f1ed..2070bda 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/document/PageDirectiveAdapterImpl.java
@@ -606,7 +606,24 @@
 					}
 				}
 			}
+			embeddedTypeHandler = null;
 		}
-
+	}
+	
+	public void release() {
+		if (embeddedTypeHandler != null) {
+			if (embeddedFactoryRegistry != null) {
+				Iterator iterator = embeddedFactoryRegistry.iterator();
+				INodeAdapterFactory factory = null;
+				while (iterator.hasNext()) {
+					factory = (INodeAdapterFactory) iterator.next();
+					factory.release();
+				}
+			}
+			// pa_TODO: possibly need to release here...
+			// or "uninitializeFactoryRegistry"
+			// initializeFactoryRegistry was called from JSPModelLoader
+			embeddedTypeHandler = null;
+		}
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/DOMDocumentForJSP.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/DOMDocumentForJSP.java
index 6584c04..a3a2cff 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/DOMDocumentForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/domdocument/DOMDocumentForJSP.java
@@ -52,8 +52,8 @@
 		if(oldAdapter != null) {
 			if(oldAdapter instanceof IReleasable) {
 				((IReleasable)oldAdapter).release();
-				removeAdapter(oldAdapter);
 			}
+			removeAdapter(oldAdapter);
 		}
 		
 		INodeAdapter result = null;
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
index 6e1aad3..886f9cd 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/JSPContentAssistProcessor.java
@@ -65,6 +65,7 @@
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer;
 import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
 import org.eclipse.wst.sse.core.internal.util.StringUtils;
+import org.eclipse.wst.sse.ui.internal.IReleasable;
 import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
 import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
 import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
@@ -1086,10 +1087,8 @@
 				Object key = null;
 				while (it.hasNext()) {
 					key = it.next();
-					// TODO (pa) need to make sure processors w/ release()
-					// implement releasable
-					if (map.get(key) instanceof AbstractContentAssistProcessor) {
-						((AbstractContentAssistProcessor) map.get(key)).release();
+					if (map.get(key) instanceof IReleasable ) {
+						((IReleasable) map.get(key)).release();
 					}
 				}
 			}
diff --git a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
index 9d3f2df..c7c4155 100644
--- a/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
+++ b/bundles/org.eclipse.jst.jsp.ui/src/org/eclipse/jst/jsp/ui/internal/contentassist/NoRegionContentAssistProcessorForJSP.java
@@ -40,30 +40,28 @@
 	protected void initPartitionToProcessorMap() {
 		super.initPartitionToProcessorMap();
 		IContentAssistProcessor jspContentAssistProcessor = new JSPContentAssistProcessor();
+
 		// JSP
-		fPartitionToProcessorMap.put(IStructuredPartitionTypes.DEFAULT_PARTITION, jspContentAssistProcessor);
-		fPartitionToProcessorMap.put(IXMLPartitions.XML_DEFAULT, jspContentAssistProcessor);
-		fPartitionToProcessorMap.put(IHTMLPartitionTypes.HTML_DEFAULT, jspContentAssistProcessor);
-		fPartitionToProcessorMap.put(IHTMLPartitionTypes.HTML_COMMENT, jspContentAssistProcessor);
-		fPartitionToProcessorMap.put(IJSPPartitionTypes.JSP_DEFAULT, jspContentAssistProcessor);
-		// JSP directives
-		fPartitionToProcessorMap.put(IJSPPartitionTypes.JSP_DIRECTIVE, jspContentAssistProcessor);
-		// JSP delimiters
-		fPartitionToProcessorMap.put(IJSPPartitionTypes.JSP_CONTENT_DELIMITER, jspContentAssistProcessor);
-		// JSP JavaScript
-		fPartitionToProcessorMap.put(IJSPPartitionTypes.JSP_CONTENT_JAVASCRIPT, jspContentAssistProcessor);
+		addPartitionProcessor(IStructuredPartitionTypes.DEFAULT_PARTITION, jspContentAssistProcessor);
+		addPartitionProcessor(IXMLPartitions.XML_DEFAULT, jspContentAssistProcessor);
+		addPartitionProcessor(IHTMLPartitionTypes.HTML_DEFAULT, jspContentAssistProcessor);
+		addPartitionProcessor(IHTMLPartitionTypes.HTML_COMMENT, jspContentAssistProcessor);
+		addPartitionProcessor(IJSPPartitionTypes.JSP_DEFAULT, jspContentAssistProcessor);
+		addPartitionProcessor(IJSPPartitionTypes.JSP_DIRECTIVE, jspContentAssistProcessor);
+		addPartitionProcessor(IJSPPartitionTypes.JSP_CONTENT_DELIMITER, jspContentAssistProcessor);
+		addPartitionProcessor(IJSPPartitionTypes.JSP_CONTENT_JAVASCRIPT, jspContentAssistProcessor);
 
 		IContentAssistProcessor jspJavaContentAssistProcessor = new JSPJavaContentAssistProcessor();
-		// JSP Java
-		fPartitionToProcessorMap.put(IJSPPartitionTypes.JSP_CONTENT_JAVA, jspJavaContentAssistProcessor);
+		addPartitionProcessor(IJSPPartitionTypes.JSP_CONTENT_JAVA, jspJavaContentAssistProcessor);
+
 	}
 
 	protected void initNameToProcessorMap() {
 		super.initNameToProcessorMap();
 		JSPPropertyContentAssistProcessor jspPropertyCAP = new JSPPropertyContentAssistProcessor();
-		fNameToProcessorMap.put(JSP11Namespace.ElementName.SETPROPERTY, jspPropertyCAP);
-		fNameToProcessorMap.put(JSP11Namespace.ElementName.GETPROPERTY, jspPropertyCAP);
-		fNameToProcessorMap.put(JSP11Namespace.ElementName.USEBEAN, new JSPUseBeanContentAssistProcessor());
+		addNameProcessor(JSP11Namespace.ElementName.SETPROPERTY, jspPropertyCAP);
+		addNameProcessor(JSP11Namespace.ElementName.GETPROPERTY, jspPropertyCAP);
+		addNameProcessor(JSP11Namespace.ElementName.USEBEAN, new JSPUseBeanContentAssistProcessor());
 	}
 
 	private void initJSPContexts() {
@@ -71,7 +69,9 @@
 	}
 
 	/**
-	 * Quick check to see if context (String) should map to JSPContentAssistProcessor.
+	 * Quick check to see if context (String) should map to
+	 * JSPContentAssistProcessor.
+	 * 
 	 * @param context
 	 * @return if it's a JSP Region (for which we need JSP Content assist)
 	 */
@@ -89,7 +89,7 @@
 		if (p == null) {
 			IStructuredDocumentRegion sdRegion = ((IStructuredDocument) viewer.getDocument()).getRegionAtCharacterOffset(documentOffset);
 			if (isJSPRegion(sdRegion))
-				p = (IContentAssistProcessor) fPartitionToProcessorMap.get(IJSPPartitionTypes.JSP_CONTENT_JAVA);
+				p = getPartitionProcessor(IJSPPartitionTypes.JSP_CONTENT_JAVA);
 		}
 		return p;
 	}
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java
index 7b4e7e5..7241f28 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/document/HTMLDocumentTypeAdapterFactory.java
@@ -58,10 +58,14 @@
 		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85484
 		
 		// remove old adapter, or else they may collect
-		DocumentTypeAdapter oldAdapter = (DocumentTypeAdapter)notifier.getExistingAdapter(DocumentTypeAdapter.class);
-		if(oldAdapter != null) {
-			oldAdapter.release();
-			notifier.removeAdapter(oldAdapter);
+//		DocumentTypeAdapter oldAdapter = (DocumentTypeAdapter)notifier.getExistingAdapter(DocumentTypeAdapter.class);
+//		if(oldAdapter != null) {
+//			oldAdapter.release();
+//			notifier.removeAdapter(oldAdapter);
+//		}
+		if(fAdapter != null && fNotifier != null) {
+			fAdapter.release();
+			fNotifier.removeAdapter(fAdapter);
 		}
 		
 		DocumentTypeAdapter adapter = null;
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java
index 3e63176..a63a6f2 100644
--- a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java
+++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/contentassist/NoRegionContentAssistProcessorForHTML.java
@@ -23,15 +23,16 @@
  */
 public class NoRegionContentAssistProcessorForHTML extends NoRegionContentAssistProcessor {
 	protected void initPartitionToProcessorMap() {
+		
 		super.initPartitionToProcessorMap();
 		IContentAssistProcessor htmlProcessor = new HTMLContentAssistProcessor();
-		fPartitionToProcessorMap.put(IHTMLPartitionTypes.HTML_DEFAULT, htmlProcessor);
-		fPartitionToProcessorMap.put(IHTMLPartitionTypes.HTML_COMMENT, htmlProcessor);
+		addPartitionProcessor(IHTMLPartitionTypes.HTML_DEFAULT, htmlProcessor);
+		addPartitionProcessor(IHTMLPartitionTypes.HTML_COMMENT, htmlProcessor);
 
 		IContentAssistProcessor jsContentAssistProcessor = new JavaScriptContentAssistProcessor();
-		fPartitionToProcessorMap.put(IHTMLPartitionTypes.SCRIPT, jsContentAssistProcessor);
+		addPartitionProcessor(IHTMLPartitionTypes.SCRIPT, jsContentAssistProcessor);
 
 		IContentAssistProcessor cssContentAssistProcessor = new CSSContentAssistProcessor();
-		fPartitionToProcessorMap.put(ICSSPartitionTypes.STYLE, cssContentAssistProcessor);
+		addPartitionProcessor(ICSSPartitionTypes.STYLE, cssContentAssistProcessor);
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java
index b1b5643..8743104 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/AbstractStructuredModel.java
@@ -239,6 +239,8 @@
 		// get it, in order to disconnect from it.)
 		if (fStructuredDocument != null) {
 			fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);
+			fStructuredDocument.removeDocumentAboutToChangeListener(fDocumentToModelNotifier);
+			fStructuredDocument.removeDocumentChangedListener(fDocumentToModelNotifier);
 		}
 	}
 
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
index de1e224..8d7086d 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/provisional/StructuredTextViewerConfiguration.java
@@ -372,6 +372,8 @@
 		// save for reinit and release
 		IContentAssistProcessor previousProcessor = ca.getContentAssistProcessor(partitionType);
 		if (previousProcessor != null) {
+			if(previousProcessor instanceof IReleasable)
+				((IReleasable)previousProcessor).release();
 			fContentAssistProcessors.remove(previousProcessor);
 		}
 		fContentAssistProcessors.add(newProcessor);
diff --git a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java
index 3be09fb..4ad91b2 100644
--- a/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java
+++ b/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/reconcile/StructuredRegionProcessor.java
@@ -25,8 +25,6 @@
 import org.eclipse.jface.text.reconciler.DirtyRegion;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
 import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
 import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
@@ -73,19 +71,6 @@
 		}
 	}
 
-	/**
-	 * Cancels any running reconcile operations via progress monitor. Ensures
-	 * that strategies are released on close of the editor.
-	 */
-	private class SourceWidgetDisposeListener implements DisposeListener {
-
-		public void widgetDisposed(DisposeEvent e) {
-			handleWidgetDisposed();
-		}
-	}
-
-	/** to cancel any long running reconciles if someone closes the editor */
-	private SourceWidgetDisposeListener fDisposeListener = null;
 	/** for initital reconcile when document is opened */
 	private SourceTextInputListener fTextInputListener = null;
 
@@ -298,24 +283,6 @@
 		}
 	}
 
-	public void handleWidgetDisposed() {
-
-		getLocalProgressMonitor().setCanceled(true);
-
-		List strategyTypes = getStrategyTypes();
-		if (!strategyTypes.isEmpty()) {
-			Iterator it = strategyTypes.iterator();
-			IReconcilingStrategy strategy = null;
-			while (it.hasNext()) {
-				strategy = getReconcilingStrategy((String) it.next());
-				if (strategy instanceof IReleasable) {
-					((IReleasable) strategy).release();
-					strategy = null;
-				}
-			}
-		}
-	}
-
 	/**
 	 * @param document
 	 */
@@ -340,9 +307,7 @@
 	public void install(ITextViewer textViewer) {
 
 		super.install(textViewer);
-		fDisposeListener = new SourceWidgetDisposeListener();
 		fTextInputListener = new SourceTextInputListener();
-		textViewer.getTextWidget().addDisposeListener(fDisposeListener);
 		textViewer.addTextInputListener(fTextInputListener);
 	}
 
@@ -452,7 +417,8 @@
 		// unhook old lifecycle listner
 		unhookModelLifecycleListener(currentDoc);
 		// add new lifecycle listener
-		hookUpModelLifecycleListener(newDocument);
+		if(newDocument != null)
+			hookUpModelLifecycleListener(newDocument);
 
 		// unhook old document listener
 		if (currentDoc != null && currentDoc instanceof IStructuredDocument)
@@ -516,8 +482,32 @@
 	 */
 	public void uninstall() {
 		if (isInstalled()) {
+			
+			getLocalProgressMonitor().setCanceled(true);
+			
+			// removes model listeners
+			unhookModelLifecycleListener(getDocument());
+			
+			// removes document listeners
+			reconcilerDocumentChanged(null);
+			
+			// removes widget listener
 			getTextViewer().removeTextInputListener(fTextInputListener);
-			getTextViewer().getTextWidget().removeDisposeListener(fDisposeListener);
+			//getTextViewer().getTextWidget().removeDisposeListener(fDisposeListener);
+			
+			// release all strategies
+			List strategyTypes = getStrategyTypes();
+			if (!strategyTypes.isEmpty()) {
+				Iterator it = strategyTypes.iterator();
+				IReconcilingStrategy strategy = null;
+				while (it.hasNext()) {
+					strategy = getReconcilingStrategy((String) it.next());
+					if (strategy instanceof IReleasable) {
+						((IReleasable) strategy).release();
+						strategy = null;
+					}
+				}
+			}
 		}
 		super.uninstall();
 	}
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
index ddfb066..97cde65 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/AbstractContentAssistProcessor.java
@@ -116,7 +116,6 @@
 	private final boolean showValues = true;
 
 	public AbstractContentAssistProcessor() {
-		super();
 		init();
 	}
 
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java
index 655a59c..5d31911 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/contentassist/NoRegionContentAssistProcessor.java
@@ -49,8 +49,8 @@
 
 	private final ICompletionProposal[] EMPTY_PROPOSAL_SET = new ICompletionProposal[0];
 	protected String fErrorMessage = null;
-	protected HashMap fNameToProcessorMap = null;
-	protected HashMap fPartitionToProcessorMap = null;
+	private HashMap fNameToProcessorMap = null;
+	private HashMap fPartitionToProcessorMap = null;
 	protected IResource fResource = null;
 
 	public NoRegionContentAssistProcessor() {
@@ -62,6 +62,33 @@
 
 	}
 
+	protected void addPartitionProcessor(String key, IContentAssistProcessor processor) {
+		addProcessor(fPartitionToProcessorMap, key, processor);
+	}
+	protected void addNameProcessor(String key, IContentAssistProcessor processor) {
+		addProcessor(fNameToProcessorMap, key, processor);
+	}
+	protected IContentAssistProcessor getPartitionProcessor(String key) {
+		return (IContentAssistProcessor)fPartitionToProcessorMap.get(key);
+	}
+	
+	/**
+	 * Ensures release if it's a duplicate partition type.
+	 * 
+	 * @param map
+	 * @param key
+	 * @param processor
+	 */
+	private void addProcessor(HashMap map, String key, IContentAssistProcessor processor) {
+		Object o = map.remove(key);
+		if(o != null) {
+			if(o instanceof IReleasable) {
+				((IReleasable)o).release();
+			}
+		}
+		map.put(key, processor);
+	}
+	
 	/**
 	 * Figures out what the correct ICompletionProposalProcessor is and
 	 * computesCompletionProposals on that.
@@ -210,7 +237,7 @@
 	 */
 	protected void initPartitionToProcessorMap() {
 		XMLContentAssistProcessor xmlProcessor = new XMLContentAssistProcessor();
-		fPartitionToProcessorMap.put(IXMLPartitions.XML_DEFAULT, xmlProcessor);
+		addProcessor(fPartitionToProcessorMap, IXMLPartitions.XML_DEFAULT, xmlProcessor);
 	}
 
 	public void release() {
@@ -224,8 +251,9 @@
 			Object key = null;
 			while (it.hasNext()) {
 				key = it.next();
-				if (map.get(key) instanceof IReleasable)
+				if (map.get(key) instanceof IReleasable) {
 					((IReleasable) map.get(key)).release();
+				}
 			}
 			map.clear();
 			map = null;