[122340] DTD Outline context menu missing
diff --git a/bundles/org.eclipse.wst.dtd.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.dtd.core/META-INF/MANIFEST.MF
index adc2aa8..eb1635a 100644
--- a/bundles/org.eclipse.wst.dtd.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.dtd.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.dtd.core; singleton:=true
-Bundle-Version: 1.0.0
+Bundle-Version: 1.0.1
 Bundle-Activator: org.eclipse.wst.dtd.core.internal.DTDCorePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/Element.java b/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/Element.java
index 989b57e..04904e5 100644
--- a/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/Element.java
+++ b/bundles/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/Element.java
@@ -30,7 +30,7 @@
 
 	List attributes = new ArrayList();
 
-	protected CMNode contentModel;
+	protected CMNode fContentModel;
 
 	public Element(DTDFile dtdFile, IStructuredDocumentRegion flatNode) {
 		super(dtdFile, flatNode, DTDRegionTypes.ELEMENT_TAG);
@@ -130,9 +130,12 @@
 	}
 
 	public void replaceContentModel(Object requestor, CMNode node) {
+		replaceContentModel(requestor, node.getNodeText());
+	}
+
+	public void replaceContentModel(Object requestor, String nodeText) {
 		int offset = 0;
 		int length = 0;
-		String nodeText = node.getNodeText();
 		CMNode contentModel = getContentModel();
 		if (contentModel != null) {
 			offset = contentModel.getStartOffset();
@@ -147,7 +150,7 @@
 	public void resolveRegions() {
 		// System.out.println("element node stream = " +
 		// tokenStream.getString());
-		contentModel = null;
+		fContentModel = null;
 		removeChildNodes();
 		RegionIterator iter = iterator();
 
@@ -159,22 +162,22 @@
 		while (iter.hasNext()) {
 			ITextRegion currentRegion = iter.next();
 
-			if (contentModel == null) {
+			if (fContentModel == null) {
 				if (currentRegion.getType().equals(DTDRegionTypes.NAME)) {
-					contentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
+					fContentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
 				}
 				else if (currentRegion.getType().equals(DTDRegionTypes.CONTENT_PCDATA)) {
-					contentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
+					fContentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
 				}
 				else if (currentRegion.getType().equals(DTDRegionTypes.LEFT_PAREN)) {
-					contentModel = new CMGroupNode(getDTDFile(), getStructuredDTDDocumentRegion());
+					fContentModel = new CMGroupNode(getDTDFile(), getStructuredDTDDocumentRegion());
 				}
 			}
 
-			if (contentModel != null) {
+			if (fContentModel != null) {
 				if (!currentRegion.getType().equals(DTDRegionTypes.END_TAG)) {
 					// content model gets all regions except for the '>'
-					contentModel.addRegion(currentRegion);
+					fContentModel.addRegion(currentRegion);
 				}
 				else {
 					// if it is equal to the end tag, then don't add anymore
@@ -186,17 +189,17 @@
 			}
 
 		}
-		if (contentModel != null) {
-			appendChild(contentModel);
+		if (fContentModel != null) {
+			appendChild(fContentModel);
 			// this is the root element content so set it true
-			contentModel.setRootElementContent(true);
+			fContentModel.setRootElementContent(true);
 			// now tell the content model to resolve it's regions
-			contentModel.resolveRegions();
+			fContentModel.resolveRegions();
 
 		}
 	}
 
 	public void setContentModel(CMNode contentModel) {
-		this.contentModel = contentModel;
+		this.fContentModel = contentModel;
 	}
 }
diff --git a/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
index 1d26844..ebc987d 100644
--- a/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.dtd.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.dtd.ui; singleton:=true
-Bundle-Version: 1.0.0
+Bundle-Version: 1.0.1
 Bundle-Activator: org.eclipse.wst.dtd.ui.internal.DTDUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeAction.java
index 736591d..db4936f 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeAction.java
@@ -18,13 +18,13 @@
 import org.eclipse.wst.dtd.core.internal.AttributeList;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
 import org.eclipse.wst.dtd.core.internal.Element;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddAttributeAction extends BaseAction {
 
-	public AddAttributeAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddAttributeAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeListAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeListAction.java
index e03f0dc..784251a 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeListAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddAttributeListAction.java
@@ -17,13 +17,13 @@
 import org.eclipse.wst.dtd.core.internal.DTDFile;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
 import org.eclipse.wst.dtd.core.internal.Element;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddAttributeListAction extends BaseAction {
 
-	public AddAttributeListAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddAttributeListAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddCommentAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddCommentAction.java
index 303e916..e6c6976 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddCommentAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddCommentAction.java
@@ -16,13 +16,13 @@
 
 
 import org.eclipse.wst.dtd.core.internal.DTDNode;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddCommentAction extends BaseAction {
 
-	public AddCommentAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddCommentAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementAction.java
index caaf3b4..108a36a 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementAction.java
@@ -14,14 +14,14 @@
 
 import org.eclipse.wst.dtd.core.internal.DTDFile;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 import org.eclipse.wst.dtd.core.internal.util.DTDUniqueNameHelper;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
 
 
 public class AddElementAction extends BaseAction {
 
-	public AddElementAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddElementAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementToContentModelAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementToContentModelAction.java
index 3176640..403026b 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementToContentModelAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddElementToContentModelAction.java
@@ -18,13 +18,13 @@
 import org.eclipse.wst.dtd.core.internal.CMGroupNode;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
 import org.eclipse.wst.dtd.core.internal.Element;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddElementToContentModelAction extends BaseAction {
 
-	public AddElementToContentModelAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddElementToContentModelAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddEntityAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddEntityAction.java
index 54be4d7..4b14bfc 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddEntityAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddEntityAction.java
@@ -16,13 +16,13 @@
 
 
 import org.eclipse.wst.dtd.core.internal.DTDNode;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddEntityAction extends BaseAction {
 
-	public AddEntityAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddEntityAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddGroupToContentModelAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddGroupToContentModelAction.java
index 728fb3b..72e6e8e 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddGroupToContentModelAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddGroupToContentModelAction.java
@@ -17,15 +17,13 @@
 import org.eclipse.wst.dtd.core.internal.CMGroupNode;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
 import org.eclipse.wst.dtd.core.internal.Element;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddGroupToContentModelAction extends BaseAction {
 
-	// private Object element;
-
-	public AddGroupToContentModelAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddGroupToContentModelAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddNotationAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddNotationAction.java
index 1321726..fb1f071 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddNotationAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddNotationAction.java
@@ -15,13 +15,13 @@
 package org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions;
 
 import org.eclipse.wst.dtd.core.internal.DTDNode;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 
 
 public class AddNotationAction extends BaseAction {
 
-	public AddNotationAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddNotationAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddParameterEntityReferenceAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddParameterEntityReferenceAction.java
index 53f9b07..4c38894 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddParameterEntityReferenceAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/AddParameterEntityReferenceAction.java
@@ -16,13 +16,13 @@
 
 import org.eclipse.wst.dtd.core.internal.DTDFile;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 import org.eclipse.wst.dtd.core.internal.util.LabelValuePair;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
 
 
 public class AddParameterEntityReferenceAction extends BaseAction {
-	public AddParameterEntityReferenceAction(StructuredTextEditor editor, String label) {
-		super(editor, label);
+	public AddParameterEntityReferenceAction(DTDModelImpl model, String label) {
+		super(model, label);
 	}
 
 	public String getFirstExternalParameterEntity(DTDFile dtdFile) {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/BaseAction.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/BaseAction.java
index 5c32081..158737c 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/BaseAction.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/internal/views/contentoutline/actions/BaseAction.java
@@ -22,33 +22,29 @@
 import org.eclipse.ui.actions.SelectionListenerAction;
 import org.eclipse.wst.dtd.core.internal.DTDNode;
 import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 
 
 abstract public class BaseAction extends SelectionListenerAction {
 
 	protected IEditorActionBarContributor contextContributor;
-	private StructuredTextEditor fTextEditor;
+	private IStructuredModel fModel;
 
-	public BaseAction(StructuredTextEditor editor, String text) {
-		this(editor, text, null);
+	public BaseAction(IStructuredModel model, String text) {
+		this(model, text, null);
 	}
 
-	public BaseAction(StructuredTextEditor editor, String text, ImageDescriptor imageDesc) {
+	public BaseAction(IStructuredModel model, String text, ImageDescriptor imageDesc) {
 		super(text);
-		fTextEditor = editor;
+		fModel = model;
 		setImageDescriptor(imageDesc);
 	}
 
-	public IEditorActionBarContributor getContextContributor() {
-		return contextContributor;
-	}
-
-	public DTDNode getFirstNodeSelected() {
+	protected DTDNode getFirstNodeSelected() {
 		return getFirstNodeSelected(getStructuredSelection());
 	}
 
-	public DTDNode getFirstNodeSelected(IStructuredSelection selection) {
+	protected DTDNode getFirstNodeSelected(IStructuredSelection selection) {
 		Iterator iter = selection.iterator();
 		// DTDNode referencePoint = null;
 		while (iter.hasNext()) {
@@ -60,15 +56,8 @@
 		return null;
 	}
 
-	public DTDModelImpl getModel() {
-		return (DTDModelImpl) getTextEditor().getModel();
-	}
-
-	/**
-	 * @return Returns the textEditor.
-	 */
-	public StructuredTextEditor getTextEditor() {
-		return fTextEditor;
+	protected DTDModelImpl getModel() {
+		return (DTDModelImpl) fModel;
 	}
 
 	public void setContextContributor(IEditorActionBarContributor contributor) {
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
index d3ac8b8..ce87173 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContentOutlineConfiguration.java
@@ -29,6 +29,7 @@
 import org.eclipse.wst.common.ui.internal.dnd.ObjectTransfer;
 import org.eclipse.wst.common.ui.internal.dnd.ViewerDragAdapter;
 import org.eclipse.wst.common.ui.internal.dnd.ViewerDropAdapter;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 import org.eclipse.wst.dtd.ui.internal.DTDUIPlugin;
 import org.eclipse.wst.dtd.ui.internal.dnd.DTDDragAndDropManager;
 import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem;
@@ -122,14 +123,15 @@
 	 * @see org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration#getMenuListener(org.eclipse.jface.viewers.TreeViewer)
 	 */
 	public IMenuListener getMenuListener(TreeViewer viewer) {
-		if (fMenuHelper == null) {
-			// fMenuHelper = new DTDContextMenuHelper(getEditor());
-			// System.out.println("DTDContextMenuHelper not implemented");
-			// //$NON-NLS-1$
+		IMenuListener listener = null;
+		if (fMenuHelper == null && viewer.getInput() instanceof DTDModelImpl) {
+			fMenuHelper = new DTDContextMenuHelper((DTDModelImpl) viewer.getInput());
+			fMenuHelper.createMenuListenersFor(viewer);
 		}
-		// fMenuHelper.createMenuListenersFor(viewer);
-		// return fMenuHelper.getMenuListener();
-		return null;
+		if (fMenuHelper != null) {
+			listener = fMenuHelper.getMenuListener();
+		}
+		return listener;
 	}
 
 	/*
@@ -227,7 +229,8 @@
 		super.unconfigure(viewer);
 		fViewerContributions.remove(viewer);
 		if (fMenuHelper != null) {
-			// fMenuHelper.removeMenuListenersFor(viewer);
+			fMenuHelper.removeMenuListenersFor(viewer);
+			fMenuHelper = null;
 		}
 	}
 }
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContextMenuHelper.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContextMenuHelper.java
index 76bff7c..5dfc6ba 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContextMenuHelper.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDContextMenuHelper.java
@@ -13,70 +13,115 @@
 
 package org.eclipse.wst.dtd.ui.views.contentoutline;
 
-/**
- * Menu helper for Content Outline page.  This should not be used elsewhere.
- */
-class DTDContextMenuHelper // extends FocusAdapter
-{
-/*
+import java.util.ArrayList;
+import java.util.List;
 
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.wst.dtd.core.internal.AttributeList;
+import org.eclipse.wst.dtd.core.internal.CMGroupNode;
+import org.eclipse.wst.dtd.core.internal.CMNode;
+import org.eclipse.wst.dtd.core.internal.DTDFile;
+import org.eclipse.wst.dtd.core.internal.DTDNode;
+import org.eclipse.wst.dtd.core.internal.Element;
+import org.eclipse.wst.dtd.core.internal.NodeList;
+import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
+import org.eclipse.wst.dtd.core.internal.parser.DTDRegionTypes;
+import org.eclipse.wst.dtd.core.internal.util.LabelValuePair;
+import org.eclipse.wst.dtd.ui.internal.DTDUIMessages;
+import org.eclipse.wst.dtd.ui.internal.editor.DTDEditorPluginImageHelper;
+import org.eclipse.wst.dtd.ui.internal.editor.DTDEditorPluginImages;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddAttributeAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddAttributeListAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddCommentAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddElementAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddElementToContentModelAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddEntityAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddGroupToContentModelAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddNotationAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.AddParameterEntityReferenceAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.DeleteAction;
+import org.eclipse.wst.dtd.ui.internal.views.contentoutline.actions.ReplaceEmptyContentModelWithGroupAction;
+
+/**
+ * Menu helper for Content Outline page. This should not be used elsewhere.
+ */
+class DTDContextMenuHelper {
 	class DTDMenuListener implements IMenuListener {
 		public void menuAboutToShow(IMenuManager manager) {
-			updateActions();
-			Object node = null;
-			IContentOutlinePage outline = (IContentOutlinePage) DTDContextMenuHelper.this.fEditor.getAdapter(IContentOutlinePage.class);
-			ISelection selection = outline.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				node = ((IStructuredSelection) selection).getFirstElement();
-			}
-			if (node == null && selection instanceof ITextSelection) {
-				node = fEditor.getModel().getIndexedRegion(((ITextSelection) selection).getOffset());
-			}
-			if (node != null) {
-				addActionItemsForSelection(node, manager);
+			// update the action selection now
+			addNotationAction.selectionChanged(fViewerSelection);
+			addEntityAction.selectionChanged(fViewerSelection);
+			addElementAction.selectionChanged(fViewerSelection);
+			addCommentAction.selectionChanged(fViewerSelection);
+			addParameterEntityReferenceAction.selectionChanged(fViewerSelection);
+			deleteAction.selectionChanged(fViewerSelection);
+			addAttributeAction.selectionChanged(fViewerSelection);
+			addAttributeListAction.selectionChanged(fViewerSelection);
+			addGroupToContentModelAction.selectionChanged(fViewerSelection);
+			addElementToContentModelAction.selectionChanged(fViewerSelection);
+			replaceEmptyContentModelWithGroupAction.selectionChanged(fViewerSelection);
+
+
+			if (!fViewerSelection.isEmpty()) {
+				addActionItemsForSelection(fViewerSelection.getFirstElement(), manager);
 			}
 		}
 	}
 
-	private AddAttributeAction addAttributeAction;
-	private AddAttributeListAction addAttributeListAction;
-	private AddCommentAction addCommentAction;
-	private AddElementAction addElementAction;
-	private AddElementToContentModelAction addElementToContentModelAction;
-	private AddEntityAction addEntityAction;
-	private AddGroupToContentModelAction addGroupToContentModelAction;
-	private AddNotationAction addNotationAction;
-	private AddParameterEntityReferenceAction addParameterEntityReferenceAction;
-	private DeleteAction deleteAction;
+	class ViewerSelectionChangeListener implements ISelectionChangedListener {
+		public void selectionChanged(SelectionChangedEvent event) {
+			_selectionChanged(event);
+		}
+	}
 
-	// default access, for inner class
-	IEditorPart fEditor;
+	AddAttributeAction addAttributeAction;
+
+	AddAttributeListAction addAttributeListAction;
+	AddCommentAction addCommentAction;
+	AddElementAction addElementAction;
+	AddElementToContentModelAction addElementToContentModelAction;
+	AddEntityAction addEntityAction;
+	AddGroupToContentModelAction addGroupToContentModelAction;
+	AddNotationAction addNotationAction;
+	AddParameterEntityReferenceAction addParameterEntityReferenceAction;
+	DeleteAction deleteAction;
+	private ISelectionChangedListener fInternalSelectionChangedListener = new ViewerSelectionChangeListener();
 
 	private IMenuListener fMenuListener;
-	private IAction redoAction;
+	private DTDModelImpl fModel;
+	private List fViewerList;
 
-	// protected CutAction cutAction;
-	// protected CopyAction copyAction;
-	// protected PasteAction pasteAction;
-	private IAction undoAction;
+	IStructuredSelection fViewerSelection = StructuredSelection.EMPTY;
 
-	// private List viewerList = new Vector();
+	ReplaceEmptyContentModelWithGroupAction replaceEmptyContentModelWithGroupAction;
 
-	public DTDContextMenuHelper(IEditorPart editor) {
-		this.fEditor = editor;
+	public DTDContextMenuHelper(DTDModelImpl model) {
+		fModel = model;
+		fViewerList = new ArrayList(1);
 		fMenuListener = new DTDMenuListener();
-		addNotationAction = new AddNotationAction(editor, DTDUIMessages._UI_ACTION_ADD_DTD_NOTATION); //$NON-NLS-1$
-		addEntityAction = new AddEntityAction(editor, DTDUIMessages._UI_ACTION_ADD_DTD_ENTITY); //$NON-NLS-1$
-		addElementAction = new AddElementAction(editor, DTDUIMessages._UI_ACTION_ADD_DTD_ELEMENT); //$NON-NLS-1$
-		addCommentAction = new AddCommentAction(editor, DTDUIMessages._UI_ACTION_ADD_DTD_COMMENT); //$NON-NLS-1$
 
-		addParameterEntityReferenceAction = new AddParameterEntityReferenceAction(editor, DTDUIMessages._UI_ACTION_ADD_PARAM_ENTITY_REF); //$NON-NLS-1$
+		addNotationAction = new AddNotationAction(model, DTDUIMessages._UI_ACTION_ADD_DTD_NOTATION); //$NON-NLS-1$
+		addEntityAction = new AddEntityAction(model, DTDUIMessages._UI_ACTION_ADD_DTD_ENTITY); //$NON-NLS-1$
+		addElementAction = new AddElementAction(model, DTDUIMessages._UI_ACTION_ADD_DTD_ELEMENT); //$NON-NLS-1$
+		addCommentAction = new AddCommentAction(model, DTDUIMessages._UI_ACTION_ADD_DTD_COMMENT); //$NON-NLS-1$
+
+		addParameterEntityReferenceAction = new AddParameterEntityReferenceAction(model, DTDUIMessages._UI_ACTION_ADD_PARAM_ENTITY_REF); //$NON-NLS-1$
 		deleteAction = new DeleteAction(DTDUIMessages._UI_ACTION_DTD_DELETE); //$NON-NLS-1$
-		addAttributeAction = new AddAttributeAction(editor, DTDUIMessages._UI_ACTION_ADD_ATTRIBUTE); //$NON-NLS-1$
-		addAttributeListAction = new AddAttributeListAction(editor, DTDUIMessages._UI_ACTION_ADD_ATTRIBUTELIST); //$NON-NLS-1$
+		addAttributeAction = new AddAttributeAction(model, DTDUIMessages._UI_ACTION_ADD_ATTRIBUTE); //$NON-NLS-1$
+		addAttributeListAction = new AddAttributeListAction(model, DTDUIMessages._UI_ACTION_ADD_ATTRIBUTELIST); //$NON-NLS-1$
 
-		addGroupToContentModelAction = new AddGroupToContentModelAction(editor, DTDUIMessages._UI_ACTION_GROUP_ADD_GROUP); //$NON-NLS-1$
-		addElementToContentModelAction = new AddElementToContentModelAction(editor, DTDUIMessages._UI_ACTION_ADD_ELEMENT); //$NON-NLS-1$
+		addGroupToContentModelAction = new AddGroupToContentModelAction(model, DTDUIMessages._UI_ACTION_GROUP_ADD_GROUP); //$NON-NLS-1$
+		addElementToContentModelAction = new AddElementToContentModelAction(model, DTDUIMessages._UI_ACTION_ADD_ELEMENT); //$NON-NLS-1$
+
+		replaceEmptyContentModelWithGroupAction = new ReplaceEmptyContentModelWithGroupAction(model, DTDUIMessages._UI_ACTION_GROUP_ADD_GROUP); //$NON-NLS-1$
 
 		addNotationAction.setImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_OBJ_ADD_NOTATION));
 		addEntityAction.setImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_OBJ_ADD_ENTITY));
@@ -103,18 +148,28 @@
 		addElementToContentModelAction.setImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_ETOOL_ADD_ELEMENTTOCONMODEL));
 		addElementToContentModelAction.setHoverImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_CTOOL_ADD_ELEMENTTOCONMODEL));
 		addElementToContentModelAction.setDisabledImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_DTOOL_ADD_ELEMENTTOCONMODEL));
+
+		// use the same images as addGroupToContentModelAction
+		replaceEmptyContentModelWithGroupAction.setImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_ETOOL_ADD_GROUPTOCONMODEL));
+		replaceEmptyContentModelWithGroupAction.setHoverImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_CTOOL_ADD_GROUPTOCONMODEL));
+		replaceEmptyContentModelWithGroupAction.setDisabledImageDescriptor(DTDEditorPluginImageHelper.getInstance().getImageDescriptor(DTDEditorPluginImages.IMG_DTOOL_ADD_GROUPTOCONMODEL));
 	}
 
-	public void addActionItemsForSelection(Object selectedObject, IMenuManager menu) {
-		if (undoAction == null) {
-			undoAction = fEditor.getAction(ActionFactory.UNDO.getId());
-			redoAction = fEditor.getAction(ActionFactory.REDO.getId());
+	void _selectionChanged(SelectionChangedEvent event) {
+		/*
+		 * Save the selection so we only notify the actions when the menu is
+		 * shown
+		 */
+		ISelection selection = event.getSelection();
+		if (selection instanceof IStructuredSelection) {
+			fViewerSelection = (IStructuredSelection) selection;
 		}
+		else {
+			fViewerSelection = StructuredSelection.EMPTY;
+		}
+	}
 
-		menu.add(undoAction);
-		menu.add(redoAction);
-		menu.add(new Separator());
-
+	void addActionItemsForSelection(Object selectedObject, IMenuManager menu) {
 		if (selectedObject instanceof NodeList) {
 			// add appropriate menu to logical view
 			NodeList folder = (NodeList) selectedObject;
@@ -125,7 +180,7 @@
 				menu.add(addEntityAction);
 			}
 			else if (folder.getListType().equals(DTDRegionTypes.ELEMENT_TAG)) {
-				LabelValuePair[] availableEntities = ((DTDModelImpl) fEditor.getModel()).createParmEntityContentItems(null);
+				LabelValuePair[] availableEntities = fModel.createParmEntityContentItems(null);
 				addParameterEntityReferenceAction.setEnabled(availableEntities.length > 0);
 
 				menu.add(addElementAction);
@@ -136,7 +191,7 @@
 			}
 		}
 		if (selectedObject instanceof DTDFile || selectedObject == null) {
-			LabelValuePair[] availableEntities = ((DTDModelImpl) fEditor.getModel()).createParmEntityContentItems(null);
+			LabelValuePair[] availableEntities = fModel.createParmEntityContentItems(null);
 			addParameterEntityReferenceAction.setEnabled(availableEntities.length > 0);
 
 			menu.add(addElementAction);
@@ -151,10 +206,14 @@
 		if (selectedObject instanceof Element) {
 			Element dtdElement = (Element) selectedObject;
 
-			if (dtdElement.getContentModel() == null) {
+			CMNode contentModel = dtdElement.getContentModel();
+			if (contentModel == null) {
 				menu.add(addGroupToContentModelAction);
 				menu.add(addElementToContentModelAction);
 			}
+			else if (contentModel != null && CMNode.EMPTY.equals(contentModel.getType())) {
+				menu.add(replaceEmptyContentModelWithGroupAction);
+			}
 			// if (!(((Element)selectedObject).getContentModel() instanceof
 			// CMGroupNode))
 			// {
@@ -192,7 +251,7 @@
 		}
 	}
 
-	public void addEditActions(IMenuManager menu) {
+	void addEditActions(IMenuManager menu) {
 		// menu.add(undoAction);
 		// menu.add(redoAction);
 		// menu.add(new Separator());
@@ -202,82 +261,24 @@
 	}
 
 	public void createMenuListenersFor(Viewer viewer) {
-		viewer.addSelectionChangedListener(addNotationAction);
-		viewer.addSelectionChangedListener(addEntityAction);
-		viewer.addSelectionChangedListener(addElementAction);
-		viewer.addSelectionChangedListener(addCommentAction);
-		viewer.addSelectionChangedListener(addParameterEntityReferenceAction);
-		viewer.addSelectionChangedListener(deleteAction);
-		viewer.addSelectionChangedListener(addAttributeAction);
-		viewer.addSelectionChangedListener(addAttributeListAction);
-		viewer.addSelectionChangedListener(addGroupToContentModelAction);
-		viewer.addSelectionChangedListener(addElementToContentModelAction);
+		viewer.addSelectionChangedListener(fInternalSelectionChangedListener);
+		ISelection selection = viewer.getSelection();
+		if (selection instanceof IStructuredSelection) {
+			fViewerSelection = (IStructuredSelection) selection;
+		}
+		else {
+			fViewerSelection = StructuredSelection.EMPTY;
+		}
 
-		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-		addNotationAction.selectionChanged(selection);
-		addEntityAction.selectionChanged(selection);
-		addElementAction.selectionChanged(selection);
-		addParameterEntityReferenceAction.selectionChanged(selection);
-		deleteAction.selectionChanged(selection);
-		addAttributeAction.selectionChanged(selection);
-		addAttributeListAction.selectionChanged(selection);
-		addGroupToContentModelAction.selectionChanged(selection);
-		addElementToContentModelAction.selectionChanged(selection);
-
-		// viewer.addSelectionChangedListener(cutAction);
-		// viewer.addSelectionChangedListener(copyAction);
-		// viewer.addSelectionChangedListener(pasteAction);
-
-		// viewerList.add(viewer);
-		// viewer.getControl().addFocusListener(this);
-	}
-
-	public DeleteAction getDeleteAction() {
-		return deleteAction;
+		fViewerList.add(viewer);
 	}
 
 	public IMenuListener getMenuListener() {
 		return fMenuListener;
 	}
 
-	// public void focusGained(FocusEvent event)
-	// {
-	// updateSelection();
-	// }
-
 	public void removeMenuListenersFor(Viewer viewer) {
-		viewer.removeSelectionChangedListener(addNotationAction);
-		viewer.removeSelectionChangedListener(addEntityAction);
-		viewer.removeSelectionChangedListener(addElementAction);
-		viewer.removeSelectionChangedListener(addCommentAction);
-		viewer.removeSelectionChangedListener(addParameterEntityReferenceAction);
-		viewer.removeSelectionChangedListener(deleteAction);
-		viewer.removeSelectionChangedListener(addAttributeAction);
-		viewer.removeSelectionChangedListener(addAttributeListAction);
-		viewer.removeSelectionChangedListener(addGroupToContentModelAction);
-		viewer.removeSelectionChangedListener(addElementToContentModelAction);
+		viewer.removeSelectionChangedListener(fInternalSelectionChangedListener);
+		fViewerList.remove(viewer);
 	}
-
-	// Update all the actions for the viewer in focus
-	public void updateActions() {
-		// undoAction.update();
-		// redoAction.update();
-	}
-
-	public void updateEditActions(IActionBars actionBars) {
-		// if (actionBars != null)
-		// {
-		// actionBars.setGlobalActionHandler(IWorkbenchActionConstants.CUT,
-		// cutAction);
-		// actionBars.setGlobalActionHandler(IWorkbenchActionConstants.COPY,
-		// copyAction);
-		// actionBars.setGlobalActionHandler(IWorkbenchActionConstants.PASTE,
-		// pasteAction);
-		// actionBars.setGlobalActionHandler(IWorkbenchActionConstants.UNDO,
-		// undoAction);
-		// actionBars.setGlobalActionHandler(IWorkbenchActionConstants.REDO,
-		// redoAction);
-		// }
-	}
-*/
 }
diff --git a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDTreeContentProvider.java b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDTreeContentProvider.java
index f4c163d..5c605d4 100644
--- a/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDTreeContentProvider.java
+++ b/bundles/org.eclipse.wst.dtd.ui/src/org/eclipse/wst/dtd/ui/views/contentoutline/DTDTreeContentProvider.java
@@ -37,7 +37,6 @@
 import org.eclipse.wst.dtd.core.internal.document.DTDModelImpl;
 import org.eclipse.wst.dtd.core.internal.event.IDTDFileListener;
 import org.eclipse.wst.dtd.core.internal.event.NodesEvent;
-import org.eclipse.wst.dtd.core.internal.parser.DTDRegionTypes;
 
 class DTDTreeContentProvider implements ITreeContentProvider, IDTDFileListener {
 
@@ -235,7 +234,12 @@
 	}
 
 	private boolean isVisibleNodeList(NodeList nodeList) {
-		return !nodeList.getListType().equals(DTDRegionTypes.ATTLIST_TAG);
+		/*
+		 * All NodesLists should be visible because you can momentarily have
+		 * an ATTLIST (for example) without a corresponding ELEMENT
+		 * declaration
+		 */
+		return true;// !nodeList.getListType().equals(DTDRegionTypes.ATTLIST_TAG);
 	}
 
 	public void nodeChanged(DTDNode node) {