[510040] Merge representation and viewpoint blocks

- Merged functionality of viewpoint selection block into the
representation.
- The activation is now handled by a double click on the viewpoint item
instead of checking checkbox.
- Double click on representation descriptor now opens the representation
creation wizard with the representation descriptor selected.

Bug: 510040
Change-Id: I2d4d5ca92ea7e8e345f4f0b6be45e94a241a1abd
Signed-off-by: pguilet <pierre.guilet@obeo.fr>
diff --git a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
index 6dd73e1..35f2ccc 100644
--- a/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.sirius.ui.editor/META-INF/MANIFEST.MF
@@ -40,4 +40,5 @@
 Export-Package: org.eclipse.sirius.ui.editor;version="5.0.0",
  org.eclipse.sirius.ui.editor.internal.graphicalcomponents;version="5.0.0";x-internal:=true,
  org.eclipse.sirius.ui.editor.internal.pages;version="5.0.0";x-internal:=true,
- org.eclipse.sirius.ui.editor.internal.preferences;version="5.0.0";x-internal:=true
+ org.eclipse.sirius.ui.editor.internal.preferences;version="5.0.0";x-internal:=true,
+ org.eclipse.sirius.ui.editor.provider;version="5.0.0"
diff --git a/plugins/org.eclipse.sirius.ui.editor/plugin.properties b/plugins/org.eclipse.sirius.ui.editor/plugin.properties
index c6e83e3..e635183 100644
--- a/plugins/org.eclipse.sirius.ui.editor/plugin.properties
+++ b/plugins/org.eclipse.sirius.ui.editor/plugin.properties
@@ -25,4 +25,7 @@
 UI_SessionEditor_representation_title=Representations
 UI_SessionEditor_representation_button_newRepresentation=New...
 UI_SessionEditor_representation_button_removeRepresentation=Remove
-UI_SessionEditor_inputNotHandled_error_message=The aird editor handles only FileEditorInput and URIEditorInput. The following input is not handled: {0}
\ No newline at end of file
+UI_SessionEditor_inputNotHandled_error_message=The aird editor handles only FileEditorInput and URIEditorInput. The following input is not handled: {0}
+GraphicalRepresentationHandler_missingDependencies_requirements=Viewpoint ''{0}'' requires viewpoint(s) which are not enabled: {1}
+GraphicalRepresentationHandler_disabledViewpoint_label=disabled
+GraphicalRepresentationHandler_representationNumber_label=\u0020({0} representations)
\ No newline at end of file
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
index 1497d63..8206331 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/Messages.java
@@ -67,6 +67,15 @@
     @TranslatableMessage
     public static String UI_SessionEditor_inputNotHandled_error_message;
 
+    @TranslatableMessage
+    public static String GraphicalRepresentationHandler_missingDependencies_requirements;
+
+    @TranslatableMessage
+    public static String GraphicalRepresentationHandler_disabledViewpoint_label;
+
+    @TranslatableMessage
+    public static String GraphicalRepresentationHandler_representationNumber_label;
+
     // CHECKSTYLE:ON
 
     private Messages() {
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
index 4079bee..106cad7 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalRepresentationHandler.java
@@ -10,9 +10,15 @@
  *******************************************************************************/
 package org.eclipse.sirius.ui.editor.internal.graphicalcomponents;
 
-import java.util.Arrays;
+import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 import java.util.stream.Collectors;
 
 import org.eclipse.jface.action.Action;
@@ -20,26 +26,34 @@
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
 import org.eclipse.sirius.business.api.session.Session;
 import org.eclipse.sirius.business.api.session.SessionListener;
 import org.eclipse.sirius.business.api.session.SessionManager;
 import org.eclipse.sirius.business.api.session.SessionManagerListener;
-import org.eclipse.sirius.common.ui.tools.api.navigator.GroupingContentProvider;
+import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
 import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
-import org.eclipse.sirius.common.ui.tools.api.util.TreeItemWrapperContentProvider;
+import org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection;
 import org.eclipse.sirius.ui.editor.Messages;
-import org.eclipse.sirius.ui.tools.api.views.common.item.ViewpointsFolderItem;
+import org.eclipse.sirius.ui.editor.provider.SiriusRepresentationLabelProvider;
+import org.eclipse.sirius.ui.tools.internal.viewpoint.ViewpointHelper;
+import org.eclipse.sirius.ui.tools.internal.viewpoint.ViewpointsSelectionGraphicalHandler;
 import org.eclipse.sirius.ui.tools.internal.views.common.action.DeleteRepresentationAction;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
 import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.ViewpointItemImpl;
 import org.eclipse.sirius.ui.tools.internal.views.common.navigator.ManageSessionActionProvider;
 import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonContentProvider;
-import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonLabelProvider;
 import org.eclipse.sirius.ui.tools.internal.views.common.navigator.sorter.CommonItemSorter;
 import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.DeleteActionHandler;
 import org.eclipse.sirius.ui.tools.internal.views.modelexplorer.RenameActionHandler;
@@ -53,27 +67,159 @@
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.ActionContext;
 import org.eclipse.ui.dialogs.FilteredTree;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
 /**
  * This graphical component provides a {@link TreeViewer} showing all
- * representations belonging to the given session under corresponding viewpoints
- * objects. It also provides buttons to add or remove external semantic model
- * dependency to the session. This component also reacts to external session
- * changes regarding loading semantic models or selected viewpoints to always
- * display representations available to use from the session.
+ * representations belonging to the given session under corresponding
+ * representation descriptors under corresponding viewpoints objects.
+ * 
+ * It also provides addition and removal representations functionalities.
+ * 
+ * It also have capabilities to activate/deactivate the viewpoints.
+ * 
+ * This component also reacts to external session changes regarding loading
+ * semantic models or selected viewpoints to always display representations
+ * available to use from the session.
  * 
  * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
  *
  */
 public class GraphicalRepresentationHandler implements SessionManagerListener {
     /**
+     * Double click listener activating/deactivating viewpoints from viewpoints
+     * item and launching representation creation wizard from representation
+     * descriptor.
+     * 
+     * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+     *
+     */
+    private final class ViewpointActivationAndRepresentationCreationDoubleClickListener implements IDoubleClickListener {
+        @Override
+        public void doubleClick(DoubleClickEvent event) {
+            if (event.getSelection() instanceof StructuredSelection) {
+                StructuredSelection selection = (StructuredSelection) event.getSelection();
+
+                if (selection.getFirstElement() instanceof ViewpointItemImpl) {
+                    ViewpointItemImpl viewpointItem = (ViewpointItemImpl) selection.getFirstElement();
+                    Viewpoint changedViewpoint = viewpointItem.getViewpoint();
+                    boolean activateViewpoint = !viewpointItem.isViewpointEnabledInSession();
+                    Set<Viewpoint> selectedViewpoints = getSelectedViewpoints();
+                    if (activateViewpoint) {
+                        String errorMessage = null;
+
+                        errorMessage = getMissingDependencyErrorMessage(changedViewpoint, selectedViewpoints);
+                        if (errorMessage == null) {
+                            viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
+                            handleViewpointActivation(viewpointItem, changedViewpoint, selectedViewpoints, activateViewpoint);
+                        } else {
+                            viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
+                        }
+                    } else {
+                        handleViewpointActivation(viewpointItem, changedViewpoint, selectedViewpoints, activateViewpoint);
+                    }
+
+                } else if (selection.getFirstElement() instanceof RepresentationDescriptionItemImpl) {
+                    RepresentationDescriptionItemImpl representationDescriptionItem = (RepresentationDescriptionItemImpl) selection.getFirstElement();
+                    ViewpointItemImpl viewpointItem = (ViewpointItemImpl) representationDescriptionItem.getParent();
+                    boolean viewpointParentActivated = viewpointItem.isViewpointEnabledInSession();
+                    Set<Viewpoint> selectedViewpoints = getSelectedViewpoints();
+                    if (!viewpointParentActivated) {
+                        // We activate the viewpoint if it is not the case.
+                        handleViewpointActivation(viewpointItem, viewpointItem.getViewpoint(), selectedViewpoints, true);
+                    }
+
+                    treeViewer.getTree().setRedraw(false);
+                    CreateRepresentationWizard wizard = new CreateRepresentationWizard(session, representationDescriptionItem);
+                    wizard.init();
+                    final WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), wizard);
+                    dialog.create();
+                    dialog.getShell().setText("Create Representation Wizard"); //$NON-NLS-1$
+                    dialog.open();
+                    treeViewer.getTree().setRedraw(true);
+
+                    if (wizard.isCreationCancelled() && !viewpointParentActivated) {
+                        // we deactivate the viewpoint if it was its status
+                        // before cancellation of representation creation.
+                        selectedViewpoints = getSelectedViewpoints();
+                        handleViewpointActivation(viewpointItem, viewpointItem.getViewpoint(), selectedViewpoints, false);
+                    } else {
+                        treeViewer.refresh();
+                        treeViewer.setSelection(new StructuredSelection(viewpointItem));
+                    }
+                }
+            }
+
+        }
+    }
+
+    /**
+     * This listener takes care of enabling/disabling buttons handling
+     * representations. It also update the browser description regarding the
+     * viewpoint of the selected item.
+     * 
+     * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+     *
+     */
+    private final class UpdateButtonsAndBrowserAtSelectionChangeListener implements ISelectionChangedListener {
+        @Override
+        public void selectionChanged(SelectionChangedEvent event) {
+            if (event.getSelection().isEmpty()) {
+                removeSemanticModelOrRepresentationButton.setEnabled(false);
+                deleteActionHandler.setEnabled(false);
+                renameActionHandler.setEnabled(false);
+            } else if (event.getSelection() instanceof TreeSelection) {
+                TreeSelection selection = (TreeSelection) event.getSelection();
+
+                // update browser
+                viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
+                Object firstElement = ((IStructuredSelection) selection).getFirstElement();
+                if (firstElement instanceof ViewpointItemImpl) {
+                    viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) firstElement).getViewpoint());
+                } else if (firstElement instanceof RepresentationDescriptionItemImpl) {
+                    RepresentationDescriptionItemImpl representationDescriptionItemImpl = (RepresentationDescriptionItemImpl) firstElement;
+                    viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) representationDescriptionItemImpl.getParent()).getViewpoint());
+                } else if (firstElement instanceof RepresentationItemImpl) {
+                    RepresentationItemImpl representationItem = (RepresentationItemImpl) firstElement;
+                    RepresentationDescriptionItemImpl representationDescriptionItemImpl = (RepresentationDescriptionItemImpl) representationItem.getParent();
+                    viewpointsSelectionGraphicalHandler.setBrowserInput(((ViewpointItemImpl) representationDescriptionItemImpl.getParent()).getViewpoint());
+                }
+
+                // update buttons
+                Iterator<?> selectionIte = selection.iterator();
+                boolean allRepresentationItem = true;
+                while (selectionIte.hasNext() && allRepresentationItem) {
+                    Object object = selectionIte.next();
+                    if (!(object instanceof RepresentationItemImpl)) {
+                        allRepresentationItem = false;
+                    }
+                }
+                if (allRepresentationItem) {
+                    removeSemanticModelOrRepresentationButton.setEnabled(true);
+                    deleteActionHandler.setEnabled(true);
+                    renameActionHandler.setEnabled(true);
+                } else {
+                    removeSemanticModelOrRepresentationButton.setEnabled(false);
+                    deleteActionHandler.setEnabled(false);
+                    renameActionHandler.setEnabled(false);
+                }
+            }
+        }
+    }
+
+    /**
      * Session from which representations are handled.
      */
     private Session session;
@@ -128,6 +274,12 @@
     private Action renameActionHandler;
 
     /**
+     * The graphic component contains the browser used to show information about
+     * viewpoints.
+     */
+    private ViewpointsSelectionGraphicalHandler viewpointsSelectionGraphicalHandler;
+
+    /**
      * Initialize the component with the given session.
      * 
      * @param theSession
@@ -139,6 +291,7 @@
     public GraphicalRepresentationHandler(Session theSession, FormToolkit toolkit) {
         this.session = theSession;
         this.toolkit = toolkit;
+        viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
     }
 
     /**
@@ -183,22 +336,44 @@
      *            the composite to be attached to.
      */
     public void createControl(Composite parentComposite) {
-        treeViewer = createRepresentationExplorerNavigator(parentComposite);
-        createRepresentationExplorerButton(parentComposite, treeViewer);
+        viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
+        Composite rootComposite = new Composite(parentComposite, SWT.NONE);
+        GridLayout rootGridLayout = GridLayoutFactory.swtDefaults().numColumns(3).equalWidth(false).create();
+        rootComposite.setLayout(rootGridLayout);
+        GridData rootLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+        rootComposite.setLayoutData(rootLayoutData);
+        treeViewer = createRepresentationExplorerNavigator(rootComposite);
+        GridData layoutData = (GridData) treeViewer.getTree().getLayoutData();
+        // setting height hint avoids the composite to grow outside visible
+        // port when too much item are present.
+        layoutData.heightHint = 50;
+        viewpointsSelectionGraphicalHandler.createBrowser(rootComposite);
+        viewpointsSelectionGraphicalHandler.setBrowserMinWidth(200);
+        updateViewerInput(treeViewer);
         SessionManager.INSTANCE.addSessionsListener(this);
+
     }
 
     /**
      * Update the representations viewer with the representation currently
-     * available in the session.
+     * available in the session and expand items to level 2 and set selection to
+     * the first item.
      * 
      * @param theTreeViewer
      *            the viewer to update.
      */
     protected void updateViewerInput(TreeViewer theTreeViewer) {
-        Object[] children = siriusCommonContentProvider.getChildren(session);
-        theTreeViewer.setInput(Arrays.stream(children).filter(child -> child instanceof ViewpointsFolderItem).findFirst().get());
+        List<Object> viewpointItemList = new ArrayList<>();
+        Collection<Viewpoint> availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
+        for (Viewpoint viewpoint : availableViewpoints) {
+            viewpointItemList.add(new ViewpointItemImpl(session, viewpoint, this));
+        }
+        theTreeViewer.setInput(viewpointItemList);
         theTreeViewer.expandToLevel(2);
+        if (!availableViewpoints.isEmpty()) {
+            theTreeViewer.setSelection(new StructuredSelection(theTreeViewer.getTree().getItem(0).getData()));
+        }
+
     }
 
     /**
@@ -210,72 +385,161 @@
      */
     private TreeViewer createRepresentationExplorerNavigator(Composite parent) {
         Composite subComposite = toolkit.createComposite(parent, SWT.NONE);
-        subComposite.setLayout(GridLayoutFactory.fillDefaults().create());
-        subComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        representationTree = SWTUtil.createFilteredTree(subComposite, SWT.BORDER, new org.eclipse.ui.dialogs.PatternFilter());
-        TreeViewer theTreeViewer = representationTree.getViewer();
+        subComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
+        GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+        layoutData.widthHint = 350;
+        subComposite.setLayoutData(layoutData);
+        representationTree = SWTUtil.createFilteredTree(subComposite, SWT.BORDER | SWT.MULTI, new org.eclipse.ui.dialogs.PatternFilter());
+        treeViewer = representationTree.getViewer();
         final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
         gridData.minimumHeight = 200;
-        theTreeViewer.getControl().setLayoutData(gridData);
-        theTreeViewer.getTree().setHeaderVisible(false);
-        theTreeViewer.getTree().setLinesVisible(false);
-        final ITreeContentProvider contentProvider = new GroupingContentProvider(new TreeItemWrapperContentProvider());
-        theTreeViewer.setContentProvider(contentProvider);
+        treeViewer.getControl().setLayoutData(gridData);
+        treeViewer.getTree().setHeaderVisible(false);
+        treeViewer.getTree().setLinesVisible(false);
         siriusCommonContentProvider = new SiriusCommonContentProvider();
-        theTreeViewer.setContentProvider(siriusCommonContentProvider);
-        theTreeViewer.setLabelProvider(new SiriusCommonLabelProvider());
+        treeViewer.setContentProvider(siriusCommonContentProvider);
+        treeViewer.setLabelProvider(new SiriusRepresentationLabelProvider());
+        treeViewer.setSorter(new CommonItemSorter());
 
-        updateViewerInput(theTreeViewer);
+        bindKeyToActions();
+        initializeMenusAndActions();
 
-        deleteActionHandler = new DeleteActionHandler(theTreeViewer);
-        renameActionHandler = new RenameActionHandler(theTreeViewer);
+        treeViewer.addDoubleClickListener(new ViewpointActivationAndRepresentationCreationDoubleClickListener());
+        createRepresentationExplorerButton(subComposite, treeViewer);
+        treeViewer.addSelectionChangedListener(new UpdateButtonsAndBrowserAtSelectionChangeListener());
 
-        theTreeViewer.addSelectionChangedListener((event) -> {
-            if (event.getSelection().isEmpty()) {
-                removeSemanticModelOrRepresentationButton.setEnabled(false);
-                deleteActionHandler.setEnabled(false);
-                renameActionHandler.setEnabled(false);
-            } else {
-                TreeSelection selection = (TreeSelection) event.getSelection();
-                // The tree allows only single selections so we pick the
-                // first element.
-                Object firstElement = selection.getFirstElement();
-                if (firstElement instanceof RepresentationItemImpl) {
-                    removeSemanticModelOrRepresentationButton.setEnabled(true);
-                    deleteActionHandler.setEnabled(true);
-                    renameActionHandler.setEnabled(true);
-                } else {
-                    removeSemanticModelOrRepresentationButton.setEnabled(false);
-                    deleteActionHandler.setEnabled(false);
-                    renameActionHandler.setEnabled(false);
-                }
-            }
-        });
+        return treeViewer;
+    }
 
-        theTreeViewer.setSorter(new CommonItemSorter());
-
-        menuManager = new MenuManager();
-        menuManager.addMenuListener(new IMenuListener() {
-
-            @Override
-            public void menuAboutToShow(IMenuManager manager) {
-                manageSessionActionProvider.setContext(new ActionContext(theTreeViewer.getSelection()));
-                manageSessionActionProvider.fillContextMenu(menuManager);
-            }
-
-        });
-        Menu menu = menuManager.createContextMenu(theTreeViewer.getControl());
-        manageSessionActionProvider = new ManageSessionActionProvider();
-        manageSessionActionProvider.initFromViewer(theTreeViewer);
-        theTreeViewer.getControl().setMenu(menu);
-        theTreeViewer.getControl().addKeyListener(new KeyAdapter() {
+    /**
+     * Bind DEL and F2 keys to delete and rename actions.
+     */
+    private void bindKeyToActions() {
+        deleteActionHandler = new DeleteActionHandler(treeViewer);
+        renameActionHandler = new RenameActionHandler(treeViewer);
+        treeViewer.getControl().addKeyListener(new KeyAdapter() {
             @Override
             public void keyReleased(KeyEvent event) {
                 handleKeyReleased(event);
             }
         });
+    }
 
-        return theTreeViewer;
+    /**
+     * Initializes all menus and actions for representation blocks.
+     */
+    private void initializeMenusAndActions() {
+        menuManager = new MenuManager();
+        menuManager.addMenuListener(new IMenuListener() {
+
+            @Override
+            public void menuAboutToShow(IMenuManager manager) {
+                manageSessionActionProvider.setContext(new ActionContext(treeViewer.getSelection()));
+                manageSessionActionProvider.fillContextMenu(menuManager);
+            }
+
+        });
+        Menu menu = menuManager.createContextMenu(treeViewer.getControl());
+        menuManager.setRemoveAllWhenShown(true);
+        manageSessionActionProvider = new ManageSessionActionProvider();
+        manageSessionActionProvider.initFromViewer(treeViewer);
+        treeViewer.getControl().setMenu(menu);
+    }
+
+    /**
+     * Activate or deactivate the viewpoint of the given
+     * {@link ViewpointItemImpl} regarding the activation parameter.
+     * 
+     * @param viewpointItem
+     *            the {@link ViewpointItemImpl} from which the viewpoint should
+     *            be activated or deactivated.
+     * @param changedViewpoint
+     *            the viewpoint that will be deactivated or activated.
+     * @param selectedViewpoints
+     *            the viewpoint that are currently selected in the session.
+     * @param activateViewpoint
+     *            true if the viewpoint should be activated. False otherwise.
+     */
+    private void handleViewpointActivation(ViewpointItemImpl viewpointItem, Viewpoint changedViewpoint, Set<Viewpoint> selectedViewpoints, boolean activateViewpoint) {
+        treeViewer.getTree().setRedraw(false);
+        final SortedMap<Viewpoint, Boolean> originalViewpointsMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
+        Collection<Viewpoint> availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
+        for (final Viewpoint viewpoint : availableViewpoints) {
+            boolean selected = false;
+
+            for (Viewpoint selectedViewpoint : selectedViewpoints) {
+                if (EqualityHelper.areEquals(selectedViewpoint, viewpoint)) {
+                    selected = true;
+                    break;
+                }
+            }
+            originalViewpointsMap.put(viewpoint, Boolean.valueOf(selected));
+        }
+        SortedMap<Viewpoint, Boolean> newViewpointToSelectionStateMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
+        newViewpointToSelectionStateMap.putAll(originalViewpointsMap);
+        newViewpointToSelectionStateMap.put(changedViewpoint, !viewpointItem.isViewpointEnabledInSession());
+
+        // we also deselect viewpoint that will be missing a
+        // dependency if such element exists.
+        Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper
+                .getViewpointsMissingDependencies(newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
+        for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
+            newViewpointToSelectionStateMap.put(viewpointsMissingDependency, false);
+        }
+
+        ViewpointHelper.applyNewViewpointSelection(originalViewpointsMap, newViewpointToSelectionStateMap, session, true);
+
+        // if deactivation has been cancelled by user because an editor is
+        // currently open with one of the viewpoint representations, then we
+        // rollback all deactivation.
+        if ((activateViewpoint && !viewpointItem.isViewpointEnabledInSession()) || (!activateViewpoint && viewpointItem.isViewpointEnabledInSession())) {
+            ViewpointHelper.applyNewViewpointSelection(newViewpointToSelectionStateMap, originalViewpointsMap, session, false);
+        }
+        treeViewer.getTree().setRedraw(true);
+        treeViewer.refresh();
+        treeViewer.setSelection(new StructuredSelection(viewpointItem));
+    }
+
+    /**
+     * Returns the viewpoint that are currently selected in the session.
+     * 
+     * @return the viewpoint that are currently selected in the session.
+     */
+    private Set<Viewpoint> getSelectedViewpoints() {
+        Set<Viewpoint> selectedViewpoints = new HashSet<>();
+        for (int i = 0; i < treeViewer.getTree().getItemCount(); i++) {
+            TreeItem treeItem = treeViewer.getTree().getItem(i);
+            if (treeItem.getData() instanceof ViewpointItemImpl) {
+                ViewpointItemImpl viewpointItem = (ViewpointItemImpl) treeItem.getData();
+                if (viewpointItem.isViewpointEnabledInSession()) {
+                    selectedViewpoints.add(viewpointItem.getViewpoint());
+                }
+            }
+        }
+        return selectedViewpoints;
+    }
+
+    /**
+     * Return an error message referencing all missing dependencies for the
+     * given viewpoint or null if no missing dependencies exists.
+     * 
+     * @param viewpoint
+     *            the viewpoint from which we check if it has missing
+     *            dependencies among activated viewpoints.
+     * @param selectedViewpoints
+     *            the current activated viewpoints.
+     * @return an error message referencing all missing dependencies for the
+     *         given viewpoint or null if no missing dependencies exists.
+     */
+    protected String getMissingDependencyErrorMessage(Viewpoint viewpoint, Set<Viewpoint> selectedViewpoints) {
+        Set<Viewpoint> viewpoints = Sets.newHashSet(selectedViewpoints);
+        viewpoints.add(viewpoint);
+        Map<String, Collection<String>> missingDependencies = ViewpointSelection.getMissingDependencies(viewpoints);
+        if (missingDependencies != null && missingDependencies.get(viewpoint.getName()) != null) {
+            return MessageFormat.format(Messages.GraphicalRepresentationHandler_missingDependencies_requirements, viewpoint.getName(),
+                    missingDependencies.get(viewpoint.getName()).stream().collect(Collectors.joining(", "))); //$NON-NLS-1$
+        }
+        return null;
     }
 
     /**
@@ -287,7 +551,9 @@
     private void createRepresentationExplorerButton(Composite parent, final TreeViewer theTreeViewer) {
         Composite subComposite = toolkit.createComposite(parent, SWT.NONE);
         subComposite.setLayout(GridLayoutFactory.fillDefaults().margins(0, 0).create());
-        subComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+        GridData layoutData = new GridData(SWT.LEFT, SWT.TOP, false, false);
+        layoutData.widthHint = 70;
+        subComposite.setLayoutData(layoutData);
         Composite buttonsComposite = toolkit.createComposite(subComposite, SWT.NONE);
         FillLayout buttonsLayout = new FillLayout(SWT.BEGINNING);
         buttonsLayout.spacing = 5;
@@ -385,8 +651,7 @@
                     if (!representationTree.isDisposed()) {
                         updateViewerInput(treeViewer);
                         // we reset the selection to update the button
-                        // activated
-                        // state if needed.
+                        // activated state if needed.
                         ISelection selection = treeViewer.getSelection();
                         treeViewer.setSelection(selection);
                     }
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
index 9f964d0..9bf6b09 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/graphicalcomponents/GraphicalSemanticModelsHandler.java
@@ -26,7 +26,6 @@
 import org.eclipse.jface.layout.GridLayoutFactory;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.TreePath;
 import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -35,9 +34,7 @@
 import org.eclipse.sirius.business.api.session.SessionListener;
 import org.eclipse.sirius.business.api.session.SessionManager;
 import org.eclipse.sirius.business.api.session.SessionManagerListener;
-import org.eclipse.sirius.common.ui.tools.api.navigator.GroupingContentProvider;
 import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
-import org.eclipse.sirius.common.ui.tools.api.util.TreeItemWrapperContentProvider;
 import org.eclipse.sirius.ui.editor.Messages;
 import org.eclipse.sirius.ui.tools.api.views.common.item.ProjectDependenciesItem;
 import org.eclipse.sirius.ui.tools.internal.actions.analysis.AddModelDependencyAction;
@@ -280,12 +277,10 @@
         modelTree = SWTUtil.createFilteredTree(parent, SWT.BORDER, new org.eclipse.ui.dialogs.PatternFilter());
         TreeViewer theTreeViewer = modelTree.getViewer();
         final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-        gridData.widthHint = 450;
+        gridData.widthHint = 300;
         theTreeViewer.getControl().setLayoutData(gridData);
         theTreeViewer.getTree().setHeaderVisible(false);
         theTreeViewer.getTree().setLinesVisible(false);
-        final ITreeContentProvider contentProvider = new GroupingContentProvider(new TreeItemWrapperContentProvider());
-        theTreeViewer.setContentProvider(contentProvider);
         siriusCommonContentModelProvider = new SiriusCommonContentProvider();
         theTreeViewer.setContentProvider(siriusCommonContentModelProvider);
         theTreeViewer.setLabelProvider(new SiriusCommonLabelProvider());
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
index 8765294..d542668 100644
--- a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/internal/pages/DefaultSessionEditorPage.java
@@ -26,10 +26,8 @@
 import org.eclipse.sirius.ui.editor.SessionEditorPlugin;
 import org.eclipse.sirius.ui.editor.internal.graphicalcomponents.GraphicalRepresentationHandler;
 import org.eclipse.sirius.ui.editor.internal.graphicalcomponents.GraphicalSemanticModelsHandler;
-import org.eclipse.sirius.ui.tools.internal.viewpoint.DynamicViewpointsSelectionComponent;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
@@ -37,7 +35,6 @@
 import org.eclipse.ui.forms.editor.FormPage;
 import org.eclipse.ui.forms.events.HyperlinkEvent;
 import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.FormText;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.forms.widgets.ScrolledForm;
@@ -68,8 +65,6 @@
      */
     private Session session;
 
-    private DynamicViewpointsSelectionComponent dynamicViewpointsSelectionComponent;
-
     /**
      * Label used to provides information regarding editor's context.
      */
@@ -116,17 +111,19 @@
         body.setLayout(GridLayoutFactory.swtDefaults().create());
 
         informativeLabel = toolkit.createFormText(body, false);
-        informativeLabel.setText("<form><p>This editor is a work in progress, currently in alpha state. See <a href='https://wiki.eclipse.org/Sirius/SessionEditor'>the wiki</a> for more details and how to provide feedback.</p></form>", true, true); //$NON-NLS-1$
+        informativeLabel.setText(
+                "<form><p>This editor is a work in progress, currently in alpha state. See <a href='https://wiki.eclipse.org/Sirius/SessionEditor'>the wiki</a> for more details and how to provide feedback.</p></form>", //$NON-NLS-1$
+                true, true);
         informativeLabel.addHyperlinkListener(new IHyperlinkListener() {
-            
+
             @Override
             public void linkExited(HyperlinkEvent e) {
             }
-            
+
             @Override
             public void linkEntered(HyperlinkEvent e) {
             }
-            
+
             @Override
             public void linkActivated(HyperlinkEvent e) {
                 try {
@@ -148,7 +145,6 @@
         rightComposite.setLayout(GridLayoutFactory.swtDefaults().margins(5, 0).create());
         rightComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
-        createViewpointSelectionControl(toolkit, rightComposite, scrolledForm);
         createRepresentationsControl(toolkit, rightComposite);
 
         session.addListener(this);
@@ -175,7 +171,7 @@
 
         Composite modelSectionClient = toolkit.createComposite(modelSection, SWT.NONE);
         modelSectionClient.setLayout(GridLayoutFactory.swtDefaults().numColumns(2).create());
-        modelSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        modelSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
         modelSection.setClient(modelSectionClient);
 
         graphicalModelingHandler = new GraphicalSemanticModelsHandler(session, toolkit);
@@ -209,36 +205,6 @@
 
     }
 
-    /**
-     * Create the control allowing to select/unselect active viewpoints of the
-     * session.
-     * 
-     * @param toolkit
-     *            the tool allowing to create form UI component.
-     * @param rightComposite
-     *            the composite containing the viewpoint selection control.
-     * @param scrolledForm
-     *            dd.
-     */
-    protected void createViewpointSelectionControl(FormToolkit toolkit, Composite rightComposite, ScrolledForm scrolledForm) {
-        Composite bottomComposite = toolkit.createComposite(rightComposite);
-        bottomComposite.setLayout(GridLayoutFactory.fillDefaults().create());
-        bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
-        final Section viewpointSection = toolkit.createSection(bottomComposite,
-                Section.DESCRIPTION | Section.TITLE_BAR | ExpandableComposite.COMPACT | ExpandableComposite.EXPANDED | ExpandableComposite.TWISTIE);
-        viewpointSection.setLayout(GridLayoutFactory.fillDefaults().create());
-        viewpointSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        viewpointSection.setText(Messages.UI_SessionEditor_viewpoints_title);
-
-        Composite viewpointSectionClient = toolkit.createComposite(viewpointSection, SWT.NONE);
-        GridLayout newLayout = GridLayoutFactory.fillDefaults().create();
-        viewpointSectionClient.setLayout(newLayout);
-        viewpointSection.setClient(viewpointSectionClient);
-
-        dynamicViewpointsSelectionComponent = new DynamicViewpointsSelectionComponent(session);
-        dynamicViewpointsSelectionComponent.createControl(viewpointSectionClient);
-    }
-
     @Override
     public void doSave(IProgressMonitor monitor) {
         if (session != null) {
@@ -288,10 +254,6 @@
             session.removeListener(this);
             session = null;
         }
-        if (dynamicViewpointsSelectionComponent != null) {
-            dynamicViewpointsSelectionComponent.dispose();
-            dynamicViewpointsSelectionComponent = null;
-        }
         if (graphicalModelingHandler != null) {
             graphicalModelingHandler.dispose();
             graphicalModelingHandler = null;
diff --git a/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java
new file mode 100644
index 0000000..0d872d7
--- /dev/null
+++ b/plugins/org.eclipse.sirius.ui.editor/src/org/eclipse/sirius/ui/editor/provider/SiriusRepresentationLabelProvider.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.ui.editor.provider;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
+import org.eclipse.sirius.ui.editor.Messages;
+import org.eclipse.sirius.ui.tools.api.color.VisualBindingManager;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.ViewpointItemImpl;
+import org.eclipse.sirius.ui.tools.internal.views.common.navigator.SiriusCommonLabelProvider;
+import org.eclipse.sirius.viewpoint.description.Viewpoint;
+import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * This label provider is used to provides labels, images and foreground for
+ * items of the block showing representations and viewpoint on the same viewer.
+ * 
+ * 
+ * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
+ *
+ */
+public class SiriusRepresentationLabelProvider extends SiriusCommonLabelProvider {
+
+    @Override
+    public Color getForeground(Object element) {
+        // we show a gray out the item if it is a viewpoint item not enabled in
+        // the session of the current opened editor.
+        Color result = null;
+        if (element instanceof ViewpointItemImpl) {
+
+            ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+
+            if (!viewpointItem.isViewpointEnabledInSession()) {
+                result = VisualBindingManager.getDefault().getColorFromName("gray"); //$NON-NLS-1$
+            }
+        }
+        if (result == null) {
+            result = super.getForeground(element);
+        }
+        return result;
+    }
+
+    @Override
+    public String getText(Object element) {
+        // We add a disabled label to the viewpoint item label if it is not
+        // enabled in the session of the current opened editor.
+        String text = super.getText(element);
+        if (element instanceof ViewpointItemImpl) {
+            ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+
+            if (!viewpointItem.isViewpointEnabledInSession()) {
+                text += " (" + Messages.GraphicalRepresentationHandler_disabledViewpoint_label + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+            }
+        } else if (element instanceof RepresentationDescriptionItemImpl) {
+            RepresentationDescriptionItemImpl descriptionItem = (RepresentationDescriptionItemImpl) element;
+            text += MessageFormat.format(Messages.GraphicalRepresentationHandler_representationNumber_label, descriptionItem.getChildren().size()); // $NON-NLS-1$
+        }
+        return text;
+    }
+
+    @Override
+    public Image getImage(Object element) {
+        Image image = null;
+        // For viewpoint item we show as icon the one corresponding to the
+        // status of the viewpoint (coming from a plugin in the runtime context
+        // or in the workspace).
+        if (element instanceof ViewpointItemImpl) {
+            ViewpointItemImpl viewpointItem = (ViewpointItemImpl) element;
+            final Viewpoint vp = viewpointItem.getViewpoint();
+            if (vp.getIcon() != null && vp.getIcon().length() > 0) {
+                final ImageDescriptor desc = SiriusEditPlugin.Implementation.findImageDescriptor(vp.getIcon());
+                if (desc != null) {
+                    image = SiriusEditPlugin.getPlugin().getImage(desc);
+                    image = getEnhancedImage(image, vp);
+                }
+            }
+            if (image == null) {
+                image = SiriusEditPlugin.getPlugin().getImage(SiriusEditPlugin.getPlugin().getItemImageDescriptor(vp));
+                image = getEnhancedImage(image, vp);
+            }
+        } else {
+            image = super.getImage(element);
+        }
+        return image;
+    }
+
+    /**
+     * Return a composition of the viewpoint item image with the viewpoint image
+     * and a folder image as an overlay.
+     * 
+     * @param image
+     *            the viewpoint image.
+     * @param viewpoint
+     *            the viewpoint from which we want the composed image.
+     * @return a composition of the viewpoint item image with the viewpoint
+     *         image as an overlay and a folder image.
+     */
+    private Image getEnhancedImage(final Image image, final Viewpoint viewpoint) {
+        // Add decorator if the viewpoint comes from workspace
+        if (!ViewpointRegistry.getInstance().isFromPlugin(viewpoint) && image != null) {
+            return SiriusEditPlugin.getPlugin().getImage(getOverlayedDescriptor(image, "icons/full/decorator/folder_close.gif")); //$NON-NLS-1$
+        }
+        return image;
+    }
+
+    /**
+     * Returns an image descriptor of the folder image as overlay of the
+     * viewpoint image.
+     * 
+     * @param baseImage
+     *            viewpoint image
+     * @param decoratorPath
+     *            path to the folder image.
+     * @return an image descriptor of the folder image as overlay of the
+     *         viewpoint image.
+     */
+    private ImageDescriptor getOverlayedDescriptor(final Image baseImage, final String decoratorPath) {
+        final ImageDescriptor decoratorDescriptor = SiriusEditPlugin.Implementation.getBundledImageDescriptor(decoratorPath);
+        return new DecorationOverlayIcon(baseImage, decoratorDescriptor, IDecoration.BOTTOM_LEFT);
+    }
+
+}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java
deleted file mode 100644
index 565e80d..0000000
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/DynamicViewpointsSelectionComponent.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Obeo.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.ui.tools.internal.viewpoint;
-
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.stream.Collectors;
-
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.sirius.business.api.componentization.ViewpointRegistry;
-import org.eclipse.sirius.business.api.session.Session;
-import org.eclipse.sirius.business.api.session.SessionListener;
-import org.eclipse.sirius.business.internal.metamodel.description.spec.ViewpointSpec;
-import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
-import org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection;
-import org.eclipse.sirius.ui.tools.internal.wizards.pages.IViewpointStateListener;
-import org.eclipse.sirius.ui.tools.internal.wizards.pages.ViewpointStateChangeEvent;
-import org.eclipse.sirius.viewpoint.description.Viewpoint;
-import org.eclipse.sirius.viewpoint.provider.Messages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-/**
- * Component providing dynamic activation/deactivation behavior for the graphic component
- * {@link ViewpointsSelectionGraphicalHandler} and session synchronization. I.e any viewpoint check state change from
- * graphical component and triggered by user will be feed through to the session. And in the other way any change of
- * viewpoint activation/deactivation or presence change in the session will be feed through to the graphic component to
- * update viewpoints available and their check state status.
- * 
- * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
- *
- */
-public class DynamicViewpointsSelectionComponent {
-
-    /**
-     * The session from which viewpoint will be available for activation/deactivation.
-     */
-    private Session session;
-
-    /**
-     * Contains all viewpoints available in the current runtime registry.
-     */
-    private Collection<Viewpoint> availableViewpoints;
-
-    /**
-     * Listen to any change regarding viewpoints or semantic models available to the session and refresh the list of
-     * viewpoint available in the graphic component with their check status if needed.
-     */
-    private SessionChangeListener sessionChangelistener;
-
-    /**
-     * The graphic component containing checkbox for each viewpoint activable/deactivable and a browser allowing to see
-     * a description for each.
-     */
-    private ViewpointsSelectionGraphicalHandler viewpointsSelectionGraphicalHandler;
-
-    /**
-     * Listener updating the session accordingly to changes triggered by user when checking /unchecking viewpoint from
-     * graphical component {@link ViewpointsSelectionGraphicalHandler}.
-     */
-    private DefaultViewpointStateListener viewpointStateListener;
-
-    /**
-     * The last viewpoints activation status for the current editor session.
-     */
-    private Set<Viewpoint> lastSelectedViewpoints;
-
-    /**
-     * Listener delegating to the {@link DefaultViewpointStateListener} listener when a check state change occurs (I.e a
-     * viewpoint has been checked or unchecked).
-     */
-    private ICheckStateListener checkStateListener;
-
-    /**
-     * Check if selected viewpoint is missing dependencies to be activated. If so it show an error message above the
-     * viewpoint description browser.
-     */
-    private ISelectionChangedListener selectionListener;
-
-    /**
-     * This listener allows viewpoint activation/deactivation by a double click.
-     */
-    private IDoubleClickListener doubleClickListener;
-
-    /**
-     * Listener updating the session accordingly to changes triggered by user when checking /unchecking viewpoint from
-     * graphical component {@link ViewpointsSelectionGraphicalHandler}.
-     * 
-     * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
-     *
-     */
-    private class DefaultViewpointStateListener implements IViewpointStateListener {
-
-        @Override
-        public void viewpointStateChange(ViewpointStateChangeEvent viewpointStateChangeEvent) {
-            final SortedMap<Viewpoint, Boolean> originalViewpointsMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
-            for (final Viewpoint viewpoint : availableViewpoints) {
-                boolean selected = false;
-
-                for (Viewpoint selectedViewpoint : lastSelectedViewpoints) {
-                    if (EqualityHelper.areEquals(selectedViewpoint, viewpoint)) {
-                        selected = true;
-                        break;
-                    }
-                }
-                originalViewpointsMap.put(viewpoint, Boolean.valueOf(selected));
-            }
-            SortedMap<Viewpoint, Boolean> newViewpointToSelectionStateMap = Maps.newTreeMap(new ViewpointRegistry.ViewpointComparator());
-            newViewpointToSelectionStateMap.putAll(originalViewpointsMap);
-            newViewpointToSelectionStateMap.put(viewpointStateChangeEvent.getViewpoint(), viewpointStateChangeEvent.shouldBeActivated());
-
-            // we also deselect viewpoint that will be missing a dependency if such element exists.
-            Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper.getViewpointsMissingDependencies(
-                    newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
-            for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
-                newViewpointToSelectionStateMap.put(viewpointsMissingDependency, false);
-            }
-
-            ViewpointHelper.applyNewViewpointSelection(originalViewpointsMap, newViewpointToSelectionStateMap, session, true);
-
-            // If deselection has been cancelled we update the last selected viewpoints set to reflect this deselection
-            // in the cache.
-            boolean viewpointSelected = session.getSelectedViewpoints(true).stream().anyMatch(viewpoint -> EqualityHelper.areEquals(viewpointStateChangeEvent.getViewpoint(), viewpoint));
-            newViewpointToSelectionStateMap.put(viewpointStateChangeEvent.getViewpoint(), viewpointSelected);
-            for (Viewpoint viewpointsMissingDependency : viewpointsMissingDependencies) {
-                viewpointSelected = session.getSelectedViewpoints(true).stream().anyMatch(viewpoint -> EqualityHelper.areEquals(viewpointsMissingDependency, viewpoint));
-                newViewpointToSelectionStateMap.put(viewpointsMissingDependency, viewpointSelected);
-            }
-
-            lastSelectedViewpoints = new HashSet<Viewpoint>(
-                    newViewpointToSelectionStateMap.keySet().stream().filter(viewpoint -> newViewpointToSelectionStateMap.get(viewpoint)).collect(Collectors.toSet()));
-            viewpointsSelectionGraphicalHandler.getViewer().setCheckedElements(lastSelectedViewpoints.toArray(new Object[0]));
-            viewpointsSelectionGraphicalHandler.getViewer().setSelection(new StructuredSelection(viewpointStateChangeEvent.getViewpoint()));
-
-            updateGrayedOutElement();
-            viewpointsSelectionGraphicalHandler.getViewer().refresh();
-        }
-
-    }
-
-    /**
-     * Create an instance of a graphic component allowing to activate/deactivate viewpoint from a session.
-     *
-     * @param theSession
-     *            the session from which viewpoint will be available for activation/deactivation.
-     */
-    public DynamicViewpointsSelectionComponent(final Session theSession) {
-        this.session = theSession;
-        viewpointsSelectionGraphicalHandler = new ViewpointsSelectionGraphicalHandler();
-        availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(theSession);
-        viewpointStateListener = new DefaultViewpointStateListener();
-        lastSelectedViewpoints = new HashSet<Viewpoint>();
-    }
-
-    private void updateGrayedOutElement() {
-        for (Viewpoint viewpoint : availableViewpoints) {
-            String missingDependencyErrorMessage = getMissingDependencyErrorMessage(viewpoint, lastSelectedViewpoints);
-            if (missingDependencyErrorMessage != null) {
-                viewpointsSelectionGraphicalHandler.getViewer().setGrayed(viewpoint, true);
-            } else {
-                viewpointsSelectionGraphicalHandler.getViewer().setGrayed(viewpoint, false);
-            }
-        }
-
-    }
-
-    /**
-     * Listen to any change regarding viewpoints or semantic models available to the session and refresh the list of
-     * viewpoint available in the graphic component with their check status if needed. Viewpoint can be made unavailable
-     * for the session when closing the project containing it and model semantic models can be removed for example.
-     * 
-     * @author <a href="mailto:pierre.guilet@obeo.fr">Pierre Guilet</a>
-     *
-     */
-    private final class SessionChangeListener implements SessionListener {
-        @Override
-        public void notify(int changeKind) {
-            switch (changeKind) {
-            case SessionListener.SELECTED_VIEWS_CHANGE_KIND:
-            case SessionListener.VSM_UPDATED:
-            case SessionListener.SEMANTIC_CHANGE:
-                availableViewpoints = viewpointsSelectionGraphicalHandler.getAvailableViewpoints(session);
-                setViewpoints(getAvailableViewpoints());
-                break;
-            default:
-                break;
-            }
-
-        }
-    }
-
-    /**
-     * Reinitialize the viewer containing all the checkbox for available viewpoints for the session with their check
-     * status.
-     * 
-     * @param theAvailableViewpoints
-     *            all the viewpoints available to the session that need to be made visible for activation/deactivation
-     *            to the user in the graphic component.
-     */
-    private void setViewpoints(Collection<Viewpoint> theAvailableViewpoints) {
-        PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
-            lastSelectedViewpoints.clear();
-            CheckboxTableViewer viewer = viewpointsSelectionGraphicalHandler.getViewer();
-            viewer.setInput(theAvailableViewpoints);
-            // case were activated viewpoint are the one corresponding to the session.
-            Collection<Viewpoint> selectedViewpoints = session.getSelectedViewpoints(false);
-            for (int i = 0; i < viewer.getTable().getItemCount(); i++) {
-                Object object = viewer.getElementAt(i);
-                if (object instanceof Viewpoint) {
-                    Viewpoint viewerViewpoint = (Viewpoint) object;
-                    for (Viewpoint selectedViewpoint : selectedViewpoints) {
-                        if (EqualityHelper.areEquals(viewerViewpoint, selectedViewpoint)) {
-                            lastSelectedViewpoints.add(viewerViewpoint);
-                        }
-                    }
-                }
-            }
-            if (!lastSelectedViewpoints.isEmpty()) {
-                // Check all the default viewpoints
-                viewer.setCheckedElements(lastSelectedViewpoints.toArray(new Object[0]));
-                // Set the focus on the first one
-                viewer.setSelection(new StructuredSelection(lastSelectedViewpoints.stream().findFirst().get()));
-            } else {
-                viewpointsSelectionGraphicalHandler.getBrowser().setText(""); //$NON-NLS-1$
-            }
-
-            // For all no selected viewpoints we check if they have missing dependencies among activated ones and if
-            // they do we gray out
-            // those.
-            for (Viewpoint viewpoint : availableViewpoints) {
-                Set<Viewpoint> viewpoints = new HashSet<Viewpoint>(lastSelectedViewpoints);
-                viewpoints.add(viewpoint);
-                Set<Viewpoint> viewpointsMissingDependencies = ViewpointHelper.getViewpointsMissingDependencies(viewpoints);
-                if (viewpointsMissingDependencies.contains(viewpoint)) {
-                    viewer.setGrayed(viewpoint, true);
-                } else {
-                    viewer.setGrayed(viewpoint, false);
-                }
-            }
-            viewpointsSelectionGraphicalHandler.getRootComposite().layout();
-        });
-
-    }
-
-    /**
-     * Returns all registered viewpoints that define editors for metamodel of loaded session's semantic models.
-     * 
-     * @return all registered viewpoints that define editors for metamodel of loaded session's semantic models.
-     */
-    public Collection<Viewpoint> getAvailableViewpoints() {
-        return availableViewpoints;
-    }
-
-    /**
-     * Create the control allowing to select/deselect viewpoints with checkbox and to see in a browser a description of
-     * each viewpoint.
-     * 
-     * @param parent
-     *            the parent composite to attached to this graphic component.
-     */
-    public void createControl(final Composite parent) {
-        viewpointsSelectionGraphicalHandler.createControl(parent, false);
-        viewpointsSelectionGraphicalHandler.setBrowserMinWidth(200);
-        viewpointsSelectionGraphicalHandler.setHeight(304);
-        checkStateListener = event -> {
-            String errorMessage = null;
-
-            if (event.getElement() instanceof Viewpoint) {
-                Viewpoint viewpointChecked = (Viewpoint) event.getElement();
-                viewpointsSelectionGraphicalHandler.getViewer().setSelection(new StructuredSelection(viewpointChecked));
-                if (!lastSelectedViewpoints.isEmpty()) {
-                    errorMessage = getMissingDependencyErrorMessage(viewpointChecked, lastSelectedViewpoints);
-                }
-                if (errorMessage == null) {
-                    viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
-                    if (!viewpointsSelectionGraphicalHandler.getViewer().getGrayed(viewpointChecked)) {
-                        if (event.getChecked()) {
-                            viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpointChecked, true));
-                        } else {
-                            viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpointChecked, false));
-                        }
-                    }
-                } else {
-                    viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
-                }
-            }
-        };
-        viewpointsSelectionGraphicalHandler.getViewer().addCheckStateListener(checkStateListener);
-
-        selectionListener = event -> {
-            if (event.getSelection() instanceof StructuredSelection) {
-                StructuredSelection selection = (StructuredSelection) event.getSelection();
-                if (selection.getFirstElement() instanceof Viewpoint) {
-                    Viewpoint viewpoint = (Viewpoint) selection.getFirstElement();
-                    String errorMessage = getMissingDependencyErrorMessage(viewpoint, lastSelectedViewpoints);
-                    if (errorMessage != null) {
-                        viewpointsSelectionGraphicalHandler.setBrowserErrorMessageText(errorMessage);
-                    } else {
-                        viewpointsSelectionGraphicalHandler.clearBrowserErrorMessageText();
-                    }
-                }
-            }
-        };
-        viewpointsSelectionGraphicalHandler.getViewer().addSelectionChangedListener(selectionListener);
-
-        doubleClickListener = (event) -> {
-            event.getSelection();
-            if (event.getSelection() instanceof StructuredSelection) {
-                StructuredSelection selection = (StructuredSelection) event.getSelection();
-                if (selection.getFirstElement() instanceof ViewpointSpec) {
-                    ViewpointSpec viewpoint = (ViewpointSpec) selection.getFirstElement();
-                    if (!viewpointsSelectionGraphicalHandler.getViewer().getGrayed(viewpoint)) {
-                        viewpointStateListener.viewpointStateChange(new ViewpointStateChangeEvent(viewpoint, !viewpointsSelectionGraphicalHandler.getViewer().getChecked(viewpoint)));
-                    } else {
-                        viewpointsSelectionGraphicalHandler.getViewer().setChecked(viewpoint, !viewpointsSelectionGraphicalHandler.getViewer().getChecked(viewpoint));
-                    }
-
-                }
-            }
-        };
-        viewpointsSelectionGraphicalHandler.getViewer().addDoubleClickListener(doubleClickListener);
-
-        setViewpoints(availableViewpoints);
-        sessionChangelistener = new SessionChangeListener();
-        session.addListener(sessionChangelistener);
-    }
-
-    /**
-     * Return an error message referencing all missing dependencies for the given viewpoint or null if no missing
-     * dependencies exists.
-     * 
-     * @param viewpoint
-     *            the viewpoint from which we check if it has missing dependencies among activated viewpoints.
-     * @param selectedViewpoints
-     *            the current activated viewpoints.
-     * @return an error message referencing all missing dependencies for the given viewpoint or null if no missing
-     *         dependencies exists.
-     */
-    protected String getMissingDependencyErrorMessage(Viewpoint viewpoint, Set<Viewpoint> selectedViewpoints) {
-        Set<Viewpoint> viewpoints = Sets.newHashSet(selectedViewpoints);
-        viewpoints.add(viewpoint);
-        Map<String, Collection<String>> missingDependencies = ViewpointSelection.getMissingDependencies(viewpoints);
-        if (missingDependencies != null && missingDependencies.get(viewpoint.getName()) != null) {
-            return MessageFormat.format(Messages.DynamicViewpointsSelectionComponent_missingDependencies_requirements, viewpoint.getName(),
-                    missingDependencies.get(viewpoint.getName()).stream().collect(Collectors.joining(", "))); //$NON-NLS-1$
-        }
-        return null;
-    }
-
-    /**
-     * Dispose any listeners added by this instance.
-     */
-    public void dispose() {
-        if (session != null && sessionChangelistener != null) {
-            session.removeListener(sessionChangelistener);
-        }
-        if (viewpointsSelectionGraphicalHandler != null) {
-            if (selectionListener != null) {
-                viewpointsSelectionGraphicalHandler.getViewer().removeSelectionChangedListener(selectionListener);
-            }
-            if (checkStateListener != null) {
-                viewpointsSelectionGraphicalHandler.getViewer().removeCheckStateListener(checkStateListener);
-            }
-            if (doubleClickListener != null) {
-                viewpointsSelectionGraphicalHandler.getViewer().removeDoubleClickListener(doubleClickListener);
-            }
-        }
-        viewpointStateListener = null;
-        selectionListener = null;
-        sessionChangelistener = null;
-        session = null;
-    }
-}
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
index 593780b..f5c1521 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/viewpoint/ViewpointsSelectionGraphicalHandler.java
@@ -122,6 +122,11 @@
     private Composite browserErrorMessageComposite;
 
     /**
+     * The root composite of the browser component.
+     */
+    private Composite browserRootComposite;
+
+    /**
      * Return the composite enclosing all graphical parts of this component.
      * 
      * @return the composite enclosing all graphical parts of this component.
@@ -140,6 +145,15 @@
     }
 
     /**
+     * Returns the root composite of the browser component.
+     * 
+     * @return the root composite of the browser component.
+     */
+    public Composite getBrowserRootComposite() {
+        return browserRootComposite;
+    }
+
+    /**
      * Return all registered viewpoints that define editors for metamodel of loaded session's semantic models.
      * 
      * @param session
@@ -201,7 +215,7 @@
 
         createTableViewer(rootComposite);
 
-        this.browser = createBrowser(rootComposite);
+        createBrowser(rootComposite);
         setBrowserInput(null);
 
     }
@@ -214,9 +228,9 @@
      *            the parent composite to be attached to.
      * @return the newly created {@link Browser}.
      */
-    private Browser createBrowser(final Composite parent) {
+    public Browser createBrowser(final Composite parent) {
 
-        Composite browserRootComposite = new Composite(parent, SWT.None);
+        browserRootComposite = new Composite(parent, SWT.BORDER);
         browserRootComposite.setLayout(GridLayoutFactory.fillDefaults().create());
         browserRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
 
@@ -241,6 +255,7 @@
             browserGridData.widthHint = 0;
             browserGridData.heightHint = 0;
             aBrowser.setLayoutData(browserGridData);
+            this.browser = aBrowser;
             return aBrowser;
         } catch (SWTError error) {
             /*
@@ -261,7 +276,7 @@
         browserErrorMessageLayoutData.exclude = false;
         browserErrorMessageText.setText(errorMessage);
         browserErrorMessageComposite.setVisible(true);
-        rootComposite.layout(true, true);
+        browserRootComposite.layout(true, true);
     }
 
     /**
@@ -271,7 +286,7 @@
         browserErrorMessageLayoutData.exclude = true;
         browserErrorMessageText.setText(""); //$NON-NLS-1$
         browserErrorMessageComposite.setVisible(false);
-        rootComposite.getParent().layout(true, true);
+        browserRootComposite.getParent().layout(true, true);
     }
 
     /**
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
index 3e4f684..7a17c15 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/views/common/item/ViewpointItemImpl.java
@@ -21,6 +21,7 @@
 import org.eclipse.sirius.business.api.query.IdentifiedElementQuery;
 import org.eclipse.sirius.business.api.query.ViewpointQuery;
 import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.common.tools.api.util.EqualityHelper;
 import org.eclipse.sirius.common.tools.api.util.MessageTranslator;
 import org.eclipse.sirius.common.ui.tools.api.view.common.item.ItemDecorator;
 import org.eclipse.sirius.ext.base.Option;
@@ -186,4 +187,26 @@
     public Image getImage() {
         return SiriusEditPlugin.getPlugin().getImage(SiriusEditPlugin.getPlugin().getItemImageDescriptor(viewpoint));
     }
+
+    /**
+     * Returns true if the viewpoint is enabled in the session of this item.
+     * 
+     * @return true if the viewpoint is enabled in the session of this item. False otherwise.
+     */
+    public boolean isViewpointEnabledInSession() {
+        boolean isViewpointEnabledInSession = false;
+        Collection<Viewpoint> selectedViewpoints = session.getSelectedViewpoints(false);
+        for (Viewpoint viewpointTemp : selectedViewpoints) {
+            if (EqualityHelper.areEquals(viewpoint, viewpointTemp)) {
+                isViewpointEnabledInSession = true;
+            }
+
+        }
+        return isViewpointEnabledInSession;
+
+    }
+
+    public Viewpoint getViewpoint() {
+        return viewpoint;
+    }
 }
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
index f4e44e2..fa97163 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/CreateRepresentationWizard.java
@@ -16,13 +16,13 @@
 import org.eclipse.sirius.ui.tools.api.views.ViewHelper;
 import org.eclipse.sirius.ui.tools.internal.actions.creation.CreateRepresentationAction;
 import org.eclipse.sirius.ui.tools.internal.views.common.SessionLabelProvider;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
 import org.eclipse.sirius.ui.tools.internal.wizards.pages.RepresentationSelectionWizardPage;
 import org.eclipse.sirius.ui.tools.internal.wizards.pages.SemanticElementSelectionWizardPage;
 import org.eclipse.sirius.viewpoint.provider.Messages;
 
 /**
- * This wizard creates a representation, choosing the representation type and
- * the semantic element.
+ * This wizard creates a representation, choosing the representation type and the semantic element.
  *
  * @author nlepine
  *
@@ -35,6 +35,10 @@
 
     private RepresentationSelectionWizardPage representationWizardPage;
 
+    private RepresentationDescriptionItemImpl representationDescriptionItem;
+
+    private boolean creationCancelled;
+
     /**
      * Constructor.
      *
@@ -46,6 +50,19 @@
     }
 
     /**
+     * Initialize wizard with the given representation descriptor to use.
+     * 
+     * @param theSession
+     *            the session used for representation creation.
+     * @param theRepresentationDescriptionItem
+     *            the representation descriptor to select by default.
+     */
+    public CreateRepresentationWizard(Session theSession, RepresentationDescriptionItemImpl theRepresentationDescriptionItem) {
+        this.session = theSession;
+        this.representationDescriptionItem = theRepresentationDescriptionItem;
+    }
+
+    /**
      * Initialize the wizard.
      */
     public void init() {
@@ -57,8 +74,8 @@
     public boolean performFinish() {
         EObject element = selectElementPage.getSelectedElement();
         if (element != null) {
-            CreateRepresentationAction action = new CreateRepresentationAction(session, element, representationWizardPage.getRepresentation(), new SessionLabelProvider(
-                    ViewHelper.INSTANCE.createAdapterFactory()));
+            CreateRepresentationAction action = new CreateRepresentationAction(session, element, representationWizardPage.getRepresentation(),
+                    new SessionLabelProvider(ViewHelper.INSTANCE.createAdapterFactory()));
             action.run();
         }
         return true;
@@ -66,7 +83,7 @@
 
     @Override
     public void addPages() {
-        representationWizardPage = new RepresentationSelectionWizardPage(session);
+        representationWizardPage = new RepresentationSelectionWizardPage(session, representationDescriptionItem);
         selectElementPage = new SemanticElementSelectionWizardPage(session);
         representationWizardPage.setSelectionWizard(selectElementPage);
         addPage(representationWizardPage);
@@ -85,4 +102,18 @@
         return !representationWizardPage.isCurrentPageOnWizard() && super.canFinish();
     }
 
+    @Override
+    public boolean performCancel() {
+        this.creationCancelled = true;
+        return true;
+    }
+
+    /**
+     * Returns true is the creation has been cancelled. False otherwise.
+     * 
+     * @return true is the creation has been cancelled. False otherwise.
+     */
+    public boolean isCreationCancelled() {
+        return creationCancelled;
+    }
 }
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
index 4b6c54b..d5388d8 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/RepresentationSelectionWizardPage.java
@@ -14,6 +14,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
 import org.eclipse.jface.viewers.ISelection;
@@ -31,6 +32,7 @@
 import org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority;
 import org.eclipse.sirius.ecore.extender.business.api.permission.PermissionAuthorityRegistry;
 import org.eclipse.sirius.ui.tools.api.views.ViewHelper;
+import org.eclipse.sirius.ui.tools.internal.views.common.item.RepresentationDescriptionItemImpl;
 import org.eclipse.sirius.ui.tools.internal.views.common.navigator.sorter.CommonItemSorter;
 import org.eclipse.sirius.viewpoint.DView;
 import org.eclipse.sirius.viewpoint.description.RepresentationDescription;
@@ -65,6 +67,11 @@
     private SemanticElementSelectionWizardPage selectionWizard;
 
     /**
+     * The representation descriptor that should be selected by default when opening the page.
+     */
+    private RepresentationDescriptionItemImpl representationDescriptionItem;
+
+    /**
      * Create a new <code>RepresentationSelectionWizardPage</code>.
      *
      * @param root
@@ -77,6 +84,22 @@
         setMessage(Messages.RepresentationSelectionWizardPage_message);
     }
 
+    /**
+     * Create a new <code>RepresentationSelectionWizardPage</code>.
+     * 
+     * @param theSession
+     *            the session from which representations will be created.
+     * @param theRepresentationDescriptionItem
+     *            The representation descriptor that should be selected by default when opening the page.
+     */
+    public RepresentationSelectionWizardPage(Session theSession, RepresentationDescriptionItemImpl theRepresentationDescriptionItem) {
+        super(Messages.RepresentationSelectionWizardPage_title);
+        this.setTitle(Messages.RepresentationSelectionWizardPage_title);
+        this.root = theSession;
+        setMessage(Messages.RepresentationSelectionWizardPage_message);
+        representationDescriptionItem = theRepresentationDescriptionItem;
+    }
+
     @Override
     public boolean canFlipToNextPage() {
         boolean result = false;
@@ -160,7 +183,25 @@
                 }
             }
         });
-
+        if (representationDescriptionItem != null) {
+            // we select the representation description item among all other items.
+            treeViewer.expandAll();
+            int itemCount = treeViewer.getTree().getItemCount();
+            for (int i = 0; i < itemCount; i++) {
+                Object item = treeViewer.getTree().getItem(i).getData();
+                if (item instanceof Viewpoint) {
+                    Viewpoint viewpoint = (Viewpoint) item;
+                    Optional<RepresentationDescription> representationOption = Lists.newArrayList(viewpoint.getOwnedRepresentations()).stream()
+                            .filter(rep -> CommonItemSorter.compareRepresentationDescriptions(rep, (RepresentationDescription) representationDescriptionItem.getWrappedObject()) == 0).findFirst();
+                    if (representationOption.isPresent()) {
+                        treeViewer.setSelection(new StructuredSelection(representationOption.get()), true);
+                        representation = representationOption.get();
+                        selectionWizard.setRepresentation(getRepresentation());
+                        selectionWizard.update();
+                    }
+                }
+            }
+        }
         setControl(pageComposite);
     }
 
@@ -214,6 +255,7 @@
                         return CommonItemSorter.compareRepresentationDescriptions(rep1, rep2);
                     };
                 });
+
                 children = reps.toArray();
             }
             return children;
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
index 5ad7f4b..7b2b381 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/internal/wizards/pages/SemanticElementSelectionWizardPage.java
@@ -100,10 +100,9 @@
         final int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
         tree = SWTUtil.createFilteredTree(parent, style, new EObjectFilter());
         /*
-         * If there is a problem accessing/enabling the quick selection mode the
-         * best course of action is to fail silently, this mode only provides a
-         * slightly improved user experience by automatically selecting the
-         * first element which matches the filter and is selectable.
+         * If there is a problem accessing/enabling the quick selection mode the best course of action is to fail
+         * silently, this mode only provides a slightly improved user experience by automatically selecting the first
+         * element which matches the filter and is selectable.
          */
         ReflectionHelper.invokeMethodWithoutException(tree, "setQuickSelectionMode", new Class[] { Boolean.TYPE }, new Object[] { true }); //$NON-NLS-1$
         final TreeViewer viewer = tree.getViewer();
@@ -192,15 +191,16 @@
      * Update the page.
      */
     public void update() {
-        treeViewer.refresh();
-        if (tree.getFilterControl() != null) {
-            /*
-             * By setting the text to 'wilcard' ourselves we make sure to
-             * trigger the filtering. As the tree has "QuickSelectionMode"
-             * enabled it also makes the tree pre-select the first matching
-             * node, saving the user a manual selection in many cases.
-             */
-            tree.getFilterControl().setText("*"); //$NON-NLS-1$
+        if (treeViewer != null) {
+            treeViewer.refresh();
+            if (tree.getFilterControl() != null) {
+                /*
+                 * By setting the text to 'wilcard' ourselves we make sure to trigger the filtering. As the tree has
+                 * "QuickSelectionMode" enabled it also makes the tree pre-select the first matching node, saving the
+                 * user a manual selection in many cases.
+                 */
+                tree.getFilterControl().setText("*"); //$NON-NLS-1$
+            }
         }
     }