diff --git a/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelerWizard.java b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelerWizard.java
index b158707..cf770d6 100644
--- a/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelerWizard.java
+++ b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelerWizard.java
@@ -83,563 +83,511 @@
  */
 public class EcoreModelerWizard extends BasicNewProjectResourceWizard {
 
-	/** The name of the Design viewpoint. */
-	private static final String DESIGN_VIEWPOINT_NAME = "Design"; //$NON-NLS-1$ 
+    /** The name of the Design viewpoint. */
+    private static final String DESIGN_VIEWPOINT_NAME = "Design"; //$NON-NLS-1$ 
 
-	private EcoreModelSpecPage modelPage;
+    private EcoreModelSpecPage modelPage;
 
-	private ViewpointsSelectionWizardPage viewpointsSelectionWizardPage;
+    private ViewpointsSelectionWizardPage viewpointsSelectionWizardPage;
 
-	private WizardNewProjectCreationPage wizardNewProjectCreationPage;
+    private WizardNewProjectCreationPage wizardNewProjectCreationPage;
 
-	protected IWorkbench workbench;
-	protected IPath genModelProjectLocation;
-	protected IPath genModelContainerPath;
-	protected String initialProjectName;
-	protected IStructuredSelection selection;
+    protected IWorkbench workbench;
 
-	private IProject createdProject;
+    protected IPath genModelProjectLocation;
 
-	/**
-	 * Constructor.
-	 */
-	public EcoreModelerWizard() {
-		super();
-	}
+    protected IPath genModelContainerPath;
 
-	@Override
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		this.workbench = workbench;
-		this.selection = selection;
-		setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE
-				.getImageDescriptor(GenModelEditPlugin.INSTANCE
-						.getImage("full/wizban/NewEmptyEMFProject")));
-		setWindowTitle(GenModelEditPlugin.INSTANCE
-				.getString("_UI_NewEmptyProject_title"));
-		setWindowTitle("New Ecore Modeling Project"); //$NON-NLS-1$ 
-		setDefaultPageImageDescriptor(AbstractUIPlugin
-				.imageDescriptorFromPlugin(EcoreToolsDesignPlugin.PLUGIN_ID,
-						"icons/full/wizban/EcoreModelingProject_wizban.png"));
-		setNeedsProgressMonitor(true);
-	}
+    protected String initialProjectName;
 
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void addPages() {
-		wizardNewProjectCreationPage = new WizardNewProjectCreationPage(
-				SiriusEditPlugin.getPlugin().getString(
-						"_UI_ModelingProjectWizard_label")) {
+    protected IStructuredSelection selection;
 
-			@Override
-			public void createControl(Composite parent) {
-				super.createControl(parent);
+    private IProject createdProject;
 
-				Composite control = (Composite) getControl();
-				GridLayout layout = new GridLayout();
-				control.setLayout(layout);
+    /**
+     * Constructor.
+     */
+    public EcoreModelerWizard() {
+        super();
+    }
 
-				createWorkingSetGroup(
-						control,
-						new StructuredSelection(),
-						new String[] {
-								"org.eclipse.jdt.ui.JavaWorkingSetPage", //$NON-NLS-1$
-								"org.eclipse.pde.ui.pluginWorkingSet", "org.eclipse.ui.resourceWorkingSetPage" }); //$NON-NLS-1$ //$NON-NLS-2$
+    @Override
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
+        super.init(workbench, selection);
+        this.workbench = workbench;
+        this.selection = selection;
+        setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(GenModelEditPlugin.INSTANCE.getImage("full/wizban/NewEmptyEMFProject")));
+        setWindowTitle(GenModelEditPlugin.INSTANCE.getString("_UI_NewEmptyProject_title"));
+        setWindowTitle("New Ecore Modeling Project"); //$NON-NLS-1$ 
+        setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(EcoreToolsDesignPlugin.PLUGIN_ID, "icons/full/wizban/EcoreModelingProject_wizban.png"));
+        setNeedsProgressMonitor(true);
+    }
 
-				Dialog.applyDialogFont(control);
-			}
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void addPages() {
+        wizardNewProjectCreationPage = new WizardNewProjectCreationPage(SiriusEditPlugin.getPlugin().getString("_UI_ModelingProjectWizard_label")) {
 
-			@Override
-			protected boolean validatePage() {
-				if (super.validatePage()) {
-					IPath locationPath = getLocationPath();
-					genModelProjectLocation = Platform.getLocation().equals(
-							locationPath) ? null : locationPath;
-					IPath projectPath = getProjectHandle().getFullPath();
-					genModelContainerPath = projectPath.append("src"); //$NON-NLS-1$ 
+            @Override
+            public void createControl(Composite parent) {
+                super.createControl(parent);
 
-					updateModelPagePackageName(getProjectName());
-					return true;
-				} else {
-					return false;
-				}
-			}
+                Composite control = (Composite) getControl();
+                GridLayout layout = new GridLayout();
+                control.setLayout(layout);
 
-			private void updateModelPagePackageName(String projectName) {
-				if (!StringUtil.isEmpty(projectName)) {
-					String packageName = getPackageName(projectName);
-					if (!StringUtil.isEmpty(packageName)) {
-						modelPage.setPackageNameSilently(packageName);
-					}
-				}
-			}
+                createWorkingSetGroup(control, new StructuredSelection(), new String[] { "org.eclipse.jdt.ui.JavaWorkingSetPage", //$NON-NLS-1$
+                        "org.eclipse.pde.ui.pluginWorkingSet", "org.eclipse.ui.resourceWorkingSetPage" }); //$NON-NLS-1$ //$NON-NLS-2$
 
-		};
+                Dialog.applyDialogFont(control);
+            }
 
-		wizardNewProjectCreationPage.setInitialProjectName(initialProjectName);
-		wizardNewProjectCreationPage
-				.setTitle("Create a new Ecore Modeling project"); //$NON-NLS-1$ 
-		wizardNewProjectCreationPage.setDescription("Enter a project name"); //$NON-NLS-1$    
+            @Override
+            protected boolean validatePage() {
+                if (super.validatePage()) {
+                    IPath locationPath = getLocationPath();
+                    genModelProjectLocation = Platform.getLocation().equals(locationPath) ? null : locationPath;
+                    IPath projectPath = getProjectHandle().getFullPath();
+                    genModelContainerPath = projectPath.append("src"); //$NON-NLS-1$ 
 
-		modelPage = new EcoreModelSpecPage("Ecore model parameters"); //$NON-NLS-1$ 
-		modelPage.setTitle("Model settings"); //$NON-NLS-1$ 
-		modelPage.setDescription("Define the model settings"); //$NON-NLS-1$ 
+                    updateModelPagePackageName(getProjectName());
+                    return true;
+                } else {
+                    return false;
+                }
+            }
 
-		viewpointsSelectionWizardPage = new ViewpointsSelectionWizardPage(null,
-				Lists.newArrayList(DESIGN_VIEWPOINT_NAME)) {
-			@Override
-			protected Collection<String> computeSemanticFileExtensions(
-					Session session) {
-				Set<String> fileExtensions = new HashSet<String>();
-				fileExtensions.add("ecore");
-				return fileExtensions;
-			}
-		};
+            private void updateModelPagePackageName(String projectName) {
+                if (!StringUtil.isEmpty(projectName)) {
+                    String packageName = getPackageName(projectName);
+                    if (!StringUtil.isEmpty(packageName)) {
+                        modelPage.setPackageNameSilently(packageName);
+                    }
+                }
+            }
 
-		// Fix for VP-3711 to avoid a NPE on 3.8
-		ReflectionHelper.setFieldValueWithoutException(this,
-				"newProjectCreationPage", wizardNewProjectCreationPage);
+        };
 
-		addPage(wizardNewProjectCreationPage);
-		addPage(modelPage);
-		addPage(viewpointsSelectionWizardPage);
-	}
+        wizardNewProjectCreationPage.setInitialProjectName(initialProjectName);
+        wizardNewProjectCreationPage.setTitle("Create a new Ecore Modeling project"); //$NON-NLS-1$ 
+        wizardNewProjectCreationPage.setDescription("Enter a project name"); //$NON-NLS-1$    
 
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	@Override
-	public boolean performFinish() {
-		boolean finished = true;
+        modelPage = new EcoreModelSpecPage("Ecore model parameters"); //$NON-NLS-1$ 
+        modelPage.setTitle("Model settings"); //$NON-NLS-1$ 
+        modelPage.setDescription("Define the model settings"); //$NON-NLS-1$ 
 
-		updatePerspective();
-		final EcoreModelingProjectCreationOperation ecoreModelingProjectCreationOperation = new EcoreModelingProjectCreationOperation(
-				modelPage.getEPackage(), modelPage.getEcoreFileName(),
-				modelPage.getGenModelFileName(),
-				modelPage.getRepresentationFileName(),
-				new LinkedHashSet<Viewpoint>(viewpointsSelectionWizardPage
-						.getViewpoints()), workbench, genModelContainerPath,
-				genModelProjectLocation,
-				wizardNewProjectCreationPage.getSelectedWorkingSets());
-		try {
-			getContainer().run(true, false,
-					ecoreModelingProjectCreationOperation);
-		} catch (InvocationTargetException e) {
-			IStatus status = new Status(IStatus.ERROR,
-					EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR,
-					e.getMessage(), e);
-			EcoreToolsDesignPlugin.getDefault().getLog().log(status);
-			finished = false;
-		} catch (InterruptedException e) {
-			IStatus status = new Status(IStatus.ERROR,
-					EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR,
-					e.getMessage(), e);
-			EcoreToolsDesignPlugin.getDefault().getLog().log(status);
-			finished = false;
-		}
-		try {
-			getContainer().run(false, false, new IRunnableWithProgress() {
+        viewpointsSelectionWizardPage = new ViewpointsSelectionWizardPage(null, Lists.newArrayList(DESIGN_VIEWPOINT_NAME)) {
+            @Override
+            protected Collection<String> computeSemanticFileExtensions(Session session) {
+                Set<String> fileExtensions = new HashSet<String>();
+                fileExtensions.add("ecore");
+                return fileExtensions;
+            }
+        };
 
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					try {
-						monitor.beginTask("Open the diagram metamodel", 2);
+        // Fix for VP-3711 to avoid a NPE on 3.8
+        ReflectionHelper.setFieldValueWithoutException(this, "newProjectCreationPage", wizardNewProjectCreationPage);
 
-						IFile ecoreModel = ecoreModelingProjectCreationOperation
-								.getEcoreModel();
-						createdProject = ecoreModelingProjectCreationOperation
-								.getNewProject();
-						if (ecoreModel != null && ecoreModel.exists()) {
-							selectAndReveal(ecoreModel);
-						} else {
-							selectAndReveal(ecoreModelingProjectCreationOperation
-									.getNewProject());
-						}
-						monitor.worked(1);
+        addPage(wizardNewProjectCreationPage);
+        addPage(modelPage);
+        addPage(viewpointsSelectionWizardPage);
+    }
 
-						// Open the entities diagram, of the root of the
-						// ecore
-						// file,
-						// that is automatically created (because the
-						// Entities
-						// diagram has
-						// the "initialization" to true).
-						// This can fail if the user deselects the "Design"
-						// viewpoint in the second page of the wizard.
-						openFirstRepresentation(
-								ecoreModelingProjectCreationOperation
-										.getNewProject(),
-								new SubProgressMonitor(monitor, 1));
-					} finally {
-						monitor.done();
-					}
-				}
-			});
-		} catch (InvocationTargetException e) {
-			IStatus status = new Status(IStatus.ERROR,
-					EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR,
-					e.getMessage(), e);
-			EcoreToolsDesignPlugin.getDefault().getLog().log(status);
-			finished = false;
-		} catch (InterruptedException e) {
-			IStatus status = new Status(IStatus.ERROR,
-					EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR,
-					e.getMessage(), e);
-			EcoreToolsDesignPlugin.getDefault().getLog().log(status);
-			finished = false;
-		}
-		return finished;
-	}
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.eclipse.jface.wizard.Wizard#performFinish()
+     */
+    @Override
+    public boolean performFinish() {
+        boolean finished = true;
 
-	@Override
-	public IProject getNewProject() {
-		return createdProject;
-	}
+        updatePerspective();
+        final EcoreModelingProjectCreationOperation ecoreModelingProjectCreationOperation = new EcoreModelingProjectCreationOperation(modelPage.getEPackage(), modelPage.getEcoreFileName(),
+                modelPage.getGenModelFileName(), modelPage.getRepresentationFileName(), new LinkedHashSet<Viewpoint>(viewpointsSelectionWizardPage.getViewpoints()), workbench, genModelContainerPath,
+                genModelProjectLocation, wizardNewProjectCreationPage.getSelectedWorkingSets());
+        try {
+            getContainer().run(true, false, ecoreModelingProjectCreationOperation);
+        } catch (InvocationTargetException e) {
+            IStatus status = new Status(IStatus.ERROR, EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e);
+            EcoreToolsDesignPlugin.INSTANCE.log(status);
+            finished = false;
+        } catch (InterruptedException e) {
+            IStatus status = new Status(IStatus.ERROR, EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e);
+            EcoreToolsDesignPlugin.INSTANCE.log(status);
+            finished = false;
+        }
+        try {
+            getContainer().run(false, false, new IRunnableWithProgress() {
 
-	/**
-	 * Selects and reveals the newly added resource in all parts of the active
-	 * workbench window's active page.
-	 * 
-	 * @see ISetSelectionTarget
-	 */
-	protected void selectAndReveal(IResource newResource) {
-		BasicNewResourceWizard.selectAndReveal(newResource,
-				workbench.getActiveWorkbenchWindow());
-		EclipseUIUtil.expand(newResource, workbench.getActiveWorkbenchWindow());
-	}
+                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                    try {
+                        monitor.beginTask("Open the diagram metamodel", 2);
 
-	/**
-	 * Open the first representation containing in the representation file of
-	 * this Modeling project.
-	 * 
-	 * @param project
-	 *            The modeling project containing the representations file.
-	 * @param monitor
-	 *            a {@link IProgressMonitor} to show progression of first
-	 *            {@link DRepresentation} opening
-	 */
-	private void openFirstRepresentation(IProject project,
-			IProgressMonitor monitor) {
-		Option<ModelingProject> opionalModelingProject = ModelingProject
-				.asModelingProject(project);
-		if (opionalModelingProject.some()) {
-			Session session = opionalModelingProject.get().getSession();
-			if (session != null) {
-				if (!session.getSelectedViews().isEmpty()) {
-					DView view = session.getSelectedViews().iterator().next();
-					if (!view.getOwnedRepresentations().isEmpty()) {
-						DRepresentation representationToOpen = view
-								.getOwnedRepresentations().get(0);
-						DialectUIManager.INSTANCE.openEditor(session,
-								representationToOpen, monitor);
-					}
-				}
-			}
-		}
-	}
+                        IFile ecoreModel = ecoreModelingProjectCreationOperation.getEcoreModel();
+                        createdProject = ecoreModelingProjectCreationOperation.getNewProject();
+                        if (ecoreModel != null && ecoreModel.exists()) {
+                            selectAndReveal(ecoreModel);
+                        } else {
+                            selectAndReveal(ecoreModelingProjectCreationOperation.getNewProject());
+                        }
+                        monitor.worked(1);
 
-	public void setInitialProjectName(String value) {
-		initialProjectName = value;
-	}
+                        // Open the entities diagram, of the root of the
+                        // ecore
+                        // file,
+                        // that is automatically created (because the
+                        // Entities
+                        // diagram has
+                        // the "initialization" to true).
+                        // This can fail if the user deselects the "Design"
+                        // viewpoint in the second page of the wizard.
+                        openFirstRepresentation(ecoreModelingProjectCreationOperation.getNewProject(), new SubProgressMonitor(monitor, 1));
+                    } finally {
+                        monitor.done();
+                    }
+                }
+            });
+        } catch (InvocationTargetException e) {
+            IStatus status = new Status(IStatus.ERROR, EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e);
+            EcoreToolsDesignPlugin.INSTANCE.log(status);
+            finished = false;
+        } catch (InterruptedException e) {
+            IStatus status = new Status(IStatus.ERROR, EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR, e.getMessage(), e);
+            EcoreToolsDesignPlugin.INSTANCE.log(status);
+            finished = false;
+        }
+        return finished;
+    }
 
-	private String getPackageName(String projectName) {
-		String packageName = projectName.substring(0, 1).toLowerCase()
-				+ projectName.substring(1);
-		int index = packageName.lastIndexOf('.');
-		if (index != -1) {
-			packageName = packageName.substring(index + 1);
-		}
-		return packageName;
-	}
+    @Override
+    public IProject getNewProject() {
+        return createdProject;
+    }
 
-	private class EcoreModelSpecPage extends WizardPage {
+    /**
+     * Selects and reveals the newly added resource in all parts of the active
+     * workbench window's active page.
+     * 
+     * @see ISetSelectionTarget
+     */
+    protected void selectAndReveal(IResource newResource) {
+        BasicNewResourceWizard.selectAndReveal(newResource, workbench.getActiveWorkbenchWindow());
+        EclipseUIUtil.expand(newResource, workbench.getActiveWorkbenchWindow());
+    }
 
-		private static final String NAMESPACE_GROUP_LABEL = "Namespace properties";//$NON-NLS-1$ 
+    /**
+     * Open the first representation containing in the representation file of
+     * this Modeling project.
+     * 
+     * @param project
+     *            The modeling project containing the representations file.
+     * @param monitor
+     *            a {@link IProgressMonitor} to show progression of first
+     *            {@link DRepresentation} opening
+     */
+    private void openFirstRepresentation(IProject project, IProgressMonitor monitor) {
+        Option<ModelingProject> opionalModelingProject = ModelingProject.asModelingProject(project);
+        if (opionalModelingProject.some()) {
+            Session session = opionalModelingProject.get().getSession();
+            if (session != null) {
+                if (!session.getSelectedViews().isEmpty()) {
+                    DView view = session.getSelectedViews().iterator().next();
+                    if (!view.getOwnedRepresentations().isEmpty()) {
+                        DRepresentation representationToOpen = view.getOwnedRepresentations().get(0);
+                        DialectUIManager.INSTANCE.openEditor(session, representationToOpen, monitor);
+                    }
+                }
+            }
+        }
+    }
+
+    public void setInitialProjectName(String value) {
+        initialProjectName = value;
+    }
+
+    private String getPackageName(String projectName) {
+        String packageName = projectName.substring(0, 1).toLowerCase() + projectName.substring(1);
+        int index = packageName.lastIndexOf('.');
+        if (index != -1) {
+            packageName = packageName.substring(index + 1);
+        }
+        return packageName;
+    }
+
+    private class EcoreModelSpecPage extends WizardPage {
+
+        private static final String NAMESPACE_GROUP_LABEL = "Namespace properties";//$NON-NLS-1$ 
 
-		private static final String NS_PREFIX_FIELD_LABEL = "Ns Prefix"; //$NON-NLS-1$ 
+        private static final String NS_PREFIX_FIELD_LABEL = "Ns Prefix"; //$NON-NLS-1$ 
 
-		private static final String NS_URI_FIELD_LABEL = "Ns Uri"; //$NON-NLS-1$ 
+        private static final String NS_URI_FIELD_LABEL = "Ns Uri"; //$NON-NLS-1$ 
 
-		private static final String USE_DEFAULT_LABEL = "Use default namespace parameters"; //$NON-NLS-1$ 
+        private static final String USE_DEFAULT_LABEL = "Use default namespace parameters"; //$NON-NLS-1$ 
 
-		private static final String PACKAGE_FIELD_LABEL = "Main package name"; //$NON-NLS-1$ 
+        private static final String PACKAGE_FIELD_LABEL = "Main package name"; //$NON-NLS-1$ 
 
-		private static final String DEFAULT_URI_BASE = "http://www.example.org/"; //$NON-NLS-1$ 
+        private static final String DEFAULT_URI_BASE = "http://www.example.org/"; //$NON-NLS-1$ 
 
-		private static final String DEFAULT_COMMON_FILE_NAME = "model"; //$NON-NLS-1$ 
+        private static final String DEFAULT_COMMON_FILE_NAME = "model"; //$NON-NLS-1$ 
 
-		// widgets
-		private Text packageNameField;
+        // widgets
+        private Text packageNameField;
 
-		private Text nsPrefixField;
+        private Text nsPrefixField;
 
-		private Text nsUriField;
+        private Text nsUriField;
 
-		private Button useDefaultsButton;
+        private Button useDefaultsButton;
 
-		private EPackage ePackage;
+        private EPackage ePackage;
 
-		private boolean silentModificationEnabled = true;
+        private boolean silentModificationEnabled = true;
 
-		private final ModifyListener nsModifyListener = new ModifyListener() {
+        private final ModifyListener nsModifyListener = new ModifyListener() {
 
-			public void modifyText(ModifyEvent e) {
-				if (!(useDefaultsButton != null && useDefaultsButton
-						.getSelection())) {
-					setPageComplete(validatePage());
-				}
-			}
-		};
+            public void modifyText(ModifyEvent e) {
+                if (!(useDefaultsButton != null && useDefaultsButton.getSelection())) {
+                    setPageComplete(validatePage());
+                }
+            }
+        };
 
-		public EcoreModelSpecPage(String name) {
-			super(name);
-		}
+        public EcoreModelSpecPage(String name) {
+            super(name);
+        }
 
-		/**
-		 * Allow an other page to set the package name until the user manualy
-		 * modify it.
-		 * 
-		 * @param packageName
-		 *            the package name to set.
-		 */
-		public void setPackageNameSilently(String packageName) {
-			if (packageNameField != null && silentModificationEnabled) {
-				packageNameField.setText(packageName);
-			}
-		}
+        /**
+         * Allow an other page to set the package name until the user manualy
+         * modify it.
+         * 
+         * @param packageName
+         *            the package name to set.
+         */
+        public void setPackageNameSilently(String packageName) {
+            if (packageNameField != null && silentModificationEnabled) {
+                packageNameField.setText(packageName);
+            }
+        }
 
-		/**
-		 * {@inheritDoc}
-		 */
-		public void createControl(Composite parent) {
-			Composite composite = new Composite(parent, SWT.NULL);
-			composite.setLayout(new GridLayout());
-			composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+        /**
+         * {@inheritDoc}
+         */
+        public void createControl(Composite parent) {
+            Composite composite = new Composite(parent, SWT.NULL);
+            composite.setLayout(new GridLayout());
+            composite.setLayoutData(new GridData(GridData.FILL_BOTH));
 
-			createModelGroup(composite);
-			createNamespaceGroup(composite, false);
+            createModelGroup(composite);
+            createNamespaceGroup(composite, false);
 
-			setPageComplete(validatePage());
+            setPageComplete(validatePage());
 
-			setControl(composite);
-			Dialog.applyDialogFont(composite);
-		}
+            setControl(composite);
+            Dialog.applyDialogFont(composite);
+        }
 
-		private void createModelGroup(Composite parent) {
-			packageNameField = createLabelAndText(parent, PACKAGE_FIELD_LABEL,
-					getPackageName());
-			packageNameField.addModifyListener(new ModifyListener() {
+        private void createModelGroup(Composite parent) {
+            packageNameField = createLabelAndText(parent, PACKAGE_FIELD_LABEL, getPackageName());
+            packageNameField.addModifyListener(new ModifyListener() {
 
-				public void modifyText(ModifyEvent e) {
-					if (packageNameField.isVisible()) {
-						silentModificationEnabled = false;
-					}
-					updateNamespaceValues();
-					setPageComplete(validatePage());
-				}
-			});
+                public void modifyText(ModifyEvent e) {
+                    if (packageNameField.isVisible()) {
+                        silentModificationEnabled = false;
+                    }
+                    updateNamespaceValues();
+                    setPageComplete(validatePage());
+                }
+            });
 
-		}
+        }
 
-		private void createNamespaceGroup(Composite composite, boolean custom) {
-			Group nsGroup = new Group(composite, SWT.NONE);
-			nsGroup.setFont(composite.getFont());
-			nsGroup.setText(NAMESPACE_GROUP_LABEL);
-			nsGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
-			nsGroup.setLayout(new GridLayout(1, false));
+        private void createNamespaceGroup(Composite composite, boolean custom) {
+            Group nsGroup = new Group(composite, SWT.NONE);
+            nsGroup.setFont(composite.getFont());
+            nsGroup.setText(NAMESPACE_GROUP_LABEL);
+            nsGroup.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+            nsGroup.setLayout(new GridLayout(1, false));
 
-			useDefaultsButton = new Button(nsGroup, SWT.CHECK | SWT.RIGHT);
-			useDefaultsButton.setText(USE_DEFAULT_LABEL);
+            useDefaultsButton = new Button(nsGroup, SWT.CHECK | SWT.RIGHT);
+            useDefaultsButton.setText(USE_DEFAULT_LABEL);
 
-			GridData buttonData = new GridData();
-			buttonData.horizontalSpan = 4;
-			useDefaultsButton.setLayoutData(buttonData);
-			useDefaultsButton.setSelection(!custom);
+            GridData buttonData = new GridData();
+            buttonData.horizontalSpan = 4;
+            useDefaultsButton.setLayoutData(buttonData);
+            useDefaultsButton.setSelection(!custom);
 
-			nsUriField = createLabelAndText(nsGroup, NS_URI_FIELD_LABEL,
-					getNsUri());
-			nsPrefixField = createLabelAndText(nsGroup, NS_PREFIX_FIELD_LABEL,
-					getNsPRefix());
+            nsUriField = createLabelAndText(nsGroup, NS_URI_FIELD_LABEL, getNsUri());
+            nsPrefixField = createLabelAndText(nsGroup, NS_PREFIX_FIELD_LABEL, getNsPRefix());
 
-			nsUriField.addModifyListener(nsModifyListener);
-			nsPrefixField.addModifyListener(nsModifyListener);
-			setNameSpaceGroupActivation(custom);
+            nsUriField.addModifyListener(nsModifyListener);
+            nsPrefixField.addModifyListener(nsModifyListener);
+            setNameSpaceGroupActivation(custom);
 
-			useDefaultsButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					boolean useDefault = useDefaultsButton.getSelection();
-					if (useDefault) {
-						updateNamespaceValues();
-					}
-					setNameSpaceGroupActivation(!useDefault);
-					setPageComplete(validatePage());
-				}
-			});
-		}
+            useDefaultsButton.addSelectionListener(new SelectionAdapter() {
+                public void widgetSelected(SelectionEvent e) {
+                    boolean useDefault = useDefaultsButton.getSelection();
+                    if (useDefault) {
+                        updateNamespaceValues();
+                    }
+                    setNameSpaceGroupActivation(!useDefault);
+                    setPageComplete(validatePage());
+                }
+            });
+        }
 
-		private void setNameSpaceGroupActivation(boolean enabled) {
-			if (nsUriField != null) {
-				nsUriField.setEnabled(enabled);
-			}
+        private void setNameSpaceGroupActivation(boolean enabled) {
+            if (nsUriField != null) {
+                nsUriField.setEnabled(enabled);
+            }
 
-			if (nsPrefixField != null) {
-				nsPrefixField.setEnabled(enabled);
-			}
-		}
+            if (nsPrefixField != null) {
+                nsPrefixField.setEnabled(enabled);
+            }
+        }
 
-		private void updateNamespaceValues() {
-			if (useDefaultsButton != null && useDefaultsButton.getSelection()) {
-				String packageName = getPackageName();
-				if (nsPrefixField != null) {
-					nsPrefixField.setText(packageName);
-				}
+        private void updateNamespaceValues() {
+            if (useDefaultsButton != null && useDefaultsButton.getSelection()) {
+                String packageName = getPackageName();
+                if (nsPrefixField != null) {
+                    nsPrefixField.setText(packageName);
+                }
 
-				if (nsUriField != null) {
-					nsUriField.setText(getDefaultNsUri(packageName));
-				}
-			}
-		}
+                if (nsUriField != null) {
+                    nsUriField.setText(getDefaultNsUri(packageName));
+                }
+            }
+        }
 
-		private Text createLabelAndText(Composite parent, String label,
-				String initialValue) {
-			Composite group = new Composite(parent, SWT.NONE);
-			GridLayout layout = new GridLayout();
-			layout.numColumns = 2;
-			group.setLayout(layout);
-			group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        private Text createLabelAndText(Composite parent, String label, String initialValue) {
+            Composite group = new Composite(parent, SWT.NONE);
+            GridLayout layout = new GridLayout();
+            layout.numColumns = 2;
+            group.setLayout(layout);
+            group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
-			// label
-			Label labelField = new Label(group, SWT.NONE);
-			labelField.setText(label);
-			labelField.setFont(parent.getFont());
+            // label
+            Label labelField = new Label(group, SWT.NONE);
+            labelField.setText(label);
+            labelField.setFont(parent.getFont());
 
-			// text
-			Text textField = new Text(group, SWT.BORDER);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.widthHint = 250;
-			textField.setLayoutData(data);
-			textField.setFont(parent.getFont());
-			if (initialValue != null) {
-				textField.setText(initialValue);
-			}
-			return textField;
-		}
+            // text
+            Text textField = new Text(group, SWT.BORDER);
+            GridData data = new GridData(GridData.FILL_HORIZONTAL);
+            data.widthHint = 250;
+            textField.setLayoutData(data);
+            textField.setFont(parent.getFont());
+            if (initialValue != null) {
+                textField.setText(initialValue);
+            }
+            return textField;
+        }
 
-		public EPackage getEPackage() {
-			if (ePackage == null) {
-				initEPackage();
-			}
-			return ePackage;
-		}
+        public EPackage getEPackage() {
+            if (ePackage == null) {
+                initEPackage();
+            }
+            return ePackage;
+        }
 
-		private void initEPackage() {
-			EClass eClass = (EClass) EcorePackage.eINSTANCE
-					.getEClassifier("EPackage");
-			EObject rootObject = EcoreFactory.eINSTANCE.create(eClass);
+        private void initEPackage() {
+            EClass eClass = (EClass) EcorePackage.eINSTANCE.getEClassifier("EPackage");
+            EObject rootObject = EcoreFactory.eINSTANCE.create(eClass);
 
-			if (rootObject instanceof EPackage) {
-				ePackage = (EPackage) rootObject;
-				updateEPackage(ePackage);
-			}
-		}
+            if (rootObject instanceof EPackage) {
+                ePackage = (EPackage) rootObject;
+                updateEPackage(ePackage);
+            }
+        }
 
-		private void updateEPackage(EPackage p) {
-			p.setName(getPackageName());
-			p.setNsPrefix(getNsPRefix());
-			p.setNsURI(getNsUri());
-		}
+        private void updateEPackage(EPackage p) {
+            p.setName(getPackageName());
+            p.setNsPrefix(getNsPRefix());
+            p.setNsURI(getNsUri());
+        }
 
-		/**
-		 * Returns whether this page's controls currently all contain valid
-		 * values.
-		 * 
-		 * @return <code>true</code> if all controls are valid, and
-		 *         <code>false</code> if at least one is invalid
-		 */
-		protected boolean validatePage() {
-			if (ePackage == null) {
-				initEPackage();
-			} else {
-				updateEPackage(ePackage);
-			}
+        /**
+         * Returns whether this page's controls currently all contain valid
+         * values.
+         * 
+         * @return <code>true</code> if all controls are valid, and
+         *         <code>false</code> if at least one is invalid
+         */
+        protected boolean validatePage() {
+            if (ePackage == null) {
+                initEPackage();
+            } else {
+                updateEPackage(ePackage);
+            }
 
-			EcoreValidator validator = new EcoreValidator();
-			BasicDiagnostic diagnostic = new BasicDiagnostic();
-			boolean validName = validator.validateENamedElement_WellFormedName(
-					ePackage, diagnostic, null);
-			boolean validNsUri = validator.validateEPackage_WellFormedNsURI(
-					ePackage, diagnostic, null);
-			boolean validNsPrefix = validator
-					.validateEPackage_WellFormedNsPrefix(ePackage, diagnostic,
-							null);
+            EcoreValidator validator = new EcoreValidator();
+            BasicDiagnostic diagnostic = new BasicDiagnostic();
+            boolean validName = validator.validateENamedElement_WellFormedName(ePackage, diagnostic, null);
+            boolean validNsUri = validator.validateEPackage_WellFormedNsURI(ePackage, diagnostic, null);
+            boolean validNsPrefix = validator.validateEPackage_WellFormedNsPrefix(ePackage, diagnostic, null);
 
-			boolean validEPackage = validName && validNsUri && validNsPrefix;
-			if (validEPackage) {
-				setErrorMessage(null);
-			} else {
-				StringBuilder sb = new StringBuilder();
-				buildCompoundMessage(sb, diagnostic);
-				setErrorMessage(sb.toString());
-			}
-			return validEPackage;
-		}
+            boolean validEPackage = validName && validNsUri && validNsPrefix;
+            if (validEPackage) {
+                setErrorMessage(null);
+            } else {
+                StringBuilder sb = new StringBuilder();
+                buildCompoundMessage(sb, diagnostic);
+                setErrorMessage(sb.toString());
+            }
+            return validEPackage;
+        }
 
-		private void buildCompoundMessage(StringBuilder sb,
-				Diagnostic diagnostic) {
-			if (!StringUtil.isEmpty(diagnostic.getMessage())
-					&& diagnostic.getSeverity() != Diagnostic.OK) {
-				sb.append(diagnostic.getMessage());
-				sb.append("\n");
-			}
+        private void buildCompoundMessage(StringBuilder sb, Diagnostic diagnostic) {
+            if (!StringUtil.isEmpty(diagnostic.getMessage()) && diagnostic.getSeverity() != Diagnostic.OK) {
+                sb.append(diagnostic.getMessage());
+                sb.append("\n");
+            }
 
-			for (Diagnostic child : diagnostic.getChildren()) {
-				buildCompoundMessage(sb, child);
-			}
-		}
+            for (Diagnostic child : diagnostic.getChildren()) {
+                buildCompoundMessage(sb, child);
+            }
+        }
 
-		private String getPackageName() {
-			if (packageNameField == null) {
-				return DEFAULT_COMMON_FILE_NAME;
-			}
+        private String getPackageName() {
+            if (packageNameField == null) {
+                return DEFAULT_COMMON_FILE_NAME;
+            }
 
-			return packageNameField.getText().trim();
-		}
+            return packageNameField.getText().trim();
+        }
 
-		private String getNsUri() {
-			if (nsUriField == null) {
-				return getDefaultNsUri(getPackageName());
-			}
+        private String getNsUri() {
+            if (nsUriField == null) {
+                return getDefaultNsUri(getPackageName());
+            }
 
-			return nsUriField.getText().trim();
-		}
+            return nsUriField.getText().trim();
+        }
 
-		private String getDefaultNsUri(String packageName) {
-			return DEFAULT_URI_BASE + packageName;
-		}
+        private String getDefaultNsUri(String packageName) {
+            return DEFAULT_URI_BASE + packageName;
+        }
 
-		private String getNsPRefix() {
-			if (nsPrefixField == null) {
-				return getPackageName();
-			}
+        private String getNsPRefix() {
+            if (nsPrefixField == null) {
+                return getPackageName();
+            }
 
-			return nsPrefixField.getText().trim();
-		}
+            return nsPrefixField.getText().trim();
+        }
 
-		public String getRepresentationFileName() {
-			return getPackageName()
-					+ "." + SiriusUtil.SESSION_RESOURCE_EXTENSION; //$NON-NLS-1$ 
-		}
+        public String getRepresentationFileName() {
+            return getPackageName() + "." + SiriusUtil.SESSION_RESOURCE_EXTENSION; //$NON-NLS-1$ 
+        }
 
-		public String getEcoreFileName() {
-			return getPackageName() + ".ecore"; //$NON-NLS-1$ 
-		}
+        public String getEcoreFileName() {
+            return getPackageName() + ".ecore"; //$NON-NLS-1$ 
+        }
 
-		public String getGenModelFileName() {
-			return getPackageName() + ".genmodel"; //$NON-NLS-1$ 
-		}
-	}
+        public String getGenModelFileName() {
+            return getPackageName() + ".genmodel"; //$NON-NLS-1$ 
+        }
+    }
 }
diff --git a/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelingProjectCreationOperation.java b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelingProjectCreationOperation.java
index 4a4e49b..5cbaa28 100644
--- a/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelingProjectCreationOperation.java
+++ b/org.eclipse.emf.ecoretools.design.ui/src/org/eclipse/emf/ecoretools/design/ui/wizard/EcoreModelingProjectCreationOperation.java
@@ -149,7 +149,7 @@
 		final IStatus status = new Status(IStatus.ERROR,
 				EcoreToolsDesignPlugin.PLUGIN_ID, IStatus.ERROR,
 				e.getMessage(), e);
-		EcoreToolsDesignPlugin.getDefault().getLog().log(status);
+		EcoreToolsDesignPlugin.INSTANCE.log(status);
 	}
 
 	public void modifyWorkspace(IProgressMonitor progressMonitor)
@@ -323,7 +323,7 @@
 					EcoreToolsDesignPlugin.PLUGIN_ID,
 					IStatus.ERROR,
 					"Error occurs during generating the genmodel file.", exception);//$NON-NLS-1$
-			EcoreToolsDesignPlugin.getDefault().getLog().log(status);
+			EcoreToolsDesignPlugin.INSTANCE.log(status);
 		} finally {
 			monitor.done();
 		}
diff --git a/org.eclipse.emf.ecoretools.design/META-INF/MANIFEST.MF b/org.eclipse.emf.ecoretools.design/META-INF/MANIFEST.MF
index cd2d4d1..0933996 100644
--- a/org.eclipse.emf.ecoretools.design/META-INF/MANIFEST.MF
+++ b/org.eclipse.emf.ecoretools.design/META-INF/MANIFEST.MF
@@ -10,7 +10,6 @@
  org.eclipse.sirius.diagram,
  org.eclipse.core.runtime,
  org.eclipse.core.resources,
- org.eclipse.emf.ecore.editor,
  org.eclipse.emf.ecore.xmi,
  org.eclipse.emf.importer,
  org.eclipse.emf.importer.ecore,
@@ -23,7 +22,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Vendor: %providerName
 Eclipse-LazyStart: true
-Bundle-Activator: org.eclipse.emf.ecoretools.design.service.EcoreToolsDesignPlugin
+Bundle-Activator: org.eclipse.emf.ecoretools.design.service.EcoreToolsDesignPlugin$Implementation
 Export-Package: org.eclipse.emf.ecoretools.design,
  org.eclipse.emf.ecoretools.design.service
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/internal/EcoreToolsSessionListener.java b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/internal/EcoreToolsSessionListener.java
index 9faec6e..1ae2c49 100644
--- a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/internal/EcoreToolsSessionListener.java
+++ b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/internal/EcoreToolsSessionListener.java
@@ -60,7 +60,7 @@
             set.getURIConverter().getURIMap().putAll(result);
         } else {
             IStatus status = new Status(IStatus.WARNING, EcoreToolsDesignPlugin.PLUGIN_ID, "The EMF API EcorePlugin.computePlatformURIMap has probably changed and is not supported yet by EcoreTools.");
-            EcoreToolsDesignPlugin.getDefault().getLog().log(status);
+            EcoreToolsDesignPlugin.INSTANCE.log(status);
 
         }
 
diff --git a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java
index 5bfe67e..500ab14 100644
--- a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java
+++ b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/DesignServices.java
@@ -11,7 +11,6 @@
 
 package org.eclipse.emf.ecoretools.design.service;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -38,7 +37,6 @@
 import org.eclipse.emf.ecore.ETypeParameter;
 import org.eclipse.emf.ecore.EcorePackage;
 import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.presentation.EcoreEditorPlugin;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.Diagnostician;
 import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -68,9 +66,6 @@
 import org.eclipse.sirius.viewpoint.DRepresentation;
 import org.eclipse.sirius.viewpoint.DSemanticDecorator;
 import org.eclipse.sirius.viewpoint.ViewpointPackage;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
 
 import com.google.common.base.Ascii;
 import com.google.common.base.CharMatcher;
@@ -579,20 +574,6 @@
         return true;
     }
 
-    /**
-     * Shows the Properties View. (See Double Click Action in Design ViewPoint)
-     * 
-     * @param object
-     *            Any EObject
-     */
-    public void showPropertiesViewAction(EObject object) {
-        try {
-            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("org.eclipse.ui.views.PropertySheet");
-        } catch (PartInitException exception) {
-            EcoreEditorPlugin.INSTANCE.log(exception);
-        }
-    }
-
     public EEnumLiteral arrowsFillDiamond(EObject any) {
         return DiagramPackage.eINSTANCE.getEdgeArrows().getEEnumLiteral("FillDiamond");
     }
@@ -601,30 +582,6 @@
         return ViewpointPackage.eINSTANCE.getFontFormat().getEEnumLiteral("bold");
     }
 
-    public void openClassDiagramContextHelp(EObject any) {
-        // try {
-        // openContextHelp(any,
-        // "org.eclipse.emf.ecoretools.design.ClassDiagram");
-        // } catch (IOException e) {
-        // EcoreEditorPlugin.INSTANCE.log(e);
-        // }
-    }
-
-    public void openContextHelp(EObject any, final String contextID) throws IOException {
-        if (Display.getDefault() != null)
-            Display.getDefault().asyncExec(new Runnable() {
-
-                public void run() {
-                    if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() != null) {
-                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-                        PlatformUI.getWorkbench().getHelpSystem().setHelp(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), contextID);
-                        PlatformUI.getWorkbench().getHelpSystem().displayDynamicHelp();
-
-                    }
-                }
-            });
-    }
-
     public void reconnectEReference(EObject element, DEdge edgeAfterReconnect) {
         if (edgeAfterReconnect.getSourceNode() instanceof DSemanticDecorator && edgeAfterReconnect.getTargetNode() instanceof DSemanticDecorator) {
 
@@ -700,9 +657,9 @@
                         // Execute the create view task
                         new CreateViewTask(context, session.getModelAccessor(), createViewOp, session.getInterpreter()).execute();
                     } catch (MetaClassNotFoundException e) {
-                        EcoreEditorPlugin.INSTANCE.log(e);
+                        EcoreToolsDesignPlugin.INSTANCE.log(e);
                     } catch (FeatureNotFoundException e) {
-                        EcoreEditorPlugin.INSTANCE.log(e);
+                        EcoreToolsDesignPlugin.INSTANCE.log(e);
                     }
                 }
             });
diff --git a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/EcoreToolsDesignPlugin.java b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/EcoreToolsDesignPlugin.java
index b5671fe..d494239 100644
--- a/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/EcoreToolsDesignPlugin.java
+++ b/org.eclipse.emf.ecoretools.design/src/org/eclipse/emf/ecoretools/design/service/EcoreToolsDesignPlugin.java
@@ -13,11 +13,13 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.eclipse.core.runtime.Plugin;
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
 import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
 import org.eclipse.sirius.business.api.session.SessionManager;
 import org.eclipse.sirius.business.api.session.SessionManagerListener;
 import org.eclipse.sirius.viewpoint.description.Viewpoint;
+import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
 /**
@@ -26,64 +28,122 @@
  * @author Laurent Goubet <a
  *         href="mailto:laurent.goubet@obeo.fr">laurent.goubet@obeo.fr</a>
  */
-public class EcoreToolsDesignPlugin extends Plugin {
+public class EcoreToolsDesignPlugin extends EMFPlugin {
+
+    public static final EcoreToolsDesignPlugin INSTANCE = new EcoreToolsDesignPlugin();
+
+    /**
+     * Keep track of the singleton. <!-- begin-user-doc --> <!-- end-user-doc
+     * -->
+     * 
+     * @generated
+     */
+    private static Implementation plugin;
+
     /** The plug-in ID. */
     public static final String PLUGIN_ID = "org.eclipse.emf.ecoretools.design"; //$NON-NLS-1$
 
-    /** This plug-in's shared instance. */
-    private static EcoreToolsDesignPlugin plugin;
-
     private static Set<Viewpoint> viewpoints;
 
-    private SessionManagerListener notifWhenSessionAreCreated;
-
     /**
      * Default constructor for the plugin.
      */
     public EcoreToolsDesignPlugin() {
-        plugin = this;
+        super(new ResourceLocator[] {});
     }
 
     /**
-     * Returns the shared instance.
+     * Returns the singleton instance of the Eclipse plugin. <!-- begin-user-doc
+     * --> <!-- end-user-doc -->
      * 
-     * @return the shared instance
+     * @return the singleton instance.
+     * @generated
      */
-    public static EcoreToolsDesignPlugin getDefault() {
+    @Override
+    public ResourceLocator getPluginResourceLocator() {
         return plugin;
     }
 
     /**
-     * {@inheritDoc}
+     * Returns the singleton instance of the Eclipse plugin. <!-- begin-user-doc
+     * --> <!-- end-user-doc -->
      * 
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+     * @return the singleton instance.
+     * @generated
      */
-    @Override
-    public void start(final BundleContext context) throws Exception {
-        super.start(context);
-        viewpoints = new HashSet<Viewpoint>();
-        viewpoints.addAll(ViewpointRegistry.getInstance().registerFromPlugin(PLUGIN_ID + "/description/ecore.odesign"));
+    public static Implementation getPlugin() {
+        return plugin;
     }
 
     /**
-     * {@inheritDoc}
+     * The actual implementation of the Eclipse <b>Plugin</b>. <!--
+     * begin-user-doc --> <!-- end-user-doc -->
      * 
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     * @generated
      */
-    @Override
-    public void stop(final BundleContext context) throws Exception {
-        plugin = null;
-        if (viewpoints != null) {
-            for (final Viewpoint viewpoint : viewpoints) {
-                ViewpointRegistry.getInstance().disposeFromPlugin(viewpoint);
-            }
-            viewpoints.clear();
-            viewpoints = null;
-        }
-        if (notifWhenSessionAreCreated != null) {
-            SessionManager.INSTANCE.removeSessionsListener(notifWhenSessionAreCreated);
+    public static class Implementation extends EclipsePlugin {
+
+        private SessionManagerListener notifWhenSessionAreCreated;
+
+        /**
+         * Creates an instance. <!-- begin-user-doc --> <!-- end-user-doc -->
+         * 
+         * @generated
+         */
+        public Implementation() {
+            super();
+
+            // Remember the static instance.
+            //
+            plugin = this;
         }
 
-        super.stop(context);
+        /**
+         * The actual implementation of the purely OSGi-compatible <b>Bundle
+         * Activator</b>. <!-- begin-user-doc --> <!-- end-user-doc -->
+         * 
+         * @generated
+         */
+        public static final class Activator extends EMFPlugin.OSGiDelegatingBundleActivator {
+            @Override
+            protected BundleActivator createBundle() {
+                return new Implementation();
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+         */
+        @Override
+        public void start(final BundleContext context) throws Exception {
+            super.start(context);
+            viewpoints = new HashSet<Viewpoint>();
+            viewpoints.addAll(ViewpointRegistry.getInstance().registerFromPlugin(PLUGIN_ID + "/description/ecore.odesign"));
+        }
+
+        /**
+         * {@inheritDoc}
+         * 
+         * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+         */
+        @Override
+        public void stop(final BundleContext context) throws Exception {
+            plugin = null;
+            if (viewpoints != null) {
+                for (final Viewpoint viewpoint : viewpoints) {
+                    ViewpointRegistry.getInstance().disposeFromPlugin(viewpoint);
+                }
+                viewpoints.clear();
+                viewpoints = null;
+            }
+            if (notifWhenSessionAreCreated != null) {
+                SessionManager.INSTANCE.removeSessionsListener(notifWhenSessionAreCreated);
+            }
+
+            super.stop(context);
+        }
     }
+
 }
