[205733] Content assist fails when editing web.xml or faces-config.xml in XML Editor
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
index fe464f2..fc04743 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/FileBufferModelManager.java
@@ -410,6 +410,28 @@
 		return id;
 	}
 
+	/**
+	 * Registers "interest" in a document, or rather the file buffer that
+	 * backs it. Intentionally used to alter the reference count of the file
+	 * buffer so it is not accidentally disposed of.
+	 */
+	public boolean connect(IDocument document) {
+		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
+		if( info == null)
+			return false;
+		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
+		IPath bufferLocation = info.buffer.getLocation();
+		boolean isOK = true;
+		try {
+			bufferManager.connect(bufferLocation, LocationKind.NORMALIZE, null);
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+			isOK = false;
+		}
+		return isOK;
+	}
+
 	URIResolver createURIResolver(ITextFileBuffer buffer) {
 		IPath location = buffer.getLocation();
 		IFile workspaceFile = FileBuffers.getWorkspaceFileAtLocation(location);
@@ -495,6 +517,28 @@
 		return type;
 	}
 
+	/**
+	 * Deregisters "interest" in a document, or rather the file buffer that
+	 * backs it. Intentionally used to alter the reference count of the file
+	 * buffer so that it knows it can safely be disposed of.
+	 */
+	public boolean disconnect(IDocument document) {
+		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
+		if( info == null)
+			return false;
+		ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager();
+		IPath bufferLocation = info.buffer.getLocation();
+		boolean isOK = true;
+		try {
+			bufferManager.disconnect(bufferLocation, LocationKind.NORMALIZE, null);
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+			isOK = false;
+		}
+		return isOK;
+	}
+
 	public ITextFileBuffer getBuffer(IDocument document) {
 		if (document == null) {
 			Exception iae = new IllegalArgumentException("can not get a buffer without a document reference"); //$NON-NLS-1$ 
@@ -701,7 +745,7 @@
 		DocumentInfo info = (DocumentInfo) fDocumentMap.get(document);
 		return info != null;
 	}
-
+	
 	public void releaseModel(IDocument document) {
 		if (document == null) {
 			Exception iae = new IllegalArgumentException("can not release a model without a document reference"); //$NON-NLS-1$ 
diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
index 78fa1e2..d4a2c3c 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/model/ModelManagerImpl.java
@@ -401,9 +401,24 @@
 	private void _incrCount(SharedObject sharedObject, ReadEditType type) {
 		if (type == READ) {
 			sharedObject.referenceCountForRead++;
+			FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
 		}
 		else if (type == EDIT) {
 			sharedObject.referenceCountForEdit++;
+			FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
+		}
+		else
+			throw new IllegalArgumentException();
+	}
+
+	private void _decrCount(SharedObject sharedObject, ReadEditType type) {
+		if (type == READ) {
+			sharedObject.referenceCountForRead--;
+			FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
+		}
+		else if (type == EDIT) {
+			sharedObject.referenceCountForEdit--;
+			FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());
 		}
 		else
 			throw new IllegalArgumentException();
@@ -412,9 +427,11 @@
 	private void _initCount(SharedObject sharedObject, ReadEditType type) {
 		if (type == READ) {
 			sharedObject.referenceCountForRead = 1;
+			FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
 		}
 		else if (type == EDIT) {
 			sharedObject.referenceCountForEdit = 1;
+			FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());
 		}
 		else
 			throw new IllegalArgumentException();
@@ -918,7 +935,7 @@
 			// if shared object is in our cache, then simply increment its ref
 			// count,
 			// and return the object.
-			sharedObject.referenceCountForEdit++;
+			_incrCount(sharedObject, EDIT);
 			result = sharedObject.theSharedModel;
 			trace("got existing model for Edit: ", id); //$NON-NLS-1$
 			trace("   incremented referenceCountForEdit ", id, sharedObject.referenceCountForEdit); //$NON-NLS-1$
@@ -971,7 +988,7 @@
 			// if shared object is in our cache, then simply increment its ref
 			// count,
 			// and return the object.
-			sharedObject.referenceCountForRead++;
+			_incrCount(sharedObject, READ);
 			result = sharedObject.theSharedModel;
 		}
 		return result;
@@ -1393,7 +1410,7 @@
 
 
 			if (sharedObject != null) {
-				sharedObject.referenceCountForEdit--;
+				_decrCount(sharedObject, EDIT);
 				if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
 					discardModel(id, sharedObject);
 				}
@@ -1489,7 +1506,7 @@
 		}
 
 		if (sharedObject != null) {
-			sharedObject.referenceCountForRead--;
+			_decrCount(sharedObject, READ);
 			if ((sharedObject.referenceCountForRead == 0) && (sharedObject.referenceCountForEdit == 0)) {
 				discardModel(id, sharedObject);
 			}