h1. Release Notes for Sirius

{toc:style=disc|minLevel=2|maxLevel=3}

This document contains the release notes for recent major releases of Sirius. See also "the release notes from previous versions":Release_Notes_Previous.html for details about older releases.

h2(#sirius6.2.3). Changes in Sirius 6.2.3

There are no user-visible changes in Sirius 6.2.3 compared to 6.2.2. The only change is a bugfix in the VSM editor for [a regression](https://bugs.eclipse.org/bugs/show_bug.cgi?id=549918) introduced in 6.2.0. 

h2(#sirius6.2.2). Changes in Sirius 6.2.2

There are no user-visible changes in Sirius 6.2.2 compared to 6.2.1. The only changes are internal and related either to the build process or to the automated tests.

h2(#sirius6.2.1). Changes in Sirius 6.2.1

h3. Developer-Visible Changes

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-success">Added</span> Added a constructor @org.eclipse.sirius.business.api.query.DRepresentationQuery.DRepresentationQuery(DRepresentation, Session)@ to compute queries directly from the given session instead of computing it.
* <span class="label label-success">Added</span> In @viewpoint.ecore@, the @UIState@ class has a new @subDiagramDecorationDescriptors@ attribute. It is used as a cache to speed up sub diagram decorations computing.
* <span class="label label-success">Added</span> It is now possible to consider that some specific graphical changes need a refresh of the representation. Before Sirius 6.1.3, only semantic changes triggers a refresh. Now you can use @RefreshHelper.registerImpactingNotification(Predicate<Notification>)@ to consider a specific graphical changes. An example is the possibility to launch a refresh when the region container is collapsed or expanded. See "Trigger a Sirius refresh on specific graphical changes":developer/trigger-refresh-graphical-changes.html in the developer documentation for more details.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tools.api.ui.RefreshHelper.isAutoRefresh()@ has been added to know if Sirius is in automatic refresh mode or in manual mode.
* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.tools.api.ui.RefreshHelper.registerImpactingNotification(Predicate<Notification>)@ and @org.eclipse.sirius.tools.api.ui.RefreshHelper.unregisterImpactingNotification(Predicate<Notification>)@ have been added to allow to consider some graphical modifications as requiring a refresh. By default, only semantic changes are considered as requiring a refresh.  
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.business.api.helper.task.NotificationTask@ class has been removed. It was not used anywhere.

h4. Changes in  @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span>  The methods @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseMoveLeftClick(int, int, boolean, int[])@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.click(int, int, boolean, int[])@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.clickWithKeys(String, int...)@, have been added to make a mouse click with key modifiers for a multi selection for example.

* <span class="label label-success">Added</span>  The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.selectPropertyTabItem(String, SWTBot)@ has been added. It allows to look for property tab from a given bot. The bot corresponding to the property view should be given otherwise the search could fail starting from Eclipse 2019-06.

* <span class="label label-success">Added</span>The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.getShellBot(String)@ has been added and allows to retrieve a bot related to a shell with the given label.

* <span class="label label-success">Added</span>The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.menu(SWTBot, String)@ has been added and allows to retrieve a menu even when the active shell is null. Should be used over @SWTBot.menu(String)@ method.

h2(#sirius6.2.0). Changes in Sirius 6.2.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> On sequence diagrams, it is now possible to remove vertical blank spaces on standard edition mode by dragging the mouse from bottom to top anywhere in the canvas with the Ctrl+Shift keys pressed. This "feature":user/sequences/Sequence%20Diagrams.html#remove_vertical_blank_space was here since version 6.0.0 but was only accessible through the ruler.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> It is now possible to add action/group in the "New" contextual menu of diagram elements. This menu was missed in Sirius 6.1.0. It is now documented in the "corresponding documentation":specifier/diagrams/Diagrams.html#group .

h3. Developer-Visible Changes

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> A new interface @org.eclipse.sirius.common.tools.api.interpreter.IConverter@ has been added: it encapsulates the coercion rules used to convert raw results returned by interpreted expressions into the types expected by Sirius (depending on the context of use of the expression).
* <span class="label label-success">Added</span> In interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreter@, a new method @getConverter()@ has been added to obtain the @IConverter@ for a given interpreter.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.common.tools.api.interpreter.EvaluationResult@ has been added. It serves as a default implementation of @IEvaluationResult@. It provides static factory methods for common cases (successful evaluation or failure).
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.interpreter.TypeName@, the methods @getJavaClass()@ and @getPackagePrefix()@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.profiler.ProfilerTaskRegistry@, the method @get(String)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.query.NotifierQuery@, the method @getAdapter(Class<?>)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.resource.ResourceSetSync@, the method @getResourceSetSync(TransactionalEditingDomain)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.util.MarkerUtil@, the method @addMarkerFor(IResource, String, int, String)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.util.ReflectionHelper@, all the following methods which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead: @setConstructorVisibleWithoutException(Class<? extends Object>, Class<?>...)@
@setFieldVisibleWithoutException(Class<? extends Object>, String)@, @getClassForNameWithoutException(String)@, @instantiateWithoutException(String, Class<?>[], Object[])@, @getFieldValueWithoutException(Object, String)@, @getFieldValueWithoutException(Class<? extends Object>, String)@, and @getFieldValueWithoutException(Object, String, Class<? extends Object>)@.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterWithDiagnostic.IEvaluationResult@ has been promoted as a top-level type as @org.eclipse.sirius.common.tools.api.interpreter.IEvaluationResult@. In the process it has gained several methods to check for success and coerce the raw evaluation result into any of the types that are used by Sirius (depending on the usage context).
* <span class="label label-danger">Removed</span> In interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreter@ (and all its implementations shipped with Sirius), the methods @addVariableStatusListener()@ and @removeVariableStatusListener()@ have been removed, along with the corresponding type @org.eclipse.sirius.common.tools.api.interpreter.IVariableStatusListener@. These correspond to obsolete and unused mechanisms.
* <span class="label label-danger">Removed</span> The @interface org.eclipse.sirius.common.tools.api.interpreter.IInterpreterWithDiagnostic@ has been removed. The single method it defined, @evaluateExpression()@, is now implemented directly by the main @IInterpreter@ interface. In effect, all @IInterpreter@ are now "with diagnostic". 
* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.tools.api.interpreter.context.SiriusInterpreterContextFactory@ has been removed from the API (it has been moved into an internal package): it should only be needed by Sirius itself and has no reason to be exposed as public API.

h4. Changes in @org.eclipse.sirius.common.ui@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.ui.tools.api.dialog.quickoutline.QuickOutlineDescriptor@, the methods @getFirstPage()@ and @getNextPage(QuickOutlinePageDescriptor)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.

h4. Changes in  @org.eclipse.sirius.diagram.layoutdata@

* <span class="label label-danger">Removed</span> This plugin has been removed and fully replaced by  @org.eclipse.sirius.diagram.formatdata@

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> The message @org.eclipse.sirius.diagram.Messages.SynchronizeGMFModelCommand_label@ has been added. It replaces @org.eclipse.sirius.diagram.ui.provider.Messages.SynchronizeGMFModelCommand_label@.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.diagram.business.api.query.DragAndDropTargetQuery@, a new method @getLogicalChildren()@ has been added. It makes it easy to iterate over the logical structure of diagram elements. A static factory method @on()@ was also added to provide a more fluent API, e.g. @DragAndDropTargetQuery.on(container).getLogicalChildren()@.
* <span class="label label-success">Added</span> The extension point org.eclipse.sirius.diagram.customBundledImageShape has been created in order to provide custom shape to the bundled image style. This extension point offers more flexibility on the specification of the svg tags and attributes holding the color, border color and border size information than the extension point org.eclipse.sirius.diagram.bundledImageShape.
* <span class="label label-info">Modified</span> The extension point org.eclipse.sirius.diagram.bundledImageShape has been marked as deprecated. Shapes provided by this extension point still work.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory.buildInsertVerticalBlankSpaceCommand(DDiagram, int, int)@ has been renamed to @org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory.buildInsertOrRemoveVerticalBlankSpaceCommand(DDiagram, int, int)@ because it handles now both addition and removal.
* <span class="label label-info">Modified</span> Method _getAllEdgeMappings_ defined in @org.eclipse.sirius.diagram.business.internal.metamodel.helper.ContentHelper@ has been moved in a new class called @org.eclipse.sirius.diagram.business.internal.metamodel.helper.ContentLayerHelper@ to ensure method to be independent from pure Sirius code. 
* <span class="label label-danger">Removed</span> EOperations and features have been removed from the metamodel @diagram.ecore@. This is the ones that are computed outside of EMF environment with dependencies to IInterpreter or that are deprecated. The following EOperations have been removed/replaced: 
** @DEdge.isRootFolding@ has been removed
** @DDiagram.getNodesFromMapping@ has been replaced by @DDiagramSpecOperations.getNodesFromMapping@
** @DDiagram.getEdgesFromMapping@ has been replaced by @DDiagramSpecOperations.getEdgesFromMapping@
** @DDiagram.getContainersFromMapping@ has been replaced by @DDiagramSpecOperations.getEdgesFromMapping@
** @DiagramElementMapping.checkPrecondition@ has been replaced by @SiriusElementMappingSpecOperations.checkPrecondition@
** @DiagramElementMapping.getAllMappings@ has been replaced by @MappingHelper.getAllMappings@
** @DiagramElementMapping.isFrom@ has been replaced by @SiriusElementMappingSpecOperations.isFrom@
** @AbstractNodeMapping.clearDNodesDone@ has been replaced by @NodeMappingHelper.clearDNodesDone@
** @AbstractNodeMapping.addDoneNode@ has been replaced by @NodeMappingHelper.addDoneNode@
** @AbstractNodeMapping.getAllBorderedNodeMappings@ has been replaced by @MappingHelper.getAllBorderedNodeMappings@
** @NodeMapping.createNode@ has been replaced by @NodeMappingHelper.createNode@. You must verify that @NodeMapping@ is an @INodeMappingExt@ before calling this method. Previously, in other cases, when a @NodeMapping@ is not @INodeMappingExt@, an @UnsupportedOperationException@ was thrown.
** @NodeMapping.updateNode@ has been replaced by @NodeMappingHelper.updateNode@
** @NodeMapping.updateListElement@ has been replaced by @NodeMappingHelper.updateListElement@
** @NodeMapping.getNodesCandidates(semanticOrigin,container)@ has been replaced by @NodeMappingHelper.getNodesCandidates(semanticOrigin,container)@
** @NodeMapping.getNodesCandidates(semanticOrigin,container,containerView)@ has been replaced by @NodeMappingHelper.getNodesCandidates(semanticOrigin,container,containerView)@
** @ContainerMapping.getBestStyle@ has been replaced by @ContainerMappingWithInterpreterHelper.getBestStyle@
** @EdgeMapping.createEdge(source,target,semanticTarget)@ has been replaced by @EdgeMappingHelper.createEdge(EdgeMapping, EdgeTarget, EdgeTarget, EObject, EObject)@
** @EdgeMapping.createEdge(source,target,container,semanticTarget)@ has been replaced by @EdgeMappingHelper.createEdge(EdgeMapping, EdgeTarget, EdgeTarget, EObject, EObject)@
** @EdgeMapping.getBestStyle@ has been replaced by @MappingWithInterpreterHelper.getBestStyle@
** @EdgeMapping.updateEdge@ has been replaced by @EdgeMappingHelper.updateEdge@
** @EdgeMapping.getEdgeTargetCandidates(semanticOrigin,viewPoint)@ has been replaced by @EdgeMappingHelper.getEdgeTargetCandidates@
** @EdgeMapping.getEdgeSourceCandidates@ has been replaced by @EdgeMappingHelper.getEdgeSourceCandidates@
** @EdgeMapping.getEdgeTargetCandidates(semanticOrigin,container,containerView)@ has been replaced by @EdgeMappingHelper.getEdgeTargetCandidates@
** @EdgeCreationDescription.getBestMapping@ has been removed because it is never used.
** @ContainerDropDescription.getBestMapping@ has been replaced by @ContainerMappingWithInterpreterHelper.getBestMapping@
** @Filter.isVisible@ has been replaced by @FilterService.isVisible(Filter, DDiagramElement)@
** @VariableFilter.resetVariables@ has been replaced by @VariableFilterWrapper.resetVariables@
* <span class="label label-info">Modified</span> The following features have been removed/replaced:
** @DiagramDescription.allNodeMappings@ has been replaced by @ContentHelper.getAllNodeMappings@ (with @false@ value for parameter @withoutOptionalLayers@)
** @DiagramDescription.allContainerMappings@ has been replaced by @ContentHelper.getAllContainerMappings@ (with @false@ value for parameter @withoutOptionalLayers@)
** @DiagramDescription.allLayers@ has been replaced by @LayerHelper.getAllLayers@
** @ContainerMapping.allNodeMappings@ has been replaced by @ContainerMappingHelper.getAllNodeMappings@
** @ContainerMapping.allContainerMappings@ has been replaced by @ContainerMappingHelper.getAllContainerMappings@
** @Layer.allEdgeMappings@ has been replaced by @ContentLayerHelper.getAllEdgeMappings@

h4. Changes in  @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.EditPartQuery.getDDiagram()@ has been added to retrieve the  @DDiagram@ associated to the edit part or to one of its ancestor.
* <span class="label label-danger">Removed</span> The message @org.eclipse.sirius.diagram.ui.provider.Messages.SynchronizeGMFModelCommand_label@ has been removed. It has been replaced in @org.eclipse.sirius.diagram.Messages@.
* <span class="label label-danger">Removed</span> The extension point @layoutDataManager@, deprecated since Sirius 4.1.0, has been removed. The corresponding plug-in @org.eclipse.sirius.diagram.layoutdata@ has also been removed.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery.getCenteredAnchorsAbsoluteLocation(Rectangle)@ has been added in order to compute the location of the anchor of a connection centered on its target or source.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionQuery.getAbsolutePointList(RelativeBendpoints, PrecisionPoint, PrecisionPoint)@ has been added to compute the absolute coordinates of the bendpoints of a connection.

h4. Changes in @org.eclipse.sirius.ui.editor@

* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.editor.api.pages.PageProvider.provides()@ now takes the @SessionEditor@ as an additional parameter to allow implementation to decide if it should provide an additional page or not.

h4. Changes in @org.eclipse.sirius.diagram.sequence@

* <span class="label label-success">Added</span> A new translatable message @org.eclipse.sirius.diagram.sequence.Messages.VerticalSpaceReduction_operationName@ has been added. It's key is @VerticalSpaceReduction_operationName@ and its default value is @Auto-reduction of {0}@. It is used when reducing spaces in sequence diagram.
* <span class="label label-success">Added</span> A new translatable message @org.eclipse.sirius.diagram.ui.provider.Messages.RemoveBlankSpace_cmdName@ has been added. It's key is @RemoveBlankSpace_cmdName@ and its default value is @Remove blank space@. It is used when removing spaces in sequence diagram.
* <span class="label label-success">Added</span>  The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@, have been added to make a drag an drop with more than one key modifier.

h4. Changes in @org.eclipse.sirius.ecore.extender@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.ecore.extender.business.internal.accessor.ModelAccessorAdapter@, the methods @getAdapter(ResourceSet resourceSet)@ and @removeAdapter(ResourceSet resourceSet)@ now return @java.util.Optional<T>@ instead of instance of Sirius's custom @org.eclipse.sirius.ext.base.Option<T>@.

h4. Changes in @org.eclipse.sirius.ext.gmf.runtime@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper@, all the methods which used to take or return an @org.eclipse.sirius.ext.base.Option<T>@ not take or return a standard @java.util.Optional<T>@ instead.

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@ have been added and allows to do a drag and drop with any key modifier you want.
* <span class="label label-info">Modified</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKey(int, int, int, int, int, AtomicBoolean)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKey(int, int, int, int, int, AtomicBoolean)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKey(int, int, int, int, int, AtomicBoolean)@ have been marked as deprecated. The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@ should be used instead.C

h2(#sirius6.1.2). Changes in Sirius 6.1.2

h3. User-Visible Changes

* <span class="label label-info">Modified</span> Invalid representations, that are either representations which semantic target does not exist anymore or representations that can not be retrieved anymore, are grayed in the Model Explorer and the only available action is _Delete_. It was previously the case only for representations which semantic target does not exist anymore.

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> If the @org.eclipse.sirius.diagam.ui.hidePrintingOfPermissionAuthorityDecoration@ system property is set to true and if there is no other printable decoration provided at the same location (South-West), the permission authority decorations displayed on diagrams are not printed nor exported in images (export as image actions).

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.business.api.query.DRepresentationDescriptorQuery.isRepresentationReachable()@ and @org.eclipse.sirius.business.api.query.DRepresentationDescriptorQuery.isRepresentationValid()@ have been added. The former allows to know if the @DRepresentation@ can be retrieved from the @DRepresentationDescriptor.repPath@: the repPath is correctly set and the representation effectively exists. The latter returns true if the @DRepresentationDescriptor@ is either dangling (@DRepresentationDescriptor.repPath@ can not be found) or can not by retrieved.

h4. Changes in  @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span>  A new field @CustomLayoutConfiguration layoutConfiguration@ has been added to @org.eclipse.sirius.diagram.ui.tools.api.layout.provider.DefaultLayoutProvider@ and its setter method 
@setLayoutConfiguration(CustomLayoutConfiguration)@. It allows any layout provider to be aware of any VSM layout configuration that should be used.

* <span class="label label-info">Modified</span> The method @getDiagramLayoutProvider(DiagramEditPart, IAdaptable)@ in package  @org.eclipse.sirius.diagram.ui.tools.api.layout.provider.AbstractLayoutProvider@ has been made protected to allow to provide layout provider from other mechanism than LayoutService.

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> The getter and setter methods have been added for the new attribute @org.eclipse.sirius.diagram.ui.tools.api.decoration.DecorationDescriptor.isPrintable@. This attribute is used to know if the decoration should be hidden when printing or exporting the diagram. The behavior is applied only if there is no printable decoration in its diagram element location (South, West, South-West etc).

h4. Changes in  @org.eclipse.sirius.common@

* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.common.tools.api.util.SiriusCopier@ has been replaced by the internal class @org.eclipse.sirius.tools.internal.SiriusCopierHelper@. @SiriusCopier.Helper.copy(T)@ and @SiriusCopier.Helper.copyAll(Collection<? extends T>)@ have been replaced by @SiriusCopierHelper.copyWithNoUidDuplication(T)@, @SiriusCopierHelper.copyAllWithNoUidDuplication(Collection<? extends T>)@ and @SiriusCopierHelper.copyAllWithNoUidDuplication(Collection<? extends EObject>, boolean, boolean, boolean)@. It provides the ability to copy an object without copying the EAttribute @IDENTIFIED_ELEMENT__UID@. For all these methods, this id is not set by the factory or during object creation, it is set during the copy using @org.eclipse.emf.ecore.util.EcoreUtil.generateUUID()@.


h2(#sirius6.1.1). Changes in Sirius 6.1.1

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> Add method @allowsVisibilityModeActivation()@ in @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider@ This method is used to know if the visibility mode is supported by a specific diagram description.

h2(#sirius6.1.0). Changes in Sirius 6.1.0

* <span class="label label-info">IMPORTANT</span>  The new (and still experimental) _Workflow_ and _Server_ features depend on a specific version of Eclipse Jetty which is available in the main Eclipse Photon repository. They can not be used under Oxygen (which include older and incompatible versions of Jetty).
* <span class="label label-info">IMPORTANT</span> Please note that starting from version 6.1, Sirius is now licensed under "version 2.0 of the Eclipse Public License":https://www.eclipse.org/legal/epl-2.0/, which updates some wording and clarifies some points but neither changes the open-source nature of Sirius nor the implications of using or embedding it. See "the official FAQ":https://www.eclipse.org/legal/epl-2.0/faq.php for details about the difference between EPL v1.0 (which was used before) and v2.0.

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new preference has been added in the Sirius preference panel. It allows Sirius to ask the user if he wants to save session resources after an automatic migration. If the new preference is ticked, the pop-up will only appear for session opening caused by a direct action of the user (i.e. opening a diagram or unfolding the resources in the model explorer). You can refer to the "user documentation ":user/general/Modeling%20Project.html#Migration for more details.
* <span class="label label-success">Added</span> On sequence diagrams, it is now possible to add vertical blank spaces on standard edition mode by dragging the mouse anywhere in the canvas with the Ctrl+Shift keys pressed.  This "feature:":user/sequences/Sequence%20Diagrams.html#insert_vertical_blank_space was here since version 6.0.0 but was only accessible through the ruler.
* <span class="label label-success">Added</span> The preference @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys.PREF_DISPLAY_VSM_USER_FIXED_COLOR_IN_PALETTE@ has been added and can be managed in Preferences/Sirius/Sirius Diagram/Appearance/Display viewpoint colors. It allows to display, in the color palette, the user fixed color(defined in the activated viewpoints) in addition to standard colors. The color palette is available in Appearance tab of the Properties view.
* <span class="label label-success">Added</span> A new visibility diagram edit "mode":user/diagrams/Diagrams.html#edit_modes is available. It allows to see diagram elements hidden manually with some transparency. In this mode the visibility can be changed by a double click on the target diagram element.
!user/diagrams/images/show_hide_mode_example.png!
* <span class="label label-success">Added</span> A new dropdown menu gathering the layouting, visibility and standard mode is now available in the tabbar of diagram editors to activate the chosen edit mode. The standard mode corresponds to a diagram editor without the layouting and visibility mode activated.
!user/diagrams/images/show_hide_mode_tabbar_activate.png!
* <span class="label label-success">Added</span> A quick fix is now available on the error marker signaling a modeling project without a representations file. Processing this quick fix will create a new empty representation file.
* <span class="label label-info">Modified</span> The tool "Link Note", introduced in Sirius 6.0.0, has been renamed into "Representation Link".
* <span class="label label-info">Modified</span> A "Representation Link" is no longer deleted automatically when the targeted representation is deleted. Instead, the note header changes to "Broken Representation Link" and the note icon changes to a small red diagonal cross. You can refer to the "user documentation":user/diagrams/Diagrams.html#notes for more details.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> "Initial documentation":specifier/workflows/Workflows.html has been added for the "Workflow" feature introduced in 6.0.0 (which is still experimental).
* <span class="label label-success">Added</span> The contribution of @PopupMenu@ in diagram has been improved. It is now possible to define @Group@ in @PopupMenu@. A group allows to group several actions. It appears like a separator between groups of actions. It is also possible to reuse existing menu or group.
Previously, it was possible to add new menus and actions at the end of the contextual menu:
!images/popupMenuBefore.png!
Now, it is possible to:
* group actions (actions in MySpecificPopupMenu2 for example),
* add new menus and actions in a new group of an existing menu (action MyActionF1 and menu MySpecificPopupMenu2 for example)
* add new menus and actions in an existing group of an existing menu (action MyActionH1 and menu MySpecificPopupMenu3 for example):
!images/popupMenuAfter.png!
* add new actions in the "Select All" menu of the "tab-bar":user/diagrams/Diagrams.html#ref_tabbar. Some services have been directly provided in Sirius in class @org.eclipse.sirius.diagram.ui.tools.api.interpreter.StandardDiagramServices@: see "org.eclipse.sirius.diagram.ui developer visible changes":#DeveloperVisibleChanges for the list of services or chapter "Selection after tool execution":specifier/general/ToolsSpecification.html#selectionAfterToolExecution of documentation to see how to use them.
Refer to the "specifier documentation":specifier/diagrams/Diagrams.html#group for details.
* <span class="label label-info">Modified</span> Specifier can now hide header column of Edition Table (the left-most column of the table). It is possible by specifying value -1 in the _Initial Header Column Width_ field of Edition table representation. See "the documentation":specifier/tables/Tables.html#edition_tables for details.

h3. Developer-Visible Changes

<span class="label label-info">IMPORTANT</span> Note that all plug-ins in the _Sirius Server_ feature (@org.eclipse.sirius.server.*@ and @org.eclipse.sirius.services.*@) are still considered experimental in this version. In particular, all APIs (Java, HTTP, WebSocket) they provide should be treated as provisional even if they are exposed publicly in @*.api.*@ packages. We reserve the right to modify them in incompatible ways even in future maintenance versions.

* <span class="label label-success">Added</span> Mechanism to ask user input on opening of a session with migrated resources if the session opening comes from a direct user action
** New available UI callback (@org.eclipse.sirius.tools.api.command.ui.UICallBack.askUserAndSaveMigratedSession(session)@) used to ask user if he wants to save the resources after migration and save them if necessary.
** New method to open session when this is due to a direct user action (@org.eclipse.sirius.business.api.session.SessionManager.openSession(sessionResourceURI, monitor, uiCallback, isDirectUserActionLoading)@). Previous version calls this new version with the value false for @isDirectUserActionLoading@ parameter
** New system preference to know if user want to be asked to save resources after automatic migration @org.eclipse.sirius.common.tools.api.constant.CommonPreferencesConstants.PREF_ASK_TO_SAVE_RESOURCE_AFTER_MIGRATION@
* <span class="label label-success">Added</span> @org.eclipse.sirius.migrationHandler@ extension point has been added. It allows to contribute migration process, mainly handle migration options.
* <span class="label label-info">Modified</span> Upgraded ELK version from 0.3.0 to 0.4.0, see the "ELK documentation":https://projects.eclipse.org/projects/modeling.elk/releases/0.4.0 for the list of changes in that version.
* <span class="label label-info">Modified</span> The Acceleo version has been changed from 3.7.2 to 3.7.4.
* <span class="label label-info">Modified</span> The class @SiriusFormatDataManagerForSemanticElements@ has been moved from package @org.eclipse.sirius.diagram.ui.tools.internal.format.semantic@ to @org.eclipse.sirius.diagram.ui.tools.api.format.semantic@.
* <span class="label label-danger">Removed</span> _EOperations_ @checkRule@ and @getMessage@ of @ValidationRule@ _EClass_ have been removed from @viewpoint@ metamodel. These operations were deprecated and useless since we used method of @org.eclipse.sirius.business.internal.metamodel.description.validation.operations.ValidationRuleOperations@ class.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys.PREF_DISPLAY_VSM_USER_FIXED_COLOR_IN_PALETTE@ has been added. Its default value is true. It allows to display, in the color palette, the user fixed color(defined in the activated viewpoints) in addition to standard colors. The color palette is available in Appearance tab of the Properties view.


h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> Some specific services exist natively in Sirius and can be used to contribute new select all actions. Theses services are all in the class @org.eclipse.sirius.diagram.ui.tools.api.interpreter.StandardDiagramServices@:
** @stdGetViewsRepresentingSameEType(DSemanticDiagram, List<DSemanticDecorator>)@: Return the list of @DSemanticDecorator@ representing semantic element with same EType as the current selected diagram elements.
** @stdGetViewsWithSameMapping(DSemanticDiagram, List<DSemanticDecorator>)@: Return the list of @DSemanticDecorator@ having the same mappings as the current selected diagram elements.
** @stdGetViewsRepresentingSelectedType(DSemanticDiagram)@: Return the list of @DSemanticDecorator@ in the current diagram representing semantic element having the EType provided by the end-user through a dialog box. This dialog box can be improved. There is currently no completion, neither validation.
** @stdGetViewsOfExpression(DSemanticDiagram)@: Return the list of @DSemanticDecorator@ corresponding to the evaluation of an expression written by the end-user in a dialog box. This dialog box can be improved. There is currently no completion, neither validation.
* <span class="label label-success">Added</span> The query @isRepresentationLink()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery@ to know if the view is a representation link or a normal note.
* <span class="label label-success">Added</span> The query @isRepresentationLinkBroken()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery@ to know, for a representation link, if it refers to a deleted representation descriptor. Invocations should be guarded by @isRepresentationLink()@.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerFigureDesc@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.StyledFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ITransparentFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.IRoundedCorner@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ImageFigureWithAlpha@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.ZoomDependantAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.AnchorProvider@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewGradientFigureDesc@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.TransparentFigureGraphicsModifier@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabel@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.PolygoneAndPolylineDecoraction@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ParallelogramFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.OneLineMarginBorder@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ODesignEllipseFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.GaugeSectionFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.GaugeCompositeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.DBorderedNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.AirSlidableImageAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AlphaDropShadowBorder@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirStyleDefaultSizeNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirNoteFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirDefaultSizeNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentRectangle@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentRectangle@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentNode@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentImage@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentEllipse@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractGeoShapePolygonFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> An int parameter replace now the BackgroundStyle parameter into the class @org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle@. This parameter represents still the backgroundStyle in int format.

h4. Changes in @org.eclipse.sirius.diagram.sequence.ui@

* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.HorizontalGuide@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.CombinedFragmentInvisibleResizableCompartmentFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.SequenceSlidableAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.

h4. Changes in  @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> The new preference @PREF_ASK_TO_SAVE_RESOURCE_AFTER_MIGRATION@ has been added in @CommonPreferencesConstants@. If true users will be asked to save the VSM or aird if it has been automatically migrated after a user action.
* <span class="label label-success">Added</span> The new @org.eclipse.sirius.common.tools.api.util.SiriusCopier@ has been added to provide the ability to copy an object without copying the attribute seen as id by EMF. If this id is not set by the factory or during object creation and if its concrete expected type is @String@, it is set during the copy using @org.eclipse.emf.ecore.util.EcoreUtil.generateUUID()@.

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span> The new method @AbstractSiriusSwtBotGefTestCase.changeSiriusCommonPreference(String, Boolean)@ has been added. It allows to change a preference defined in @oes.common@ plugin.

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added to convert the serialized xmi:id to the technical id (uid attribut) for Sirius model elements of the .aird files (see "bugzilla #525261":https://bugs.eclipse.org/bugs/show_bug.cgi?id=525261 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201808300808_.
* <span class="label label-success">Added</span> A migration participant has been added to fix diagrams with corrupted Note, Text or Note Attachment (see "bugzilla #539550":https://bugs.eclipse.org/bugs/show_bug.cgi?id=539550 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201809271200_.
* <span class="label label-success">Added</span> A migration participant has been added to update existing representation link. (see "bugzilla #533175":https://bugs.eclipse.org/bugs/show_bug.cgi?id=535648 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201810111800_.
* <span class="label label-success">Added</span> A migration participant has been added to fix edge with multiple connector style (see "bugzilla #539944":https://bugs.eclipse.org/bugs/show_bug.cgi?id=539944 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201810161215_.

h2(#sirius6.0.0). Changes in Sirius 6.0.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new feature allows user to insert vertical blank space in sequence diagram. You can refer to the "user documentation ":user/sequences/Sequence%20Diagrams.html#insert_vertical_blank_space for more details. 
* <span class="label label-success">Added</span> A new feature called "Generic Edge Creation Tool" allows to create an edge by starting to select the source and the target before choosing the concrete edge creation tool. That allows to restrict the list of possible edge creation tools (possibly only one edge or no one) according to the selected source and target.
!images/genericEdgeCreationTool.png!
*  <span class="label label-success">Added</span> A new feature called "Link Note" has been added. It is a special kind of note which references any existing representation in the project. It is possible to navigate to the target representation by double clicking on a link note. You can refer to the "user documentation":user/diagrams/Diagrams.html#notes for more details.
* <span class="label label-success">Added</span> The color palette for text, line and fill buttons, in appearance tab in properties view, has been enhanced. Before, when clicking on text, line or fill buttons, the available colors were only 12 arbitrary colors. Now, there are 50 maximum colors distributed in 10 columns. The displayed colors are
** a shading of black to white then,
** all fixed colors defined in VSM of all selected viewpoints and 
** the Sirius fixed colors following the colors of the rainbow.
!images/color_palette.png!

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> An action is added in main toolbar to reload the VSM of installed plug-ins that may have changed. Refer to the "specifier documentation":specifier/general/Specifying_Viewpoints.html#reloadVSM for details.
* <span class="label label-success">Added</span> In the VSM editor, when the cursor is inside an interpreted expression at a location which corresponds to a Java service invocation, hitting *F3* will navigate to the service implementation in a Java editor. See "the documentation":specifier/general/Writing_Queries.html#service_navigation for more details.
* <span class="label label-success">Added</span> Specifier can now define a background color for a diagram representation. It is possible by specifying color in the _Background_ property section of the _Diagram Description_. Pre-defined system colors and colors from the _User Color Palette_ are supported. See "the documentation":specifier/diagrams/Diagrams.html#diagram_description for details.
* <span class="label label-info">Modified</span> Warning: Java service throwing an @OperationCanceledException@ with a message containing the specific key word "@-RT-@" has now a specific behavior. In this case, the @OperationCanceledException@ is rethrown to rollback the command if this Java service is called from an AQL expression or through the service interpreter. You can refer to "bugzilla 531487":https://bugs.eclipse.org/bugs/show_bug.cgi?id=531487 for more details.

h3. Developer-Visible Changes

* <span class="label label-info">Modified</span> The SWTBot test framework version has been upgraded toward SWTBot 2.6. The main impacts are described below:
** The way we retrieved some views by using @bot.viewByTitle@ (like "Problems" or "Error Log") may not work anymore. Use @bot.viewByPartName@ instead.
** @org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot.contextMenu(String)@ raise a @WidgetNotFoundException@ instead of a @TimeoutException@.
** The @org.eclipse.sirius.tests.swtbot.support.utils.dnd.DndUtil@ has been updated to be compatible with Oxygen and Photon platforms. Some methods may not work anymore on Neon platform.
* <span class="label label-info">Modified</span> Some changes have been done in the image export tooling. Main impacts are described below:
** The export of images, methods @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction.execute@ and @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction.createImageFiles@, do not open UI Dialogs anymore. It throws an @java.lang.reflect.InvocationTargetException@ that wraps the real cause of the error (@org.eclipse.sirius.ui.tools.api.actions.export.SizeTooLargeException@ or @java.lang.OutOfMemoryError@). Callers have to handle properly the exception.
** The mechanism allowing to authorize or forbid the export of an image, method @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService.isTooBig@, can now handle very large images that previously leads to incorrect exports.
* <span class="label label-danger">Removed</span> Since Sirius 5.0.0, @org.eclipse.sirius.ext.jface.viewers.IToolTipProvider@ is not used anymore to provide a tooltip on diagram element decorations defined in the VSM. The tooltip is defined directly with an interpreted expression on @GenericDecorationDescription@, @MappingBasedDecoration@ and @SemanticBasedDecoration@.

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.common.tools.api.interpreter.IExpressionProposal@ and its only implementation @DefaultExpressionProposal@ (in the same package) have been removed. They were not used anywhere, expression completion API is actually defined in package @org.eclipse.sirius.common.tools.api.contentassist@ which has its own types.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.componentization.ViewpointRegistry.reloadAllFromPlugins()@ has been added to reload, from the runtime, all the VSMs of installed plug-ins and have the effect dynamically in the runtime.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.business.api.componentization.ViewpointRegistryImpl()@ has been moved to @org.eclipse.sirius.business.internal.componentization@ package.
* <span class="label label-danger">Removed</span> The whole @contribution@ metamodel, which lived in package @org.eclipse.sirius.description.contribution@, has been removed. It corresponded to an experimental feature which has been abandonned long ago.
* <span class="label label-danger">Removed</span> The whole @DRefreshable.refresh()@ EOperation has been removed from the metamodel, along with all its implementations. Client code that needs the functionality can use either @DialectManager.refresh()@ for @DRepesentations@ or the new @org.eclipse.sirius.diagram.tools.api.command.view.RefreshSiriusElement.refresh(DRefreshable)@ static method for diagram elements (@DRefreshable.refresh()@ was a no-op for elements of other dialects). 
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.viewpointSpecificationModel@ extension point has been removed. It was part of the same experimental feauture and not actually used in practice.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper@, the method @getViewpointSelection()@ has been removed. It used an internal type as argument which has also been removed.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.helper.SiriusResourceHelper@, the method @getCorrespondingViewpoint(Session session, URI, boolean)@ has been removed. It was not used anywhere, the real one is @getCorrespondingViewpoint(Session, Viewpoint)@ in the same class.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.dialect.DialectServices@ (and all its implementations), the method @refreshEffectiveRepresentationDescription(DRepresentation, IProgressMonitor)@ has been removed. It corresponded to an experimental feature which has been abandonned long ago. 
* <span class="label label-success">Added</span> A new @ToolSection@, @ToolGroup@  and @ToolInstance@ model element have been added in @viewpoint@ metamodel. These elements are used to represent tools available for a @DDiagram@ with their visibility, enabling and filtering status. @ToolSectionInstance@ are available in the @UIState@ of a @DDiagram@ by using the @toolSections@ reference. 
* <span class="label label-danger">Removed</span> the class @ToolFilterDescriptionListener@ has been removed because of the new @ToolMangament@ mechanism used to handle tools and layer changes.

h4. Changes in @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.tools.api.preferences.SiriusDiagramPreferencesKeys.PREF_DISPLAY_GENERIC_EDGE_CREATION_TOOL@ has been added to make to possible to hide the new generic edge creation tool. See the _User-Visible Changes_ or the user documentation for more details.
* <span class="label label-success">Added</span> A component @ToolManagement@ has been created to manage tool availability and status for a given @DDiagram@. It comes with the listener interface @ToolChangeListener@ that can be used to be warned about tool changes.
* <span class="label label-success">Added</span>  An interface @ToolConstants@ has been created to gather constants relative to tool management.
* <span class="label label-info">Modified</span> The constants @SiriusDiagramPaletteFactory#GENERIC_CONNECTION_CREATION_TOOL@ and @SiriusDiagramPaletteFactory#TOOL_NOTEATTACHMENT@ have been moved in @ToolConstants@
* <span class="label label-info">Modified</span> The classes @ToolFilter@ and @ToolFilterFromDescription@ have been moved from the plugin @oes.diagram.ui@ to @oes.diagram@ in package @org.eclipse.sirius.diagram.tools.api.managment@

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.editor.tabbar.AbstractTabbarContributor.createStraightenContribution()@ has been added to make accessible the creation of the Straighten To tabbar contribution item.

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.customLayoutAlgorithmProvider@ extension point has been added. It allows to contribute layout algorithms that can be configured directly in the VSM. This extension point comes with the following classes as API: @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithmProvider@, @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithm@, @org.eclipse.sirius.diagram.ui.api.layout.EnumChoice@ and @org.eclipse.sirius.diagram.ui.api.layout.LayoutOptionFactory@.

* <span class="label label-info">Modified</span> The methods @hideLayer(Layer)@, @showLayer(Layer)@, @addToolFilter(ToolFilter)@ and @removeToolFilter(ToolFilter)@ of @org.eclipse.sirius.diagram.ui.tools.api.graphical.edit.palette.PaletteManager@ have been made deprecated. They are not used anymore. The API @ToolManagement@ is now the entry point to make palette update regarding tools and layer changes.

* <span class="label label-info">Modified</span> The @Diagram@ parameter of the methods @oes.update(Diagram)@ and @oes.update(Diagram,boolean)@ has been changed to @DDiagram@.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelectionDialog@ has been removed.

h4. Changes in @org.eclipse.sirius.tests.junit.support@

* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.support.api.TestsUtil.isBeforeOxygenPlatform()@ has been added to detect if the current platform corresponds to a version before Oxygen.
* <span class="label label-info">Modified</span> A @String@ parameter has been added to the method @org.eclipse.sirius.tests.support.api.TestsUtil.setTargetPlatform()@. This new parameter corresponds to the plug-in name from where the tests are currently launched (for example @org.eclipse.sirius.tests.swtbot.Activator.PLUGIN_ID@). It avoids to build a wrong target platform containing each Sirius plug-ins twice. 

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.tests.swtbot.support.utils.dnd.DndUtil#dragAndDrop(AbstractSWTBot<? extends Widget>, AbstractSWTBot<? extends Widget>)@ has been removed. When explicit drop coordinates are not needed, use the standard SWTbot @org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot.dragAndDrop(AbstractSWTBot<? extends Widget>)@ method instead. 

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added to fix diagram with note attachment corrupted (see "bugzilla #533177":https://bugs.eclipse.org/bugs/show_bug.cgi?id=533177 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _13.0.0.201804031646_.

h4. Translation Keys Changes

h2(#sirius5.1.1). Changes in Sirius 5.1.1

h3. User-Visible Changes

* <span class="label label-info">Modified</span> When exporting a diagram as an image, it is now possible to choose an image size level. Before this, a preference called _AutoScale_ was available and when it was enable, the diagram was scaled to the maximum size safely allowed by the system. Now, a new preference named _Size of exported images_ is available in the _Sirius > Sirius Diagram_ preference page and offer this possibility. Setting size to _Max_ generates same diagrams as by using the previous preference _AutoScale_. This can produce image with big size in long generation time. If _Size of exported images_ is set to level _Nominal_, diagram will be exported with nominal size (quality will be lower but export time will be shorter). This new preference allows you to choose the tradeoff you want. The "user documentation ":user/diagrams/Diagrams.html#Exportingimages details this change with an example. 
* <span class="label label-info">Modified</span> The "_Auto Size_" action can now be applied on region container. Before that, the action was available only for regions.
* <span class="label label-info">Modified</span> The "_Make Same Size_" action can now be applied on region container. If selected region containers have the same number of regions, the regions will have the same size. If the region container used for reference has more regions than the other(s), the last region of others will have the size of all remaining regions in the one used for reference.
* <span class="label label-info">Modified</span> In diagrams, the selection by drawing a rectangle on container (using ALT key) now has the same behaviors than selection by drawing a rectangle on the diagram's background. You can refer to _Selection_ section of the "Standard Tools":user/diagrams/Diagrams.html#standardToolId chapter for more details on this tool.

h3. Developer-Visible Changes

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.query.SiriusReferenceFinder.of(EObject)@ has been added to provide an easy way to get the @SiriusReferenceFinder@ from an @EObject@ in the Sirius @Session@. 
* <span class="label label-info">Modified</span> (experimental) The method @org.eclipse.sirius.business.api.query.SiriusReferenceFinder.getReferencingSiriusElements(Collection<EObject>, SearchScope)@. The SearchScope.LOADED_REPRESENTATIONS_SCOPE scope covers the search and result scope. Then, no additional resource will be loaded using this scope.

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-warning">Deprecated</span> Preference @PREF_SCALE_DIAGRAMS_ON_EXPORT@ from @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@ is now deprecated. User should use new preference @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys@: @PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@.
* <span class="label label-success">Added</span> A new attribute @margin@ has been added in @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult@. This attribute indicates what margin has been used to produce a white frame during diagram export. This attribute is available from the getter @getMargin()@. A new constructor is also available to pass on the margin @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult.DiagramExportResult(DDiagram, double, int, Collection<IPath>)@. 
* <span class="label label-info">Modified</span> If you previously override the default Sirius value for @SiriusDiagramUiPreferencesKeys.PREF_SCALE_DIAGRAMS_ON_EXPORT@, you must replace this override by an override of the new preference @SiriusUIPreferencesKeys.PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@. Example: 
pre.. SiriusEditPlugin.getPlugin().getPreferenceStore().setDefault(SiriusUIPreferencesKeys.PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT.name(),0); 

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> A new preference has been added to @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys@: @PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@. It is used to control the scaling level behavior when exporting diagrams. Refer to the JavaDoc for the details. 
* <span class="label label-success">Added</span> The type @org.eclipse.sirius.ui.business.api.dialect.ExportFormat@ has a new attribute representing the scaling level to use for diagram export. It is defined by an integer type. Refer to the JavaDoc for details on its meaning.

h4. Changes in @org.eclipse.sirius.tests.junit.support@

* <span class="label label-success">Added</span> The method @SiriusTestCase.loadModeler(URI, EditingDomain)@ allows to load the VSM at the specified URI and register all its Viewpoints in the current testcase. There is a new method, @org.eclipse.sirius.tests.support.api.SiriusTestCase.loadModeler(URI, EditingDomain, boolean)@, to allow to load the VSM at the specified URI without registering its viewpoints. It can be useful to load a VSM for an editing domain of another session than the current session of the
testcase.

h2(#sirius5.1.0). Changes in Sirius 5.1.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> When exporting a diagram as an image, it is now possible to choose whether or not the diagram should be scaled. If disabled, the diagram will be exported with its normal size (equivalent to a 100% zoom level). If auto-scaling is enabled, the diagram will be scaled to the maximum size safely allowed by the system (this can be different on different OSes). Note that when auto-scaling is enabled, the image files produced may be larger than without. When exporting very large diagrams it is also possible that the diagram will be scaled _down_ (i.e. with a zoom level smaller than 100%). Enabling auto-scaling can be chosen on a case by case basis from the export dialog; the initial value in the dialog can be controlled by a new preference available in the _Sirius > Sirius Diagram_ preference page.
* <span class="label label-success">Added</span> The end user can now "remove all bend-points":user/diagrams/Diagrams.html#RemoveBendpoints on rectilinear edges. It was only possible on oblique edges before. This action is available on edge context menu "Remove Bend-points" or by using the shortcut "Ctrl" + "Shift" + "-". If number of bend-points can not be reduced, remove action will be inefficient.
* <span class="label label-success">Added</span> The status Synchronized/Unsynchronized of the diagram is now displayed in the status bar when the diagram editor has the focus or can be directly displayed "in the diagram":user/diagrams/Diagrams.html#synchronized_diagram with a decorator.
* <span class="label label-success">Added</span> The user now have a drop down menu in the tabbar with all available straighten to edge actions. 
* <span class="label label-success">Added</span> Straighten to actions on edge are now available even if the selection contains incompatible elements (edge labels for example). Their execution affects only compatible edges.
* <span class="label label-success">Added</span> Four new straighten actions are available (with top pinned, with bottom pinned, with left pinned, with right pinned) and allow to straighten edges from the opposed straightening axis point of view.
* <span class="label label-info">Modified</span> In a diagram, when selecting an edge or a node that are not fully displayed in the editor, now, the reveal is not done anymore, that is, the displayed content of the editor is not moved anymore. If the user want to fully see the selected element, he may drag the editor content using center mouse button. 
* <span class="label label-info">Modified</span> In a diagram with _snapToGrid_ enabled:
** When performing a drag and drop from the model explorer or a palette tool to the diagram, the new created element is now snapped to the grid.
** When performing an _Arrange all_ or an _Arrange Linked Border Node_ action, all diagram elements are now snapped to the grid.
** When performing a drag and drop or a tool that will create multiple elements, all created elements are still visible but now snapped to the grid. 
** When creating an edge with a tool that also create the associated border nodes, the border nodes are now snapped near the click location. Before, they were created to respect a shortest path.
!./images/borderNodesWithSnapToGrid.png! 
* <span class="label label-info">Modified</span> In a sequence diagram, it is now possible to resize the combined fragment when the first or the last operand is selected (increase the size of the first operand to the top, or increase the size of the last operand to the bottom). Before, it was necessary to select the combined fragment itself to resize it. 
* <span class="label label-info">Modified</span> In a sequence diagram, it is now possible to resize an _Execution_ contained in an _Operand_ without previously resize its _Operand_ if more space is needed. The _Operand_, and if necessary the _Combined Fragment_, is resized too.
* <span class="label label-info">Modified</span> In a diagram, the action _Show/Hide label_ is now visible even if the selection contains invalid elements (ie elements without label). The action is applied only on valid elements of the selection.
* <span class="label label-info">Modified</span> In a diagram, the Line Style actions (Tree, Oblique or Rectilinear Routing Style) is now visible in the contextual menu even if the selection contains invalid elements (other elements than edges). The action is applied only on valid elements of the selection.
* <span class="label label-info">Modified</span> When an user defines a custom bundled image shape for a figure ("bundleImageShape":developer/extensions-provide_custom_bundled_image_shape.html#bundleImageShape ), opening or refreshing a diagram will not display exception anymore when the bundleImageShape extension is not valid. A warning is now displayed in the Error Log view to inform user of which attribute of the extension is not correct.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> An "automatic migration":./user/general/Modeling%20Project.html#Migration has been added in this version to fix diagram with edge labels corrupted (see "bugzilla #518870":https://bugs.eclipse.org/bugs/show_bug.cgi?id=518870 for more details). Contrary to all previous migrations, this one logs an information in the _Error Log_ view to inform how many labels have been fixed in concerned diagrams. If detected as "corrupted label", the label is reset to its default location (as if you launch the "Snap Back" action of it). If at least one label is detected as "corrupted label", the layout is also potentially corrupted (nodes, children of the diagram, with x or y coordinate very big). In this case, the concerned nodes are moved near 5000 (or -5000) as new coordinate. A message is added in this case: _Some nodes have also been moved as the layout of this diagram is corrupted. A Reset Origin and/or manual layout is probably needed for this diagram._ The rules applied to detect a corrupted label are the following:
** If the label is less than 250 pixels away from the reference point on its corresponding edge, the label is not considered as distant.
** If the label is more than 1000 pixels away from the reference point on its corresponding edge, the label is considered as distant.
** Between these 2 limits, the label is considered as distant if the distance between the center of the label and the edge is higher than "four times the size of the nearest segment".
* <span class="label label-info">Modified</span> In manual refresh mode (_Automatic Refresh_ Sirius preference disabled), when the _Force Refresh_ option of a tool is enabled in your VSM, only the current representation is refreshed when the tool is applied. Before this version, all open representations were refreshed.
* <span class="label label-info">Modified</span> The filtering expression variables available in the properties view definition in the 'Extends' tab were renamed to match the following pattern: featureName+'Description'.
* <span class="label label-info">Modified</span> The _Reference Name_ field of _Create instance_ completion will display only features with a consistent type with the one specified in _Type Name_ field (if a type has been specified).
* <span class="label label-info">Modified</span> The _Type Name_ field of _Create instance_ completion will display only types consistent with the feature type specified in _Reference Name_ field (if a valid feature has been specified).

h3. Developer-Visible Changes

h4. Migrations

* <span class="label label-success">Added</span> A migration has been added to fix diagram with edge labels corrupted (see "bugzilla #518870":https://bugs.eclipse.org/bugs/show_bug.cgi?id=518870 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201706291600_.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.SiriusDefaultSizeNodeFigure@ has been added in plugin @org.eclipse.sirius.ext.gmf.runtime@. The goal of the class is to workaround a "GMF bug":https://bugs.eclipse.org/bugs/show_bug.cgi?id=519250. So if you have created class which inherits from @org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure@, you must now use the new @SiriusDefaultSizeNodeFigure@ instead.
* <span class="label label-success">Added</span> A migration has been added to add an @uid@ to all instances of type DRepresentation. This @uid@ is used to reference the DRepresentation from the DRepresentationDescriptor. @DRepresentationDescriptor.repPath@ has been changed to have @uid@ as fragment. The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201707281200_.
* <span class="label label-success">Added</span> A migration has been added to fix diagram with edge bend-points corrupted (see "bugzilla #519044":https://bugs.eclipse.org/bugs/show_bug.cgi?id=519044 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201708031200_.

h4. Translation Keys Changes

See "this document":i18n_changes.html#sirius51 for the complete list of message keys added or removed in Sirius 5.0.

h4(#replazyloading). Representations lazy loading (experimental).

A new mode (currently experimental) is available to load representations on demand and not during session opening. This feature implies to serialize Sirius representations in separate resources. This mode can be activated by setting the system property @createLocalRepresentationInSeparateResource@ at true. For more detail, see the developer documentation: "Representations lazy loading (experimental)":./developer/representations_lazy_loading.html.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> A new convenience static method has been added on the @org.eclipse.sirius.business.api.session.Session@ interface to retrieve the session an arbitrary @EObject@ is part of: @Optional<Session> s = Session.of(myObject);@. It returns a @java.util.Optional<Session>@ so all the usual patterns apply, e.g. @Session.of(obj).ifPresent(s -> doSomething(s));@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.DRepresentationDescriptor.isLoadedRepresentation()@ has been added to know if the representation linked with this {@link DRepresentationDescriptor} is loaded. By default, all representations are held in the same resource than the DRepresentationDescriptor, in that case the method will always return true.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSession.allAnalyses()@ has been added in the interface to reflect the already existing @org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl.allAnalyses()@ implementation.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.DialectManager.getLoadedRepresentations(EObject, Session)@ has been added to get all loaded representations in the given session with the given EObject as target.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllLoadedRepresentations(Session)@ has been added to get all loaded representations in the given session.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.helper.SiriusUtil.REPRESENTATIONS_FOLDER_NAME@ constant has been added. This is the default folder where representations file (*.srm) are located if the system property "createLocalRepresentationInSeparateResource" is set at true.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tools.api.command.ui.UICallBack.shouldDeleteRepresentation(Set<DRepresentationDescriptor>)@ has been added to be called when the user interface should prompt for a choice about the representation deletion.
* <span class="label label-success">Added</span> (experimental) The new API @org.eclipse.sirius.business.api.query.SiriusReferenceFinder@ and @org.eclipse.sirius.business.api.query.EObjectQuery.getSiriusReferenceFinder()@ method to get it have been added. This API allows getting the DRepresentations or DRepresentationElements that reference the provided semantic object. It also allows getting the DRepresentationDescriptor which associated DRepresentation is or contains elements that reference the provided semantic object. This API will be useful for "representation lazy loading":#replazyloading as it may, in the future, not need to load all not yet loaded representations. For now, the use of this API will load all not loaded representations.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentationDescriptors(EObject, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllRepresentationDescriptors(Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentationDescriptors(RepresentationDescription, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> The implementations of @getRepresentationDescriptors(EObject, Session)@, @getAllRepresentationDescriptors(Session)@ and @getRepresentationDescriptors(RepresentationDescription, Session)@ have been removed from @AbstractRepresentationDialectServices@. They are implemented in @DialectManagerImpl@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentations(EObject, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllRepresentations(Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentations(RepresentationDescription, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> The implementations of @getRepresentations(EObject, Session)@, @getAllRepresentations(Session)@ and @getRepresentations(RepresentationDescription, Session)@ have been removed from @AbstractRepresentationDialectServices@. They are implemented in @DialectManagerImpl@.

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer.setEObjectToBeIgnored(Predicate<EObject>)@ has  been added to filter inverse references to prevent some references resolution.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.tools.api.util.WorkspaceUtil.getFilesFromWorkspace(Collection<IProject>, String)@ signature has been modified in @getFilesFromWorkspace(Collection<IContainer>, String)@ to be more generic.

h4. Changes in @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> A new query has been added in @org.eclipse.sirius.diagram.business.api.query.DDiagramQuery@. This query, @getAllActivatedLayers@, returns all the activated layers (transient or not) of the given diagram. It should replace @DDiagram.getActivatedLayers@ in several cases if you directly use it.

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> Three new preferences have been added to @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@: @PREF_SCALE_DIAGRAMS_ON_EXPORT@, @PREF_MAXIMUM_EXPORT_BUFFER_SIZE@, @PREF_MAXIMUM_EXPORT_BUFFER_SIZE_WINDOWS@. They are used to control the auto-scaling behavior when exporting diagrams. Refer to the JavaDoc for the details.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService@, two new methods have been added:
** @setAllowDownScaling(boolean)@: when auto-scaling is enabled (which is controlled by the already existing @setAutoScalingEnabled()@), this is used to control if down-scaling is allowed or not. 
** @getScalingFactor()@: after the export has been performed, this can be used to obtain the scaling factor that was effectively used.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult@ has been added, which inherits from @ExportResult@. It is returned by the @DialectManager.exportWithResult()@ methods when the representation exported is a diagram, and in addition to the information provided by @ExportResult@ gives access to the scaling factor that was used when exporting the diagram.
* <span class="label label-success">Added</span> The new preference @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys.PREF_SHOW_SYNCHRONIZE_STATUS_DECORATOR@ has been added to say if the "synchronize status":user/diagrams/Diagrams.html#synchronized_diagram decorator must be shown or not.
* <span class="label label-success">Added</span> A new method @checkShapesIntersect()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery@ to check if source and target of the connection intersect (only intersect - not one contained in another).

h4. Changes in @org.eclipse.sirius.ext.emf.edit@

* <span class="label label-info">Modified</span> @org.eclipse.sirius.ext.emf.edit.EditingDomainServices@ does not use @Collection@ anymore as return type or parameter type in its services. @java.util.Collection@ has been replaced by @java.util.List@. As mentioned in the "specifier documentation":./specifier/general/Writing_Queries.html#service_methods, it is recommended to use List or Set instead of Collection in java services signature.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.tools.api.dialogs.AbstractExportRepresentationsAsImagesDialog@ a new method @isAutoScaleDiagram()@ has been added to indicate (once the dialog has been closed) if the user has requested to enable auto-scaling on diagram export. 
* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction@, a new method @setAutoScaleDiagram(boolean)@ to ask for automatic scaling of diagrams on export.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices@, two new methods @exportWithResult()@ have been added. They are equivalent to the existing @export()@ methods (which return @void@) except that they return an instance of the new type @org.eclipse.sirius.ui.business.api.dialect.ExportResult@. This gives access to the list of all the actual files produced by the export operation. Note that in the case of the diagram dialect, @exportWithResult()@ actually returns a more specific @DiagramExportResult@ with additional diagram-specific information.
* <span class="label label-success">Added</span> The type @org.eclipse.sirius.ui.business.api.dialect.ExportFormat@ has a new attribute representing the scaling policy to use for diagram. It is defined by a new enumerated type @ExportFormat.ScalingPolicy@ which can have four different values: @WORKSPACE_DEFAULT@, @AUTO_SCALING@, @NO_SCALING@, @AUTO_SCALING_IF_LARGER@. Refer to the JavaDoc for details on their meanings.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.wizards.CreateEMFModelWizard@ is a new wizard that can be invoked to create instances of any metamodel. It will ask the end-user for a metamodel (@EPackage@), a concrete type to instanciate as root element, and finally the local path of the file to create. See the class Javadoc for sample usage. Note that the first two pages of the wizard (EPackage and root type selection) can be customized through the @org.eclipse.sirius.common.package_meta_data@ extension point to provide user-oriented name and documentation for an EPackage, and to suggest specific EClasses as good root candidates.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.command.AbstractSWTCallback.shouldDeleteRepresentation(Set<DRepresentationDescriptor>)@ default implementation has been added to prompt the confirm dialog.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.SessionEditorInput(URI, URI, String, Session)@ has been added to provide the @DRepresentationDescriptor@ URI to retrieve the @DRepresentation@ from the @DRepresentationDescriptor.getRepresentation()@ method instead of performing a direct load.
* <span class="label label-info">Modified</span> The org.eclipse.sirius.ui.tools.api.assist.TextContentProposalProvider.getSelectedElement() method is now protected instead of private to let sub-classes retrieving the selected element.

h4. Changes in @org.eclipse.sirius.ui.editor@

* <span class="label label-success">Added</span> New classes have been added in package @org.eclipse.sirius.ui.editor.api.pages@. They are the following: @AbstractSessionEditorPage@, @PageProvider@, @PageUpdateCOmmand@, @PositioningKind@, @PageUpdateCommandFactory@. These classes allow to provide custom pages to session editor instances.
* <span class="label label-success">Added</span> An extension point @org.eclipse.sirius.ui.editor.sessionEditorPageProvider@ has been added to allow custom page providing for session editor instances.

