Bug 305586 [Model] Model tweaking round 3
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
index df0e72e..5da8edf 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
@@ -2007,7 +2007,7 @@
 				IPerspectiveFactory factory = ((PerspectiveDescriptor) perspective).createFactory();
 				// use a new perspective since we're only interested in
 				// shortcuts here, see bug 305918
-				modelLayout = new ModeledPageLayout(application, modelService,
+				modelLayout = new ModeledPageLayout(application, modelService, partService,
 						AdvancedFactoryImpl.eINSTANCE.createPerspective(), perspective, this, false);
 				factory.createInitialLayout(modelLayout);
 
@@ -2025,7 +2025,8 @@
 
 		// instantiate the perspective
 		IPerspectiveFactory factory = ((PerspectiveDescriptor) perspective).createFactory();
-		modelLayout = new ModeledPageLayout(application, modelService, modelPerspective,
+		modelLayout = new ModeledPageLayout(application, modelService, partService,
+				modelPerspective,
 				perspective, this, true);
 		factory.createInitialLayout(modelLayout);
 		tagPerspective(modelPerspective);
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledFolderLayout.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledFolderLayout.java
index 1cb736c..330e839 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledFolderLayout.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledFolderLayout.java
@@ -25,6 +25,7 @@
 
 	public void addView(String viewId) {
 		MPart viewModel = ModeledPageLayout.createViewModel(application, viewId, true, layout.page,
+				layout.partService,
 				layout.createReferences);
 		folderModel.getChildren().add(viewModel);
 	}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPageLayout.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPageLayout.java
index 9fb8457..5b735e8 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPageLayout.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPageLayout.java
@@ -24,8 +24,7 @@
 import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.workbench.modeling.EModelService;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.e4.workbench.modeling.EPartService;
 import org.eclipse.swt.SWT;
 import org.eclipse.ui.IFolderLayout;
 import org.eclipse.ui.IPageLayout;
@@ -38,6 +37,7 @@
 
 	private MApplication application;
 	private EModelService modelService;
+	EPartService partService;
 	WorkbenchPage page;
 	private MPerspective perspModel;
 	private IPerspectiveDescriptor descriptor;
@@ -53,10 +53,12 @@
 	boolean createReferences;
 
 	public ModeledPageLayout(MApplication application, EModelService modelService,
+			EPartService partService,
 			MPerspective perspModel, IPerspectiveDescriptor descriptor, WorkbenchPage page,
 			boolean createReferences) {
 		this.application = application;
 		this.modelService = modelService;
+		this.partService = partService;
 		this.page = page;
 		// Create the editor area stack
 		this.perspModel = perspModel;
@@ -225,10 +227,10 @@
 	}
 
 	public static MPart createViewModel(MApplication application, String id, boolean visible,
-			WorkbenchPage page, boolean createReferences) {
+			WorkbenchPage page, EPartService partService, boolean createReferences) {
 		for (MPartDescriptor descriptor : application.getDescriptors()) {
 			if (descriptor.getElementId().equals(id)) {
-				MPart part = (MPart) EcoreUtil.copy((EObject) descriptor);
+				MPart part = (MPart) partService.createPart(id);
 				part.setToBeRendered(visible);
 				// there should only be view references for views that are
 				// visible to the end user, that is, the tab items are being
@@ -259,7 +261,8 @@
 			refModel = refModel.getParent();
 		}
 
-		MPart viewModel = createViewModel(application, viewId, visible, page, createReferences);
+		MPart viewModel = createViewModel(application, viewId, visible, page, partService,
+				createReferences);
 
 		if (withStack) {
 			String stackId = viewId + "MStack"; // Default id...basically unusable //$NON-NLS-1$
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPlaceholderFolderLayout.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPlaceholderFolderLayout.java
index a463a6f..5333fd2 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPlaceholderFolderLayout.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/e4/compatibility/ModeledPlaceholderFolderLayout.java
@@ -31,7 +31,7 @@
 
 	public void addPlaceholder(String viewId) {
 		MPart viewModel = ModeledPageLayout.createViewModel(application, viewId, false,
-				layout.page, layout.createReferences);
+				layout.page, layout.partService, layout.createReferences);
 		folderModel.getChildren().add(viewModel);
 	}