diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
index 478db28..ab091ee 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
@@ -79,19 +79,33 @@
 {
 
 	/**
-	 * The IFileEditorInput model
+	 * The IFileEditorInput model.
+	 * <p>
+	 * @see #setInput(IEditorInput)
 	 */
 	private final ModifiablePropertyValueModel<IFileEditorInput> editorInputModel = new SimplePropertyValueModel<IFileEditorInput>();
 
 	/**
-	 * The one we listen to
+	 * The root structure node model is built from the editorInputModel. We assume
+	 * there is only 1 root structure node in the JpaFile. This is true of the
+	 * persistence.xml and orm.xml models.
+	 * <p>
+	 * We listen to changes to this model and swap out the editor pages.
+	 * Do not use this model as the subjectModel for the pages, 
+	 * we need to control that model ourselves.
+	 * @see #pageRootStructureNodeModel
 	 */
 	private PropertyValueModel<JpaStructureNode> rootStructureNodeModel;
 
+	/**
+	 * Store the root structure node listener so we can remove it on {@link #dispose()}.
+	 * Listens to {@link #rootStructureNodeModel} in order to swap out the editor pages.
+	 */
 	private final PropertyChangeListener rootStructureNodeListener = new RootStructureNodeListener();
 
 	/**
-	 * The one to be passed to the Page
+	 * This root structure node model is passed to the pages. This gives us control
+	 * over when the subject is changed for the pages.
 	 */
 	private ModifiablePropertyValueModel<JpaStructureNode> pageRootStructureNodeModel;
 
@@ -151,9 +165,8 @@
 	@Override
 	protected void addPages() {
 		this.addXMLSourceEditorPage();
-		//TODO this.addXMLDesignEditorPage();
-		if (this.getRootStructureNode() != null) {
-			this.setPageRootStructureNode_(this.getRootStructureNode());
+		if (this.rootStructureNodeModel.getValue() != null) {
+			this.setPageRootStructureNode_(this.rootStructureNodeModel.getValue());
 			this.setActivePage(0);
 		}
 	}
@@ -178,20 +191,21 @@
 	 * @see #getRootStructureNode()
 	 * @see Page
 	 */
-	protected void addSpecificPages() {
-		JptResourceType resourceType = this.getRootStructureNode().getResourceType();
+	protected void addSpecificPages(PropertyValueModel<JpaStructureNode> structureNodeModel) {
+		JpaStructureNode rootStructureNode = structureNodeModel.getValue();
+		JptResourceType resourceType = rootStructureNode.getResourceType();
 		if (resourceType == null) {
 			return;  // might not ever get here... (if we have a p.xml, it probably has a resource type...)
 		}
 
-		JpaPlatform jpaPlatform = this.getRootStructureNode().getJpaPlatform();
+		JpaPlatform jpaPlatform = rootStructureNode.getJpaPlatform();
 		JpaPlatformUi jpaPlatformUI = (JpaPlatformUi) jpaPlatform.getAdapter(JpaPlatformUi.class);
 		ResourceUiDefinition definition = jpaPlatformUI.getResourceUiDefinition(resourceType);
 
 		ListIterable<JpaEditorPageDefinition> pageDefinitions = definition.getEditorPageDefinitions();
 
 		for (JpaEditorPageDefinition editorPageDefinition : pageDefinitions) {
-			FormPage formPage = new Page(editorPageDefinition);
+			FormPage formPage = new Page(editorPageDefinition, structureNodeModel);
 
 			int index = this.getPageCount() == 0 ? 0 : this.getPageCount() - 1;//always keep the source tab as the last tab
 			try {
@@ -283,25 +297,23 @@
 			this.pageRootStructureNodeModel.setValue(null);
 			this.pageRootStructureNodeModel = null;
 		}
-
-		while (this.getPageCount() > 1) {//don't remove the XML Editor page
+		if (this.getPageCount() > 1) {
 			//set the XML source editor to be the active page before removing the other pages.
 			//If I don't do this and the active page gets removed it will build the contents
 			//of the next page. I don't want to do this since I'm trying to remove all the
-			//pages except the xml source page.
-			this.setActivePage(getPageCount() - 1);
-			this.removePage(0);
+			//pages except the XML source editor page.
+			this.setActivePage(this.getPageCount() - 1);
+
+			while (this.getPageCount() > 1) {//don't remove the XML Editor page
+				this.removePage(0);
+			}
 		}
 		if (rootStructureNode != null) {
 			this.pageRootStructureNodeModel = new SimplePropertyValueModel<JpaStructureNode>(rootStructureNode);
-			this.addSpecificPages();
+			this.addSpecificPages(this.pageRootStructureNodeModel);
 		}
 	}
 
-	protected JpaStructureNode getRootStructureNode() {
-		return this.rootStructureNodeModel.getValue();
-	}
-
 	//*should* be only 1 root structure node for the jpa file (this is true for persistence.xml and orm.xml files)
 	protected PropertyValueModel<JpaStructureNode> buildRootStructureNodeModel() {
 		return new CollectionPropertyValueModelAdapter<JpaStructureNode, JpaStructureNode>(this.buildRootStructureNodesCollectionModel()) {
@@ -352,6 +364,7 @@
 	public void dispose() {
 		this.editorInputModel.setValue(null);
 		this.localResourceManager.dispose();
+		this.widgetFactory.dispose();
 		this.rootStructureNodeModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.rootStructureNodeListener);
 
 		super.dispose();
@@ -397,16 +410,22 @@
 		private final JpaEditorPageDefinition editorPageDefinition;
 
 		/**
+		 * This root structure node model.
+		 */
+		private PropertyValueModel<JpaStructureNode> structureNodeModel;
+
+		/**
 		 * The FormPage's image descriptor, stored so that we can dispose of it.
 		 */
 		private ImageDescriptor imageDescriptor;
 
-		Page(JpaEditorPageDefinition editorPageDefinition) {
+		Page(JpaEditorPageDefinition editorPageDefinition, PropertyValueModel<JpaStructureNode> structureNodeModel) {
 			super(JpaXmlEditor.this,
 					editorPageDefinition.getClass().getName(),
 					editorPageDefinition.getPageText());
 
 			this.editorPageDefinition = editorPageDefinition;
+			this.structureNodeModel = structureNodeModel;
 		}
 
 		@Override
@@ -446,7 +465,7 @@
 			Composite body = form.getForm().getBody();
 			body.setLayout(new GridLayout(1, true));
 
-			this.editorPageDefinition.buildEditorPageContent(form, getWidgetFactory(), JpaXmlEditor.this.pageRootStructureNodeModel);
+			this.editorPageDefinition.buildEditorPageContent(form, getWidgetFactory(), this.structureNodeModel);
 			//calling this because it makes the scroll bar appear on the editor tabs when the content
 			//is larger than the editor tab area. Not sure how else to make this happen
 			form.reflow(true);
