Bug 544678: [Incubation][GitLight] Create the plugins to manage the
GitLight feature

Integrate the GitLight feature into incubation repository.

Change-Id: Ic3198bb95bfbc8987f712bce0785e60f58488bd2
Signed-off-by: Nicolas FAUVERGUE <nicolas.fauvergue@cea.fr>
diff --git a/gitlight/features/org.eclipse.papyrus.gitlight.feature/.project b/gitlight/features/org.eclipse.papyrus.gitlight.feature/.project
new file mode 100644
index 0000000..f4619c2
--- /dev/null
+++ b/gitlight/features/org.eclipse.papyrus.gitlight.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/features/org.eclipse.papyrus.gitlight.feature/build.properties b/gitlight/features/org.eclipse.papyrus.gitlight.feature/build.properties
new file mode 100644
index 0000000..b3a611b
--- /dev/null
+++ b/gitlight/features/org.eclipse.papyrus.gitlight.feature/build.properties
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+               feature.properties
diff --git a/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.properties b/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.properties
new file mode 100644
index 0000000..d80b8b1
--- /dev/null
+++ b/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.properties
@@ -0,0 +1,31 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+
+# NLS_MESSAGEFORMAT_VAR
+
+# "featureName" property - name of the feature
+featureName=Papyrus GitLight Feature (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse Modeling Project 
+
+# Description o the feature
+description=Feature for the papyrus git light.
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2019 CEA LIST, and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n\
+\n\
+SPDX-License-Identifier: EPL-2.0\n
+################ end of copyright property ####################################
diff --git a/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.xml b/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.xml
new file mode 100644
index 0000000..43715c6
--- /dev/null
+++ b/gitlight/features/org.eclipse.papyrus.gitlight.feature/feature.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.papyrus.gitlight.feature"
+      label="%featureName"
+      version="0.7.0.qualifier"
+      provider-name="%providerName"
+      license-feature="org.eclipse.license"
+      license-feature-version="2.0.0">
+
+   <description url="https://eclipse.org/papyrus/">
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import plugin="org.eclipse.emf.compare"/>
+      <import plugin="org.eclipse.emf.compare.egit"/>
+      <import plugin="org.eclipse.emf.compare.ide.ui"/>
+      <import plugin="org.eclipse.emf.compare.rcp.ui"/>
+      <import plugin="org.eclipse.emf.compare.uml2"/>
+      <import plugin="org.eclipse.papyrus.compare.uml2"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.git"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.git.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.review.profile"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.review.profile.edit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.review.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.compare"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.compare.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.papyrus.gitlight.compare.uml2.edit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/gitlight/features/org.eclipse.papyrus.gitlight.feature/pom.xml b/gitlight/features/org.eclipse.papyrus.gitlight.feature/pom.xml
new file mode 100644
index 0000000..1f4e50b
--- /dev/null
+++ b/gitlight/features/org.eclipse.papyrus.gitlight.feature/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.features</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.gitlight.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/features/pom.xml b/gitlight/features/pom.xml
new file mode 100644
index 0000000..b7502cc
--- /dev/null
+++ b/gitlight/features/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.parent</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.features</artifactId>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>org.eclipse.papyrus.gitlight.feature</module>
+	</modules>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.classpath
new file mode 100644
index 0000000..22f3064
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.project
new file mode 100644
index 0000000..745f41d
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.compare.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.runtime.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8a12f2c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.includeFieldsInNullAnalysis=disabled
+org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.ui.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..4bc0578
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,8 @@
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_settings_version=14
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=fr;com;java;javax;org;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+sp_cleanup.use_type_arguments=false
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.pde.api.tools.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..01461e0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,97 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Warning
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Warning
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Warning
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Warning
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Warning
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Warning
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Warning
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Warning
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Warning
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Warning
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Warning
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Warning
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Warning
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Warning
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Warning
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Warning
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Warning
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Warning
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Warning
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Warning
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Warning
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Warning
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Warning
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Warning
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Warning
+malformed_since_tag=Warning
+missing_since_tag=Warning
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..092cb3b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,65 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.compare.ui;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.compare.ui
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Version: 0.7.0.qualifier
+Bundle-Localization: plugin
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.emf.compare,
+ org.eclipse.emf.compare.rcp,
+ org.eclipse.emf.compare.ide,
+ org.eclipse.emf.compare.ide.ui,
+ org.eclipse.emf.compare.diagram.ide.ui,
+ org.eclipse.emf.compare.rcp.ui,
+ org.eclipse.gmf.runtime.diagram.ui,
+ org.eclipse.papyrus.uml.diagram.common,
+ org.eclipse.papyrus.infra.gmfdiag.common,
+ org.eclipse.papyrus.infra.core,
+ org.eclipse.papyrus.infra.onefile,
+ org.eclipse.papyrus.infra.gmfdiag.css,
+ org.eclipse.papyrus.uml.tools,
+ org.eclipse.papyrus.infra.emf,
+ org.eclipse.compare,
+ org.eclipse.emf.compare.rcp.ui,
+ org.eclipse.emf.edit.ui,
+ org.eclipse.papyrus.emf.facet.custom.metamodel,
+ org.eclipse.papyrus.emf.facet.custom.ui,
+ org.eclipse.uml2.uml.edit,
+ org.eclipse.papyrus.infra.services.labelprovider,
+ org.eclipse.ui.navigator,
+ org.eclipse.emf.compare.edit,
+ org.eclipse.papyrus.infra.architecture.representation,
+ org.eclipse.papyrus.infra.architecture,
+ org.eclipse.papyrus.infra.viewpoints.policy,
+ org.eclipse.papyrus.infra.gmfdiag.representation,
+ org.eclipse.jface,
+ org.eclipse.papyrus.infra.properties.ui,
+ org.eclipse.papyrus.uml.internationalization.utils,
+ org.eclipse.papyrus.gitlight.compare;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.gitlight.git;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.gitlight.review.profile;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.gitlight.review.ui;bundle-version="[0.7.0,1.0.0)"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: com.google.common.base;version="[15.0.0,22.0.0)",
+ com.google.common.collect;version="[15.0.0,22.0.0)",
+ com.google.common.io;version="[15.0.0,22.0.0)"
+Export-Package: org.eclipse.papyrus.gitlight.compare.ui,
+ org.eclipse.papyrus.gitlight.compare.ui.comparesource,
+ org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer,
+ org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet,
+ org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider,
+ org.eclipse.papyrus.gitlight.compare.ui.dependency,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.accessorfactory,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.commands,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.context,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.helper;x-internal:=true,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.logical,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.logical.view,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.properties,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters;x-internal:=true,
+ org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.groups;x-internal:=true,
+ org.eclipse.papyrus.gitlight.compare.ui.util
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/build.properties
new file mode 100644
index 0000000..67f6deb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/build.properties
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               resources/,\
+               about.html
+source.. = src/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.properties
new file mode 100644
index 0000000..3dd8a23
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Compare UI
+providerName = Eclipse Modeling Project
+
+emf.compare.fallback.textcompare = Text Compare
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.xml
new file mode 100644
index 0000000..24899e4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/plugin.xml
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+   <extension
+         point="org.eclipse.core.contenttype.contentTypes">
+      <file-association
+            content-type="org.eclipse.emf.compare.content.type"
+            file-extensions="di,notation"/>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.ide.resourceSetHook">
+      <resourceSetHook
+            class="org.eclipse.papyrus.gitlight.compare.ui.CssInstallationHook">
+      </resourceSetHook>
+      <resourceSetHook
+            class="org.eclipse.papyrus.gitlight.compare.ui.SaveParameterHook">
+      </resourceSetHook>
+      <resourceSetHook
+            class="org.eclipse.papyrus.gitlight.compare.ui.ElementTypeSetConfigurationRegistryInitializingHook">
+      </resourceSetHook>
+      <resourceSetHook
+            class="org.eclipse.papyrus.gitlight.compare.ui.ServicesRegistryInitializingHook">
+      </resourceSetHook>
+      <resourceSetHook
+            class="org.eclipse.papyrus.gitlight.compare.ui.DiagramMigrationHook">
+      </resourceSetHook>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.ide.ui.logicalModelViewHandlers">
+      <handler
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.logical.view.PapyrusLMVHandler"
+            ranking="20">
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.ide.ui.modelDependencyProvider">
+      <dependency
+            class="org.eclipse.papyrus.gitlight.compare.ui.dependency.PapyrusDependencyProvider">
+      </dependency>
+   </extension>
+   <extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory
+            adaptableType="org.eclipse.papyrus.infra.onefile.model.IPapyrusFile"
+            class="org.eclipse.papyrus.gitlight.compare.ui.comparesource.EMFCompareSourceAdapterFactory">
+         <adapter
+               type="org.eclipse.emf.compare.ide.ui.source.IEMFComparisonSource">
+         </adapter>
+      </factory>
+   </extension>
+   <extension
+         point="org.eclipse.compare.contentMergeViewers">
+      <viewer
+            class="org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.PapyrusTreeContentMergeViewerCreator"
+            id="org.eclipse.papyrus.gitlight.compare.ui.PapyrusTreeContentMergeViewer"
+            label="Papyrus"
+            extensions= 
+              "papyrus-org.eclipse.emf.compare.rcp.ui.eTreeDiff,
+              papyrus-org.eclipse.emf.compare.rcp.ui.eMatch,
+              papyrus-org.eclipse.emf.compare.rcp.ui.eResourceDiff,
+              papyrus-NODE_TYPE__EMF_EOBJECT,
+              papyrus-NODE_TYPE__EMF_RESOURCE,
+              papyrus-NODE_TYPE__EMF_RESOURCESET,
+              papyrus-NODE_TYPE__EMF_COMPARISON">
+      </viewer>
+      <viewer
+            class="org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.TextFallbackCompareViewerCreator"
+            extensions=
+            "papyrus-org.eclipse.emf.compare.rcp.ui.eTreeDiff,
+              papyrus-org.eclipse.emf.compare.rcp.ui.eMatch,
+              papyrus-org.eclipse.emf.compare.rcp.ui.eResourceDiff,
+              papyrus-NODE_TYPE__EMF_EOBJECT,
+              papyrus-NODE_TYPE__EMF_RESOURCE,
+              papyrus-NODE_TYPE__EMF_RESOURCESET,
+              papyrus-NODE_TYPE__EMF_COMPARISON"
+            id="org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.TextFallbackCompareViewer"
+            label="%emf.compare.fallback.textcompare">
+      </viewer>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.rcp.ui.accessorFactory">
+      <factory
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.accessorfactory.PapyrusAccessorFactoryWrapper"
+            ranking="1000">
+      </factory>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.rcp.ui.contentMergeViewerCustomization">
+      <treeContentCustomization
+            contentProvider="org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusMergeViewerItemContentProvider"
+            context="org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusContextTester"
+            ranking="20">
+      </treeContentCustomization>
+      <contentCustomization
+            context="org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusContextTester"
+            mergeViewerItemProvider="org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusCompareAccessorMergeViewerItemProvider"
+            ranking="10">
+      </contentCustomization>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.rcp.ui.filters">
+      <filter
+            activeByDefault="true"
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters.PapyrusDiagramTechnicalElementsFilter"
+            description="Technical elements of Papyrus diagrams such as hidden applied stereotype comments shapes and links."
+            label="Papyrus diagram technical elements">
+      </filter>
+      <filter
+            activeByDefault="true"
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters.ManagedDiffsFilter"
+            description="Hide the already managed differences."
+            label="Hide managed differences">
+      </filter>
+      <filter
+            activeByDefault="true"
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters.AnnotationDiffsFilter"
+            description="Hide the Papyrus Annotations differences."
+            label="Hide Papyrus Annotations differences">
+      </filter>
+   </extension>
+   <extension
+         point="org.eclipse.papyrus.infra.viewpoints.policy.viewType">
+      <helper
+            class="org.eclipse.papyrus.gitlight.compare.ui.internal.helper.CompareDiagramViewTypeHelper"
+            priority="50">
+      </helper>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.rcp.ui.groups">
+     <group
+           class="org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.groups.PapyrusGroupProvider"
+           label="Default (Papyrus)"
+           rank="140">
+      </group>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.ide.modelInclusionTester">
+      <fileExtensionModelInclusionTester
+            fileExtension="di">
+      </fileExtensionModelInclusionTester>
+      <fileExtensionModelInclusionTester
+            fileExtension="sash">
+      </fileExtensionModelInclusionTester>
+      <dynamicModelInclusionTester
+            dynamicTester="org.eclipse.papyrus.gitlight.compare.ui.internal.logical.InternationalizationFileInclusionTester">
+      </dynamicModelInclusionTester>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <category
+            description="The papyrus category for commands"
+            id="org.eclipse.papyrus.gitlight.compare.ui.compare.category"
+            name="Papyrus">
+      </category>
+      <command
+            categoryId="org.eclipse.papyrus.gitlight.compare.ui.compare.category"
+            description="This allows to accept a modification"
+            id="org.eclipse.papyrus.gitlight.compare.ui.accept"
+            name="Accept">
+      </command>
+      <command
+            categoryId="org.eclipse.papyrus.gitlight.compare.ui.compare.category"
+            description="This allows to reject a modification"
+            id="org.eclipse.papyrus.gitlight.compare.ui.reject"
+            name="Reject">
+      </command>
+      <command
+            categoryId="org.eclipse.papyrus.gitlight.compare.ui.compare.category"
+            description="This allows to go to the previous difference"
+            id="org.eclipse.papyrus.gitlight.compare.ui.previous"
+            name="Previous">
+      </command>
+      <command
+            categoryId="org.eclipse.papyrus.gitlight.compare.ui.compare.category"
+            description="This allows to go to the next difference"
+            id="org.eclipse.papyrus.gitlight.compare.ui.next"
+            name="Next">
+      </command>
+   </extension>
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/pom.xml
new file mode 100644
index 0000000..3aece89
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.compare.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Accept.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Accept.png
new file mode 100644
index 0000000..d129273
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Accept.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Next.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Next.png
new file mode 100644
index 0000000..3edb863
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Next.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Previous.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Previous.png
new file mode 100644
index 0000000..2c805f3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Previous.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Reject.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Reject.png
new file mode 100644
index 0000000..ef0bc5c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/resources/icons/Reject.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/AbstractPapyrusResourceSetHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/AbstractPapyrusResourceSetHook.java
new file mode 100644
index 0000000..91a29a9
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/AbstractPapyrusResourceSetHook.java
@@ -0,0 +1,49 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.ide.hook.AbstractResourceSetHooks;
+import org.eclipse.papyrus.gitlight.compare.util.ModelExtensionUtil;
+
+/**
+ * Abstract resource set hook that is activated for Papyrus files.
+ */
+public abstract class AbstractPapyrusResourceSetHook extends AbstractResourceSetHooks {
+
+	/**
+	 * File extensions registered in Papyrus.
+	 */
+	protected final Set<String> fileExtensions = ImmutableSet
+			.copyOf(ModelExtensionUtil.getRegisteredFileExtensions());
+
+	/**
+	 * Hooks in when any of the file extensions registered in Papyrus are loaded. {@inheritDoc}
+	 */
+	@Override
+	public boolean isHookFor(final Collection<? extends URI> uris) {
+		for (final URI uri : uris) {
+			if (fileExtensions.contains(uri.fileExtension())) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CompareUIPapyrusMessages.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CompareUIPapyrusMessages.java
new file mode 100644
index 0000000..e72ea0e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CompareUIPapyrusMessages.java
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Utility class to access externalized Strings for this bundle.
+ */
+public final class CompareUIPapyrusMessages {
+	/** Fully qualified path to the properties file in which to seek the keys. */
+	private static final String BUNDLE_NAME = "org.eclipse.papyrus.gitlight.compare.ui.compare_ui_papyrus_messages"; //$NON-NLS-1$
+
+	/** Contains the locale specific {@link String}s needed by this plug-in. */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Utility classes don't need to (and shouldn't) be instantiated.
+	 */
+	private CompareUIPapyrusMessages() {
+		// prevents instantiation
+	}
+
+	/**
+	 * Returns a specified {@link String} from the resource bundle.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @return The String from the resource bundle associated with <code>key</code>.
+	 */
+	public static String getString(String key) {
+		// Pass through MessageFormat to be consistent in the handling of special chars such as the apostrophe
+		return MessageFormat.format(internalGetString(key), new Object[] {});
+	}
+
+	/**
+	 * Returns a String from the resource bundle bound with the given arguments.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @param arguments
+	 *            Arguments for the String formatting.
+	 * @return formatted {@link String}.
+	 * @see MessageFormat#format(String, Object[])
+	 */
+	public static String getString(String key, Object... arguments) {
+		if (arguments == null) {
+			return getString(key);
+		}
+		return MessageFormat.format(internalGetString(key), arguments);
+	}
+
+	/**
+	 * This will return an unformatted String from the resource bundle.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @return An unformatted String from the bundle.
+	 */
+	private static String internalGetString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CssInstallationHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CssInstallationHook.java
new file mode 100644
index 0000000..0682a3a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/CssInstallationHook.java
@@ -0,0 +1,63 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.ide.hook.AbstractResourceSetHooks;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.infra.gmfdiag.css.helper.CSSHelper;
+
+/**
+ * Hook in the EMF Compare {@link org.eclipse.emf.ecore.resource.ResourceSet} in order to make it able to
+ * handle papyrus CSS features.
+ */
+public class CssInstallationHook extends AbstractResourceSetHooks {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.internal.utils.IResourceSetHook#handle(java.lang.Iterable)
+	 */
+	@Override
+	public boolean isHookFor(Collection<? extends URI> uris) {
+		// Looks for a papyrus notation file.
+		for (URI uri : uris) {
+			// FIXME this is a realy weak test. We can not use the
+			// triple of papyrus file "x.di", "x.notation" and "x.uml" since one or more of these files might
+			// not be part of the uri list. This might change soon since we might need to force loading uml if
+			// the notation file is loaded see https://bugs.eclipse.org/bugs/show_bug.cgi?id=443187.
+			if ("notation".equals(uri.fileExtension())) { //$NON-NLS-1$
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.hook.AbstractResourceSetHooks#preLoadingHook(org.eclipse.emf.ecore.resource.ResourceSet,
+	 *      java.util.Collection)
+	 */
+	@Override
+	public void preLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		if (!CSSHelper.isCSSSupported(resourceSet)) {
+			CSSHelper.installCSSSupport(resourceSet);
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/DiagramMigrationHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/DiagramMigrationHook.java
new file mode 100644
index 0000000..bd8e778
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/DiagramMigrationHook.java
@@ -0,0 +1,335 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import static java.lang.String.format;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.papyrus.infra.emf.gmf.util.GMFUnsafe;
+import org.eclipse.papyrus.infra.gmfdiag.common.model.NotationModel;
+import org.eclipse.papyrus.infra.gmfdiag.common.reconciler.DiagramReconciler;
+import org.eclipse.papyrus.infra.gmfdiag.common.reconciler.DiagramReconcilersReader;
+import org.eclipse.papyrus.infra.gmfdiag.common.reconciler.DiagramVersioningUtils;
+
+/**
+ * Hook in the EMF Compare {@link ResourceSet} in order to make it able to handle papyrus diagram migration
+ * features.
+ */
+public class DiagramMigrationHook extends AbstractPapyrusResourceSetHook {
+
+	@Override
+	public void preLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		// Pass
+	}
+
+	@Override
+	public void postLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		for (Resource resource : new ArrayList<Resource>(resourceSet.getResources())) {
+			if (NotationModel.NOTATION_FILE_EXTENSION.equals(resource.getURI().fileExtension())) {
+				EList<EObject> contents = resource.getContents();
+				for (EObject object : contents) {
+					if (object instanceof Diagram) {
+						Diagram diagram = (Diagram)object;
+						IDGenerator idgen = new IDGenerator(diagram);
+						try {
+							migrateDiagram(getEditingDomain(resourceSet), diagram);
+						} finally {
+							idgen.dispose();
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the editing domain for this resourceSet or create it.
+	 * 
+	 * @param resourceSet
+	 *            The resource set
+	 * @return TransactionalEditingDomain
+	 */
+	private TransactionalEditingDomain getEditingDomain(ResourceSet resourceSet) {
+		TransactionalEditingDomain existingDomain = TransactionalEditingDomain.Factory.INSTANCE
+				.getEditingDomain(resourceSet);
+		if (existingDomain == null) {
+			return TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(resourceSet);
+		} else {
+			return existingDomain;
+		}
+	}
+
+	/**
+	 * Build the migration command.
+	 * 
+	 * @param diagram
+	 *            Diagram you want to migrate
+	 * @return CompositeCommand
+	 */
+	private CompositeCommand buildCommand(Diagram diagram) {
+		CompositeCommand reconcileCommand = null;
+
+		if (!DiagramVersioningUtils.isOfCurrentPapyrusVersion(diagram)) {
+			reconcileCommand = new CompositeCommand("Reconciling"); //$NON-NLS-1$
+
+			String sourceVersion = DiagramVersioningUtils.getCompatibilityVersion(diagram);
+			Map<String, Collection<DiagramReconciler>> diagramReconcilers = DiagramReconcilersReader
+					.getInstance().load();
+			String diagramType = diagram.getType();
+			Collection<DiagramReconciler> reconcilers = new LinkedList<DiagramReconciler>();
+			if (diagramReconcilers.containsKey(diagramType)) {
+				reconcilers.addAll(diagramReconcilers.get(diagramType));
+			}
+
+			boolean someFailed = false;
+			Iterator<DiagramReconciler> reconciler = reconcilers.iterator();
+			while (reconciler.hasNext() && !someFailed) {
+				DiagramReconciler next = reconciler.next();
+
+				if (!next.canReconcileFrom(diagram, sourceVersion)) {
+					// asked for ignore it for this instance, all fine
+					continue;
+				}
+				ICommand nextCommand = next.getReconcileCommand(diagram);
+				if (nextCommand == null) {
+					// legitimate no-op response, all fine
+					continue;
+				}
+
+				if (nextCommand.canExecute()) {
+					reconcileCommand.add(nextCommand);
+				} else {
+					PapyrusCompareUIPlugin.getDefault().getLog().log(new Status(IStatus.ERROR,
+							PapyrusCompareUIPlugin.PLUGIN_ID,
+							"Diagram reconciler " + next + " failed to reconcile diagram: " + diagram)); //$NON-NLS-1$ //$NON-NLS-2$
+					someFailed = true;
+				}
+			}
+			if (someFailed) {
+				reconcileCommand = null;
+			}
+		}
+		return reconcileCommand;
+	}
+
+	/**
+	 * Migrate the diagram to the current version of Papyrus.
+	 * 
+	 * @param domain
+	 *            The editing domain for this diagram.
+	 * @param diagram
+	 *            The diagram.
+	 */
+	private void migrateDiagram(TransactionalEditingDomain domain, Diagram diagram) {
+		CompositeCommand migrationCommand = buildCommand(diagram);
+		if (migrationCommand == null) {
+			domain.dispose();
+			return;
+		}
+
+		migrationCommand.add(DiagramVersioningUtils.createStampCurrentVersionCommand(diagram));
+		// TODO: Handle reconcile exception
+		try {
+			// The migration command requires a transactional editing domain, but we don't
+			// want to record anything for undo/redo etc.
+			GMFUnsafe.write(domain, migrationCommand);
+		} catch (Exception e) {
+			logException(e);
+		} finally {
+			domain.dispose();
+		}
+	}
+
+	/**
+	 * Logs the specified exception.
+	 * 
+	 * @param t
+	 *            The exception to be logged.
+	 */
+	private static void logException(Throwable t) {
+		PapyrusCompareUIPlugin.getDefault().getLog()
+				.log(new Status(IStatus.WARNING, PapyrusCompareUIPlugin.PLUGIN_ID,
+						"Could not migrate the diagram before comparison", t)); //$NON-NLS-1$
+	}
+
+	//
+	// Nested types
+	//
+
+	/**
+	 * An adapter that generates new unique IDs, using a stable algorithm, for all new objects created by
+	 * diagram migration. This helps to ensure that when the same diagram on multiple sides of a comparison is
+	 * migrated on each side, that new elements created by migration are matched to avoid spurious add-add
+	 * conflicts.
+	 *
+	 * @author Christian W. Damus
+	 */
+	protected static class IDGenerator extends EContentAdapter {
+		private static final Pattern NOT_NCNAME = Pattern.compile("[^-a-zA-Z0-9_.]"); //$NON-NLS-1$
+
+		private static final String CHILDREN_PAT = "%s.%d"; //$NON-NLS-1$
+
+		private static final String STYLES_PAT = "%s._%s"; //$NON-NLS-1$
+
+		private static final String OTHER_PAT = "%s.%s%d"; //$NON-NLS-1$
+
+		private final Matcher notNCName = NOT_NCNAME.matcher(""); //$NON-NLS-1$
+
+		private final EObject root;
+
+		// Papyrus diagrams do not support cross-resource containment
+		private XMLResource resource;
+
+		private boolean enabled;
+
+		/**
+		 * Initializes me for generation of predictable, matchable unique identifiers in the tree under the
+		 * given {@code root}.
+		 * 
+		 * @param root
+		 *            the root of a tree in which to generate unique identifiers
+		 */
+		public IDGenerator(EObject root) {
+			super();
+
+			this.root = root;
+			this.resource = (XMLResource)root.eResource();
+
+			root.eAdapters().add(this);
+			this.enabled = true;
+		}
+
+		public void dispose() {
+			this.enabled = false;
+			root.eAdapters().remove(this);
+		}
+
+		@Override
+		protected void setTarget(EObject target) {
+			if (enabled) {
+				generateID(target);
+			}
+
+			super.setTarget(target);
+		}
+
+		/**
+		 * Generate a new unique ID for an {@code object} based on its containment in its parent object.
+		 * 
+		 * @param object
+		 *            a new object for which to generate a predictable, matchable ID
+		 */
+		protected void generateID(EObject object) {
+			// Everything has a container because we can never attempt to generate
+			// the ID of the diagram, itself
+			EObject parent = object.eContainer();
+			String parentID = resource.getID(parent);
+			String newID;
+
+			EReference containment = object.eContainmentFeature();
+			int index = indexOf(parent, containment, object);
+			if (containment == NotationPackage.Literals.VIEW__PERSISTED_CHILDREN) {
+				// For the most common case, the most compact scheme
+				newID = format(CHILDREN_PAT, parentID, Integer.valueOf(index));
+			} else if (containment == NotationPackage.Literals.VIEW__STYLES) {
+				// Identify styles by EClass to avoid ordering issues
+				newID = format(STYLES_PAT, parentID, asID(object.eClass().getName()));
+			} else {
+				newID = format(OTHER_PAT, parentID, asID(containment.getName()), Integer.valueOf(index));
+			}
+
+			resource.setID(object, unique(newID));
+		}
+
+		/**
+		 * Compures the index of an object {@code contained} in some {@code containment} reference of a
+		 * {@code container}.
+		 * 
+		 * @param container
+		 *            the containing object
+		 * @param containment
+		 *            the reference in which the {@code contained} object is stored
+		 * @param contained
+		 *            the contained object
+		 * @return its index
+		 */
+		protected int indexOf(EObject container, EReference containment, EObject contained) {
+			if (containment.isMany()) {
+				return ((InternalEList<?>)container.eGet(containment, false)).basicIndexOf(contained);
+			} else {
+				return 0;
+			}
+		}
+
+		/**
+		 * Transforms a {@link name} from the Ecore model by removing characters that are not valid in an XMI
+		 * ID.
+		 * 
+		 * @param name
+		 *            an Ecore name
+		 * @return a munged variant that is suitable for concatenation in an XMI ID (usually unchanged)
+		 */
+		protected String asID(String name) {
+			notNCName.reset(name);
+			return notNCName.replaceAll(""); //$NON-NLS-1$
+		}
+
+		/**
+		 * Munge an object identifier, if necessary, to make it unique in the resource.
+		 * 
+		 * @param id
+		 *            an object identifier
+		 * @return an unique variant of the identifier (usually unchanged)
+		 */
+		protected String unique(String id) {
+			String base = id;
+			String result = base;
+			int suffix = -1;
+
+			while (resource.getEObject(result) != null) {
+				if (suffix < 0) {
+					base = base + '_';
+				}
+				suffix++;
+				result = base + suffix;
+			}
+
+			return result;
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ElementTypeSetConfigurationRegistryInitializingHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ElementTypeSetConfigurationRegistryInitializingHook.java
new file mode 100644
index 0000000..0efe3c6
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ElementTypeSetConfigurationRegistryInitializingHook.java
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.Bundle;
+
+/**
+ * This hook initializes the ElementTypeSetConfigurationRegistry before a Papyrus resource is loaded.
+ * <p>
+ * The class
+ * {@link org.eclipse.papyrus.infra.elementtypesconfigurations.registries.ElementTypeSetConfigurationRegistry.ElementTypeSetConfigurationRegistry
+ * ElementTypeSetConfigurationRegistry} is not available in Luna and in different bundles in Mars and Neon, so
+ * we have to use reflection to be backwards compatible with all versions of Papyrus
+ * </p>
+ */
+public class ElementTypeSetConfigurationRegistryInitializingHook extends AbstractPapyrusResourceSetHook {
+
+	/** The id of the bundle containing the class ElementTypeSetConfigurationRegistry in Mars. */
+	private static final String BUNDLE_ID_MARS = "org.eclipse.papyrus.infra.elementtypesconfigurations"; //$NON-NLS-1$
+
+	/** The id of the bundle containing the class ElementTypeSetConfigurationRegistry in Neon. */
+	private static final String BUNDLE_ID_NEON = "org.eclipse.papyrus.infra.types.core"; //$NON-NLS-1$
+
+	/** The method to be invoked in ElementTypeSetConfigurationRegistry. */
+	private static final String GET_INSTANCE = "getInstance"; //$NON-NLS-1$
+
+	/** The qualified class name of ElementTypeSetConfigurationRegistry in Mars. */
+	private static final String ELEMENTTYPESETCONFIGREG_CLASS_NAME_MARS = "org.eclipse.papyrus.infra.elementtypesconfigurations.registries.ElementTypeSetConfigurationRegistry"; //$NON-NLS-1$
+
+	/** The qualified class name of ElementTypeSetConfigurationRegistry in Neon. */
+	private static final String ELEMENTTYPESETCONFIGREG_CLASS_NAME_NEON = "org.eclipse.papyrus.infra.types.core.registries.ElementTypeSetConfigurationRegistry"; //$NON-NLS-1$
+
+	@Override
+	public void preLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		Display.getDefault().syncExec(new Runnable() {
+			public void run() {
+				try {
+					// ElementTypeSetConfigurationRegistry is not available in Luna and in different bundles
+					// in Mars and Neon, so we have to use reflection to be backwards compatible with all
+					// versions of Papyrus
+					Class<?> registryClass;
+					Bundle bundle = Platform.getBundle(BUNDLE_ID_NEON);
+					if (bundle != null) {
+						registryClass = bundle.loadClass(ELEMENTTYPESETCONFIGREG_CLASS_NAME_NEON);
+					} else {
+						// neon bundle is not available, try mars bundle
+						bundle = Platform.getBundle(BUNDLE_ID_MARS);
+						registryClass = bundle.loadClass(ELEMENTTYPESETCONFIGREG_CLASS_NAME_MARS);
+					}
+					Method getInstanceMethod = registryClass.getDeclaredMethod(GET_INSTANCE);
+					getInstanceMethod.invoke(null);
+				} catch (ClassNotFoundException | NoSuchMethodException | SecurityException
+						| IllegalAccessException | IllegalArgumentException | InvocationTargetException
+						| NullPointerException e) {
+					logException(e);
+				}
+			}
+		});
+	}
+
+	/**
+	 * Logs the specified exception <code>e</code>.
+	 * 
+	 * @param e
+	 *            The exception to be logged.
+	 */
+	private void logException(Exception e) {
+		PapyrusCompareUIPlugin.getDefault().getLog()
+				.log(new Status(IStatus.WARNING, PapyrusCompareUIPlugin.PLUGIN_ID,
+						"Could not initialize ElementTypeSetConfigurationRegistry before comparison", e)); //$NON-NLS-1$
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/PapyrusCompareUIPlugin.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/PapyrusCompareUIPlugin.java
new file mode 100644
index 0000000..fad068f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/PapyrusCompareUIPlugin.java
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import org.eclipse.compare.internal.CompareEditor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.properties.CompareEditorPropertySheetAdapterFactory;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.services.labelprovider.service.impl.LabelProviderServiceImpl;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusCompareUIPlugin extends AbstractUIPlugin {
+
+	/** ID of this plug-in. */
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.gitlight.compare.ui"; //$NON-NLS-1$
+
+	/** The shared instance. */
+	private static PapyrusCompareUIPlugin plugin;
+
+	/** The Papyrus Label Provder. */
+	private LabelProviderService labelProviderService;
+
+	/**
+	 * The constructor.
+	 */
+	public PapyrusCompareUIPlugin() {
+		// Do nothing
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		
+		// This allows to manage the property sheet page for the CompareEditor
+		Platform.getAdapterManager().registerAdapters(new CompareEditorPropertySheetAdapterFactory(), CompareEditor.class);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		if (labelProviderService != null) {
+			try {
+				labelProviderService.disposeService();
+			} catch (ServiceException ex) {
+				plugin.getLog().log(new Status(IStatus.WARNING, PLUGIN_ID,
+						"Unable to dispose Papyrus Label Provider Service", ex)); //$NON-NLS-1$
+			}
+		}
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance.
+	 * 
+	 * @return the shared instance
+	 */
+	public static PapyrusCompareUIPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the Papyrus Label Provider service. If the service does not exist yet it will be created.
+	 * 
+	 * @return the Papyrus Label Provider service. Can be {@code null} if the service can not be started.
+	 */
+	public LabelProviderService getLabelProviderService() {
+		if (labelProviderService == null) {
+			labelProviderService = new LabelProviderServiceImpl();
+			try {
+				labelProviderService.startService();
+			} catch (ServiceException ex) {
+				// prevent service from being used if it could not be started
+				labelProviderService = null;
+				getDefault().getLog().log(new Status(IStatus.WARNING, PLUGIN_ID,
+						"Unable to start Papyrus Label Provider Service", ex)); //$NON-NLS-1$
+			}
+		}
+		return labelProviderService;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/SaveParameterHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/SaveParameterHook.java
new file mode 100644
index 0000000..2149695
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/SaveParameterHook.java
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.papyrus.gitlight.compare.util.ModelExtensionUtil;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.DiModel;
+import org.eclipse.papyrus.infra.gmfdiag.common.model.NotationModel;
+
+/**
+ * Hook into the EMF Compare {@link org.eclipse.emf.ecore.resource.ResourceSet} in order to adjust the default
+ * save parameters.
+ */
+public class SaveParameterHook extends AbstractPapyrusResourceSetHook {
+
+	/**
+	 * Adjust the default save parameters of Papyrus resources. The {@link ResourceSet} is checked if it
+	 * "really" contains Papyrus resources by looking for either a {@code .di} or {@code .notation} file since
+	 * they are pretty unique to Papyrus. If either one is found all default save parameters of files with
+	 * file extensions registered in Papyrus are checked for additional save parameters. {@inheritDoc}
+	 */
+	@Override
+	public void postLoadingHook(final ResourceSet resourceSet, final Collection<? extends URI> uris) {
+		if (containsPapyrusResources(resourceSet)) {
+			for (final Resource resource : resourceSet.getResources()) {
+				if (resource instanceof XMLResource && resource.getURI() != null) {
+					final String resourceExtension = resource.getURI().fileExtension();
+					if (fileExtensions.contains(resourceExtension)) {
+						final Map<?, ?> saveParameters = ModelExtensionUtil.getSaveParameters(resourceExtension);
+						final XMLResource xmlResource = (XMLResource) resource;
+						xmlResource.getDefaultSaveOptions().putAll(saveParameters);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Walks through the {@link Resource}s of the {@link ResourceSet} to determine if it contains Papyrus
+	 * resources.
+	 * 
+	 * @param resourceSet
+	 *            The checked {@link ResourceSet}.
+	 * @return {@code true} if the given {@code resourceSet} contains either a {@code .di} or
+	 *         {@code .notation} file, {@code false} otherwise.
+	 */
+	private boolean containsPapyrusResources(final ResourceSet resourceSet) {
+		for (final Resource resource : resourceSet.getResources()) {
+			if (resource.getURI() != null) {
+				final String resourceExtension = resource.getURI().fileExtension();
+				if (DiModel.DI_FILE_EXTENSION.equals(resourceExtension) || NotationModel.NOTATION_FILE_EXTENSION.equals(resourceExtension)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ServicesRegistryInitializingHook.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ServicesRegistryInitializingHook.java
new file mode 100644
index 0000000..c6c45c9
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/ServicesRegistryInitializingHook.java
@@ -0,0 +1,57 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui;
+
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.ide.hook.IResourceSetHook;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.infra.core.editor.ModelSetServiceFactory;
+import org.eclipse.papyrus.infra.core.services.ExtensionServicesRegistry;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+
+/**
+ * An {@link IResourceSetHook} to initialize a Papyrus Services Registry attached to the resource set. This
+ * will help Papyrus Diagrams to render properly, by giving them access to (a subset of) Papyrus services.
+ */
+public class ServicesRegistryInitializingHook extends AbstractPapyrusResourceSetHook {
+	@Override
+	public void preLoadingHook(ResourceSet resourceSet, Collection<? extends URI> uris) {
+		super.preLoadingHook(resourceSet, uris);
+
+		try {
+			ExtensionServicesRegistry servicesRegistry = new ExtensionServicesRegistry();
+			servicesRegistry.add(ResourceSet.class, Integer.MAX_VALUE, resourceSet);
+			try {
+				servicesRegistry.startRegistry();
+			} catch (ServiceException ex) {
+				// Ignore: ServiceExceptions are expected here, because some services registered via the
+				// extension point have a dependency on the Papyrus editor. The only consequence is that
+				// editor-bound services won't be started. We don't need them anyway (Probably :) )
+				// The services registry is still started properly (At least the services without any
+				// unresolved dependency)
+			}
+
+			ModelSetServiceFactory.setServiceRegistry(resourceSet, servicesRegistry);
+		} catch (ServiceException ex) {
+			PapyrusCompareUIPlugin.getDefault().getLog()
+					.log(new Status(IStatus.WARNING, PapyrusCompareUIPlugin.PLUGIN_ID,
+							"Unable to attach the Papyrus Services Registry to the Resource Set", ex)); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/compare_ui_papyrus_messages.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/compare_ui_papyrus_messages.properties
new file mode 100644
index 0000000..3f398b6
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/compare_ui_papyrus_messages.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+## ! note ! double the apostrophes if you need one in the printed String
+
+ModelExtensionUtil.InvalidConfig=Configuration error: Unable to create executable extension for extension ''{0}'', attribute ''classname'' is missing or invalid.
+AddEquivalencesBetweenPapyrusRenames.TaskLabel=Adding equivalences between papyrus renamed resources...
+MergeRenamingResources.TaskLabel=Finding equivalent papyrus renamed resource...
+
+PapyrusResourceAttachmentChangeMerge.saveFailure=Failed to save resource {0} because an exception occurred
+PapyrusResourceAttachmentChangeMerge.deleteFailure=Failed to delete resource {0} because an exception occurred
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/EMFCompareSourceAdapterFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/EMFCompareSourceAdapterFactory.java
new file mode 100644
index 0000000..3cc783b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/EMFCompareSourceAdapterFactory.java
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.comparesource;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.emf.compare.ide.ui.source.IEMFComparisonSource;
+import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
+
+/**
+ * The {@link IAdapterFactory} for {@link IEMFComparisonSource}s.
+ */
+@SuppressWarnings({"unchecked", "rawtypes" })
+public class EMFCompareSourceAdapterFactory implements IAdapterFactory {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Class[] getAdapterList() {
+		return new Class[] {IEMFComparisonSource.class };
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		if (IEMFComparisonSource.class.equals(adapterType)) {
+			return new PapyrusFileEMFCompareSourceAdapter((IPapyrusFile)adaptableObject);
+		}
+		return null;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/PapyrusFileEMFCompareSourceAdapter.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/PapyrusFileEMFCompareSourceAdapter.java
new file mode 100644
index 0000000..f1b483d
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/comparesource/PapyrusFileEMFCompareSourceAdapter.java
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.comparesource;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IAdapterManager;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.compare.ide.ui.source.IEMFComparisonSource;
+import org.eclipse.emf.compare.ide.utils.StorageTraversal;
+import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
+
+/**
+ * The {@link IEMFComparisonSource} adapter for {@link IPapyrusFile}s.
+ */
+public class PapyrusFileEMFCompareSourceAdapter implements IEMFComparisonSource {
+
+	/**
+	 * The {@link IPapyrusFile} which is adapted.
+	 */
+	private final IPapyrusFile papyrusFile;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param papyrusFile
+	 *            The {@link IPapyrusFile} which is adapted. Passing {@code null} is not allowed.
+	 */
+	public PapyrusFileEMFCompareSourceAdapter(IPapyrusFile papyrusFile) {
+		Assert.isNotNull(papyrusFile);
+		this.papyrusFile = papyrusFile;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getName() {
+		return papyrusFile.getName();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public StorageTraversal getStorageTraversal() {
+		IResource[] resources = papyrusFile.getAssociatedResources();
+		Set<IStorage> storages = getStorages(resources);
+		return new StorageTraversal(storages);
+	}
+
+	/**
+	 * Adapts the given {@code resources} to {@link IStorage}.
+	 * 
+	 * @param resources
+	 *            The array of resources which are to be adapted.
+	 * @return A set of all adapted {@link IStorage}s. If resources can not be adapted the set will be empty.
+	 */
+	private Set<IStorage> getStorages(IResource[] resources) {
+		final Set<IStorage> storages = new LinkedHashSet<IStorage>();
+		if (resources == null) {
+			return storages;
+		}
+
+		final IAdapterManager adapterManager = Platform.getAdapterManager();
+		for (IResource resource : resources) {
+			final IStorage storage = (IStorage)adapterManager.getAdapter(resource, IStorage.class);
+			if (storage != null) {
+				storages.add(storage);
+			}
+		}
+		return storages;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/ExegisTreeContentMergeViewer.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/ExegisTreeContentMergeViewer.properties
new file mode 100644
index 0000000..bb92137
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/ExegisTreeContentMergeViewer.properties
@@ -0,0 +1,71 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+title= Papyrus
+
+saveDialog.title= Save Resource
+saveDialog.message= Resource has been modified. Save changes?
+
+compareProgressTask.title= Computing Differences...
+
+tooComplexError.title= Error
+tooComplexError.message= Too many differences. Turn on the 'Ignore White Space' option or do a structure compare first.
+
+UnkownResource = Unknown Resource
+
+#####################################################
+# Toolbar actions
+#####################################################
+#
+# Default labels, tooltips and images for toolbar actions are inherited from the Eclipse Compare TextMergeViewer using the 
+# EMFCompareContentMergeViewerResourceBundle class in EMFCompareContentMergeViewer. The default values may be overridden here.
+#
+
+#####################################################
+# Context menu actions
+#####################################################
+
+action.undo.label=&Undo
+action.undo.tooltip=Undo Last Operation
+
+action.redo.label=&Redo
+action.redo.tooltip=Redo Last Operation
+
+action.cut.label=Cu&t
+action.cut.tooltip=Cut Text Selection to Clipboard
+
+action.copy.label=&Copy
+action.copy.tooltip=Copy Text Selection to Clipboard
+
+action.paste.label=&Paste
+action.paste.tooltip=Replace Text Selection with Clipboard Contents
+
+action.delete.label=&Delete
+action.delete.tooltip=Delete Current Text Selection
+
+action.find.label=&Find...
+action.find.tooltip=Find Occurrence
+
+action.selectAll.label=Select &All
+action.selectAll.tooltip=Select All Changes
+
+Editor.FindReplace.label=&Find/Replace...
+Editor.FindReplace.tooltip=Find/Replace
+Editor.FindReplace.image=
+Editor.FindReplace.description=Find/Replace
+
+action.IgnoreWhiteSpace.label=&Ignore White Space
+action.IgnoreWhiteSpace.tooltip=Ignore White Space Where Applicable
+
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewer.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewer.java
new file mode 100644
index 0000000..f7c6a86
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewer.java
@@ -0,0 +1,1484 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.eclipse.compare.INavigatable;
+import org.eclipse.compare.internal.Utilities;
+import org.eclipse.compare.internal.ViewerSwitchingCancelled;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.command.ICompareCommandStack;
+import org.eclipse.emf.compare.command.ICompareCopyCommand;
+import org.eclipse.emf.compare.domain.ICompareEditingDomain;
+import org.eclipse.emf.compare.domain.IMergeRunnable;
+import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.TreeContentMergeViewer;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.provider.DelegatingTreeMergeViewerItemContentProvider;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.provider.MergeViewerItemProviderConfiguration;
+import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeAction;
+import org.eclipse.emf.compare.internal.merge.MergeMode;
+import org.eclipse.emf.compare.merge.IMerger;
+import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.ICompareAccessor;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.AbstractMergeViewer;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.AbstractTableOrTreeMergeViewer.ElementComparer;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.impl.TreeMergeViewer;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.MergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProviderConfiguration;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+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.window.Window;
+import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet.PapyrusFacetContentProviderWrapperAdapterFactory;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusMergeViewerItem;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusTreeContentMergeViewerItemLabelProvider;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.commands.AddReviewCommentCommandWrapper;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.commands.CompoundCompareCommand;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.commands.PapyrusCompareCopyCommand;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.commands.RemoveDiffCommand;
+import org.eclipse.papyrus.gitlight.review.profile.utils.ReviewProfileUtils;
+import org.eclipse.papyrus.gitlight.review.ui.dialogs.ReviewCommentDialog;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity;
+import org.eclipse.papyrus.infra.emf.gmf.command.GMFtoEMFCommandWrapper;
+import org.eclipse.papyrus.infra.properties.ui.runtime.PropertiesRuntime;
+import org.eclipse.papyrus.uml.internationalization.utils.utils.UMLLabelInternationalization;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * Specialized Tree Content Merge Viewer for Papyrus.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusTreeContentMergeViewer extends TreeContentMergeViewer {
+
+	/**
+	 * Since Papyrus trees could in theory be infinite, we need a maximum search level.
+	 */
+	private static final int MAX_SEARCH_LEVEL = 20;
+
+	/**
+	 * Atomic boolean to manage the sync of selection.
+	 */
+	private AtomicBoolean syncingSelections;
+
+	/**
+	 * Map of objects to {@link PapyrusContentProviderMergeViewerItem Papyrus merge viewer items} used when changing the selection in order to find the merge viewer item to be selected when a specific object (model element or diff) is to be revealed.
+	 */
+	private Map<Object, IMergeViewerItem> cachedMapForSelection;
+
+	/**
+	 * A queue of computations for computing the content tree items in the {@linked #getLeftMergeViewer() right merge viewer}.
+	 */
+	private LinkedList<AbstractContentFunction> leftContentComputations;
+
+	/**
+	 * A queue of computations for computing the content tree items in the {@linked #getRightMergeViewer() left merge viewer}.
+	 */
+	private LinkedList<AbstractContentFunction> rightContentComputations;
+
+	/**
+	 * The accept action contribution item.
+	 */
+	private ActionContributionItem acceptAction;
+
+	/**
+	 * The reject action contribution item.
+	 */
+	private ActionContributionItem rejectAction;
+
+	/**
+	 * The next action contribution item.
+	 */
+	private ActionContributionItem nextAction;
+
+	/**
+	 * The previous action contribution item.
+	 */
+	private ActionContributionItem previousAction;
+
+	/**
+	 * The papyrus command category identifier
+	 */
+	private static final String PAPYRUS_CATEGORY = "Papyrus"; //$NON-NLS-1$
+
+	/**
+	 * The papyrus merge viewer items corresponding to the differences.
+	 */
+	private List<PapyrusMergeViewerItem> papyrusMergeViewerItems;
+
+	/**
+	 * This allows to store the current difference (to manage correctly the next and previous selection)
+	 */
+	protected PapyrusMergeViewerItem currentDiff = null;
+
+	/**
+	 * The adapter factory content provider for the property view when this one is an ExtendedPropertySheetPage.
+	 */
+	private AdapterFactoryContentProvider adapterFactoryContentProvider;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param style
+	 *            The style parameter.
+	 * @param bundle
+	 *            The {@link ResourceBundle}.
+	 * @param parent
+	 *            The {@link Composite} parent.
+	 * @param config
+	 *            The {@link EMFCompareConfiguration}.
+	 */
+	public PapyrusTreeContentMergeViewer(final int style, final ResourceBundle bundle, final Composite parent, final EMFCompareConfiguration config) {
+		super(style, bundle, parent, config);
+
+		// This is needed to load the different elements for papyrus properties view
+		PropertiesRuntime.getConfigurationManager();
+
+		AdapterFactory currentAdapterFactory = getCompareConfiguration().getAdapterFactory();
+		if (null != currentAdapterFactory) {
+			adapterFactoryContentProvider = new AdapterFactoryContentProvider(currentAdapterFactory);
+		}
+
+		// Manage a selection change listener for the left and right merge tree viewer
+		getLeftMergeViewer().addSelectionChangedListener(event -> updateToolBarForSelection(event));
+		getRightMergeViewer().addSelectionChangedListener(event -> updateToolBarForSelection(null));
+	}
+
+	/**
+	 * This allows to get the index of the diff containned in the list of papyrus merge viewer items.
+	 * 
+	 * @param diff
+	 *            The diff to search.
+	 * @return The index of the diff or -1 if not found.
+	 */
+	private int getDiffIndex(final Diff diff) {
+		return IntStream.range(0, papyrusMergeViewerItems.size()).filter(index -> {
+			PapyrusMergeViewerItem item = papyrusMergeViewerItems.get(index);
+			return null != item ? diff.equals(papyrusMergeViewerItems.get(index).getDiff()) : false;
+		}).findFirst().getAsInt();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.EMFCompareContentMergeViewer#createMergeViewer(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected AbstractMergeViewer createMergeViewer(final Composite parent, final MergeViewerSide side) {
+		final TreeMergeViewer mergeTreeViewer = new TreeMergeViewer(parent, side, this, getCompareConfiguration()) {
+			@Override
+			protected IAction createAction(MergeMode mode, Diff diff) {
+				return new MergeAction(getCompareConfiguration(), EMFCompareRCPPlugin.getDefault().getMergerRegistry(), mode, null, new StructuredSelection(diff));
+			}
+		};
+
+		final IContentProvider contentProvider = createMergeViewerContentProvider(side);
+		mergeTreeViewer.setContentProvider(contentProvider);
+
+		final IBaseLabelProvider labelProvider = new PapyrusTreeContentMergeViewerItemLabelProvider(getResourceBundle(), getAdapterFactory(), side);
+		mergeTreeViewer.setLabelProvider(labelProvider);
+
+		hookListeners(mergeTreeViewer);
+
+		return mergeTreeViewer;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.TreeContentMergeViewer#createMergeViewerItemProviderConfiguration(org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide)
+	 */
+	@Override
+	protected IMergeViewerItemProviderConfiguration createMergeViewerItemProviderConfiguration(final MergeViewerSide side) {
+		ComposedAdapterFactory factory = new ComposedAdapterFactory(new AdapterFactory[] { new PapyrusFacetContentProviderWrapperAdapterFactory(), getAdapterFactory(), });
+		return new MergeViewerItemProviderConfiguration(factory, getDifferenceGroupProvider(), getDifferenceFilterPredicate(), getCompareConfiguration().getComparison(), side);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.EMFCompareContentMergeViewer#updateContent(java.lang.Object, java.lang.Object, java.lang.Object)
+	 */
+	@Override
+	protected void updateContent(final Object ancestor, Object left, final Object right) {
+		// Modify selection so it works with the Papyrus Merge Viewer Items
+
+		// first check whether the input on any side has changed
+		if (isDifferentInput(MergeViewerSide.LEFT, left) || isDifferentInput(MergeViewerSide.RIGHT, right)) {
+			getAncestorMergeViewer().setInput(ancestor);
+			getLeftMergeViewer().setInput(left);
+			getRightMergeViewer().setInput(right);
+
+			leftContentComputations = null;
+			rightContentComputations = null;
+			cachedMapForSelection = null;
+		} else {
+			getLeftMergeViewer().refresh();
+			getRightMergeViewer().refresh();
+		}
+
+		// Get the papyrus merge viewer items of the right tree viewer
+		if (null == papyrusMergeViewerItems && getLeftMergeViewer().getContentProvider() instanceof DelegatingTreeMergeViewerItemContentProvider) {
+
+			if (left instanceof ICompareAccessor) {
+				final IMergeViewerItem initialItem = ((ICompareAccessor) left).getInitialItem();
+				final Object root = getRootItem(initialItem, MergeViewerSide.LEFT);
+				final Object rootInput = null != root ? root : initialItem;
+
+				final DelegatingTreeMergeViewerItemContentProvider contentProvider = (DelegatingTreeMergeViewerItemContentProvider) getLeftMergeViewer().getContentProvider();
+				papyrusMergeViewerItems = getDiffPapyrusMergeViewerItems(rootInput, contentProvider);
+			} else {
+				papyrusMergeViewerItems = null;
+			}
+		}
+
+		// Set the first diff
+		if (null == currentDiff) {
+
+			final IMergeViewerItem leftInitialItem = left instanceof ICompareAccessor ? ((ICompareAccessor) left).getInitialItem() : null;
+
+			// This first lines allowed to initialize the cached map
+			// Bug 458818: In some cases, the left initial item is null because the item that should be selected has been deleted on the right and this delete is part of a conflict
+			if (leftInitialItem == null || leftInitialItem.getLeft() == null) {
+				if (right instanceof ICompareAccessor) {
+					IMergeViewerItem rightInitialItem = ((ICompareAccessor) right).getInitialItem();
+					if (rightInitialItem == null) {
+						getLeftMergeViewer().setSelection(StructuredSelection.EMPTY, true);
+					} else {
+						setSelection((ICompareAccessor) right);
+					}
+				} else {
+					// Strange case: left is an ICompareAccessor but right is not?
+					getLeftMergeViewer().setSelection(StructuredSelection.EMPTY, true);
+				}
+			} else {
+				// others will synchronize on this one :)
+				setSelection((ICompareAccessor) left);
+			}
+
+			if (null != papyrusMergeViewerItems && !papyrusMergeViewerItems.isEmpty()) {
+				setCurrentDiff(papyrusMergeViewerItems.get(0));
+			}
+		}
+
+		redrawCenterControl();
+	}
+
+	/**
+	 * Check whether the given input is an instance of {@link ICompareAccessor}.
+	 * 
+	 * @param input
+	 *            The given input to check.
+	 * @return {@code true}, if the input is an instance of {@link ICompareAccessor}, {@code false} otherwise.
+	 */
+	private static boolean isCompareAccessor(final Object input) {
+		return input instanceof ICompareAccessor;
+	}
+
+	/**
+	 * Check whether the current input of the given side differs from the given one.
+	 * 
+	 * @param side
+	 *            The side to be checked, either {@link MergeViewerSide#LEFT} or {@link MergeViewerSide#RIGHT}.
+	 * @param input
+	 *            The input to check against.
+	 * @return {@code true}, if the input is different, {@code false} otherwise
+	 */
+	private boolean isDifferentInput(final MergeViewerSide side, final Object input) {
+		TreeMergeViewer viewer = getMergeViewer(side);
+		if (!isCompareAccessor(input) || !isCompareAccessor(viewer.getInput())) {
+			return true;
+		}
+		ImmutableList<? extends IMergeViewerItem> inputItems = ICompareAccessor.class.cast(input).getItems();
+		ImmutableList<? extends IMergeViewerItem> vieweritems = ICompareAccessor.class.cast(viewer.getInput()).getItems();
+		if (inputItems.size() != vieweritems.size()) {
+			return true;
+		}
+		ElementComparer comparer = new ElementComparer();
+		for (int i = 0; i < vieweritems.size(); i++) {
+			if (!comparer.equals(inputItems.get(i), vieweritems.get(i))) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Returns the {@link TreeMergeViewer} of the given side.
+	 * 
+	 * @param side
+	 *            The side for which to return the {@link TreeMergeViewer}.
+	 * @return the {@link TreeMergeViewer} of the respective side
+	 */
+	public TreeMergeViewer getMergeViewer(final MergeViewerSide side) {
+		if (side == MergeViewerSide.LEFT) {
+			return getLeftMergeViewer();
+		} else if (side == MergeViewerSide.RIGHT) {
+			return getRightMergeViewer();
+		}
+		return getAncestorMergeViewer();
+	}
+
+	/**
+	 * This allows to initialize graphically the action.
+	 * 
+	 * @param action
+	 *            The action to initialize.
+	 * @param bundle
+	 *            The current bundle.
+	 * @param actionName
+	 *            The name of the action.
+	 * @param tooltip
+	 *            The tooltip of the action.
+	 * @param description
+	 *            The description of the action.
+	 */
+	private void initGraphicalAction(final IAction action, final ResourceBundle bundle, final String actionName, final String tooltip, final String description) {
+		action.setText(actionName);
+		action.setToolTipText(tooltip);
+		action.setDescription(description);
+
+		final String path = "resources/icons/" + actionName + ".png"; //$NON-NLS-1$ //$NON-NLS-2$
+		final ImageDescriptor imageDescriptor = PapyrusCompareUIPlugin.imageDescriptorFromPlugin(PapyrusCompareUIPlugin.PLUGIN_ID, path);
+		if (null != imageDescriptor) {
+			action.setImageDescriptor(imageDescriptor);
+			action.setHoverImageDescriptor(imageDescriptor);
+		}
+	}
+
+	/**
+	 * This allows to create the merge action (left to right, right to left, accept or reject).
+	 * 
+	 * @param mergeMode
+	 *            The merge mode (left to right, right to left, accept or reject).
+	 * @param cc
+	 *            The compare configuration.
+	 * @param nav
+	 *            The navigatable (can be <code>null</code>).
+	 * @return The created merge action.
+	 */
+	private MergeAction createMergeAction(final MergeMode mergeMode, final EMFCompareConfiguration cc, final INavigatable nav) {
+		IMerger.Registry mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
+		MergeAction mergeAction = new MergeAction(cc, mergerRegistry, mergeMode, nav) {
+			@Override
+			protected Iterable<Diff> getSelectedDifferences(final IStructuredSelection selection) {
+				final List<?> selectedObjects = selection.toList();
+				final List<PapyrusMergeViewerItem> papyrusItems = selectedObjects.stream().filter(item -> item instanceof PapyrusMergeViewerItem).map(item -> (PapyrusMergeViewerItem) item).collect(Collectors.toList());
+				Iterable<Diff> diffs = papyrusItems.stream().map(item -> item.getDiff()).collect(Collectors.toList());
+				if (Iterables.isEmpty(diffs)) {
+					diffs = Iterables.filter(selectedObjects, Diff.class);
+				}
+				return getSelectedDifferences(diffs);
+			}
+
+			@Override
+			public void run() {
+				int diffIndex = -1;
+				if (null != papyrusMergeViewerItems && !papyrusMergeViewerItems.isEmpty() && null != currentDiff) {
+					diffIndex = getDiffIndex(currentDiff.getDiff());
+				}
+
+				super.run();
+
+				if (continueProcess) {
+					// Manage the next selection (if this is not the last) or the previous if possible
+					if (diffIndex >= 0 && (diffIndex < papyrusMergeViewerItems.size() || diffIndex > 0)) {
+						selectDiffByIndex(diffIndex);
+					} else {
+						// If there is no next or previous diff, select the same
+						selectDiff(currentDiff);
+					}
+				}
+			}
+
+			private boolean continueProcess = true;;
+
+			@Override
+			protected void execute(final ICompareCommandStack commandStack, final MergeMode mode, final List<Diff> diffs) {
+
+				final CompoundCompareCommand command = new CompoundCompareCommand();
+
+				continueProcess = true;
+				ReviewComment createdReviewComment = null;
+
+				// We this is a reject action, we need to comment the reject with a message
+				if (getSelectedMode() == MergeMode.RIGHT_TO_LEFT || getSelectedMode() == MergeMode.REJECT) {
+					createdReviewComment = ReviewProfileUtils.createReviewComment();
+					createdReviewComment.setSeverity(ReviewSeverity.ERROR);
+
+					// Open the dialog of the comment
+					final ReviewCommentDialog dialog = new ReviewCommentDialog(getControl().getShell(), createdReviewComment);
+					continueProcess = dialog.open() == Window.OK;
+
+					// If this is a delete, the element will be removed (and we need to add something to comment's body to specify the deleted element).
+					if (continueProcess) {
+						updateCommentBody(createdReviewComment, currentDiff);
+					}
+				}
+
+				if (continueProcess) {
+					final IMergeRunnable runnable = createMergeRunnable(mode, isLeftEditable(), isRightEditable(), getDiffRelationshipComputer());
+					final ICompareCopyCommand compareCopyCommand = editingDomain.createCopyCommand(diffs, mode.isLeftToRight(isLeftEditable(), isRightEditable()), mergerRegistry, runnable);
+
+					IMergeViewerItem parentViewerItem = retrieveExistingPapyrusMergeViewerItem(currentDiff);
+					Object leftValue = parentViewerItem.getSideValue(MergeViewerSide.LEFT);
+					if (leftValue instanceof Element) {
+						final TransactionalEditingDomain domain = retrieveTransactionalEditingDomain(((Element) leftValue).getModel());
+
+						// Manage the remove of the diff from the papyrus items
+						final Command transactionalCommand = GMFtoEMFCommandWrapper.wrap(new PapyrusCompareCopyCommand(domain, compareCopyCommand));
+						command.append(new AddReviewCommentCommandWrapper(transactionalCommand, createdReviewComment, currentDiff, getCompareConfiguration()));
+						command.append(new RemoveDiffCommand(papyrusMergeViewerItems, currentDiff));
+						commandStack.execute(command);
+
+						if (!isLeftDirty()) {
+							setLeftDirty(true);
+						}
+
+						getLeftMergeViewer().refresh();
+						getRightMergeViewer().refresh();
+					}
+				}
+			}
+
+
+		};
+		if (mergeMode == MergeMode.RIGHT_TO_LEFT || mergeMode == MergeMode.REJECT) {
+			mergeAction.setActionDefinitionId("org.eclipse.compare.copyRightToLeft"); //$NON-NLS-1$
+		} else {
+			mergeAction.setActionDefinitionId("org.eclipse.compare.copyLeftToRight"); //$NON-NLS-1$
+		}
+		return mergeAction;
+	}
+
+	/**
+	 * This allows to update the comment body of a reject.
+	 * 
+	 * @param reviewComment
+	 *            The review comment to modify.
+	 * @param diff
+	 *            The diff to manage.
+	 */
+	protected void updateCommentBody(final ReviewComment reviewComment, final PapyrusMergeViewerItem diff) {
+		Object itemValue = diff.getSideValue(MergeViewerSide.LEFT);
+		if (null == itemValue) {
+			itemValue = diff.getSideValue(MergeViewerSide.RIGHT);
+		}
+
+		if (itemValue instanceof Element) {
+			final StringBuilder commentBody = new StringBuilder();
+			String identifier = "<Unknown>"; //$NON-NLS-1$
+			if (itemValue instanceof NamedElement) {
+				identifier = UMLLabelInternationalization.getInstance().getLabel((NamedElement) itemValue);
+			} else if (itemValue instanceof Comment) {
+				final EObject parent = ((Comment) itemValue).eContainer();
+				if (parent instanceof NamedElement) {
+					identifier = "comment of '" + UMLLabelInternationalization.getInstance().getLabel((NamedElement) itemValue) + "'"; //$NON-NLS-1$ //$NON-NLS-2$
+				}
+			}
+			commentBody.append("Modification of '" + identifier + "' rejected."); //$NON-NLS-1$ //$NON-NLS-2$
+			commentBody.append("\n"); //$NON-NLS-1$
+			commentBody.append("Reason: "); //$NON-NLS-1$
+			if (null != reviewComment.getBase_Comment().getBody()) {
+				commentBody.append(reviewComment.getBase_Comment().getBody());
+			}
+
+			reviewComment.getBase_Comment().setBody(commentBody.toString());
+		}
+	}
+
+	/**
+	 * This allows to retrieve the first upper merge viewer item where the element is the same for both side.
+	 * 
+	 * @param diff
+	 *            The diff to manage.
+	 * @return The first upper merge viewer item.
+	 */
+	private IMergeViewerItem retrieveExistingPapyrusMergeViewerItem(final IMergeViewerItem diff) {
+		if (null != diff) {
+			final Object leftValue = diff.getSideValue(MergeViewerSide.LEFT);
+			if (diff.getDiff() == null && leftValue instanceof Element) {
+				return diff;
+			} else {
+				final IMergeViewerItem papyrusParent = diff.getParent();
+				if (papyrusParent instanceof IMergeViewerItem) {
+					return retrieveExistingPapyrusMergeViewerItem(papyrusParent);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to retrieve the transactional editing domain associated to the element.
+	 * 
+	 * @param element
+	 *            the UML element.
+	 * @return The transactional editing domain or <code>null</code>.
+	 */
+	private TransactionalEditingDomain retrieveTransactionalEditingDomain(final Element element) {
+		TransactionalEditingDomain transactionalEditingDomain = TransactionUtil.getEditingDomain(element);
+		if (null == transactionalEditingDomain) {
+			final EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(element);
+			if (editingDomain instanceof TransactionalEditingDomain) {
+				transactionalEditingDomain = (TransactionalEditingDomain) editingDomain;
+			}
+		}
+		return transactionalEditingDomain;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	 */
+	public void selectionChanged(SelectionChangedEvent event) {
+		synchronizeSelection(event);
+		updateToolItems();
+	}
+
+	/**
+	 * This allows to synchronize the selection.
+	 * 
+	 * @param event
+	 *            the selection change event.
+	 */
+	private void synchronizeSelection(final SelectionChangedEvent event) {
+		if (null == syncingSelections) {
+			syncingSelections = new AtomicBoolean(false);
+		}
+		if (syncingSelections.compareAndSet(false, true)) { // prevents stack overflow
+			try {
+				final ISelection selection = event.getSelection();
+				updatePropertiesView(selection);
+				getLeftMergeViewer().setSelection(selection, true);
+				getRightMergeViewer().setSelection(selection, true);
+				getAncestorMergeViewer().setSelection(selection, true);
+			} finally {
+				syncingSelections.set(false);
+			}
+		}
+
+	}
+
+	/**
+	 * Update the properties view with the given selection.
+	 * 
+	 * @param selection
+	 *            the given selection.
+	 */
+	private void updatePropertiesView(final ISelection selection) {
+		if (!PlatformUI.isWorkbenchRunning()) {
+			// no update of property view outside of workbench
+			return;
+		}
+
+		if (selection instanceof StructuredSelection) {
+			final StructuredSelection structuredSelection = (StructuredSelection) selection;
+			final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+			final IPropertySheetPage propertySheetPage = getPropertySheetPage(page);
+			if (propertySheetPage != null) {
+				StructuredSelection selectionForPropertySheet = null;
+				final IWorkbenchPart activePart = page.getActivePart();
+				final Object firstElement = structuredSelection.getFirstElement();
+				if (firstElement instanceof MergeViewerItem) {
+					final MergeViewerItem mergeViewerItem = (MergeViewerItem) firstElement;
+					final MergeViewerSide side = mergeViewerItem.getSide();
+					final Object newSelectedObject = mergeViewerItem.getSideValue(side);
+					if (propertySheetPage instanceof ExtendedPropertySheetPage) {
+						((ExtendedPropertySheetPage) propertySheetPage).setPropertySourceProvider(adapterFactoryContentProvider);
+					}
+					getControl().addDisposeListener(new DisposeListener() {
+						public void widgetDisposed(DisposeEvent e) {
+							if (propertySheetPage instanceof ExtendedPropertySheetPage && null != propertySheetPage.getControl() && !propertySheetPage.getControl().isDisposed()) {
+								((ExtendedPropertySheetPage) propertySheetPage).selectionChanged(activePart, null);
+								((ExtendedPropertySheetPage) propertySheetPage).setPropertySourceProvider(null);
+							}
+						}
+					});
+					if (newSelectedObject != null) {
+						if (newSelectedObject instanceof EObject) {
+							manageReadOnly((EObject) newSelectedObject, side);
+						}
+						if (null != propertySheetPage.getControl() && !propertySheetPage.getControl().isDisposed()) {
+							selectionForPropertySheet = new StructuredSelection(newSelectedObject);
+							propertySheetPage.selectionChanged(activePart, selectionForPropertySheet);
+						}
+					}
+				}
+				if (selectionForPropertySheet == null && null != propertySheetPage.getControl() && !propertySheetPage.getControl().isDisposed()) {
+					selectionForPropertySheet = new StructuredSelection(new Object());
+					propertySheetPage.selectionChanged(activePart, selectionForPropertySheet);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Returns the property sheet page.
+	 * 
+	 * @return the property sheet page.
+	 */
+	private IPropertySheetPage getPropertySheetPage(final IWorkbenchPage activePage) {
+		IPropertySheetPage propertyPage = null;
+		if (activePage != null) {
+			final IViewPart view = activePage.findView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
+			if (view != null) {
+				if (view instanceof PropertySheet) {
+					final PropertySheet propertySheet = (PropertySheet) view;
+					final IPage currentPage = propertySheet.getCurrentPage();
+					final IEditorPart activeEditor = activePage.getActiveEditor();
+					final IPropertySheetPage adapter = (IPropertySheetPage) Platform.getAdapterManager().getAdapter(activeEditor, IPropertySheetPage.class);
+					if (null != activeEditor && null != adapter) {
+						propertySheet.partActivated(activePage.getActivePart());
+						propertyPage = adapter;
+					} else if (currentPage instanceof ExtendedPropertySheetPage) {
+						propertyPage = (ExtendedPropertySheetPage) currentPage;
+					}
+
+				}
+			}
+		}
+		return propertyPage;
+	}
+
+	/**
+	 * Manages the read-only state of the properties sheet page for the given selected object.
+	 * 
+	 * @param selectedObject
+	 *            the given selected object.
+	 * @param side
+	 *            the side of the selected object.
+	 */
+	private void manageReadOnly(final EObject selectedObject, final MergeViewerSide side) {
+		if (MergeViewerSide.RIGHT == side) {
+			setToReadOnly(selectedObject);
+		} else if (MergeViewerSide.ANCESTOR == side) {
+			setToReadOnly(selectedObject);
+		}
+	}
+
+	/**
+	 * Sets the resource of the selected object to read-only in the appropriate editing domain.
+	 * 
+	 * @param selectedObject
+	 *            the given selected object.
+	 */
+	private void setToReadOnly(final EObject selectedObject) {
+		final EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(selectedObject);
+		if (editingDomain instanceof AdapterFactoryEditingDomain) {
+			final Resource r = selectedObject.eResource();
+			final Map<Resource, Boolean> resourceToReadOnlyMap = ((AdapterFactoryEditingDomain) editingDomain).getResourceToReadOnlyMap();
+			if (!resourceToReadOnlyMap.containsKey(r)) {
+				resourceToReadOnlyMap.put(r, Boolean.TRUE);
+			}
+		}
+	}
+
+	/**
+	 * Denied the existing update buttons.
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#updateToolItems()
+	 */
+	@Override
+	protected void updateToolItems() {
+		// Do nothing
+	}
+
+	/**
+	 * This allows to update the toolbar actions status depending to the selection.
+	 * 
+	 * @param event
+	 *            The event of the selection change.
+	 */
+	protected void updateToolBarForSelection(final SelectionChangedEvent event) {
+
+		PapyrusMergeViewerItem selectedPapyrusMergeViewerItem = null;
+		final ISelection selection = null != event ? event.getSelection() : null;
+		if (selection instanceof StructuredSelection) {
+			final Object firstSelected = ((StructuredSelection) selection).getFirstElement();
+			if (firstSelected instanceof PapyrusMergeViewerItem && null != ((PapyrusMergeViewerItem) firstSelected).getDiff()) {
+				selectedPapyrusMergeViewerItem = (PapyrusMergeViewerItem) firstSelected;
+			}
+		}
+
+		// Manage correctly the action and the reject action
+		if (null != acceptAction) {
+			if (null != event && null != selectedPapyrusMergeViewerItem) {
+				((MergeAction) acceptAction.getAction()).selectionChanged(event);
+			} else {
+				((MergeAction) acceptAction.getAction()).selectionChanged(StructuredSelection.EMPTY);
+			}
+		}
+		if (null != rejectAction) {
+			if (null != event && null != selectedPapyrusMergeViewerItem) {
+				((MergeAction) rejectAction.getAction()).selectionChanged(event);
+			} else {
+				((MergeAction) rejectAction.getAction()).selectionChanged(StructuredSelection.EMPTY);
+			}
+		}
+
+		// We need to manage the next and previous action
+		if (null != nextAction || null != previousAction) {
+			boolean enableNext = false;
+			boolean enablePrevious = false;
+			if (null != papyrusMergeViewerItems && !papyrusMergeViewerItems.isEmpty() && null != selectedPapyrusMergeViewerItem) {
+				final int diffIndex = getDiffIndex(selectedPapyrusMergeViewerItem.getDiff());
+				enableNext = diffIndex > -1 && diffIndex < (papyrusMergeViewerItems.size() - 1);
+				enablePrevious = diffIndex > 0;
+			}
+			if (null != nextAction) {
+				nextAction.getAction().setEnabled(enableNext);
+			}
+			if (null != nextAction) {
+				previousAction.getAction().setEnabled(enablePrevious);
+			}
+		}
+
+		setCurrentDiff(selectedPapyrusMergeViewerItem);
+	}
+
+	/**
+	 * Sets the selection according to the accessor.
+	 * 
+	 * @param accessor
+	 *            The {@link ICompareAccessor} which contains the root tree elements and the initial selection.
+	 */
+	private void setSelection(final ICompareAccessor accessor) {
+		// First try to set the initial item directly
+		final IMergeViewerItem initialItem = accessor.getInitialItem();
+		final TreeMergeViewer viewer = getMergeViewer(initialItem.getSide());
+		viewer.setSelection(new StructuredSelection(initialItem), true);
+
+		// if that didn't work (empty selection), use cache to find correct merge viewer item
+		if (viewer.getSelection().isEmpty()) {
+			final IMergeViewerItem itemToBeSelected = getItemToBeSelected(initialItem, viewer);
+			if (itemToBeSelected != null) {
+				viewer.setSelection(new StructuredSelection(itemToBeSelected), true);
+			} else {
+				viewer.setSelection(new StructuredSelection(), true);
+			}
+		}
+	}
+
+	/**
+	 * Determines the item to select from the corresponding side viewer, given an input item.
+	 * 
+	 * @param item
+	 *            The input item.
+	 * @param viewer
+	 *            The viewer in which to select the item.
+	 * @return The item to be selected.
+	 */
+	private IMergeViewerItem getItemToBeSelected(final IMergeViewerItem item, final TreeMergeViewer viewer) {
+		return getItemToBeSelected(item.getSideValue(viewer.getSide()), viewer);
+	}
+
+	/**
+	 * Determines the item to select from the corresponding side viewer, given an input item.
+	 * 
+	 * @param itemValue
+	 *            The input item value.
+	 * @param viewer
+	 *            The viewer in which to select the item.
+	 * @return The item to be selected.
+	 */
+	private IMergeViewerItem getItemToBeSelected(final Object itemValue, final TreeMergeViewer viewer) {
+		final MergeViewerSide side = viewer.getSide();
+		IMergeViewerItem result;
+		if (cachedMapForSelection == null) {
+			cachedMapForSelection = Maps.newHashMap();
+			result = null;
+		} else {
+			result = cachedMapForSelection.get(itemValue);
+		}
+
+		if (result == null && itemValue != null) {
+			LinkedList<AbstractContentFunction> contentComputations;
+
+			switch (side) {
+			case LEFT:
+				if (leftContentComputations == null) {
+					leftContentComputations = Lists.newLinkedList();
+					leftContentComputations.add(new ElementFunction(side, viewer, leftContentComputations, cachedMapForSelection));
+				}
+				contentComputations = leftContentComputations;
+				break;
+
+			case RIGHT:
+				if (rightContentComputations == null) {
+					rightContentComputations = Lists.newLinkedList();
+					rightContentComputations.add(new ElementFunction(side, viewer, rightContentComputations, cachedMapForSelection));
+				}
+				contentComputations = rightContentComputations;
+				break;
+
+			default:
+				throw new IllegalArgumentException();
+			}
+
+			final Collection<Object> containers = getContainers(itemValue);
+			if (!containers.isEmpty()) {
+				// move necessary computations to the front
+				final List<AbstractContentFunction> containerComputations = extractComputations(contentComputations, containers);
+				contentComputations.addAll(0, containerComputations);
+			}
+
+			result = computeItemToBeSelected(itemValue, containers, contentComputations);
+		}
+
+		return result;
+	}
+
+	/**
+	 * Computes the item to be selected for the given item value, taking into account the containers, using
+	 * the content computations.
+	 * 
+	 * @param itemValue
+	 *            The item for which to base the selection.
+	 * @param containers
+	 *            The containers for that item.
+	 * @param contentComputations
+	 *            The computations for computing content.
+	 * @return the item to be selected.
+	 */
+	private IMergeViewerItem computeItemToBeSelected(final Object itemValue, final Collection<Object> containers, final LinkedList<AbstractContentFunction> contentComputations) {
+		// We try to limit the amount of time we spend looking for selection.
+		// Sometimes the object will not be present in the tree at all, causing the whole tree to be visited.
+		// So we keep track of which of the contains have not been visited, removing any containers for which there is already a selection computed.
+		IMergeViewerItem result = null;
+		final Collection<Object> unvistedContainers = Sets.newHashSet(containers);
+		unvistedContainers.removeAll(cachedMapForSelection.keySet());
+		long start = System.currentTimeMillis();
+		while (!contentComputations.isEmpty()) {
+			AbstractContentFunction contentFunction = contentComputations.removeFirst();
+
+			// If we've visited all the containers and have been computing for more the 2 seconds, stop looking and select the container instead.
+			unvistedContainers.remove(contentFunction.getValue());
+			if (unvistedContainers.isEmpty() && (System.currentTimeMillis() - start) > 2 * 1000) {
+				break;
+			}
+
+			result = contentFunction.apply(itemValue, containers);
+			if (result != null) {
+				break;
+			}
+		}
+
+		// If we haven't found the selection, try to find a selection for the nearest container.
+		if (result == null) {
+			for (final Object container : containers) {
+				result = cachedMapForSelection.get(container);
+				if (result != null) {
+					break;
+				}
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * This allows to select a difference (if the diff is <code>null</code>, select the first difference).
+	 * 
+	 * @param diff
+	 *            The papyrus viewer item representing the difference.
+	 * @param isNext
+	 *            <code>true</code> if we find the next difference, <code>false</code> otherwise.
+	 */
+	protected void selectNextOrPreviousDiff(final PapyrusMergeViewerItem diff, final boolean isNext) {
+		int index = -1;
+		if (null != papyrusMergeViewerItems && !papyrusMergeViewerItems.isEmpty()) {
+			index = 0;
+			if (null != diff) {
+				final int diffIndex = getDiffIndex(diff.getDiff());
+				if (null != diff && diffIndex > -1 && ((isNext && diffIndex < papyrusMergeViewerItems.size() - 1) || (!isNext && diffIndex > 1))) {
+					final int nextIndex = isNext ? 1 : -1;
+					index = diffIndex + nextIndex;
+				}
+			}
+		}
+
+		selectDiffByIndex(index);
+	}
+
+	/**
+	 * This allows to select a difference from its index.
+	 * 
+	 * @param index
+	 *            The index to select.
+	 */
+	protected void selectDiffByIndex(final int index) {
+		final PapyrusMergeViewerItem selectedDiff = -1 != index && index < papyrusMergeViewerItems.size() ? papyrusMergeViewerItems.get(index) : null;
+
+		// Select the diff
+		selectDiff(selectedDiff);
+	}
+
+	/**
+	 * This allows to select the diff.
+	 * 
+	 * @param diff
+	 *            The diff to select.
+	 */
+	protected void selectDiff(final PapyrusMergeViewerItem diff) {
+		setCurrentDiff(diff);
+		if (null != diff) {
+
+			final Object leftValue = diff.getSideValue(MergeViewerSide.LEFT);
+			if (null != leftValue) {
+				expandUntilItem(diff, leftValue, getRightMergeViewer());
+				getLeftMergeViewer().setSelection(new StructuredSelection(diff), true);
+			} else {
+				final Object rightValue = diff.getSideValue(MergeViewerSide.RIGHT);
+				expandUntilItem(diff, rightValue, getLeftMergeViewer());
+				getRightMergeViewer().setSelection(new StructuredSelection(diff), true);
+			}
+		}
+	}
+
+	/**
+	 * Expand the tree until the item is displayed.
+	 * 
+	 * @param item
+	 *            The item to display.
+	 * @param itemValue
+	 *            The item corresponding value.
+	 * @param viewer
+	 *            The viewer.
+	 */
+	protected void expandUntilItem(final IMergeViewerItem item, final Object itemValue, final TreeMergeViewer viewer) {
+		final Collection<Object> containers = getContainers(itemValue);
+		containers.forEach(container -> {
+			if (null != cachedMapForSelection && cachedMapForSelection.containsKey(container)) {
+				viewer.setExpandedState(cachedMapForSelection.get(container), true);
+			} else {
+				expandUntilItem(getItemToBeSelected(container, viewer), container, viewer);
+			}
+		});
+	}
+
+	/**
+	 * This allows to set the current difference.
+	 * 
+	 * @param diff
+	 *            The papyrus viewer item representing the difference.
+	 */
+	private void setCurrentDiff(final PapyrusMergeViewerItem diff) {
+		currentDiff = diff;
+	}
+
+	/**
+	 * Extracts all content functions for the given objects from the computation list.
+	 * 
+	 * @param computations
+	 *            The computation list from which functions are extracted.
+	 * @param values
+	 *            The values specifying which functions should be extracted.
+	 * @return Non-null list of computations covering the given objects.
+	 */
+	private List<AbstractContentFunction> extractComputations(final LinkedList<AbstractContentFunction> computations, final Collection<Object> values) {
+		final List<AbstractContentFunction> extractedComputations = new ArrayList<>();
+		final Iterator<AbstractContentFunction> computationsIterator = computations.iterator();
+		while (computationsIterator.hasNext()) {
+			final AbstractContentFunction contentFuction = computationsIterator.next();
+			if (values.contains(contentFuction.getValue())) {
+				computationsIterator.remove();
+				extractedComputations.add(contentFuction);
+			}
+		}
+		return extractedComputations;
+	}
+
+	/**
+	 * Returns all EObject containers for the given value, if the given object is an EObject.
+	 * 
+	 * @param eObject
+	 *            The eObject value.
+	 * @return Non-null collection of containers.
+	 */
+	private Collection<Object> getContainers(final Object eObject) {
+		Collection<Object> containers;
+		if (eObject instanceof EObject) {
+			containers = Sets.newLinkedHashSet();
+			for (EObject container = ((EObject) eObject).eContainer(); container != null; container = container.eContainer()) {
+				containers.add(container);
+			}
+		} else {
+			containers = Collections.emptySet();
+		}
+		return containers;
+	}
+
+	/**
+	 * Remove the existing buttons and add the needed ones. {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.EMFCompareContentMergeViewer#createToolItems(org.eclipse.jface.action.ToolBarManager)
+	 */
+	@Override
+	protected void createToolItems(final ToolBarManager tbm) {
+		if (tbm != null) {
+			tbm.removeAll();
+
+			tbm.add(new Separator(PAPYRUS_CATEGORY));
+
+			// Create accept and reject bouton only if the left is editable
+			if (isLeftEditable()) {
+				// Create the accept and reject actions
+				final EMFCompareConfiguration compareConfiguration = getCompareConfiguration();
+				final boolean isLeftAndRightEditable = compareConfiguration.isLeftEditable() && compareConfiguration.isRightEditable();
+				acceptAction = new ActionContributionItem(createMergeAction(isLeftAndRightEditable ? MergeMode.LEFT_TO_RIGHT : MergeMode.ACCEPT, compareConfiguration, null));
+				tbm.appendToGroup(PAPYRUS_CATEGORY, acceptAction);
+				initGraphicalAction(acceptAction.getAction(), getResourceBundle(), "Accept", "Accept", "This allows to accept a modification"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+				rejectAction = new ActionContributionItem(createMergeAction(isLeftAndRightEditable ? MergeMode.RIGHT_TO_LEFT : MergeMode.REJECT, compareConfiguration, null));
+				tbm.appendToGroup(PAPYRUS_CATEGORY, rejectAction);
+				initGraphicalAction(rejectAction.getAction(), getResourceBundle(), "Reject", "Reject", "This allows to reject a modification"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+
+			// Manage correctly the previous and next actions
+			previousAction = new ActionContributionItem(new Action() {
+				@Override
+				public void run() {
+					selectNextOrPreviousDiff(currentDiff, false);
+				}
+			});
+			tbm.appendToGroup(PAPYRUS_CATEGORY, previousAction);
+			initGraphicalAction(previousAction.getAction(), getResourceBundle(), "Previous", "Previous", "This allows to go to previous modification"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			getHandlerService().registerAction(previousAction.getAction(), "org.eclipse.papyrus.gitlight.compare.ui.previous"); //$NON-NLS-1$
+
+			nextAction = new ActionContributionItem(new Action() {
+				@Override
+				public void run() {
+					selectNextOrPreviousDiff(currentDiff, true);
+				}
+			});
+			tbm.appendToGroup(PAPYRUS_CATEGORY, nextAction);
+			initGraphicalAction(nextAction.getAction(), getResourceBundle(), "Next", "Next", "This allows to go to next modification"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			getHandlerService().registerAction(nextAction.getAction(), "org.eclipse.papyrus.gitlight.compare.ui.next"); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * This allows to get the root merge viewer item.
+	 * 
+	 * @param item
+	 *            The initial item.
+	 * @param side
+	 *            The side of the tree viewer.
+	 * @return The parent item or itself if parent is <code>null</code>.
+	 */
+	protected Object getRootItem(final IMergeViewerItem item, final MergeViewerSide side) {
+		if (null != item) {
+			if (null != item.getParent()) {
+				return getRootItem(item.getParent(), side);
+			} else {
+				return item;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to get the papyrus merge viewer items where the diff is not <code>null</code>.
+	 * 
+	 * @param root
+	 *            The root item.
+	 * @param contentProvider
+	 *            The content provider.
+	 * @return The list of differences.
+	 */
+	protected List<PapyrusMergeViewerItem> getDiffPapyrusMergeViewerItems(final Object root, final ITreeContentProvider contentProvider) {
+		List<PapyrusMergeViewerItem> diffs = null;
+
+		final List<Object> children = Arrays.asList(contentProvider.getChildren(root));
+		if (null != children && !children.isEmpty()) {
+
+			diffs = children.stream().filter(element -> element instanceof PapyrusMergeViewerItem).map(element -> (PapyrusMergeViewerItem) element).collect(Collectors.toList());
+			List<PapyrusMergeViewerItem> subDiffs = new ArrayList<PapyrusMergeViewerItem>();
+
+			// Iterate on the list
+			final Iterator<PapyrusMergeViewerItem> itemsIterator = diffs.iterator();
+			while (itemsIterator.hasNext()) {
+				final PapyrusMergeViewerItem item = itemsIterator.next();
+
+				// If the current item has no diff, remove from the needed list
+				if (null == item.getDiff()) {
+					itemsIterator.remove();
+				}
+
+				// Manage the depth through
+				List<PapyrusMergeViewerItem> subDiffsForItem = getDiffPapyrusMergeViewerItems(item, contentProvider);
+				if (null != subDiffsForItem && !subDiffsForItem.isEmpty()) {
+					subDiffs.addAll(subDiffsForItem);
+				}
+			}
+
+			diffs.addAll(subDiffs);
+		}
+
+		return diffs;
+	}
+
+	/**
+	 * Allows to save the resource.
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.EMFCompareContentMergeViewer#doSave(java.lang.Object, java.lang.Object)
+	 */
+	@Override
+	protected boolean doSave(final Object newInput, final Object oldInput) {
+		if (isLeftEditable() && isLeftDirty()) {
+			final MessageDialog dialog = new MessageDialog(getControl().getShell(),
+					Utilities.getString(getResourceBundle(), "saveDialog.title"), //$NON-NLS-1$
+					null, // accept the default window icon
+					Utilities.getString(getResourceBundle(), "saveDialog.message"), //$NON-NLS-1$
+					MessageDialog.QUESTION,
+					new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
+					0); // default button index
+
+			switch (dialog.open()) { // open returns index of pressed button
+			case 0:
+				flushContent(oldInput, null);
+				break;
+			case 1:
+				setLeftDirty(false);
+				setRightDirty(false);
+				break;
+			case 2:
+				throw new ViewerSwitchingCancelled();
+			}
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	public void commandStackChanged(EventObject event) {
+		boolean leftDirty = isLeftDirty();
+		super.commandStackChanged(event);
+		setLeftDirty(leftDirty);
+	}
+
+	@Override
+	protected void editingDomainChange(ICompareEditingDomain oldValue, ICompareEditingDomain newValue) {
+		boolean leftDirty = isLeftDirty();
+		super.editingDomainChange(oldValue, newValue);
+		setLeftDirty(leftDirty);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.TreeContentMergeViewer#handleDispose(org.eclipse.swt.events.DisposeEvent)
+	 */
+	@Override
+	protected void handleDispose(final DisposeEvent event) {
+		if (cachedMapForSelection != null) {
+			cachedMapForSelection = null;
+		}
+		if (null != papyrusMergeViewerItems) {
+			papyrusMergeViewerItems = null;
+		}
+		if (null != currentDiff) {
+			currentDiff = null;
+		}
+
+		super.handleDispose(event);
+	}
+
+	/**
+	 * A function for computing the items in the content tree induced by an item provider. Instances are managed in a {@link #contentComputations} queue and are processed to update the {@linked #selections selections} cache.
+	 * 
+	 * @see PapyrusTreeContentMergeViewer#getItemToBeSelected(IMergeViewerItem)
+	 */
+	private abstract static class AbstractContentFunction {
+
+		/**
+		 * The side for which the computation is being done.
+		 */
+		protected final MergeViewerSide side;
+
+		/**
+		 * The tree content provider which induces the content tree.
+		 */
+		protected final ITreeContentProvider provider;
+
+		/**
+		 * The queue of computations being managed.
+		 * 
+		 * @see PapyrusTreeContentMergeViewer#leftContentComputations
+		 * @see PapyrusTreeContentMergeViewer#rightContentComputations
+		 */
+		protected final LinkedList<AbstractContentFunction> contentComputations;
+
+		/**
+		 * The selections being cached.
+		 * 
+		 * @see PapyrusTreeContentMergeViewer#cachedMapForSelection.
+		 */
+		protected final Map<Object, IMergeViewerItem> selections;
+
+		/**
+		 * Creates and instance for a given side that induces content based on the given providers and manages the queue of content computations, updating the selections.
+		 * 
+		 * @param side
+		 *            The side for which the content is being computed.
+		 * @param provider
+		 *            The provider used to induce content.
+		 * @param contentComputations
+		 *            The queue of computations being managed.
+		 * @param selections
+		 *            The selection cache being managed.
+		 */
+		protected AbstractContentFunction(final MergeViewerSide side, final ITreeContentProvider provider, final LinkedList<AbstractContentFunction> contentComputations, final Map<Object, IMergeViewerItem> selections) {
+			this.side = side;
+			this.provider = provider;
+			this.contentComputations = contentComputations;
+			this.selections = selections;
+		}
+
+		/**
+		 * Computes new content and if any of the new content item matches the given value, returns the corresponding item from the side viewer. The {@link #contentComputations queue} is updated with functions for the new content items. Any new item with a
+		 * value that matches one of the containers is placed at the front of the queue, rather than the back.
+		 * 
+		 * @param matchValue
+		 *            The value to match.
+		 * @param containers
+		 *            The items that are of high priority to process first.
+		 * @return The corresponding side viewer item for the match value, or null.
+		 */
+		public abstract IMergeViewerItem apply(final Object matchValue, final Collection<?> containers);
+
+		/**
+		 * Returns the value for which content will be computed.
+		 * 
+		 * @return the value for which content will be computed.
+		 */
+		public abstract Object getValue();
+
+		/**
+		 * A base helper method that does the computation needed by {@link #apply(Object, Collection)}.
+		 * 
+		 * @param matchValue
+		 *            The value to be matched.
+		 * @param containers
+		 *            The items that are of high priority to process first.
+		 * @param values
+		 *            The new content items to be processed.
+		 * @param depth
+		 *            The current tree depth of the traversal.
+		 * @return the corresponding side viewer item for the match value, or null.
+		 */
+		protected IMergeViewerItem apply(final Object matchValue, final Collection<?> containers, final Object[] values, final int depth) {
+			IMergeViewerItem result = null;
+			for (final Object element : values) {
+				if (element instanceof IMergeViewerItem) {
+					final IMergeViewerItem item = (IMergeViewerItem) element;
+					final Object sideValue = item.getSideValue(side);
+
+					// If we don't yet have a result, and the new value is equal to the matching value, then cache it as the result.
+					if (result == null) {
+						if (sideValue != null && sideValue.equals(matchValue)) {
+							result = item;
+						}
+					}
+
+					// Create a new child function for the given item and add it to the front or the back of the queue depending on whether the high priority containers include the item's side value. So in general the content is build breadth first, but the
+					// subtree of the containers is processed depth first.
+					final ChildFunction childFunction = new ChildFunction(side, provider, item, depth, contentComputations, selections);
+					if (containers.contains(sideValue)) {
+						contentComputations.addFirst(childFunction);
+					} else {
+						contentComputations.addLast(childFunction);
+
+					}
+				}
+			}
+			return result;
+		}
+	}
+
+	/**
+	 * A content function that computes the root elements of a side viewer.
+	 */
+	private static final class ElementFunction extends AbstractContentFunction {
+
+		/**
+		 * The input object of the side viewer.
+		 */
+		private final Object input;
+
+		/**
+		 * Creates and instance for a given side viewer that induces content based on the viewer's provider and manages the queue of content computations, updating the selections.
+		 * 
+		 * @param side
+		 *            The side for which the content is being computed.
+		 * @param viewer
+		 *            The side viewer for which to induce content.
+		 * @param contentComputations
+		 *            The queue of computations being managed.
+		 * @param selections
+		 *            The selection cache being managed.
+		 */
+		private ElementFunction(final MergeViewerSide side, final TreeMergeViewer viewer, final LinkedList<AbstractContentFunction> contentComputations, final Map<Object, IMergeViewerItem> selections) {
+			super(side, (ITreeContentProvider) viewer.getContentProvider(), contentComputations, selections);
+			this.input = viewer.getInput();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.PapyrusTreeContentMergeViewer.AbstractContentFunction#getValue()
+		 */
+		@Override
+		public Object getValue() {
+			return input;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.PapyrusTreeContentMergeViewer.AbstractContentFunction#apply(java.lang.Object, java.util.Collection)
+		 */
+		@Override
+		public IMergeViewerItem apply(final Object matchValue, final Collection<?> containers) {
+			return apply(matchValue, containers, provider.getElements(input), 0);
+		}
+	}
+
+	/**
+	 * A content function that computes the child elements of a side viewer.
+	 */
+	private static final class ChildFunction extends AbstractContentFunction {
+
+		/**
+		 * The item for which to induce child content.
+		 */
+		private final IMergeViewerItem item;
+
+		/**
+		 * The depth of the item.
+		 */
+		private final int depth;
+
+		/**
+		 * Creates and instance for a given side viewer's content provider that induces for the given item and the given depth and manages the queue of content computations, updating the selections.
+		 * 
+		 * @param side
+		 *            The side for which the content is being computed.
+		 * @param provider
+		 *            The content provider of the side viewer.
+		 * @param item
+		 *            The item for which to induce child content.
+		 * @param depth
+		 *            The depth of the item.
+		 * @param contentComputations
+		 *            The queue of computations being managed.
+		 * @param selections
+		 *            The selection cache being managed.
+		 */
+		private ChildFunction(final MergeViewerSide side, final ITreeContentProvider provider, final IMergeViewerItem item, final int depth, final LinkedList<AbstractContentFunction> contentComputations, final Map<Object, IMergeViewerItem> selections) {
+			super(side, provider, contentComputations, selections);
+			this.item = item;
+			this.depth = depth;
+
+			final Object value = item.getSideValue(side);
+			if (value != null) {
+				selections.put(value, item);
+			}
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.PapyrusTreeContentMergeViewer.AbstractContentFunction#getValue()
+		 */
+		@Override
+		public Object getValue() {
+			return item.getSideValue(side);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.PapyrusTreeContentMergeViewer.AbstractContentFunction#apply(java.lang.Object, java.util.Collection)
+		 */
+		@Override
+		public IMergeViewerItem apply(final Object matchValue, final Collection<?> containers) {
+			return depth == MAX_SEARCH_LEVEL ? null : apply(matchValue, containers, provider.getChildren(item), depth + 1);
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewerCreator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewerCreator.java
new file mode 100644
index 0000000..0ffc7ee
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/PapyrusTreeContentMergeViewerCreator.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
+import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeNodeCompareInput;
+import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeNodeCompareInputLabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Creator for {@link PapyrusTreeContentMergeViewer}.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusTreeContentMergeViewerCreator implements IViewerCreator {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Viewer createViewer(Composite parent, CompareConfiguration config) {
+		final EMFCompareConfiguration emfConfig = new EMFCompareConfiguration(config);
+		emfConfig.setLabelProvider(TreeNodeCompareInput.class, new TreeNodeCompareInputLabelProvider());
+		final Viewer viewer = new PapyrusTreeContentMergeViewer(SWT.NONE,
+				ResourceBundle.getBundle(PapyrusTreeContentMergeViewer.class.getName()), parent, emfConfig);
+		return viewer;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/FacetUtil.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/FacetUtil.java
new file mode 100644
index 0000000..50ba74f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/FacetUtil.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet;
+
+import com.google.common.base.Function;
+
+import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement;
+
+/**
+ * Util class for handling Papyrus Facet.
+ */
+public final class FacetUtil {
+
+	/**
+	 * Un-Wraps the Objects returned by the Papyrus Facet mechanism.
+	 */
+	public static final Function<Object, Object> UN_WRAP = new Function<Object, Object>() {
+		public Object apply(Object input) {
+			if (EObjectTreeElement.class.isInstance(input)) {
+				return EObjectTreeElement.class.cast(input).getEObject();
+			}
+			return input;
+		}
+
+	};
+
+	/**
+	 * Private Constructor for Util classes.
+	 */
+	private FacetUtil() {
+
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapper.java
new file mode 100644
index 0000000..7e300e2
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapper.java
@@ -0,0 +1,245 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet;
+
+import static com.google.common.base.Predicates.instanceOf;
+import static com.google.common.base.Predicates.not;
+import static com.google.common.collect.Collections2.filter;
+import static org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet.FacetUtil.UN_WRAP;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.papyrus.uml.tools.providers.SemanticUMLContentProvider;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.resource.UMLResource;
+
+/**
+ * Wraps the Papyrus Facet content provider in an EMF {@link ItemProviderAdapter}.
+ */
+public class PapyrusFacetContentProviderWrapper extends ItemProviderAdapter implements ITreeItemContentProvider {
+
+	/**
+	 * The Papyrus Facet Content Provider.
+	 */
+	private SemanticUMLContentProvider facetContentProvider;
+
+	/**
+	 * The ResourceSet.
+	 */
+	private ResourceSet resourceSet;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param adapterFactory
+	 *            the {@link AdapterFactory}.
+	 * @param resourceSet
+	 *            the {@ResourceSet} for Papyrus Facet.
+	 */
+	public PapyrusFacetContentProviderWrapper(AdapterFactory adapterFactory, ResourceSet resourceSet) {
+		this(adapterFactory, resourceSet, new SemanticUMLContentProvider(resourceSet));
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param adapterFactory
+	 *            the {@link AdapterFactory}.
+	 * @param facetContentProvider
+	 *            the content provider to which to delegate.
+	 * @param resourceSet
+	 *            the {@ResourceSet} for Papyrus Facet.
+	 */
+	public PapyrusFacetContentProviderWrapper(AdapterFactory adapterFactory, ResourceSet resourceSet,
+			SemanticUMLContentProvider facetContentProvider) {
+		super(adapterFactory);
+		this.facetContentProvider = facetContentProvider;
+		this.resourceSet = resourceSet;
+	}
+
+	@Override
+	public Collection<?> getElements(Object object) {
+		// The SemanticUMLContentProvider has problems determining the root elements. Papyrus usually
+		// uses its own ResourceSet implementation and uses its UMLModel to determine the root elements. In
+		// other types of ResourceSets it tries to determine them manually. This fails here since the URIs of
+		// our UML model can for example contain git fragments. This implementation is similar to the one if
+		// the SemanticUMLContentProvider but fixed for our use cases.
+		EObject rootElement = getRootElement();
+
+		List<EObject> rootElements = new LinkedList<EObject>();
+		for (Resource resource : resourceSet.getResources()) {
+			if (MySemanticUMLContentProvider.isUMLModel(resource, rootElement)) {
+				for (EObject rootEObject : resource.getContents()) {
+					if (Element.class.isInstance(rootEObject)) {
+						rootElements.add(rootEObject);
+					}
+				}
+			}
+		}
+		return rootElements;
+	}
+
+	/**
+	 * Same behavior as in "getRoots" of the SemanticUMLContentProvider but fixed for our use cases.
+	 * 
+	 * @return the determined root element.
+	 */
+	private EObject getRootElement() {
+		EObject rootElement = null;
+		EObject rootProfile = null;
+		for (Resource resource : resourceSet.getResources()) {
+			if (MySemanticUMLContentProvider.isUMLResource(resource) && !resource.getContents().isEmpty()) {
+				EObject resourceElement = resource.getContents().get(0);
+				if (Profile.class.isInstance(resourceElement)) {
+					if (rootProfile == null) {
+						rootProfile = resourceElement;
+					}
+				} else if (Element.class.isInstance(resourceElement)) {
+					if (rootElement == null) {
+						rootElement = resourceElement;
+					}
+				}
+			}
+		}
+		if (rootElement != null) {
+			return rootElement;
+		}
+		return rootProfile;
+	}
+
+	@Override
+	public Collection<?> getChildren(Object object) {
+		// we need to remove duplicates since the facet mechanism sometimes introduces them
+		// additionally we also need to remove diagram elements
+		return filter(removeDuplicates(unwrapFacet(facetContentProvider.getChildren(object))),
+				not(instanceOf(Diagram.class)));
+	}
+
+	@Override
+	public boolean hasChildren(Object object) {
+		return facetContentProvider.hasChildren(object);
+	}
+
+	@Override
+	public Object getParent(Object object) {
+		return UN_WRAP.apply(facetContentProvider.getParent(object));
+	}
+
+	/**
+	 * Removed duplicates from the given objects.
+	 * 
+	 * @param objects
+	 *            the objects.
+	 * @return the objects in same order but with duplicates removed.
+	 */
+	private List<Object> removeDuplicates(Iterable<Object> objects) {
+		return ImmutableSet.copyOf(objects).asList();
+	}
+
+	/**
+	 * The Papyrus ModelExplorer tree consists of special Papyrus objects. To use them in EMFCompare they have
+	 * to be unwrapped.
+	 * 
+	 * @param elements
+	 *            The elements to unwrap
+	 * @return The collection of unwrapped objects.
+	 */
+	private List<Object> unwrapFacet(Object[] elements) {
+		return Lists.newArrayList(Iterables.transform(Arrays.asList(elements), UN_WRAP));
+	}
+
+	@Override
+	public void dispose() {
+		facetContentProvider.dispose();
+		super.dispose();
+	}
+
+	/**
+	 * Subclassed to gain access to protected static method.
+	 */
+	private static class MySemanticUMLContentProvider extends SemanticUMLContentProvider {
+		/**
+		 * Copied from SemanticUMLContentProvider but calling our implementation of isUMLResource.
+		 * 
+		 * @param resource
+		 *            the {@link Resource}.
+		 * @param rootElement
+		 *            the {@link EObject}.
+		 * @return whether the given resource is an UMLModel resource.
+		 */
+		public static boolean isUMLModel(Resource resource, EObject rootElement) {
+			if (!isUMLResource(resource)) {
+				return false;
+			}
+
+			for (URI uri : excludedModels) {
+				if (uri.equals(resource.getURI())) {
+					return false;
+				}
+			}
+
+			for (EObject rootObject : resource.getContents()) {
+				if (rootObject.eIsProxy()) {
+					continue;
+				}
+
+				if (rootObject.eContainer() != null
+						|| rootObject instanceof Profile && !(rootElement instanceof Profile)) {
+					return false;
+				}
+			}
+
+			return true;
+		}
+
+		/**
+		 * Copied from SemanticUMLContentProvider and fixed for our use cases.
+		 * 
+		 * @param resource
+		 *            the {@link Resource}.
+		 * @return whether the given resource is an {@link UMLResource}.
+		 */
+		public static boolean isUMLResource(Resource resource) {
+			if (resource == null) {
+				return false;
+			}
+
+			if (resource instanceof UMLResource) {
+				return true;
+			}
+
+			URI uri = resource.getURI();
+			// check beginning of file extension instead of equals
+			return uri != null && uri.fileExtension().startsWith(UMLResource.FILE_EXTENSION);
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapperAdapterFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapperAdapterFactory.java
new file mode 100644
index 0000000..06403ee
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/facet/PapyrusFacetContentProviderWrapperAdapterFactory.java
@@ -0,0 +1,113 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.edit.provider.Disposable;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.papyrus.uml.tools.providers.SemanticUMLContentProvider;
+import org.eclipse.uml2.uml.edit.providers.UMLItemProviderAdapterFactory;
+
+/**
+ * Couples the Papyrus Facet mechanism with the AdapterFactory approach of EMFCompare.
+ */
+public class PapyrusFacetContentProviderWrapperAdapterFactory extends UMLItemProviderAdapterFactory {
+
+	/**
+	 * Collects and disposes associated adapters.
+	 */
+	private Disposable disposable = new Disposable();
+
+	/**
+	 * Associates resource sets with their semantic content providers.
+	 */
+	private final Map<ResourceSet, SemanticUMLContentProvider> semanticUMLContentProviders = new HashMap<>();
+
+	/**
+	 * Constructor.
+	 */
+	public PapyrusFacetContentProviderWrapperAdapterFactory() {
+		super();
+		// Only support content types
+		supportedTypes.clear();
+		supportedTypes.add(ITreeItemContentProvider.class);
+		supportedTypes.add(IStructuredItemContentProvider.class);
+	}
+
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		ResourceSet resourceSet = getResourceSet(target);
+		if (resourceSet != null) {
+			SemanticUMLContentProvider semanticUMLContentProvider = semanticUMLContentProviders
+					.get(resourceSet);
+			if (semanticUMLContentProvider == null) {
+				semanticUMLContentProvider = new SemanticUMLContentProvider(resourceSet);
+				semanticUMLContentProviders.put(resourceSet, semanticUMLContentProvider);
+			}
+			return new PapyrusFacetContentProviderWrapper(this, resourceSet, semanticUMLContentProvider);
+		}
+		return super.createAdapter(target);
+	}
+
+	/**
+	 * Determines the {@link ResourceSet} of the given {@code target}.
+	 * 
+	 * @param target
+	 *            The {@Notifier} for which a {@link ResourceSet} is to be determined.
+	 * @return The {@link ResourceSet} for the given {@code target} if there is one, {@code null} otherwise.
+	 */
+	private ResourceSet getResourceSet(Notifier target) {
+		if (target instanceof EObject) {
+			EObject object = (EObject)target;
+			Resource resource = object.eResource();
+			if (resource != null) {
+				return resource.getResourceSet();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see NotationItemProviderAdapterFactory#dispose()
+	 */
+	@Override
+	public void dispose() {
+		disposable.dispose();
+		super.dispose();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see NotationItemProviderAdapterFactory#associate(Adapter adapter, Notifier target)
+	 */
+	@Override
+	protected void associate(Adapter adapter, Notifier target) {
+		super.associate(adapter, target);
+		if (adapter != null) {
+			disposable.add(adapter);
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusCompareAccessorMergeViewerItemProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusCompareAccessorMergeViewerItemProvider.java
new file mode 100644
index 0000000..d0e75cd
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusCompareAccessorMergeViewerItemProvider.java
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
+
+import static com.google.common.collect.Iterables.filter;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.MatchResource;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.provider.CompareAccessorMergeViewerItemProvider;
+import org.eclipse.emf.compare.match.impl.NotLoadedFragmentMatch;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.ICompareAccessor;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProviderConfiguration;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet.FacetUtil;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet.PapyrusFacetContentProviderWrapper;
+
+/**
+ * Responsible for filtering unwanted root elements.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusCompareAccessorMergeViewerItemProvider extends CompareAccessorMergeViewerItemProvider {
+
+	@Override
+	public List<Object> getMergeViewerItems(Object object,
+			final IMergeViewerItemProviderConfiguration configuration) {
+		if (!ICompareAccessor.class.isInstance(object)) {
+			return super.getMergeViewerItems(object, configuration);
+		}
+
+		final List<Object> papyrusRootElements = getModelExplorerRootElements(configuration);
+		final List<Object> mergeViewerItems = super.getMergeViewerItems(object, configuration);
+
+		Iterable<Object> filtered = filter(mergeViewerItems, new Predicate<Object>() {
+			public boolean apply(Object input) {
+				if (IMergeViewerItem.class.isInstance(input)) {
+					final IMergeViewerItem item = IMergeViewerItem.class.cast(input);
+					Object sideValue = item.getSideValue(configuration.getSide());
+					if (NotLoadedFragmentMatch.class.isInstance(sideValue)) {
+						// extract value
+						Match matchChild = NotLoadedFragmentMatch.class.cast(sideValue).getFirstMatchChild();
+						sideValue = getSide(matchChild, configuration.getSide());
+					}
+					return papyrusRootElements.contains(sideValue);
+				}
+				return false;
+			}
+		});
+		return Lists.newArrayList(filtered);
+	}
+
+	/**
+	 * Uses the Papyrus Facet mechanism to determine the root elements in the ModelExplorer.
+	 * 
+	 * @param configuration
+	 *            the {@link IMergeViewerItemProviderConfiguration}.
+	 * @return the root elements as displayed in the ModelExplorer.
+	 */
+	private List<Object> getModelExplorerRootElements(IMergeViewerItemProviderConfiguration configuration) {
+		final ResourceSet resourceSet = getResourceSet(configuration.getComparison(),
+				configuration.getSide());
+		PapyrusFacetContentProviderWrapper wrapper = new PapyrusFacetContentProviderWrapper(
+				configuration.getAdapterFactory(), resourceSet);
+		Collection<?> elements = wrapper.getElements(resourceSet);
+		wrapper.dispose();
+		return Lists.newArrayList(Iterables.transform(elements, FacetUtil.UN_WRAP));
+	}
+
+	/**
+	 * Determines the {@link ResourceSet} for the given {@code side}.
+	 * 
+	 * @param comparison
+	 *            the {@link Comparison}.
+	 * @param side
+	 *            the {@link MergeViewerSide}.
+	 * @return the determined {@link ResourceSet}, {@code null} if there is none.
+	 */
+	private ResourceSet getResourceSet(Comparison comparison, MergeViewerSide side) {
+		for (MatchResource matchResource : comparison.getMatchedResources()) {
+			Resource resource = getResource(matchResource, side);
+			if (resource != null) {
+				return resource.getResourceSet();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Determines the resource of the given match and side.
+	 * 
+	 * @param matchResource
+	 *            the {@link MatchResource}.
+	 * @param side
+	 *            the {@link MergeViewerSide}.
+	 * @return the determined {@link Resource}, may be {@code null}.
+	 */
+	private Resource getResource(MatchResource matchResource, MergeViewerSide side) {
+		if (side == MergeViewerSide.LEFT) {
+			return matchResource.getLeft();
+		}
+		if (side == MergeViewerSide.RIGHT) {
+			return matchResource.getRight();
+		}
+		if (side == MergeViewerSide.ANCESTOR) {
+			return matchResource.getOrigin();
+		}
+		return null;
+	}
+
+	/**
+	 * Determines the object of the given match and side.
+	 * 
+	 * @param match
+	 *            the {@link Match}.
+	 * @param side
+	 *            the {@link MergeViewerSide}.
+	 * @return the determined {@link Object}, may be {@code null}.
+	 */
+	private Object getSide(Match match, MergeViewerSide side) {
+		if (side == MergeViewerSide.LEFT) {
+			return match.getLeft();
+		}
+		if (side == MergeViewerSide.RIGHT) {
+			return match.getRight();
+		}
+		if (side == MergeViewerSide.ANCESTOR) {
+			return match.getOrigin();
+		}
+		return null;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusContextTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusContextTester.java
new file mode 100644
index 0000000..43c3d4f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusContextTester.java
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
+
+import static org.eclipse.papyrus.gitlight.compare.ui.internal.context.PapyrusContextUtil.isPapyrusContext;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.adapterfactory.context.AbstractContextTester;
+
+/**
+ * Indicates whether we are in a Papyrus context.
+ */
+public class PapyrusContextTester extends AbstractContextTester {
+
+	/**
+	 * A weak cache of comparisons that have been already been tested.
+	 */
+	private final Map<Comparison, Boolean> cache = new WeakHashMap<>();
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean apply(Map<Object, Object> context) {
+		Comparison comparison = getComparison(context);
+		if (comparison != null) {
+			Boolean result = cache.get(comparison);
+			if (result == null) {
+				result = Boolean.valueOf(isPapyrusContext(comparison));
+				cache.put(comparison, result);
+			}
+			return result.booleanValue();
+		}
+		return false;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItem.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItem.java
new file mode 100644
index 0000000..a814c37
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItem.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.MergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+
+/**
+ * Special implementation which mimics the behavior of the Papyrus Facet Parent mechanism.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusMergeViewerItem extends MergeViewerItem {
+
+	/**
+	 * The saved parent.
+	 */
+	private IMergeViewerItem papyrusParent;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param comparison
+	 *            the {@link Comparison}.
+	 * @param diff
+	 *            the {@link Diff}.
+	 * @param left
+	 *            the left object.
+	 * @param right
+	 *            the right object.
+	 * @param ancestor
+	 *            the ancestor object.
+	 * @param side
+	 *            the {@link MergeViewerSide}.
+	 * @param adapterFactory
+	 *            the {@link AdapterFactory}.
+	 */
+	public PapyrusMergeViewerItem(Comparison comparison, Diff diff, Object left, Object right,
+			Object ancestor, MergeViewerSide side, AdapterFactory adapterFactory) {
+		super(comparison, diff, left, right, ancestor, side, adapterFactory);
+	}
+
+	/**
+	 * Sets the parent of this MergeViewerItem.
+	 * 
+	 * @param papyrusParent
+	 *            the {@link IMergeViewerItem} parent.
+	 */
+	public void setPapyrusParent(IMergeViewerItem papyrusParent) {
+		this.papyrusParent = papyrusParent;
+	}
+
+	/**
+	 * Gets the parent of this MergeViewerItem.
+	 * 
+	 * @return the {@link IMergeViewerItem} parent if it was set, {@code null} otherwise.
+	 */
+	public IMergeViewerItem getPapyrusParent() {
+		return papyrusParent;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItemContentProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItemContentProvider.java
new file mode 100644
index 0000000..5f82cca
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusMergeViewerItemContentProvider.java
@@ -0,0 +1,156 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.provider.TreeMergeViewerItemContentProvider;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.provider.IMergeViewerItemProviderConfiguration;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.gmf.runtime.notation.Diagram;
+
+/**
+ * Modifies the {@link TreeMergeViewerItemContentProvider} for the Papyrus Facet mechanism.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusMergeViewerItemContentProvider extends TreeMergeViewerItemContentProvider {
+
+	@Override
+	public boolean hasChildren(Object object, IMergeViewerItemProviderConfiguration configuration) {
+		// Filter children of diagrams
+		if (object instanceof IMergeViewerItem) {
+			Object bestSideObject = getBestSideValue(IMergeViewerItem.class.cast(object),
+					configuration.getSide());
+			if (Diagram.class.isInstance(bestSideObject)) {
+				return false;
+			}
+		}
+		return super.hasChildren(object, configuration);
+	}
+
+	@Override
+	protected IMergeViewerItem createMergeViewerItemFrom(EObject eObject, IMergeViewerItem parent,
+			IMergeViewerItemProviderConfiguration configuration) {
+		IMergeViewerItem createdItem = super.createMergeViewerItemFrom(eObject, parent, configuration);
+		if (PapyrusMergeViewerItem.class.isInstance(createdItem)) {
+			PapyrusMergeViewerItem.class.cast(createdItem).setPapyrusParent(parent);
+		}
+		return createdItem;
+	}
+
+	@Override
+	protected IMergeViewerItem createMergeViewerItem(Comparison comparison, Diff diff, Object left,
+			Object right, Object ancestor, MergeViewerSide side, AdapterFactory adapterFactory) {
+		return new PapyrusMergeViewerItem(comparison, diff, left, right, ancestor, side, adapterFactory);
+	}
+
+	@Override
+	public Object getParent(Object object, IMergeViewerItemProviderConfiguration configuration) {
+		// Mimic Facet mechanism
+		if (PapyrusMergeViewerItem.class.isInstance(object)) {
+			PapyrusMergeViewerItem item = PapyrusMergeViewerItem.class.cast(object);
+			if (item.getPapyrusParent() != null) {
+				return item.getPapyrusParent();
+			}
+		}
+
+		IMergeViewerItem mergeViewerItem = (IMergeViewerItem)object;
+		if (mergeViewerItem.getDiff() instanceof ResourceAttachmentChange) {
+			// fallback to parent in special case
+			return super.getParent(object, configuration);
+		}
+
+		// Try to get the parent but do not return a parent which could be filtered away
+		Object sideValue = getBestSideValue(mergeViewerItem, configuration.getSide());
+		if (sideValue != null) {
+			Object parent = getUnfilteredParent(sideValue, configuration);
+			if (parent != null) {
+				return parent;
+			}
+		}
+
+		// fallback
+		return super.getParent(object, configuration);
+	}
+
+	/**
+	 * Determines the parent of the given object but 'skips' parent elements which are filtered away.
+	 * 
+	 * @param object
+	 *            the {@link Object} whose parent is to be determined.
+	 * @param configuration
+	 *            the {@link IMergeViewerItemProviderConfiguration}.
+	 * @return the unfiltered parent if one could be determined, {@code null} otherwise.
+	 */
+	protected Object getUnfilteredParent(Object object, IMergeViewerItemProviderConfiguration configuration) {
+		List<Object> pathToRoot = getPathToRoot(object, configuration);
+		Set<Object> alreadyLookedAt = new HashSet<Object>();
+		int currentIndex = pathToRoot.size() - 1;
+		while (true) {
+			Object nextObject = pathToRoot.get(currentIndex);
+			if (alreadyLookedAt.contains(nextObject)) {
+				// there is a containment circle
+				return null;
+			}
+			alreadyLookedAt.add(nextObject);
+			List<Object> childrenFromContentProvider = getChildrenFromContentProvider(nextObject,
+					configuration.getAdapterFactory());
+			childrenFromContentProvider.retainAll(pathToRoot);
+			if (childrenFromContentProvider.isEmpty()) {
+				// break in the chain
+				return null;
+			}
+			if (childrenFromContentProvider.get(0) == object) {
+				// found the parent that returns the given object
+				return nextObject;
+			}
+			currentIndex = pathToRoot.lastIndexOf(childrenFromContentProvider.get(0));
+		}
+	}
+
+	/**
+	 * Determines all the parents of the given object up to the root.
+	 * 
+	 * @param object
+	 *            the {@link Object} whose parents are to be determined.
+	 * @param configuration
+	 *            the {@link IMergeViewerItemProviderConfiguration}
+	 * @return A list starting from the given {@code object} and ending with the root element.
+	 */
+	private List<Object> getPathToRoot(Object object, IMergeViewerItemProviderConfiguration configuration) {
+		List<Object> path = new ArrayList<Object>();
+		Object currentObject = object;
+		while (currentObject != null) {
+			path.add(currentObject);
+			ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider)configuration
+					.getAdapterFactory().adapt(currentObject, ITreeItemContentProvider.class);
+			if (treeItemContentProvider == null) {
+				break;
+			}
+			currentObject = treeItemContentProvider.getParent(currentObject);
+		}
+		return path;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusTreeContentMergeViewerItemLabelProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusTreeContentMergeViewerItemLabelProvider.java
new file mode 100644
index 0000000..ebf170e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/contentmergeviewer/provider/PapyrusTreeContentMergeViewerItemLabelProvider.java
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.provider.TreeContentMergeViewerItemLabelProvider;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement;
+import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeproxyFactory;
+import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
+import org.eclipse.papyrus.infra.gmfdiag.css.notation.CSSDiagram;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * The label provider for the {@link PyprusTreeContentMergeViewer}.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusTreeContentMergeViewerItemLabelProvider extends TreeContentMergeViewerItemLabelProvider {
+	/**
+	 * The {@link MergeViewerSide}.
+	 */
+	private MergeViewerSide side;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param resourceBundle
+	 *            the {@link ResourceBundle}.
+	 * @param adapterFactory
+	 *            the {@link AdapterFactory}.
+	 * @param side
+	 *            the {@link MergeViewerSide}.
+	 */
+	public PapyrusTreeContentMergeViewerItemLabelProvider(ResourceBundle resourceBundle,
+			AdapterFactory adapterFactory, MergeViewerSide side) {
+		super(resourceBundle, adapterFactory, side);
+		this.side = side;
+	}
+
+	@Override
+	public Image getImage(Object object) {
+		if (!IMergeViewerItem.class.isInstance(object)) {
+			return super.getImage(object);
+		}
+
+		final Image image;
+		final IMergeViewerItem mergeViewerItem = IMergeViewerItem.class.cast(object);
+
+		// For all special cases fall back to parent to keep consistency
+		if (mergeViewerItem.isInsertionPoint()) {
+			image = super.getImage(object);
+		} else if (mergeViewerItem.getSideValue(side) == null
+				&& mergeViewerItem.getSideValue(side.opposite()) instanceof Resource) {
+			image = super.getImage(mergeViewerItem.getSideValue(side.opposite()));
+		} else if (mergeViewerItem.getLeft() == null && mergeViewerItem.getRight() == null
+				&& mergeViewerItem.getAncestor() instanceof Resource) {
+			image = super.getImage(mergeViewerItem.getAncestor());
+		} else {
+			final Object value = mergeViewerItem.getSideValue(side);
+			if (hasModelExplorerLabel(value)) {
+				final LabelProviderService labelProviderService = PapyrusCompareUIPlugin
+						.getDefault().getLabelProviderService();
+				if (value instanceof EObject) {
+					EObjectTreeElement treeElement = TreeproxyFactory.eINSTANCE.createEObjectTreeElement();
+					treeElement.setEObject(EObject.class.cast(value));
+					image = labelProviderService.getLabelProvider().getImage(treeElement);
+				} else {
+					image = labelProviderService.getLabelProvider().getImage(value);
+				}
+			} else {
+				image = super.getImage(object);
+			}
+		}
+		return image;
+	}
+
+	@Override
+	public String getText(Object object) {
+		if (!IMergeViewerItem.class.isInstance(object)) {
+			return super.getText(object);
+		}
+
+		final String text;
+		final IMergeViewerItem mergeViewerItem = (IMergeViewerItem)object;
+		final Object value = mergeViewerItem.getSideValue(side);
+
+		// For all special cases fall back to parent to keep consistency
+		if (value instanceof EObject && ((EObject)value).eIsProxy()) {
+			text = super.getText(object);
+		} else if (mergeViewerItem.isInsertionPoint()) {
+			text = super.getText(object);
+		} else if (value == null && mergeViewerItem.getSideValue(side.opposite()) instanceof Resource) {
+			text = super.getText(object);
+		} else if (value == null && mergeViewerItem.getLeft() == null && mergeViewerItem.getRight() == null
+				&& mergeViewerItem.getAncestor() instanceof Resource) {
+			text = super.getText(object);
+		} else {
+			if (hasModelExplorerLabel(value)) {
+				final LabelProviderService labelProviderService = PapyrusCompareUIPlugin
+						.getDefault().getLabelProviderService();
+				if (value instanceof EObject) {
+					EObjectTreeElement treeElement = TreeproxyFactory.eINSTANCE.createEObjectTreeElement();
+					treeElement.setEObject(EObject.class.cast(value));
+					text = labelProviderService.getLabelProvider().getText(treeElement);
+				} else {
+					text = labelProviderService.getLabelProvider().getText(value);
+				}
+			} else {
+				text = super.getText(object);
+			}
+		}
+		return text;
+	}
+
+	/**
+	 * Determines if a given object has a label within the Papyrus ModelExplorer.
+	 * 
+	 * @param object
+	 *            the object to check
+	 * @return {@code true} if the {@code object} has a Papyrus ModelExplorer label, {@code false} otherwise.
+	 */
+	protected boolean hasModelExplorerLabel(Object object) {
+		if (EObject.class.isInstance(object)) {
+			final EObject eObject = EObject.class.cast(object);
+			if (UMLPackage.class.isInstance(eObject.eClass().getEPackage())) {
+				return true;
+			}
+			if (CSSDiagram.class.isInstance(eObject)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/dependency/PapyrusDependencyProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/dependency/PapyrusDependencyProvider.java
new file mode 100644
index 0000000..d45a8fa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/dependency/PapyrusDependencyProvider.java
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.dependency;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.ide.ui.dependency.IDependencyProvider;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.papyrus.gitlight.compare.util.ModelExtensionUtil;
+
+/**
+ * A client of the EMF Compare Dependency extension point providing a lightweight integration of the Papyrus
+ * ModelSet approach with the EMF Model Resolution Strategy.
+ */
+public class PapyrusDependencyProvider implements IDependencyProvider {
+
+	/**
+	 * File extensions registered in Papyrus.
+	 */
+	private List<String> fileExtensions;
+
+	/**
+	 * Constructs and initializes the PapyrusDependencyIdentifier.
+	 */
+	public PapyrusDependencyProvider() {
+		fileExtensions = new ArrayList<String>(ModelExtensionUtil.getRegisteredFileExtensions());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean apply(URI uri) {
+		return fileExtensions.contains(uri.fileExtension());
+	}
+
+	/**
+	 * {@inheritDoc} Checks the Papyrus model extension point and tries to determine all dependencies from the
+	 * registered information.
+	 */
+	public Set<URI> getDependencies(URI uri, URIConverter uriConverter) {
+		final Set<URI> dependencies = new LinkedHashSet<URI>();
+		final URI baseURI = uri.trimFileExtension();
+		for (String fileExtension : fileExtensions) {
+			final URI dependencyURI = baseURI.appendFileExtension(fileExtension);
+			if (uriConverter.exists(dependencyURI, null)) {
+				dependencies.add(dependencyURI);
+			}
+		}
+		return dependencies;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorFactoryWrapper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorFactoryWrapper.java
new file mode 100644
index 0000000..74dbc1a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorFactoryWrapper.java
@@ -0,0 +1,148 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.accessorfactory;
+
+import com.google.common.collect.Sets;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.compare.rcp.ui.EMFCompareRCPUIPlugin;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.ICompareAccessor;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.factory.IAccessorFactory;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement;
+import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl.AbstractAccessorFactory;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.context.PapyrusContextUtil;
+
+/**
+ * Returns a special PapyrusAccessor when the comparison took place in a Papyrus context, otherwise the call
+ * is delegated to a the normal CompareAccessorFactories.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusAccessorFactoryWrapper extends AbstractAccessorFactory {
+
+	/**
+	 * The types for which we return a special Papyrus CompareAccessor.
+	 */
+	private static final Set<String> OVERRIDE_TYPES = Sets.newHashSet(
+			"org.eclipse.emf.compare.rcp.ui.eTreeDiff", "org.eclipse.emf.compare.rcp.ui.eMatch", //$NON-NLS-1$ //$NON-NLS-2$
+			"org.eclipse.emf.compare.rcp.ui.eResourceDiff", "NODE_TYPE__EMF_EOBJECT", //$NON-NLS-1$ //$NON-NLS-2$
+			"NODE_TYPE__EMF_RESOURCE", "NODE_TYPE__EMF_RESOURCESET", "NODE_TYPE__EMF_COMPARISON"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isFactoryFor(Object target) {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createLeft(AdapterFactory adapterFactory, Object target) {
+		final IAccessorFactory highestRankingFactory = getHighestRankingFactory(target);
+		if (highestRankingFactory != null) {
+			final ITypedElement left = highestRankingFactory.createLeft(adapterFactory, target);
+			return wrapIfNecessary(left);
+		}
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createRight(AdapterFactory adapterFactory, Object target) {
+		final IAccessorFactory highestRankingFactory = getHighestRankingFactory(target);
+		if (highestRankingFactory != null) {
+			final ITypedElement right = highestRankingFactory.createRight(adapterFactory, target);
+			return wrapIfNecessary(right);
+		}
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ITypedElement createAncestor(AdapterFactory adapterFactory, Object target) {
+		final IAccessorFactory highestRankingFactory = getHighestRankingFactory(target);
+		if (highestRankingFactory != null) {
+			final ITypedElement ancestor = highestRankingFactory.createAncestor(adapterFactory, target);
+			return wrapIfNecessary(ancestor);
+		}
+		return null;
+	}
+
+	/**
+	 * Checks the given {@link ITypedElement} and wraps it in a PapyrusAccessor if needed.
+	 * 
+	 * @param element
+	 *            the {@linked ITypedElement} to check.
+	 * @return the wrapped {@code element} if a PapyrusAccessor is needed, the original {@code element}
+	 *         otherwise.
+	 */
+	private ITypedElement wrapIfNecessary(ITypedElement element) {
+		if (element instanceof ICompareAccessor) {
+			final ICompareAccessor accessor = (ICompareAccessor)element;
+			if (PapyrusContextUtil.isPapyrusContext(accessor.getComparison())
+					&& isOverrideType(element.getType())) {
+				return new PapyrusAccessorWrapper(accessor);
+			}
+		}
+		return element;
+	}
+
+	/**
+	 * Determines whether the given type is one of the types we override in a Papyrus context.
+	 * 
+	 * @param type
+	 *            the type to check.
+	 * @return {@code true} if the type is one of the types we override, {@code false} otherwise.
+	 */
+	private boolean isOverrideType(String type) {
+		return OVERRIDE_TYPES.contains(type);
+	}
+
+	/**
+	 * Searches the highest ranking factory for the given target, disregarding {@code this} factory itself.
+	 * 
+	 * @param target
+	 *            the target for which the highest ranking factory is to be determined.
+	 * @return the highest ranking factory which is not this class itself, {@code null} if no other factory
+	 *         could be determined.
+	 */
+	private IAccessorFactory getHighestRankingFactory(Object target) {
+		IAccessorFactory.Registry factoryRegistry = EMFCompareRCPUIPlugin.getDefault()
+				.getAccessorFactoryRegistry();
+
+		Iterator<IAccessorFactory> factories = factoryRegistry.getFactories(target).iterator();
+
+		IAccessorFactory ret = null;
+
+		while (factories.hasNext()) {
+			IAccessorFactory factory = factories.next();
+			// Do not use this or another higher ranking factory to avoid endless loops
+			if (factory.getRanking() >= this.getRanking()) {
+				continue;
+			}
+			if (ret == null || factory.getRanking() > ret.getRanking()) {
+				ret = factory;
+			}
+		}
+
+		return ret;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorWrapper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorWrapper.java
new file mode 100644
index 0000000..ac32e37
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/accessorfactory/PapyrusAccessorWrapper.java
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.accessorfactory;
+
+import com.google.common.collect.ImmutableList;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.ICompareAccessor;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * A Papyrus Wrapper for an {@link ICompareAccessor}. All calls are delegated to the given ICompareAccesor,
+ * except the {@link #getType()} method which adds a {@link #PAPYRUS_TYPE} in front of the type to indicate
+ * the Papyrus context.
+ */
+public class PapyrusAccessorWrapper implements ICompareAccessor {
+
+	/**
+	 * The type-prefix which indicates the Papyrus context.
+	 */
+	private static final String PAPYRUS_TYPE = "papyrus-"; //$NON-NLS-1$
+
+	/**
+	 * The wrapped {@link ICompareAccessor}.
+	 */
+	private ICompareAccessor delegate;
+
+	/**
+	 * The Constructor.
+	 * 
+	 * @param delegate
+	 *            The {@link ICompareAccessor} which is wrapped.
+	 */
+	public PapyrusAccessorWrapper(ICompareAccessor delegate) {
+		this.delegate = delegate;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getName() {
+		return delegate.getName();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Image getImage() {
+		return delegate.getImage();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getType() {
+		return PAPYRUS_TYPE + delegate.getType();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Comparison getComparison() {
+		return delegate.getComparison();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public IMergeViewerItem getInitialItem() {
+		return delegate.getInitialItem();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ImmutableList<? extends IMergeViewerItem> getItems() {
+		return delegate.getItems();
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/AddReviewCommentCommandWrapper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/AddReviewCommentCommandWrapper.java
new file mode 100644
index 0000000..6bfbb5e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/AddReviewCommentCommandWrapper.java
@@ -0,0 +1,429 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.commands;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandWrapper;
+import org.eclipse.emf.compare.CompareFactory;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusMergeViewerItem;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * This review comment command wrapper allows to wrap the accept or reject action with a review comment added to the added/removed/changed/moved element.
+ */
+@SuppressWarnings("restriction")
+public class AddReviewCommentCommandWrapper extends CommandWrapper {
+
+	/**
+	 * The review comment to add.
+	 */
+	private ReviewComment reviewComment;
+
+	/**
+	 * The diff to manage.
+	 */
+	private PapyrusMergeViewerItem diff;
+
+	/**
+	 * The emf compare configuration to get the comparison (and also add the match difference of the review comment to add).
+	 */
+	private EMFCompareConfiguration config;
+
+	/**
+	 * The review command (we needed this one ad global variable to manage the undo).
+	 */
+	private AbstractTransactionalCommand reviewCommand;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param command
+	 *            The command to wrap.
+	 * @param reviewComment
+	 *            The review comment.
+	 * @param diff
+	 *            The diff to manage.
+	 * @param config
+	 *            The emf compare configuration.
+	 */
+	public AddReviewCommentCommandWrapper(final Command command, final ReviewComment reviewComment, final PapyrusMergeViewerItem diff, final EMFCompareConfiguration config) {
+		super(command);
+		this.reviewComment = reviewComment;
+		this.diff = diff;
+		this.config = config;
+	}
+
+	/**
+	 * Create the review command and execute it after the wrapped command.
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.CommandWrapper#execute()
+	 *
+	 */
+	@Override
+	public void execute() {
+		super.execute();
+
+		if (null != reviewComment) {
+
+			final List<Element> ownersCommentElement = getOwnersCommentElement(diff);
+			if (null != ownersCommentElement && ownersCommentElement.size() == 2) {
+				final Element leftOwnerCommentElement = ownersCommentElement.get(0);
+				final Element rightOwnerCommentElement = ownersCommentElement.get(1);
+				if (null != rightOwnerCommentElement && null != leftOwnerCommentElement) {
+
+					// Copy the review comment for right tree if it is editable
+					final ReviewComment copiedReviewComment = config.isRightEditable() ? EcoreUtil.copy(reviewComment) : null;
+					if (null != copiedReviewComment) {
+						final Comment copiedComment = EcoreUtil.copy(reviewComment.getBase_Comment());
+						copiedReviewComment.setBase_Comment(copiedComment);
+					}
+
+					final TransactionalEditingDomain domain = retrieveTransactionalEditingDomain(leftOwnerCommentElement.getModel());
+
+					// Get the editing domain
+					if (null != domain) {
+
+						reviewCommand = new AbstractTransactionalCommand(domain, getCommand().getLabel(), null) {
+
+							@Override
+							protected CommandResult doExecuteWithResult(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
+
+								// Annotate the owner comment element
+								reviewComment.getBase_Comment().getAnnotatedElements().add(leftOwnerCommentElement);
+								// Add the comment to its owner
+								leftOwnerCommentElement.getOwnedComments().add(reviewComment.getBase_Comment());
+								// Add the review comment stereotype to the resource
+								leftOwnerCommentElement.eResource().getContents().add(reviewComment);
+
+								if (null != copiedReviewComment) {
+									// Annotate the owner comment element
+									copiedReviewComment.getBase_Comment().getAnnotatedElements().add(rightOwnerCommentElement);
+									// Add the comment to its owner
+									rightOwnerCommentElement.getOwnedComments().add(copiedReviewComment.getBase_Comment());
+									// Add the review comment stereotype to the resource
+									rightOwnerCommentElement.eResource().getContents().add(copiedReviewComment);
+								}
+								return CommandResult.newOKCommandResult();
+							}
+
+							@Override
+							public boolean canUndo() {
+								return true;
+							}
+
+							@Override
+							protected IStatus doUndo(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
+								// Remove the review comment stereotype from the resource
+								leftOwnerCommentElement.eResource().getContents().remove(reviewComment);
+								// Remove the comment from its owner
+								leftOwnerCommentElement.getOwnedComments().remove(reviewComment.getBase_Comment());
+
+								if (null != copiedReviewComment) {
+									// Remove the review comment stereotype from the resource
+									rightOwnerCommentElement.eResource().getContents().remove(copiedReviewComment);
+									// Remove the comment from its owner
+									rightOwnerCommentElement.getOwnedComments().remove(copiedReviewComment.getBase_Comment());
+								}
+
+								return new Status(IStatus.OK, PapyrusCompareUIPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
+							}
+
+							@Override
+							public boolean canRedo() {
+								return true;
+							}
+
+							@Override
+							protected IStatus doRedo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+								// Add the comment to its owner
+								leftOwnerCommentElement.getOwnedComments().add(reviewComment.getBase_Comment());
+								// Add the review comment stereotype to the resource
+								leftOwnerCommentElement.eResource().getContents().add(reviewComment);
+
+								if (null != copiedReviewComment) {
+									// Add the comment to its owner
+									rightOwnerCommentElement.getOwnedComments().add(copiedReviewComment.getBase_Comment());
+									// Add the review comment stereotype to the resource
+									rightOwnerCommentElement.eResource().getContents().add(copiedReviewComment);
+								}
+
+								return new Status(IStatus.OK, PapyrusCompareUIPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
+							}
+						};
+						try {
+							reviewCommand.execute(new NullProgressMonitor(), null);
+						} catch (ExecutionException e) {
+							e.printStackTrace();
+						}
+					}
+
+					final Match createdMatch = CompareFactory.eINSTANCE.createMatch();
+					createdMatch.setLeft(reviewComment.getBase_Comment());
+					createdMatch.setRight(null != copiedReviewComment ? copiedReviewComment.getBase_Comment() : null);
+					createdMatch.setOrigin(reviewComment.getBase_Comment());
+					config.getComparison().getMatches().add(createdMatch);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Check that the command is not <code>null</code>.
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.CommandWrapper#canUndo()
+	 */
+	@Override
+	public boolean canUndo() {
+		return true;
+	}
+
+	/**
+	 * Undo the command.
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.CommandWrapper#undo()
+	 */
+	@Override
+	public void undo() {
+		super.undo();
+		if (null != reviewCommand) {
+			try {
+				reviewCommand.undo(new NullProgressMonitor(), null);
+			} catch (ExecutionException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	@Override
+	public void redo() {
+		super.redo();
+		if (null != reviewCommand) {
+			try {
+				reviewCommand.redo(new NullProgressMonitor(), null);
+			} catch (ExecutionException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * This allows to retrieve the transactional editing domain associated to the element.
+	 * 
+	 * @param element
+	 *            the UML element.
+	 * @return The transactional editing domain or <code>null</code>.
+	 */
+	private TransactionalEditingDomain retrieveTransactionalEditingDomain(final Element element) {
+		TransactionalEditingDomain transactionalEditingDomain = TransactionUtil.getEditingDomain(element);
+		if (transactionalEditingDomain == null) {
+			final EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(element);
+			if (editingDomain instanceof TransactionalEditingDomain) {
+				transactionalEditingDomain = (TransactionalEditingDomain) editingDomain;
+			}
+		}
+		return transactionalEditingDomain;
+	}
+
+	/**
+	 * This allows to get the owners (left and right) where add the review comment.
+	 * 
+	 * @param diff
+	 *            The diff to manage.
+	 * @return List of 2 elements of comments' owners (left and right) (can be empty).
+	 */
+	private List<Element> getOwnersCommentElement(final PapyrusMergeViewerItem diff) {
+		List<Element> ownersCommentElement = new ArrayList<Element>(2);
+
+		if (null != diff) {
+			// Manage it differently if this is an DELETE because the object will not be added
+			if (diff.getDiff().getKind().equals(DifferenceKind.ADD)) {
+				ownersCommentElement = getParentOwnersCommentElementForAdd(diff);
+				// If this is an ADD, we need to recalculate the re-created item
+			} else if (diff.getDiff().getKind().equals(DifferenceKind.DELETE)) {
+
+				final Object rightValue = diff.getSideValue(MergeViewerSide.RIGHT);
+				if (rightValue instanceof Element) {
+					final IMergeViewerItem existingMergeViewerItem = retrieveExistingPapyrusMergeViewerItem(diff);
+
+					final Element leftValue = getElementByPath((Element) rightValue, existingMergeViewerItem);
+					if (leftValue instanceof Element) {
+						ownersCommentElement.add((Element) leftValue);
+						ownersCommentElement.add((Element) rightValue);
+					}
+				}
+
+			} else {
+				// If this is a MOVE or a CHANGE, there is no problem
+				final Object leftValue = diff.getSideValue(MergeViewerSide.LEFT);
+				final Object rightValue = diff.getSideValue(MergeViewerSide.RIGHT);
+
+				if (leftValue instanceof Element && rightValue instanceof Element) {
+					ownersCommentElement.add((Element) leftValue);
+					ownersCommentElement.add((Element) rightValue);
+				}
+			}
+		}
+
+		return ownersCommentElement;
+	}
+
+	/**
+	 * This allows to get an element by its path (UML) from the left tree to the right one.
+	 * 
+	 * @param leftValue
+	 *            The left value.
+	 * @param existingMergeViewerItem
+	 *            The viewer item where both of elements are same.
+	 * @return The right found element corresponding to the left one.
+	 */
+	private Element getElementByPath(final Element rightValue, final IMergeViewerItem existingMergeViewerItem) {
+		Element result = null;
+		final Object parentLeftValue = existingMergeViewerItem.getSideValue(MergeViewerSide.LEFT);
+		final Object parentRightValue = existingMergeViewerItem.getSideValue(MergeViewerSide.RIGHT);
+
+		if (parentLeftValue instanceof Element && parentRightValue instanceof Element) {
+			final TreeMap<String, String> path = new TreeMap<>();
+
+			// Climb the right tree until found the parent
+			EObject currentRightElement = rightValue;
+			while (null != currentRightElement && !currentRightElement.equals(parentLeftValue)) {
+				if (currentRightElement instanceof Comment) {
+					path.put(((Comment) currentRightElement).getBody(), currentRightElement.getClass().getName());
+				} else if (currentRightElement instanceof NamedElement) {
+					path.put(((NamedElement) currentRightElement).getName(), currentRightElement.getClass().getName());
+				}
+				currentRightElement = currentRightElement.eContainer();
+			}
+
+			// Browse the left tree from the parent right to the correct element
+			EObject currentLeftElement = (Element) parentRightValue;
+			for (final Entry<String, String> entry : path.descendingMap().entrySet()) {
+				if (currentLeftElement instanceof Element) {
+					if (entry.getValue().equals(Comment.class.getName())) {
+						final Iterator<Comment> comments = ((Element) currentLeftElement).getOwnedComments().iterator();
+						boolean found = false;
+						while (comments.hasNext() && !found) {
+							final Comment nextComment = comments.next();
+							if (nextComment.getBody().equals(entry.getKey())) {
+								currentLeftElement = nextComment;
+								found = true;
+							}
+						}
+					} else {
+						final Iterator<EObject> contents = currentLeftElement.eContents().iterator();
+						boolean found = false;
+						while (contents.hasNext() && !found) {
+							final EObject nextContent = contents.next();
+							if (nextContent.getClass().getName().equals(entry.getValue()) && nextContent instanceof NamedElement) {
+								currentLeftElement = nextContent;
+								found = true;
+							}
+						}
+					}
+				}
+			}
+
+			if (currentLeftElement instanceof Element && !currentLeftElement.equals(parentRightValue)) {
+				result = (Element) currentLeftElement;
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * This allows to get the parent of the diff for add to add the review comment to this one.
+	 * 
+	 * @param diff
+	 *            The diff to manage.
+	 * @return The parent element that is same for both side.
+	 */
+	private List<Element> getParentOwnersCommentElementForAdd(final PapyrusMergeViewerItem diff) {
+		List<Element> ownersCommentElement = new ArrayList<Element>(2);
+
+		if (null != diff) {
+			final IMergeViewerItem papyrusParent = diff.getPapyrusParent();
+			if (papyrusParent instanceof IMergeViewerItem) {
+				final Object leftValue = diff.getSideValue(MergeViewerSide.LEFT);
+				final Object rightValue = diff.getSideValue(MergeViewerSide.RIGHT);
+
+				if ((null == leftValue || null == rightValue) && papyrusParent instanceof PapyrusMergeViewerItem) {
+					ownersCommentElement = getParentOwnersCommentElementForAdd((PapyrusMergeViewerItem) papyrusParent);
+				} else {
+					ownersCommentElement.add((Element) leftValue);
+					ownersCommentElement.add((Element) rightValue);
+				}
+			}
+		}
+
+		return ownersCommentElement;
+	}
+
+	/**
+	 * This allows to retrieve the first upper merge viewer item where the element is the same for both side.
+	 * 
+	 * @param diff
+	 *            The diff to manage.
+	 * @return The first upper merge viewer item.
+	 */
+	private IMergeViewerItem retrieveExistingPapyrusMergeViewerItem(final IMergeViewerItem diff) {
+		if (null != diff) {
+			final Object leftValue = diff.getSideValue(MergeViewerSide.LEFT);
+			final Object rightValue = diff.getSideValue(MergeViewerSide.LEFT);
+			if (diff.getDiff() == null && leftValue.equals(rightValue)) {
+				return diff;
+			} else {
+				final IMergeViewerItem papyrusParent = diff.getParent();
+				if (papyrusParent instanceof IMergeViewerItem) {
+					return retrieveExistingPapyrusMergeViewerItem(papyrusParent);
+				}
+			}
+		}
+		return null;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/CompoundCompareCommand.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/CompoundCompareCommand.java
new file mode 100644
index 0000000..9a7cd0f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/CompoundCompareCommand.java
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.commands;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.compare.command.ICompareCopyCommand;
+
+/**
+ * CompoundCommand for compare copy command of EMF compare.
+ */
+public class CompoundCompareCommand extends CompoundCommand implements ICompareCopyCommand {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.command.ICompareCopyCommand#isLeftToRight()
+	 */
+	@Override
+	public boolean isLeftToRight() {
+		final Collection<ICompareCopyCommand> compareCopyCommands = getCommandList().stream().filter(command -> command instanceof ICompareCopyCommand)
+				.map(command -> (ICompareCopyCommand) command).collect(Collectors.toList());
+		return compareCopyCommands.stream().allMatch(command -> command.isLeftToRight());
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/PapyrusCompareCopyCommand.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/PapyrusCompareCopyCommand.java
new file mode 100644
index 0000000..518ede6
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/PapyrusCompareCopyCommand.java
@@ -0,0 +1,105 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.commands;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
+
+/**
+ * This allows to manage the compare copy command as transactional command to avoid transactional error while executing.
+ */
+public class PapyrusCompareCopyCommand extends AbstractTransactionalCommand {
+
+	/**
+	 * The compare copy command to wrap as transactional.
+	 */
+	private Command compareCopyCommand;
+
+	/**
+	 * 
+	 * Constructor.
+	 *
+	 * @param domain
+	 *            The editing domain.
+	 * @param compareCopyCommand
+	 *            The compare copy command to wrap as transactional.
+	 */
+	public PapyrusCompareCopyCommand(final TransactionalEditingDomain domain, final Command compareCopyCommand) {
+		super(domain, compareCopyCommand.getLabel(), null);
+		this.compareCopyCommand = compareCopyCommand;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand#doExecuteWithResult(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+	 */
+	@Override
+	protected CommandResult doExecuteWithResult(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
+		compareCopyCommand.execute();
+		return CommandResult.newOKCommandResult();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.workspace.AbstractEMFOperation#canUndo()
+	 */
+	@Override
+	public boolean canUndo() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand#doUndo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+	 */
+	@Override
+	protected IStatus doUndo(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
+		compareCopyCommand.undo();
+		return new Status(IStatus.OK, PapyrusCompareUIPlugin.PLUGIN_ID, "Undo merge"); //$NON-NLS-1$
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.workspace.AbstractEMFOperation#canRedo()
+	 */
+	@Override
+	public boolean canRedo() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand#doRedo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
+	 */
+	@Override
+	protected IStatus doRedo(final IProgressMonitor monitor, final IAdaptable info) throws ExecutionException {
+		compareCopyCommand.undo();
+		return new Status(IStatus.OK, PapyrusCompareUIPlugin.PLUGIN_ID, "Undo merge"); //$NON-NLS-1$
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/RemoveDiffCommand.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/RemoveDiffCommand.java
new file mode 100644
index 0000000..3d23183
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/commands/RemoveDiffCommand.java
@@ -0,0 +1,128 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.commands;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.emf.common.command.AbstractCommand;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider.PapyrusMergeViewerItem;
+
+/**
+ * This allows to remove a diff from the list of papyrus items.
+ */
+@SuppressWarnings("restriction")
+public class RemoveDiffCommand extends AbstractCommand {
+
+	/**
+	 * The papyrus items.
+	 */
+	private List<PapyrusMergeViewerItem> papyrusMergeViewerItems;
+
+	/**
+	 * The diff to remove from the list of papyrus items.
+	 */
+	private PapyrusMergeViewerItem diffToRemove;
+
+	/**
+	 * The papyrus items removed by command.
+	 */
+	private Map<PapyrusMergeViewerItem, Integer> papyrusItemsAndIndexRemoved;
+
+	/**
+	 * Default constructor.
+	 *
+	 * @param papyrusMergeViewerItems
+	 *            The papyrus items.
+	 * @param diffToRemove
+	 *            The diff to remove from the list.
+	 */
+	public RemoveDiffCommand(final List<PapyrusMergeViewerItem> papyrusMergeViewerItems, final PapyrusMergeViewerItem diffToRemove) {
+		this.papyrusMergeViewerItems = papyrusMergeViewerItems;
+		this.diffToRemove = diffToRemove;
+		this.papyrusItemsAndIndexRemoved = null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.AbstractCommand#canExecute()
+	 */
+	@Override
+	public boolean canExecute() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.Command#execute()
+	 */
+	@Override
+	public void execute() {
+		if (null != diffToRemove) {
+			papyrusItemsAndIndexRemoved = new HashMap<PapyrusMergeViewerItem, Integer>();
+			for (final PapyrusMergeViewerItem item : papyrusMergeViewerItems) {
+				if (null != item && diffToRemove.getDiff().equals(item.getDiff())) {
+					papyrusItemsAndIndexRemoved.put(item, papyrusMergeViewerItems.indexOf(item));
+				}
+			}
+			if (!papyrusItemsAndIndexRemoved.isEmpty()) {
+				papyrusMergeViewerItems.removeAll(papyrusItemsAndIndexRemoved.keySet());
+			}
+		}
+		this.diffToRemove = null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.AbstractCommand#canUndo()
+	 */
+	@Override
+	public boolean canUndo() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
+	 */
+	@Override
+	public void undo() {
+		if (!papyrusItemsAndIndexRemoved.isEmpty()) {
+			for (final Entry<PapyrusMergeViewerItem, Integer> entry : papyrusItemsAndIndexRemoved.entrySet()) {
+				papyrusMergeViewerItems.add(entry.getValue(), entry.getKey());
+			}
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.common.command.Command#redo()
+	 */
+	@Override
+	public void redo() {
+		if (!papyrusItemsAndIndexRemoved.isEmpty()) {
+			papyrusMergeViewerItems.removeAll(papyrusItemsAndIndexRemoved.keySet());
+		}
+	}
+
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/context/PapyrusContextUtil.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/context/PapyrusContextUtil.java
new file mode 100644
index 0000000..f7b4107
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/context/PapyrusContextUtil.java
@@ -0,0 +1,151 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.context;
+
+import static com.google.common.collect.Collections2.transform;
+import static com.google.common.collect.Iterables.any;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet.Builder;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.MatchResource;
+import org.eclipse.emf.compare.scope.IComparisonScope2;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.DiModel;
+import org.eclipse.papyrus.uml.tools.model.UmlModel;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * Helper class for determining the context of a comparison.
+ */
+public final class PapyrusContextUtil {
+
+	/** The value ".di". */
+	private static final String DI_FILE_EXTENSION = "." + DiModel.DI_FILE_EXTENSION; //$NON-NLS-1$
+
+	/** Predicate specifying whether the given URI string ends with the Papyrus DI file extension. */
+	private static final Predicate<String> ENDS_WITH_PAPYRUS_EXTENSION = new Predicate<String>() {
+		public boolean apply(String input) {
+			if (input != null) {
+				return input.endsWith(DI_FILE_EXTENSION);
+			}
+			return false;
+		}
+	};
+
+	/** Transforms an URI into the platform string representation. */
+	private static final Function<URI, String> URI_TO_STRING = new Function<URI, String>() {
+		public String apply(URI input) {
+			String uriString = null;
+			if (input != null) {
+				uriString = input.toPlatformString(true);
+				if (uriString == null) {
+					uriString = input.toString();
+				}
+			}
+			return uriString;
+		}
+	};
+
+	/**
+	 * Predicate testing whether a {@link Resource} is a UML resource.
+	 */
+	private static final Predicate<Resource> IS_UML_RESOURCE = new Predicate<Resource>() {
+		public boolean apply(Resource input) {
+			if (input == null) {
+				// Null is not an UML resource
+				return false;
+			}
+
+			URI uri = input.getURI();
+			return (uri != null) && UmlModel.UML_FILE_EXTENSION.equals(uri.fileExtension())
+					&& !input.getContents().isEmpty() //
+					&& input.getContents().get(0) instanceof Element;
+		}
+	};
+
+	/**
+	 * Hidden constructor for this utility class.
+	 */
+	private PapyrusContextUtil() {
+		// defeat instantiation
+	}
+
+	/**
+	 * Determines whether the comparison concerns Papyrus models.
+	 * 
+	 * @param comparison
+	 *            the {@link Comparison} to check.
+	 * @return {@code true} if the comparison concerns Papyrus models, {@code false} otherwise.
+	 */
+	public static boolean isPapyrusContext(Comparison comparison) {
+		final IComparisonScope2 comparisonScope = (IComparisonScope2)EcoreUtil
+				.getAdapter(comparison.eAdapters(), IComparisonScope2.class);
+		if (comparisonScope != null) {
+			return containsPapyrusURI(transform(comparisonScope.getAllInvolvedResourceURIs(), URI_TO_STRING));
+		}
+		// Fallback if the scope is not available. This way of determining the Papyrus context is not as
+		// accurate since the MatchResources are already minimized.
+		return containsPapyrusURI(comparison.getMatchedResources());
+	}
+
+	/**
+	 * Specifies whether the given matched resources contain a Papyrus resource.
+	 * 
+	 * @param matchedResources
+	 *            the list of matched resources to check.
+	 * @return <code>true</code> if the matched resources contain a Papyrus resources, <code>false</code>
+	 *         otherwise.
+	 */
+	private static boolean containsPapyrusURI(List<MatchResource> matchedResources) {
+		final Builder<String> setBuilder = ImmutableSet.builder();
+		for (MatchResource res : matchedResources) {
+			for (String uri : ImmutableSet.of(res.getLeftURI(), res.getRightURI(), res.getOriginURI())) {
+				if (uri != null) {
+					setBuilder.add(uri);
+				}
+			}
+		}
+		return containsPapyrusURI(setBuilder.build());
+	}
+
+	/**
+	 * Specifies whether the given URI strings contain a Papyrus resource.
+	 * 
+	 * @param uris
+	 *            the set of uris to check.
+	 * @return <code>true</code> if uris contain a Papyrus resources, <code>false</code> otherwise.
+	 */
+	private static boolean containsPapyrusURI(Collection<String> uris) {
+		return any(uris, ENDS_WITH_PAPYRUS_EXTENSION);
+	}
+
+	/**
+	 * Obtains a predicate testing whether a resource is a UML resource.
+	 * 
+	 * @return the UML resource predicate
+	 */
+	public static Predicate<Resource> isUMLResource() {
+		return IS_UML_RESOURCE;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/helper/CompareDiagramViewTypeHelper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/helper/CompareDiagramViewTypeHelper.java
new file mode 100644
index 0000000..3768a1a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/helper/CompareDiagramViewTypeHelper.java
@@ -0,0 +1,191 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.helper;
+
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
+import org.eclipse.papyrus.gitlight.compare.ui.util.ModelSetWrapper;
+import org.eclipse.papyrus.infra.architecture.ArchitectureDescriptionUtils;
+import org.eclipse.papyrus.infra.core.architecture.merged.MergedArchitectureViewpoint;
+import org.eclipse.papyrus.infra.core.resource.BadStateException;
+import org.eclipse.papyrus.infra.core.resource.ModelIdentifiers;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.DiModel;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
+import org.eclipse.papyrus.infra.gmfdiag.common.helper.GMFDiagramViewTypeHelper;
+import org.eclipse.papyrus.infra.viewpoints.policy.PolicyChecker;
+
+/**
+ * View-type helper that can query the Architecture Context view type associations in {@link ResourceSet}s
+ * that are not {@link ModelSet}s.
+ */
+public class CompareDiagramViewTypeHelper extends GMFDiagramViewTypeHelper {
+
+	/**
+	 * Initializes me.
+	 */
+	public CompareDiagramViewTypeHelper() {
+		super();
+	}
+
+	@Override
+	public boolean isSupported(EObject view) {
+		if (!(view instanceof Diagram)) {
+			return false;
+		}
+
+		Resource resource = view.eResource();
+		if (resource != null) {
+			// Don't need our implementation if the resource is in a native ModelSet
+			ResourceSet rset = resource.getResourceSet();
+			return rset != null && !(rset instanceof ModelSet);
+		}
+
+		return false;
+	}
+
+	/**
+	 * Obtains the most appropriate policy checker for a given {@code view}.
+	 * 
+	 * @param diagram
+	 *            a diagram
+	 * @return its policy checker
+	 */
+	@Override
+	protected PolicyChecker getPolicyChecker(EObject view) {
+		ModelSet modelSet = getModelSet(view);
+		Collection<MergedArchitectureViewpoint> viewpoints = new ArchitectureDescriptionUtils(modelSet)
+				.getArchitectureViewpoints();
+		return PolicyChecker.getFor(viewpoints);
+	}
+
+	protected ModelSet getModelSet(EObject view) {
+		ModelSet result;
+
+		// We already checked that it's in a resource
+		Resource resource = view.eResource();
+		ModelSetAdapter adapter = (ModelSetAdapter) EcoreUtil.getExistingAdapter(resource,
+				ModelSetAdapter.class);
+		if (adapter != null) {
+			result = adapter.getModelSet();
+		} else {
+			result = createModelSet(resource);
+			resource.eAdapters().add(new ModelSetAdapter(result));
+		}
+
+		return result;
+	}
+
+	protected ModelSet createModelSet(Resource resource) {
+		// We already checked that it's in a resource set
+		ResourceSet rset = resource.getResourceSet();
+		ModelSetWrapper result = new ModelSetWrapper(rset);
+
+		result.setURIWithoutExtension(resource.getURI().trimFileExtension());
+		result.registerModel(new DiModel());
+		result.registerModel(new SashModel());
+
+		for (String next : getArchitectureModels()) {
+			try {
+				result.loadModel(next);
+			} catch (BadStateException e) {
+				PapyrusCompareUIPlugin.getDefault().getLog()
+						.log(new Status(IStatus.WARNING, PapyrusCompareUIPlugin.PLUGIN_ID,
+								"Failed to load Papyrus model " + next, e)); //$NON-NLS-1$
+			}
+		}
+
+		return result;
+	}
+
+	protected ModelIdentifiers getArchitectureModels() {
+		return new ModelIdentifiers(DiModel.DI_MODEL_ID, SashModel.MODEL_ID);
+	}
+
+	//
+	// Nested types
+	//
+
+	/**
+	 * Cache of fake model-sets for view-type helping on diagrams.
+	 *
+	 * @author Christian W. Damus
+	 */
+	private static class ModelSetAdapter extends AdapterImpl {
+		private final ModelSet modelSet;
+
+		ModelSetAdapter(ModelSet modelSet) {
+			super();
+
+			this.modelSet = modelSet;
+		}
+
+		ModelSet getModelSet() {
+			return modelSet;
+		}
+
+		@Override
+		public boolean isAdapterForType(Object type) {
+			return type == ModelSetAdapter.class;
+		}
+
+		@Override
+		public void unsetTarget(Notifier oldTarget) {
+			super.unsetTarget(oldTarget);
+
+			if (getTarget() == null) {
+				if (modelSet instanceof ModelSetWrapper) {
+					// First, detach for safe clean-up of shared resources
+					// to avoid unloading them
+					((ModelSetWrapper) modelSet).detach();
+				}
+
+				modelSet.unload();
+			}
+		}
+
+		@Override
+		public void notifyChanged(Notification msg) {
+			if (msg.isTouch()) {
+				return;
+			}
+
+			if (msg.getNotifier() instanceof Resource) {
+				switch (msg.getFeatureID(Resource.class)) {
+				case Resource.RESOURCE__IS_LOADED:
+					if (!msg.getNewBooleanValue()) {
+						// We have done with this resource
+						((Resource) msg.getNotifier()).eAdapters().remove(this);
+					}
+					break;
+				default:
+					// Pass
+					break;
+				}
+			}
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/InternationalizationFileInclusionTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/InternationalizationFileInclusionTester.java
new file mode 100644
index 0000000..0b69462
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/InternationalizationFileInclusionTester.java
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.logical;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.compare.ide.logical.IModelInclusionTester;
+
+/**
+ * This {@link IModelInclusionTester} includes the <code>properties</code>-file when dealing with Papyrus
+ * models.
+ * <p>
+ * It does so not by blindly including any <code>properties</code>-file, but tests whether there is a
+ * <code>di</code>-file next to it and only includes the <code>properties</code>-file if a
+ * <code>di</code>-file was found.
+ * </p>
+ */
+public class InternationalizationFileInclusionTester implements IModelInclusionTester {
+
+	/** di-file extension. */
+	private static final String DI = ".di"; //$NON-NLS-1$
+
+	/** properties-file extension. */
+	private static final String PROPERTIES_EXT = "properties"; //$NON-NLS-1$
+
+	/** Regexp pattern to match locale and properties-file extension. */
+	private static final String PATTERN_STRING = "[.]*(?:_..|_.._..)\\." + PROPERTIES_EXT + "$"; //$NON-NLS-1$ //$NON-NLS-2$
+
+	/** Compiled regexp pattern. */
+	private static final Pattern PATTERN = Pattern.compile(PATTERN_STRING);
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean shouldInclude(IFile file) {
+		if (file != null && file.getParent() != null) {
+			if (PROPERTIES_EXT.equals(file.getFileExtension())) {
+				Matcher matcher = PATTERN.matcher(file.getName());
+				if (matcher.find()) {
+					String diFileName = matcher.replaceFirst(DI);
+					Path diFilePath = new Path(diFileName);
+					IFile equallyNamedDiFile = file.getParent().getFile(diFilePath);
+					return equallyNamedDiFile.exists();
+				}
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/view/PapyrusLMVHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/view/PapyrusLMVHandler.java
new file mode 100644
index 0000000..3d60df5
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/logical/view/PapyrusLMVHandler.java
@@ -0,0 +1,66 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.logical.view;
+
+import com.google.common.collect.Sets;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.compare.ide.ui.internal.logical.view.AbstractLogicalModelViewHandler;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
+import org.eclipse.papyrus.infra.onefile.model.ISubResourceFile;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Handle, for the Logical Model View, the Papyrus editors activations & files selections.
+ */
+public class PapyrusLMVHandler extends AbstractLogicalModelViewHandler {
+
+	/**
+	 * Retrieve the files associated with the given editor (via its {@link IWorkbenchPart}) or the given selection.
+	 * 
+	 * @param part
+	 *            the {@link IWorkbenchPart}.
+	 * @param selection
+	 *            the {@link ISelection}.
+	 * @return the files associated with the given editor or the given selection.
+	 */
+	@Override
+	public Collection<IFile> getFiles(IWorkbenchPart part, ISelection selection) {
+		final Set<IFile> files = Sets.newLinkedHashSet();
+		if (part instanceof IEditorPart) {
+			IEditorInput editorInput = ((IEditorPart)part).getEditorInput();
+			if (editorInput instanceof IFileEditorInput) {
+				files.add(((IFileEditorInput)editorInput).getFile());
+			}
+		}
+		if (files.isEmpty() && selection instanceof TreeSelection) {
+			Object element = ((TreeSelection)selection).getFirstElement();
+			if (element instanceof IPapyrusFile) {
+				files.add(((IPapyrusFile)element).getMainFile());
+			} else if (element instanceof ISubResourceFile) {
+				files.add(((ISubResourceFile)element).getFile());
+			}
+		}
+		return files;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetAdapterFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetAdapterFactory.java
new file mode 100644
index 0000000..8a7eb25
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetAdapterFactory.java
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.properties;
+
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.internal.CompareEditor;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * This allows to define the property sheet page of CompareEditor to use.
+ * We need this to define our proper property sheet page instead of the ExtendedPropertySheetPage.
+ */
+@SuppressWarnings("restriction")
+public class CompareEditorPropertySheetAdapterFactory implements IAdapterFactory {
+
+	/** The extended property sheet page provided by this adapter factory. */
+	private TabbedPropertySheetPage propertySheetPage;
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(Object, Class)
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public Object getAdapter(Object adaptableObject, Class adapterType) {
+		if (adapterType == IPropertySheetPage.class) {
+			if (propertySheetPage == null) {
+				if (adaptableObject instanceof CompareEditor) {
+					IEditorInput editorInput = ((CompareEditor) adaptableObject).getEditorInput();
+					if (editorInput instanceof CompareEditorInput) {
+						final TabbedPropertySheetPage tabbedPropertySheetPage = new TabbedPropertySheetPage(new CompareEditorPropertySheetPageContributor()) {
+							@Override
+							public void dispose() {
+								// Do not dispose
+							}
+						};
+						propertySheetPage = tabbedPropertySheetPage;
+					}
+				}
+			}
+			return propertySheetPage;
+		}
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public Class[] getAdapterList() {
+		return new Class[] { IPropertySheetPage.class };
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetPageContributor.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetPageContributor.java
new file mode 100644
index 0000000..8feb9f2
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/properties/CompareEditorPropertySheetPageContributor.java
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.properties;
+
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+
+/**
+ * This allows to declare a property sheet page contributor for the CompareEditor of EMF Compare.
+ */
+public class CompareEditorPropertySheetPageContributor implements ITabbedPropertySheetPageContributor {
+
+	/**
+	 * Default constructor.
+	 */
+	public CompareEditorPropertySheetPageContributor() {
+		// Do nothing
+	}
+
+	/**
+	 * Define the contributor id corresponding to the identifier of papyrus property view.
+	 * [{@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
+	 */
+	@Override
+	public String getContributorId() {
+		return "TreeOutlinePage"; //$NON-NLS-1$ a
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/AnnotationDiffsFilter.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/AnnotationDiffsFilter.java
new file mode 100644
index 0000000..15de577
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/AnnotationDiffsFilter.java
@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters;
+
+import com.google.common.base.Predicate;
+
+import org.eclipse.emf.common.util.BasicEMap.Entry;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.internal.spec.ReferenceChangeSpec;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.AbstractDifferenceFilter;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+
+/**
+ * The filter to hide papyrus annotations differences.
+ */
+@SuppressWarnings("restriction")
+public class AnnotationDiffsFilter extends AbstractDifferenceFilter {
+
+	/**
+	 * The predicate provided by this filter when it is selected.
+	 */
+	private static final Predicate<EObject> SELECTED_PREDICATE = new Predicate<EObject>() {
+		public boolean apply(final EObject input) {
+			EObject data = input;
+			if (input instanceof TreeNode) {
+				data = ((TreeNode) input).getData();
+			}
+
+			Diff diff = null;
+			if (data instanceof Diff) {
+				diff = (Diff) data;
+			}
+
+			boolean isPapyrusAnnotation = false;
+			if (null != diff && null != diff.getMatch()) {
+				EObject eObject = diff.getMatch().getLeft();
+				if (null == eObject) {
+					eObject = diff.getMatch().getRight();
+				}
+
+				// Remove the EAnnotation if this is a papyrus EAnnotation
+				if (eObject instanceof EAnnotation) {
+					isPapyrusAnnotation = ((EAnnotation) eObject).getSource().equals(GitConstants.VERSION_ANNOTATION);
+					// Remove too if this is a detail entry of papyrus EAnnotation
+				} else if (eObject instanceof Entry<?, ?> && eObject.eContainer() instanceof EAnnotation) {
+					final EAnnotation parentAnnotation = (EAnnotation) eObject.eContainer();
+					isPapyrusAnnotation = parentAnnotation.getSource().equals(GitConstants.VERSION_ANNOTATION);
+				}
+
+				// In some cases, the managed element is the parent byt the real value is the EAnnotation, we need to check it
+				if (!isPapyrusAnnotation && diff instanceof ReferenceChangeSpec) {
+					final ReferenceChangeSpec rcs = (ReferenceChangeSpec) diff;
+					final EObject value = rcs.getValue();
+
+					if (value instanceof EAnnotation) {
+						isPapyrusAnnotation = ((EAnnotation) value).getSource().equals(GitConstants.VERSION_ANNOTATION);
+					}
+				}
+			}
+
+			return isPapyrusAnnotation;
+		}
+	};
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.AbstractDifferenceFilter#getPredicateWhenSelected()
+	 */
+	@Override
+	public Predicate<? super EObject> getPredicateWhenSelected() {
+		return SELECTED_PREDICATE;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/ManagedDiffsFilter.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/ManagedDiffsFilter.java
new file mode 100644
index 0000000..d51fa68
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/ManagedDiffsFilter.java
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters;
+
+import com.google.common.base.Predicate;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceState;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.AbstractDifferenceFilter;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.tree.TreeNode;
+
+/**
+ * The filter to hide managed differences.
+ */
+public class ManagedDiffsFilter extends AbstractDifferenceFilter {
+
+	/**
+	 * The predicate provided by this filter when it is selected.
+	 */
+	private static final Predicate<EObject> SELECTED_PREDICATE = new Predicate<EObject>() {
+		public boolean apply(EObject input) {
+			EObject data = input;
+			if (input instanceof TreeNode) {
+				data = ((TreeNode) input).getData();
+			}
+
+			Diff diff = null;
+			if (data instanceof Diff) {
+				diff = (Diff) data;
+			}
+
+			return null != diff ? !diff.getState().equals(DifferenceState.UNRESOLVED) : false;
+		}
+	};
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.AbstractDifferenceFilter#getPredicateWhenSelected()
+	 */
+	@Override
+	public Predicate<? super EObject> getPredicateWhenSelected() {
+		return SELECTED_PREDICATE;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/PapyrusDiagramTechnicalElementsFilter.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/PapyrusDiagramTechnicalElementsFilter.java
new file mode 100644
index 0000000..7255b3a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/filters/PapyrusDiagramTechnicalElementsFilter.java
@@ -0,0 +1,171 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.filters;
+
+import static com.google.common.base.Predicates.notNull;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import java.util.Arrays;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.AbstractDifferenceFilter;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.papyrus.infra.gmfdiag.css.notation.ForceValueHelper;
+
+/**
+ * <p>
+ * A filter that excludes technical elements peculiar to Papyrus diagrams. These are, at least
+ * </p>
+ * <ul>
+ * <li>addition of, deletion of, and changes in the applied stereotype comment shapes and links for
+ * stereotypes that do not use them (in which case those views exist but are hidden from view)</li>
+ * </ul>
+ */
+public class PapyrusDiagramTechnicalElementsFilter extends AbstractDifferenceFilter {
+
+	/**
+	 * A predicate matching a hidden applied-stereotype comment shape or the link tethering such shape to the
+	 * base element shape.
+	 */
+	private static final Predicate<EObject> IS_HIDDEN_STEREOTYPE_COMMENT_VIEW = new Predicate<EObject>() {
+		public boolean apply(EObject input) {
+			if (!(input instanceof View)) {
+				return false;
+			}
+
+			View view = (View)input;
+			if (view.getType() == null) {
+				return false;
+			}
+
+			boolean result;
+
+			switch (view.getType()) {
+				case "StereotypeCommentLink": //$NON-NLS-1$
+					Edge edge = (Edge)view;
+					View source = edge.getSource();
+					View target = edge.getTarget();
+
+					// Visibility is always implied by the connected nodes
+					result = (source == null) || !isCSSVisible(source) //
+							|| (target == null) || !isCSSVisible(target);
+					break;
+				case "StereotypeComment": //$NON-NLS-1$
+					result = !isCSSVisible(view);
+					break;
+				default:
+					result = false;
+					break;
+			}
+
+			return result;
+		}
+
+		/**
+		 * Determines a {@code view}'s visibility according to Papyrus's CSS-based scheme and the assumption
+		 * that the default CSS styles for these applied-stereotype views are active that override the GMF
+		 * default visibility from {@code true} to {@code false}.
+		 * 
+		 * @param view
+		 *            a CSS-managed applied-stereotype view
+		 * @return whether the {@code view} is CSSly visible
+		 */
+		private boolean isCSSVisible(View view) {
+			// The view appears to be visible
+			return view.isVisible()
+					// and not by accident
+					&& ForceValueHelper.isSet(view, NotationPackage.Literals.VIEW__VISIBLE, Boolean.TRUE);
+		}
+	};
+
+	/**
+	 * The predicate provided by this filter when it is selected.
+	 */
+	private static final Predicate<EObject> SELECTED_PREDICATE = new Predicate<EObject>() {
+		public boolean apply(EObject input) {
+			EObject data = input;
+			if (input instanceof TreeNode) {
+				data = ((TreeNode)input).getData();
+			}
+
+			Match match = null;
+			if (data instanceof Match) {
+				match = (Match)data;
+			} else if (data instanceof Diff) {
+				match = ((Diff)data).getMatch();
+			}
+
+			if (match != null) {
+				// We don't show diffs where the view is hidden on all sides
+				// where it exists
+				return Iterables.all(getMatchedObjects(match), IS_HIDDEN_STEREOTYPE_COMMENT_VIEW);
+			}
+
+			return false;
+		}
+	};
+
+	/**
+	 * A predicate matching namespace URIs of Papyrus that we key on for the likely presence of
+	 * applied-stereotype comments.
+	 */
+	private static final Predicate<String> IS_PAPYRUS_NAMESPACE = new Predicate<String>() {
+		public boolean apply(String input) {
+			// For example, the http://www.eclipse.org/papyrus/infra/gmfdiag/style namespace
+			// for styles that always are instantiated in the applied-stereotype comments
+			return input.startsWith("http://www.eclipse.org/papyrus/infra/gmfdiag/"); //$NON-NLS-1$
+		}
+	};
+
+	/**
+	 * Initializes me.
+	 */
+	public PapyrusDiagramTechnicalElementsFilter() {
+		super();
+	}
+
+	@Override
+	public boolean isEnabled(IComparisonScope scope, Comparison comparison) {
+		return (scope != null) && Iterables.any(scope.getNsURIs(), IS_PAPYRUS_NAMESPACE);
+	}
+
+	@Override
+	public Predicate<? super EObject> getPredicateWhenSelected() {
+		return SELECTED_PREDICATE;
+	}
+
+	/**
+	 * Obtains an iterable over all of the objects matched by a {@code match}.
+	 * 
+	 * @param match
+	 *            a match
+	 * @return the one to three objects that it matches, in order the left (if any), then the right (if any),
+	 *         and finally the ancestor (if any)
+	 */
+	static Iterable<EObject> getMatchedObjects(Match match) {
+		return Iterables.filter(Arrays.asList(match.getLeft(), match.getRight(), match.getOrigin()),
+				notNull());
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/groups/PapyrusGroupProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/groups/PapyrusGroupProvider.java
new file mode 100644
index 0000000..0fd8d52
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/internal/structuremergeviewer/groups/PapyrusGroupProvider.java
@@ -0,0 +1,460 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.internal.structuremergeviewer.groups;
+
+import static com.google.common.base.Predicates.not;
+import static com.google.common.collect.Collections2.filter;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.MatchResource;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl.BasicDifferenceGroupImpl;
+import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.nodes.MatchNode;
+import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.AbstractDifferenceGroupProvider;
+import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.ECrossReferenceAdapter;
+import org.eclipse.emf.edit.tree.TreeFactory;
+import org.eclipse.emf.edit.tree.TreeNode;
+import org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.facet.PapyrusFacetContentProviderWrapper;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.context.PapyrusContextUtil;
+import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype;
+import org.eclipse.papyrus.uml.tools.providers.SemanticUMLContentProvider;
+
+/**
+ * This implementation of a
+ * {@link org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider} will be used to
+ * group the differences of Papyrus models.
+ */
+@SuppressWarnings("restriction")
+public class PapyrusGroupProvider extends AbstractDifferenceGroupProvider {
+
+	/**
+	 * Predicate testing whether a {@link MatchResource} is a UML resource (file extension is .uml).
+	 */
+	private static final Predicate<? super MatchResource> IS_UML_RESOURCE = new Predicate<MatchResource>() {
+		private final Predicate<Resource> isUML = PapyrusContextUtil.isUMLResource();
+
+		public boolean apply(MatchResource input) {
+			return input != null //
+					&& (isUML.apply(input.getLeft()) || isUML.apply(input.getRight())
+							|| isUML.apply(input.getOrigin()));
+		}
+	};
+
+	/**
+	 * Specialized {@link BasicDifferenceGroupImpl} for Papyrus models.
+	 */
+	public static class PapyrusDifferenceGroup extends BasicDifferenceGroupImpl {
+
+		/** Map for retrieving the corresponding TreeNode of a model element. **/
+		private Map<EObject, TreeNode> valueToMatchNode;
+
+		/** Map for retrieving the context UML element of a notation (Diagram/Table/etc.). **/
+		private HashMap<EObject, EObject> notationToContextualParent;
+
+		/** A predicate testing whether a match matches notations (Diagrams/Tables/etc.). **/
+		private final Predicate<Match> matchValueNotationPredicate = new Predicate<Match>() {
+			public boolean apply(Match match) {
+				EObject matchValue = getMatchValue(match);
+				return (matchValue != null) && ViewPrototype.isViewObject(matchValue);
+			}
+		};
+
+		/**
+		 * Initializes me with my comparison and cross-referencer.
+		 * 
+		 * @param comparison
+		 *            the comparison being presented
+		 * @param crossReferenceAdapter
+		 *            a cross-reference adapter to propagate down the tree
+		 */
+		public PapyrusDifferenceGroup(Comparison comparison, ECrossReferenceAdapter crossReferenceAdapter) {
+			super(comparison, Predicates.<Diff> alwaysTrue(), crossReferenceAdapter);
+			valueToMatchNode = new HashMap<>();
+			notationToContextualParent = new HashMap<>();
+			retrieveContextualNotationParents(MergeViewerSide.LEFT);
+			retrieveContextualNotationParents(MergeViewerSide.RIGHT);
+		}
+
+		/**
+		 * Makes use of the PapyrusFacetContentProviderWrapper to retrieve the contextual UML element for each
+		 * notation of the Comparison.
+		 * 
+		 * @param side
+		 *            Defines the comparison side for retrieving the elements
+		 */
+		private void retrieveContextualNotationParents(MergeViewerSide side) {
+			ResourceSet resourceSet = getResourceSet(getComparison(), side);
+			if (resourceSet != null) {
+				SemanticUMLContentProvider contentProvider = new SemanticUMLContentProvider(resourceSet);
+				try {
+					for (Object root : contentProvider.getElements(null)) {
+						retrieveNotationParents(root, contentProvider);
+					}
+				} finally {
+					contentProvider.dispose();
+				}
+			}
+		}
+
+		/**
+		 * Recursively traverses the UML mode tree and maps all notations and their contextual parent.
+		 * 
+		 * @param object
+		 *            the child Object
+		 * @param facetContentProviderWrapper
+		 *            the {@link PapyrusFacetContentProviderWrapper}
+		 */
+		private void retrieveNotationParents(Object object, SemanticUMLContentProvider contentProvider) {
+			Function<Object, EObject> asEObject = adapt(EObject.class);
+
+			// These children are EMF Facet TreeObjects
+			for (Object child : contentProvider.getChildren(object)) {
+				// Get the encapsulated model object
+				EObject eObjectChild = asEObject.apply(child);
+				if (eObjectChild != null) {
+					// This is a legitimate case
+					EObject eObjectParent = asEObject.apply(object);
+					if (eObjectParent != null && ViewPrototype.isViewObject(eObjectChild)) {
+						if (!notationToContextualParent.containsKey(eObjectChild)) {
+							notationToContextualParent.put(eObjectChild, eObjectParent);
+						}
+					}
+					retrieveNotationParents(child, contentProvider);
+				}
+			}
+		}
+
+		static <T> Function<Object, T> adapt(final Class<T> adapterType) {
+			return new Function<Object, T>() {
+				public T apply(Object input) {
+					if (adapterType.isInstance(input)) {
+						return adapterType.cast(input);
+					} else if (input instanceof IAdaptable) {
+						return ((IAdaptable)input).getAdapter(adapterType);
+					} else {
+						return null;
+					}
+				}
+			};
+		}
+
+		@Override
+		protected List<TreeNode> buildMatchTrees() {
+			final List<TreeNode> matchTrees = new ArrayList<TreeNode>();
+
+			final Collection<Match> matches = getComparison().getMatches();
+
+			/*
+			 * Notation matches rely on information of other match trees for proper grouping (valueToMatchNode
+			 * map needs to be populated ). So first all match trees for non-notation matches are built and
+			 * the notation match sub trees are built separately in a second iteration.
+			 */
+			for (Match match : filter(matches, not(isMatchValueANotation()))) {
+				MatchNode matchNode = buildTree(match);
+				if (matchNode != null) {
+					matchTrees.add(matchNode);
+				}
+			}
+
+			// But, we still want to present all notation views first as in the Model Explorer
+			List<TreeNode> nodesToSort = Lists.newArrayList();
+			for (Match match : filter(matches, isMatchValueANotation())) {
+				TreeNode notationNode = buildTree(match);
+				if (notationNode != null) {
+					TreeNode parentNode = retrieveParentNode(notationNode, getParent(getMatchValue(match)));
+					parentNode.getChildren().add(notationNode);
+					notationNode.setParent(parentNode);
+					nodesToSort.add(parentNode); // This needs sorting
+				}
+			}
+
+			if (!nodesToSort.isEmpty()) {
+				Comparator<TreeNode> sortBy = treeNodeOrdering();
+				for (TreeNode next : nodesToSort) {
+					ECollections.sort(next.getChildren(), sortBy);
+				}
+			}
+
+			return matchTrees;
+		}
+
+		/**
+		 * Obtain a comparator for sorting tree nodes by kind:
+		 * <ol>
+		 * <li>diffs of the object represented by the parent node (its own details) should come before
+		 * anything to do with child objects</li>
+		 * <li>notation views (diagrams, tables, etc.)</li>
+		 * <li>all other children</li>
+		 * </ol>
+		 * 
+		 * @return the tree node comparator
+		 */
+		protected Comparator<TreeNode> treeNodeOrdering() {
+			return new Comparator<TreeNode>() {
+				public int compare(TreeNode o1, TreeNode o2) {
+					int key1 = computeSortKey(o1);
+					int key2 = computeSortKey(o2);
+					return key1 - key2;
+				}
+
+				private int computeSortKey(TreeNode node) {
+					EObject object = node.getData();
+					if (object instanceof Diff) {
+						// Diffs of the object should come before anything about children
+						return -2;
+					}
+
+					if (object instanceof Match //
+							&& isMatchValueANotation().apply((Match)object)) {
+
+						// These come next
+						return -1;
+					}
+
+					// Everything else follows
+					return 0;
+				}
+			};
+		}
+
+		/**
+		 * Creates a predicate for determining if the associated EObject of a Match is an instance of the
+		 * given class.
+		 * 
+		 * @param clazz
+		 *            the Class
+		 * @return the created Predicate
+		 */
+		private Predicate<Match> isMatchValueANotation() {
+			return matchValueNotationPredicate;
+		}
+
+		/**
+		 * Creates a new TreeNode.
+		 * 
+		 * @param data
+		 *            data object of the node
+		 * @return created TreeNode
+		 */
+		private TreeNode createTreeNode(EObject data) {
+			TreeNode node = TreeFactory.eINSTANCE.createTreeNode();
+			node.setData(data);
+			return node;
+		}
+
+		/**
+		 * Determines the parent node of the given TreeNode. If the parent node doesn't exist yet the
+		 * corresponding node and (sub) tree is created and merged into the match tree.
+		 * 
+		 * @param childNode
+		 *            the child TreeNode
+		 * @param parentObject
+		 *            the data object of the parent node
+		 * @return (new) parent TreeNode
+		 */
+		private TreeNode retrieveParentNode(TreeNode childNode, EObject parentObject) {
+			TreeNode parentNode = getOrCreateParentNode(childNode, parentObject);
+			if (!(parentNode instanceof MatchNode)) {
+				// the parent node is a newly created node -> the corresponding subtree has to be created
+				createSubTree(parentNode, getParent(parentObject));
+			}
+			return parentNode;
+
+		}
+
+		/**
+		 * Retrieves the parent node of given TreeNode. If no matching node exists in the match tree a new
+		 * node is created
+		 * 
+		 * @param childNode
+		 *            the child TreeNode
+		 * @param parentObject
+		 *            (new) parent TreeNode
+		 * @return (new) parent TreeNode
+		 */
+		private TreeNode getOrCreateParentNode(TreeNode childNode, EObject parentObject) {
+			if (parentObject == null) {
+				// we have no parent to add this childNode; this may happen if a notation has no context;
+				// thus,
+				// we add it as root node (childNode is the parent without any parent)
+				return childNode;
+			}
+
+			TreeNode parentNode = valueToMatchNode.get(parentObject);
+			if (parentNode == null) {
+				parentNode = createTreeNode(parentObject);
+			}
+
+			childNode.setParent(parentNode);
+			parentNode.getChildren().add(childNode);
+			return parentNode;
+		}
+
+		/**
+		 * Retrieves the contextual parent of the given EObject.
+		 * 
+		 * @param value
+		 *            the child EObject
+		 * @return parent EObject
+		 */
+		private EObject getParent(EObject value) {
+			EObject result = notationToContextualParent.get(value);
+			if (result == null && value != null) {
+				result = value.eContainer();
+			}
+			return result;
+		}
+
+		/**
+		 * Creates the subtree for the given tree node with a recursive bottom-up approach.
+		 *
+		 * @param treeNode
+		 *            the TreeNode
+		 * @param parentObject
+		 *            the parent EObject
+		 */
+		private void createSubTree(TreeNode treeNode, EObject parentObject) {
+			if (parentObject == null) {
+				children.add(treeNode);
+				return;
+			}
+			TreeNode parentNode = getOrCreateParentNode(treeNode, parentObject);
+			treeNode.setParent(parentNode);
+			parentNode.getChildren().add(treeNode);
+			if (parentNode instanceof MatchNode) {
+				return;
+			}
+			createSubTree(parentNode, getParent(parentObject));
+		}
+
+		@Override
+		protected void populateMatchNode(MatchNode matchNode) {
+			super.populateMatchNode(matchNode);
+			if (!matchNode.getChildren().isEmpty()) {
+				valueToMatchNode.put(getMatchValue(matchNode.getMatch()), matchNode);
+			}
+		}
+
+		/**
+		 * Returns the corresponding EObject for the given Match.
+		 * 
+		 * @param match
+		 *            the Match
+		 * @return the corresponding EObject
+		 */
+		private EObject getMatchValue(Match match) {
+			if (match.getLeft() != null) {
+				return match.getLeft();
+			}
+			if (match.getRight() != null) {
+				return match.getRight();
+			}
+			return match.getOrigin();
+		}
+
+		/**
+		 * Determines the object of the given match and side.
+		 * 
+		 * @param comparison
+		 *            the {@link Comparison}.
+		 * @param side
+		 *            the {@link MergeViewerSide}.
+		 * @return the determined {@link Object}, may be {@code null}.
+		 */
+		private ResourceSet getResourceSet(Comparison comparison, MergeViewerSide side) {
+			for (MatchResource matchResource : comparison.getMatchedResources()) {
+				Resource resource = getResource(matchResource, side);
+				if (resource != null) {
+					return resource.getResourceSet();
+				}
+			}
+			return null;
+		}
+
+		/**
+		 * Determines the resource of the given match and side.
+		 * 
+		 * @param matchResource
+		 *            the {@link MatchResource}.
+		 * @param side
+		 *            the {@link MergeViewerSide}.
+		 * @return the determined {@link Resource}, may be {@code null}.
+		 */
+		private Resource getResource(MatchResource matchResource, MergeViewerSide side) {
+			if (side != null) {
+				switch (side) {
+					case LEFT:
+						return matchResource.getLeft();
+					case RIGHT:
+						return matchResource.getRight();
+					case ANCESTOR:
+						return matchResource.getOrigin();
+				}
+			}
+			return null;
+		}
+
+	}
+
+	@Override
+	protected Collection<? extends IDifferenceGroup> buildGroups(Comparison comparison) {
+		PapyrusDifferenceGroup group = new PapyrusDifferenceGroup(getComparison(),
+				getCrossReferenceAdapter());
+		group.buildSubTree();
+		return ImmutableList.of(group);
+	}
+
+	@Override
+	public boolean isEnabled(IComparisonScope scope, Comparison comparison) {
+		return super.isEnabled(scope, comparison) && PapyrusContextUtil.isPapyrusContext(comparison)
+				&& hasAtLeastOneUMLResource(comparison);
+	}
+
+	/**
+	 * Specifies whether the given comparison has at least one UML resource in its matched resources.
+	 * 
+	 * @param comparison
+	 *            The comparison to test.
+	 * @return <code>true</code> if it has at least one {@link MatchResource} of a UML resource,
+	 *         <code>false</code> otherwise.
+	 */
+	private boolean hasAtLeastOneUMLResource(Comparison comparison) {
+		return Iterables.any(comparison.getMatchedResources(), IS_UML_RESOURCE);
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/util/ModelSetWrapper.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/util/ModelSetWrapper.java
new file mode 100644
index 0000000..39e8c64
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.ui/src/org/eclipse/papyrus/gitlight/compare/ui/util/ModelSetWrapper.java
@@ -0,0 +1,715 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.ui.util;
+
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MapMaker;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationWrapper;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.DelegatingEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EPackage.Registry;
+import org.eclipse.emf.ecore.resource.ContentHandler;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.TransactionalEditingDomainImpl;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.uml.tools.model.UmlModel;
+
+/**
+ * This class wraps a resource set into a ModelSet with minimal changes to be compliant to the expected
+ * Profile Migration mechanism of Eclipse Luna.
+ */
+public class ModelSetWrapper extends ModelSet {
+
+	/**
+	 * Mapping of resources to their read-only setting. Needed when a new editing domain is created.
+	 */
+	private Map<Resource, Boolean> resourceToReadOnlyMap = new HashMap<Resource, Boolean>();
+
+	/**
+	 * The resource set being wrapped.
+	 */
+	private ResourceSet resourceSet;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param resourceSet
+	 *            resource set to be wrapped.
+	 */
+	public ModelSetWrapper(ResourceSet resourceSet) {
+		super();
+
+		this.resourceSet = resourceSet;
+
+		// We need to ensure that UML profiles are shared by myself and the
+		// resource set that I wrap, because a profile must be loaded exactly once
+		// to avoid confusing the identity of stereotypes. Otherwise, stereotype
+		// applications repaired in this model-set context would be deemed invalid
+		// in the wrapped resource-set context because there the UML API
+		// is seeing the wrong copy of the Stereotype as their definition
+		// cf. http://eclip.se/526932
+		this.resources = new ProxyingResourceList();
+	}
+
+	@Override
+	protected Resource demandCreateResource(URI uri) {
+		if (shouldProxy(uri)) {
+			// Create the real resource in the wrapped resource set and proxy it here
+			Resource delegate = resourceSet.createResource(uri, ContentHandler.UNSPECIFIED_CONTENT_TYPE);
+			if (delegate != null) {
+				// Get the proxy
+				return getResource(uri, false);
+			}
+		}
+
+		return super.demandCreateResource(uri);
+	}
+
+	/**
+	 * Ensure that the given resource has the specified readOnly setting in the
+	 * {@link #getTransactionalEditingDomain() editing domain} of this model set.
+	 * 
+	 * @param resource
+	 *            resource within this resource set
+	 * @param readOnly
+	 *            true if resource should be readOnly, false otherwise
+	 */
+	public void setReadOnly(Resource resource, Boolean readOnly) {
+		resourceToReadOnlyMap.put(resource, readOnly);
+	}
+
+	@Override
+	public synchronized TransactionalEditingDomain getTransactionalEditingDomain() {
+		final TransactionalEditingDomainImpl domain = new TransactionalEditingDomainImpl(
+				new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
+		domain.setResourceToReadOnlyMap(resourceToReadOnlyMap);
+		return domain;
+	}
+
+	@Override
+	public Registry getPackageRegistry() {
+		return resourceSet.getPackageRegistry(); // delegate to wrapped resourceSet
+	}
+
+	/**
+	 * Queries whether a code resource should be proxied in the model set. This is usually required for UML
+	 * library resources (profiles, metamodels, and such deployed in plug-ins) and not for other resources.
+	 * 
+	 * @param resourceURI
+	 *            a resource URI
+	 * @return whether it should be proxied
+	 */
+	protected boolean shouldProxy(URI resourceURI) {
+		return resourceSet.getURIConverter().normalize(resourceURI).isPlatformPlugin()
+				&& UmlModel.UML_FILE_EXTENSION.equals(resourceURI.fileExtension());
+	}
+
+	/**
+	 * Detaches me from the resource-set that I wrap.
+	 */
+	public void detach() {
+		((ProxyingResourceList)resources).detach();
+	}
+
+	/**
+	 * Directly set the model-set's URI without initializing the entire pluggable models and snippets
+	 * infrastructure.
+	 * 
+	 * @param uriWithoutExtension
+	 *            the URI without the file extension
+	 */
+	@Override
+	public void setURIWithoutExtension(URI uriWithoutExtension) {
+		super.setURIWithoutExtension(uriWithoutExtension);
+	}
+
+	//
+	// Nested types
+	//
+
+	/**
+	 * A specialized resource list that shares the underlying resources (and hence their contents) of UML
+	 * Profiles with the wrapped resource, to ensure a single in-memory copy of each profile definition for
+	 * consistent identification of stereotype applications. Nonetheless, each resource set has to see these
+	 * shared resources as "owned by" it, so in the {@code ModelSetWrapper} context this is achieved by
+	 * dynamic proxies that pass through to the real resources for everything but the relationship to the
+	 * owning resource-set.
+	 *
+	 * @author Christian W. Damus
+	 */
+	protected class ProxyingResourceList extends ResourcesEList<Resource> implements Adapter {
+
+		private static final long serialVersionUID = 1L;
+
+		private final Map<Resource, Resource> proxies = new HashMap<>();
+
+		/**
+		 * Initializes me.
+		 */
+		protected ProxyingResourceList() {
+			super();
+
+			for (Resource next : resourceSet.getResources()) {
+				addProxy(next);
+			}
+
+			resourceSet.eAdapters().add(this);
+		}
+
+		/**
+		 * Detaches me from my delegate list, removes all of my proxy resources, and forgets all of my proxy
+		 * mappings.
+		 */
+		void detach() {
+			// Stop listening to my delegate for changes in its resources
+			resourceSet.eAdapters().remove(this);
+
+			// Remove all of my proxy resources that I don't own
+			removeAll(proxies.values());
+			proxies.clear();
+		}
+
+		//
+		// Proxy management
+		//
+
+		/**
+		 * Queries whether a {@code resource} should be proxied in the model set. This is usually required for
+		 * UML library resources (profiles, metamodels, and such deployed in plug-ins) and not for other
+		 * resources.
+		 * 
+		 * @param resource
+		 *            a resource
+		 * @return whether it should be proxied
+		 */
+		protected boolean shouldProxy(Resource resource) {
+			return ModelSetWrapper.this.shouldProxy(resource.getURI());
+		}
+
+		/**
+		 * Obtains the existing proxy, if any, that represents my share of a {@code resource}.
+		 * 
+		 * @param resource
+		 *            a resource
+		 * @return the existing proxy, or {@code null} if it has not been proxied
+		 */
+		Resource getProxy(Resource resource) {
+			return proxies.get(resource);
+		}
+
+		/**
+		 * Creates the canonical proxy wrapper for a {@code resource} that represents my share of it.
+		 * 
+		 * @param resource
+		 *            a resource to proxy
+		 * @return the proxied resource
+		 */
+		Resource createProxy(Resource resource) {
+			Collection<Class<?>> interfaces = getResourceInterfaces(resource.getClass());
+			Resource result = (Resource)Proxy.newProxyInstance(getClass().getClassLoader(),
+					Iterables.toArray(interfaces, Class.class), new ResourceProxy(resource));
+			proxies.put(resource, result);
+			return result;
+		}
+
+		/**
+		 * Computes the {@link Resource} interfaces that a proxy needs to implement to expose the full API of
+		 * an instance of the given resource implementation class.
+		 * 
+		 * @param resourceImpl
+		 *            the implementation class of a resource
+		 * @return its interfaces
+		 */
+		private Collection<Class<?>> getResourceInterfaces(Class<?> resourceImpl) {
+			Collection<Class<?>> result = new LinkedHashSet<>();
+
+			for (Class<?> class_ = resourceImpl; class_ != null; class_ = class_.getSuperclass()) {
+				interfaces: for (Class<?> next : class_.getInterfaces()) {
+					if (Resource.class.isAssignableFrom(next)) {
+						for (Class<?> found : result) {
+							if (next.isAssignableFrom(found)) {
+								// Don't bother if it's a redundant superinterface
+								continue interfaces;
+							}
+						}
+						result.add(next);
+					}
+				}
+			}
+
+			// Remove redundant superinterfaces
+
+			return result;
+		}
+
+		/**
+		 * Queries whether a {@code resource} is a proxy that represents my co-ownership of it.
+		 * 
+		 * @param resource
+		 *            a resource
+		 * @return whether it is a proxy of mine
+		 */
+		boolean isProxy(Resource resource) {
+			return resource != null && Proxy.isProxyClass(resource.getClass())
+					&& Proxy.getInvocationHandler(resource) instanceof ResourceProxy;
+		}
+
+		/**
+		 * Obtains a proxy for the given {@code resource}, creating that proxy if necessary, to represent my
+		 * share of it.
+		 * 
+		 * @param resource
+		 *            a resource
+		 * @return the {@code resource} itself if it already {@linkplain #isProxy(Resource) is a proxy} or a
+		 *         proxy wrapping it
+		 */
+		Resource proxy(Resource resource) {
+			if (isProxy(resource)) {
+				return resource;
+			}
+
+			Resource result = getProxy(resource);
+			if (result == null) {
+				result = createProxy(resource);
+			}
+			return result;
+		}
+
+		/**
+		 * Obtains the real resource represented by the given {@code resource}, in case it
+		 * {@linkplain #isProxy(Resource) is a proxy}.
+		 * 
+		 * @param resource
+		 *            a resource
+		 * @return the real resource if a proxy, otherwise just the {@code resource}, itself
+		 */
+		Resource unproxy(Resource resource) {
+			if (isProxy(resource)) {
+				return ((ResourceProxy)Proxy.getInvocationHandler(resource)).resource;
+			}
+			return resource;
+		}
+
+		/**
+		 * Adds a proxy for me to share ownership of the given {@code resource} if I
+		 * {@linkplain #shouldProxy(Resource) should have a proxy} for it.
+		 * 
+		 * @param resource
+		 *            a resource to conditionally add to me as a proxy
+		 */
+		void addProxy(Resource resource) {
+			if (shouldProxy(resource)) {
+				add(proxy(resource));
+			}
+		}
+
+		@Override
+		public boolean contains(Object object) {
+			// XXX The super implementation only works up to the 5th element.
+			// Because we're cheating with proxies, the super impl will consider
+			// that we already contain this resource.
+			// Basically, we can't trust the bidirectionnal reference between Resource
+			// and ResourceSet because of the proxy; but EMF does trust it.
+			boolean result = super.contains(object);
+
+			if (result && object instanceof Resource && isProxy((Resource)object)) {
+				// Let's double-check... Copy the super-super implementation
+				if (useEquals()) {
+					for (int i = 0; i < size; ++i) {
+						if (object.equals(data[i])) {
+							return true;
+						}
+					}
+				} else {
+					for (int i = 0; i < size; ++i) {
+						if (data[i] == object) {
+							return true;
+						}
+					}
+				}
+
+				return false;
+			}
+
+			return result;
+		}
+
+		/**
+		 * Removes my proxy for the given {@code resource} if I have one
+		 * 
+		 * @param resource
+		 *            a resource that I must no longer share
+		 */
+		void removeProxy(Resource resource) {
+			// Don't implicitly create a proxy just to remove it
+			remove(getProxy(resource));
+		}
+
+		/**
+		 * Adds a proxy for me to share ownership of the given {@code newResource} in place of the old if I
+		 * {@linkplain #shouldProxy(Resource) should have a proxy} for it. Otherwise, just ensures that I do
+		 * not have a proxy for the {@code oldResource}.
+		 * 
+		 * @param oldResource
+		 *            a resource for which I should not have a proxy
+		 * @param newResource
+		 *            a resource to conditionally replace the old one with
+		 */
+		void replaceProxy(Resource oldResource, Resource newResource) {
+			// Don't implicitly create a proxy just to remove it
+			int index = indexOf(getProxy(oldResource));
+			if (index >= 0) {
+				if (shouldProxy(newResource)) {
+					set(index, proxy(newResource));
+				} else {
+					removeProxy(oldResource);
+				}
+			} else if (shouldProxy(newResource)) {
+				add(proxy(newResource));
+			}
+		}
+
+		//
+		// Adapter protocol to pick up changes in the delegate list
+		//
+
+		public void notifyChanged(Notification msg) {
+			if (msg.isTouch()) {
+				return;
+			}
+
+			if (msg.getNotifier() == resourceSet
+					&& msg.getFeatureID(ResourceSet.class) == RESOURCE_SET__RESOURCES) {
+				switch (msg.getEventType()) {
+					case Notification.ADD:
+						addProxy((Resource)msg.getNewValue());
+						break;
+					case Notification.ADD_MANY:
+						for (Object next : (Collection<?>)msg.getNewValue()) {
+							addProxy((Resource)next);
+						}
+						break;
+					case Notification.REMOVE:
+						removeProxy((Resource)msg.getOldValue());
+						break;
+					case Notification.REMOVE_MANY:
+						for (Object next : (Collection<?>)msg.getOldValue()) {
+							removeProxy((Resource)next);
+						}
+						break;
+					case Notification.SET:
+						replaceProxy((Resource)msg.getOldValue(), (Resource)msg.getNewValue());
+						break;
+					default:
+						// Pass. Not even move is interesting
+						break;
+				}
+			}
+		}
+
+		public Notifier getTarget() {
+			return null;
+		}
+
+		public void setTarget(Notifier newTarget) {
+			// Pass
+		}
+
+		public boolean isAdapterForType(Object type) {
+			return false;
+		}
+
+	}
+
+	/**
+	 * Invocation handler for my proxy resources. It passes through all API to the wrapped resource, properly
+	 * owned by my wrapped resource set, except for the API dealing with the relationship to the resource set,
+	 * which in that case is myself.
+	 *
+	 * @author Christian W. Damus
+	 */
+	private class ResourceProxy implements InvocationHandler {
+		private final Resource resource;
+
+		private EList<Adapter> adapterList;
+
+		ResourceProxy(Resource resource) {
+			super();
+
+			this.resource = resource;
+		}
+
+		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+			switch (method.getName()) {
+				case "getResourceSet": //$NON-NLS-1$
+					if (method.getDeclaringClass() == Resource.class) {
+						return ModelSetWrapper.this;
+					}
+					break;
+				case "basicSetResourceSet": //$NON-NLS-1$
+					if (method.getDeclaringClass() == Resource.Internal.class) {
+						// Don't try to tell the real resource that the wrapper
+						// model-set is its owner
+						return null;
+					}
+					break;
+				case "eAdapters": //$NON-NLS-1$
+					return getAdapters(proxy);
+			}
+
+			return method.invoke(resource, args);
+		}
+
+		EList<Adapter> getAdapters(Object proxy) {
+			if (adapterList == null) {
+				adapterList = new ProxyAdapterList(resource, (Resource)proxy);
+			}
+			return adapterList;
+		}
+	}
+
+	/**
+	 * An adapter list implementation for {@link ResourceProxy} instances to ensure that {@link Adapter}
+	 * call-backs are invoked with the resource proxy that the adapters are added to, not the underlying real
+	 * resource.
+	 *
+	 * @author Christian W. Damus
+	 */
+	@SuppressWarnings("serial")
+	private class ProxyAdapterList extends DelegatingEList<Adapter> implements EObservableAdapterList {
+
+		// Map of "real adapter" <--> wrapper
+		private final BiMap<Adapter, Adapter> adapters = HashBiMap.create();
+
+		private final Notifier owner;
+
+		private final Notifier proxy;
+
+		private final EList<Adapter> delegate;
+
+		private List<Listener> listeners;
+
+		/**
+		 * Initializes me with the real resource {@link notifier} and its {@code proxy} that I present to
+		 * adapters in their call-backs.
+		 * 
+		 * @param notifier
+		 *            the real notifier
+		 * @param proxy
+		 *            its proxy wrapper
+		 */
+		ProxyAdapterList(Notifier notifier, Notifier proxy) {
+			super();
+
+			owner = notifier;
+			this.proxy = proxy;
+			delegate = notifier.eAdapters();
+		}
+
+		@Override
+		protected List<Adapter> delegateList() {
+			return delegate;
+		}
+
+		@Override
+		protected boolean delegateContains(Object object) {
+			// The delegate list contains wrappers, not the real adapters
+			Object search = adapters.get(object);
+			return super.delegateContains(search == null ? object : search);
+		}
+
+		@Override
+		protected int delegateIndexOf(Object object) {
+			// The delegate list contains wrappers, not the real adapters.
+			// This is needed to support removal
+			Object search = adapters.get(object);
+			return super.delegateIndexOf(search == null ? object : search);
+		}
+
+		@Override
+		protected int delegateLastIndexOf(Object object) {
+			// The delegate list contains wrappers, not the real adapters.
+			// This is needed as counterpart to indexOf
+			Object search = adapters.get(object);
+			return super.delegateLastIndexOf(search == null ? object : search);
+		}
+
+		@Override
+		protected Adapter validate(int index, Adapter object) {
+			Adapter result = adapters.get(object);
+			if (result == null) {
+				result = new ProxyAdapter(object, owner, proxy);
+				adapters.put(object, result);
+			}
+
+			return result;
+		}
+
+		@Override
+		protected void didAdd(int index, Adapter newObject) {
+			if (listeners != null) {
+				for (Listener next : listeners) {
+					next.added(proxy, newObject);
+				}
+			}
+		}
+
+		@Override
+		protected void didRemove(int index, Adapter oldObject) {
+			if (listeners != null) {
+				for (Listener next : listeners) {
+					next.removed(proxy, oldObject);
+				}
+			}
+			adapters.inverse().remove(oldObject);
+		}
+
+		@Override
+		protected void didSet(int index, Adapter newObject, Adapter oldObject) {
+			didRemove(index, oldObject);
+			didAdd(index, newObject);
+		}
+
+		//
+		// EObservableAdapterList protocol
+		//
+
+		public void addListener(Listener listener) {
+			if (listeners == null) {
+				listeners = Lists.newArrayListWithExpectedSize(1);
+			}
+			listeners.add(listener);
+		}
+
+		public void removeListener(Listener listener) {
+			if (listeners != null) {
+				listeners.remove(listener);
+			}
+		}
+	}
+
+	//
+	// Nested types
+	//
+
+	/**
+	 * An wrapper for adapters to ensure that the {@link Adapter} call-backs are invoked with the notifier
+	 * proxy that the adapters are added to, not the underlying real notifier.
+	 *
+	 * @author Christian W. Damus
+	 */
+	private class ProxyAdapter extends AdapterImpl {
+		private final Adapter delegate;
+
+		private final Notifier notifier;
+
+		private final Notifier proxy;
+
+		/** Cache of notification wrappers for presentation of the notifier as the proxy. */
+		private final Map<Notification, Notification> notificationWrappers = new MapMaker().weakKeys()
+				.weakValues().makeMap();
+
+		/**
+		 * Initializes me with the real resource {@link notifier} and its {@code proxy} that I present to my
+		 * wrapper {@link adapter} in its call-backs.
+		 * 
+		 * @param adapter
+		 *            my real adapter delegate
+		 * @param notifier
+		 *            the real notifier
+		 * @param proxy
+		 *            its proxy wrapper
+		 */
+		ProxyAdapter(Adapter adapter, Notifier notifier, Notifier proxy) {
+			super();
+
+			delegate = adapter;
+			this.notifier = notifier;
+			this.proxy = proxy;
+		}
+
+		@Override
+		public void notifyChanged(Notification msg) {
+			delegate.notifyChanged(wrap(msg));
+		}
+
+		Notification wrap(Notification msg) {
+			Notification result = msg;
+
+			if (msg.getNotifier() == notifier) {
+				// Wrap it
+				result = notificationWrappers.get(msg);
+				if (result == null) {
+					result = new NotificationWrapper(proxy, msg);
+					notificationWrappers.put(msg, result);
+				}
+			}
+
+			return result;
+		}
+
+		@Override
+		public boolean isAdapterForType(Object type) {
+			return delegate.isAdapterForType(type);
+		}
+
+		@Override
+		public void setTarget(Notifier newTarget) {
+			if (newTarget == notifier) {
+				delegate.setTarget(proxy);
+			} else {
+				delegate.setTarget(newTarget);
+			}
+		}
+
+		@Override
+		public void unsetTarget(Notifier oldTarget) {
+			if (delegate instanceof Adapter.Internal) {
+				if (oldTarget == notifier) {
+					((Adapter.Internal)delegate).unsetTarget(proxy);
+				} else {
+					((Adapter.Internal)delegate).unsetTarget(oldTarget);
+				}
+			}
+		}
+
+		@Override
+		public String toString() {
+			return delegate.toString();
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.project
new file mode 100644
index 0000000..c48be3a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.compare.uml2.edit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.runtime.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..75adc0e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,389 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.includeFieldsInNullAnalysis=disabled
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=error
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=disabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=110
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=110
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.ui.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..5766025
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,66 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_EMF Compare
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=fr;com;java;javax;org;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=false
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_type_arguments=false
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.pde.api.tools.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..ed2233a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,97 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..70c4544
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.compare.uml2.edit;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-Activator: org.eclipse.papyrus.gitlight.compare.uml2.edit.Activator
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.compare.uml2.edit
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.compare.uml2.edit,
+ org.eclipse.papyrus.uml.tools.utils,
+ org.eclipse.emf.compare.edit,
+ org.eclipse.uml2.uml,
+ org.eclipse.papyrus.infra.services.labelprovider,
+ org.eclipse.papyrus.infra.core,
+ org.eclipse.papyrus.infra.emf,
+ org.eclipse.papyrus.emf.facet.custom.core,
+ org.eclipse.papyrus.emf.facet.custom.ui,
+ org.eclipse.papyrus.uml.tools,
+ org.eclipse.papyrus.gitlight.compare.ui;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.compare.uml2
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: com.google.common.base;version="[15.0.0,22.0.0)",
+ com.google.common.collect;version="[15.0.0,22.0.0)",
+ org.eclipse.papyrus.emf.facet.efacet.metamodel.v0_2_0.efacet
+Bundle-Localization: plugin
+Export-Package: org.eclipse.papyrus.gitlight.compare.uml2.edit,
+ org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;x-internal:=true
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/build.properties
new file mode 100644
index 0000000..f6c19f1
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/build.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.properties
new file mode 100644
index 0000000..1dd26ec
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.properties
@@ -0,0 +1,36 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+pluginName = Papyrus GitLight Compare UML2 Support
+providerName = Eclipse Modeling Project
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_UI_CreateChild_text3 = {1}
+_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
+_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
+_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
+_UI_PropertyDescriptor_description = The {0} of the {1}
+_UI_Unknown_type = Object
+_UI_Unknown_datatype= Value
+_UI_Unknown_feature = Unspecified
+
+_UI_ResourceRefactoringChange_label = {0}
+_UI_ResourceRefactoringChange_detailLeft = \ [refactored from {0}]
+_UI_ResourceRefactoringChange_detailRight = \ [refactored as {0}]
+_UI_ResourceRefactoringChange_detail = \ [{0}]
+_UI_ResourceRefactoringChange_desc_actionLeft = refactored locally
+_UI_ResourceRefactoringChange_desc_actionRight = refactored remotely
+_UI_ResourceRefactoringChange_desc = The resource {0} has been {1} from {2} to {3}.
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.xml
new file mode 100644
index 0000000..20b00a4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/plugin.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+    <extension
+         point="org.eclipse.emf.compare.edit.adapterFactory">
+      <factory
+            class="org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator.PapyrusItemProviderAdapterFactoryDecorator"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource
+               org.eclipse.emf.compare.provider.IItemStyledLabelProvider
+               org.eclipse.emf.compare.provider.IItemDescriptionProvider"
+            context="org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator.PapyrusItemProviderContextTester"
+            description="This provider displays Papyrus elements like they are a new kind of UML element. It uses the icons and labels provided through the Papyrus label provider service."
+            label="Papyrus element item provider"
+            optional="true"
+            ranking="80"
+            uri="http://www.eclipse.org/uml2/5.0.0/UML">
+      </factory>
+      <factory
+            class="org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator.PapyrusCompareItemProviderAdapterFactoryDecorator"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource
+               org.eclipse.emf.compare.provider.ISemanticObjectLabelProvider
+               org.eclipse.emf.compare.provider.IItemStyledLabelProvider
+               org.eclipse.emf.compare.provider.IItemDescriptionProvider"
+            context="org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator.PapyrusItemProviderContextTester"
+            description="Presents Papyrus-specific semantics of certain changes in a comparison."
+            label="Papyrus diff item provider"
+            optional="false"
+            ranking="80"
+            uri="http://www.eclipse.org/emf/compare">
+      </factory>
+   </extension>
+
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/pom.xml
new file mode 100644
index 0000000..74f609c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.compare.uml2.edit</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/Activator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/Activator.java
new file mode 100644
index 0000000..38e377e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/Activator.java
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.services.labelprovider.service.impl.LabelProviderServiceImpl;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class Activator extends AbstractUIPlugin {
+
+	/** The plug-in ID. */
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.gitlight.compare.uml2.edit"; //$NON-NLS-1$
+
+	/** The shared instance. */
+	private static Activator plugin;
+
+	/** The label provider service. */
+	private LabelProviderService labelProviderService;
+
+	private ResourceLocator resourceLocator;
+
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+	}
+
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		if (labelProviderService != null) {
+			try {
+				labelProviderService.disposeService();
+			} catch (ServiceException ex) {
+				Activator.getDefault().getLog().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
+						"Unable to dispose Papyrus Label Provider Service", ex)); //$NON-NLS-1$
+			}
+		}
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance.
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the Papyrus {@link LabelProviderService}.
+	 * 
+	 * @return the label provider service or <code>null</code> if the service could not be started
+	 */
+	public LabelProviderService getLabelProviderService() {
+		if (labelProviderService == null) {
+			labelProviderService = new LabelProviderServiceImpl();
+			try {
+				labelProviderService.startService();
+			} catch (ServiceException ex) {
+				// prevent service from being used if it could not be started
+				labelProviderService = null;
+				getDefault().getLog().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID,
+						"Unable to start Papyrus Label Provider Service", ex)); //$NON-NLS-1$
+			}
+		}
+		return labelProviderService;
+	}
+
+	/**
+	 * Obtain a resource locator for this plug-in.
+	 * 
+	 * @return my resource locator
+	 */
+	public ResourceLocator getResourceLocator() {
+		if (resourceLocator == null) {
+			resourceLocator = new EMFPlugin.EclipsePlugin() {
+				// Pass
+			};
+		}
+		return resourceLocator;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ForwardingItemProviderDecorator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ForwardingItemProviderDecorator.java
new file mode 100644
index 0000000..e396f3f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ForwardingItemProviderDecorator.java
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.compare.provider.ExtendedItemProviderDecorator;
+import org.eclipse.emf.compare.provider.IItemDescriptionProvider;
+import org.eclipse.emf.compare.provider.IItemStyledLabelProvider;
+import org.eclipse.emf.compare.provider.ISemanticObjectLabelProvider;
+import org.eclipse.emf.compare.provider.utils.ComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
+import org.eclipse.emf.edit.EMFEditPlugin;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedImage;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.papyrus.gitlight.compare.uml2.edit.Activator;
+
+/**
+ * A simple forwarding item-provider decorator that implements all of the optional provider interfaces.
+ */
+public class ForwardingItemProviderDecorator extends ExtendedItemProviderDecorator implements IEditingDomainItemProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider, IItemStyledLabelProvider, IItemDescriptionProvider, ISemanticObjectLabelProvider {
+
+	/**
+	 * Initializes me with my adapter factory.
+	 * 
+	 * @param adapterFactory
+	 *            my adapter factory
+	 */
+	public ForwardingItemProviderDecorator(ComposeableAdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	public String getSemanticObjectLabel(Object object) {
+		if (decoratedItemProvider instanceof ISemanticObjectLabelProvider) {
+			return ((ISemanticObjectLabelProvider)decoratedItemProvider).getSemanticObjectLabel(object);
+		}
+
+		return null;
+	}
+
+	public String getDescription(Object object) {
+		if (decoratedItemProvider instanceof IItemDescriptionProvider) {
+			return ((IItemDescriptionProvider)decoratedItemProvider).getDescription(object);
+		}
+
+		return getText(object);
+	}
+
+	public IComposedStyledString getStyledText(Object object) {
+		if (decoratedItemProvider instanceof IItemStyledLabelProvider) {
+			return ((IItemStyledLabelProvider)decoratedItemProvider).getStyledText(object);
+		}
+
+		String text = getText(object);
+		if (text != null) {
+			return new ComposedStyledString(text);
+		}
+
+		return null;
+	}
+
+	protected String getString(String key) {
+		return Activator.getDefault().getResourceLocator().getString(key);
+	}
+
+	protected String getString(String key, boolean translate) {
+		return Activator.getDefault().getResourceLocator().getString(key, translate);
+	}
+
+	protected String getString(String key, Object[] substitutions) {
+		return Activator.getDefault().getResourceLocator().getString(key, substitutions);
+	}
+
+	protected String getString(String key, Object[] substitutions, boolean translate) {
+		return Activator.getDefault().getResourceLocator().getString(key, substitutions, translate);
+	}
+
+	protected Object overlayImage(Object object, Object image) {
+		Object result = image;
+
+		if (AdapterFactoryEditingDomain.isControlled(object)) {
+			List<Object> images = new ArrayList<Object>(2);
+			images.add(image);
+			images.add(EMFEditPlugin.INSTANCE.getImage("full/ovr16/ControlledObject")); //$NON-NLS-1$
+			result = new ComposedImage(images);
+		}
+
+		return result;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusCompareItemProviderAdapterFactoryDecorator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusCompareItemProviderAdapterFactoryDecorator.java
new file mode 100644
index 0000000..780719a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusCompareItemProviderAdapterFactoryDecorator.java
@@ -0,0 +1,96 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import static org.eclipse.papyrus.compare.uml2.internal.postprocessor.ResourceRefactoringChange.isResourceRefactoringChange;
+
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.provider.spec.CompareItemProviderAdapterFactorySpec;
+import org.eclipse.emf.compare.util.CompareSwitch;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.DecoratorAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemProviderDecorator;
+
+/**
+ * Decorator adapter factory for comparison elements (diffs and such) in Papyrus UML comparisons.
+ */
+public class PapyrusCompareItemProviderAdapterFactoryDecorator extends DecoratorAdapterFactory {
+
+	private final DecoratorSwitch decoratorSwitch = createDecoratorSwitch();
+
+	/**
+	 * Initializes me.
+	 */
+	public PapyrusCompareItemProviderAdapterFactoryDecorator() {
+		super(new CompareItemProviderAdapterFactorySpec());
+	}
+
+	@Override
+	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
+		super.setParentAdapterFactory(parentAdapterFactory);
+
+		if (parentAdapterFactory != null) {
+			// Compose our delegate after us so that its item delegators may
+			// find the entire factory space
+			parentAdapterFactory.addAdapterFactory(getDecoratedAdapterFactory());
+		}
+	}
+
+	protected DecoratorSwitch createDecoratorSwitch() {
+		return new DecoratorSwitch();
+	}
+
+	@Override
+	protected final IItemProviderDecorator createItemProviderDecorator(Object target, Object type) {
+		return decoratorSwitch.doSwitch(target);
+	}
+
+	protected IItemProviderDecorator createDefaultItemProviderDecorator() {
+		return new ForwardingItemProviderDecorator(this);
+	}
+
+	protected IItemProviderDecorator createResourceRefactoringChangeItemProviderDecorator() {
+		return new ResourceRefactoringChangeItemProviderDecorator(this);
+	}
+
+	//
+	// Nested types
+	//
+
+	protected class DecoratorSwitch extends CompareSwitch<IItemProviderDecorator> {
+		public IItemProviderDecorator doSwitch(Object object) {
+			if (object instanceof EObject) {
+				return doSwitch((EObject)object);
+			} else {
+				return createDefaultItemProviderDecorator();
+			}
+		}
+
+		@Override
+		public IItemProviderDecorator defaultCase(EObject object) {
+			return createDefaultItemProviderDecorator();
+		}
+
+		@SuppressWarnings("restriction")
+		@Override
+		public IItemProviderDecorator caseResourceAttachmentChange(ResourceAttachmentChange object) {
+			if (isResourceRefactoringChange(object)) {
+				return createResourceRefactoringChangeItemProviderDecorator();
+			}
+			return null;
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderAdapterFactoryDecorator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderAdapterFactoryDecorator.java
new file mode 100644
index 0000000..aa0b6ee
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderAdapterFactoryDecorator.java
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import org.eclipse.emf.edit.provider.DecoratorAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemProviderDecorator;
+import org.eclipse.uml2.uml.edit.providers.UMLItemProviderAdapterFactory;
+
+/**
+ * Decorator adapter factory for Papyrus UML elements.
+ */
+public class PapyrusItemProviderAdapterFactoryDecorator extends DecoratorAdapterFactory {
+
+	/**
+	 * Creates a new instance.
+	 */
+	public PapyrusItemProviderAdapterFactoryDecorator() {
+		super(new UMLItemProviderAdapterFactory());
+	}
+
+	@Override
+	protected IItemProviderDecorator createItemProviderDecorator(Object target, Object type) {
+		return new PapyrusItemProviderDecorator(this);
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderContextTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderContextTester.java
new file mode 100644
index 0000000..4bd0f29
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderContextTester.java
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import java.util.Map;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.adapterfactory.context.AbstractContextTester;
+import org.eclipse.papyrus.gitlight.compare.ui.internal.context.PapyrusContextUtil;
+
+/**
+ * Context Tester for a Papyrus comparison.
+ * 
+ * @see PapyrusContextUtil#isPapyrusContext(Comparison)
+ * @author <a href="mailto:mfleck@eclipsesource.com">Martin Fleck</a>
+ */
+public class PapyrusItemProviderContextTester extends AbstractContextTester {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean apply(Map<Object, Object> context) {
+		Comparison comparison = getComparison(context);
+		return comparison != null && PapyrusContextUtil.isPapyrusContext(comparison);
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderDecorator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderDecorator.java
new file mode 100644
index 0000000..4d9f7c7
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/PapyrusItemProviderDecorator.java
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import org.eclipse.emf.compare.provider.ExtendedItemProviderDecorator;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemColorProvider;
+import org.eclipse.emf.edit.provider.IItemFontProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.papyrus.gitlight.compare.uml2.edit.Activator;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+
+/**
+ * Decorator that reuses the label provider of Papyrus.
+ * 
+ * @see org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService
+ */
+public class PapyrusItemProviderDecorator extends ExtendedItemProviderDecorator implements IEditingDomainItemProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IItemColorProvider, IItemFontProvider {
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param adapterFactory
+	 *            the adapter factory to be used by the label providers.
+	 */
+	public PapyrusItemProviderDecorator(ComposeableAdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	@Override
+	public String getText(Object object) {
+		LabelProviderService labelProviderService = Activator.getDefault().getLabelProviderService();
+		if (labelProviderService != null) {
+			ILabelProvider labelProvider = labelProviderService.getLabelProvider(object);
+			if (labelProvider != null) {
+				return labelProvider.getText(object);
+			}
+		}
+		return super.getText(object);
+	}
+
+	@Override
+	public Object getImage(Object object) {
+		LabelProviderService labelProviderService = Activator.getDefault().getLabelProviderService();
+		if (labelProviderService != null) {
+			ILabelProvider labelProvider = labelProviderService.getLabelProvider(object);
+			if (labelProvider != null) {
+				return labelProvider.getImage(object);
+			}
+		}
+		return super.getImage(object);
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ResourceRefactoringChangeItemProviderDecorator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ResourceRefactoringChangeItemProviderDecorator.java
new file mode 100644
index 0000000..c89d1f4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare.uml2.edit/src/org/eclipse/papyrus/gitlight/compare/uml2/edit/internal/decorator/ResourceRefactoringChangeItemProviderDecorator.java
@@ -0,0 +1,207 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.uml2.edit.internal.decorator;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.DifferenceState;
+import org.eclipse.emf.compare.ResourceAttachmentChange;
+import org.eclipse.emf.compare.provider.utils.ComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.IComposedStyledString;
+import org.eclipse.emf.compare.provider.utils.IStyledString.Style;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.papyrus.compare.uml2.internal.postprocessor.ResourceRefactoringChange;
+
+/**
+ * An item-provider decorator for {@link ResourceAttachmentChange}s that represent resource refactorings. The
+ * diff is presented as the inverse change from the opposite side so that it may make sense that it is
+ * rejected by implication of certain changes from that opposite side. Because, from the perspective of the
+ * left side, that is what accepting this change would do.
+ */
+@SuppressWarnings("restriction")
+public class ResourceRefactoringChangeItemProviderDecorator extends ForwardingItemProviderDecorator {
+
+	public ResourceRefactoringChangeItemProviderDecorator(ComposeableAdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * Coerce a {@code diff} as a {@link ResourceRefactoringChange}.
+	 * 
+	 * @param diff
+	 *            a resource refactoring diff
+	 * @return the {@code diff} as its proper type
+	 * @precondition {@code diff is-a} {@link ResourceRefactoringChange}
+	 */
+	protected ResourceRefactoringChange asResourceRefactoringChange(Object diff) {
+		checkArgument(diff instanceof ResourceAttachmentChange, "%s is not a ResourceAttachmentChange", diff); //$NON-NLS-1$
+		return ResourceRefactoringChange.get((Diff)diff);
+	}
+
+	/**
+	 * Obtains the resource that was refactored in the given {@code diff}.
+	 * 
+	 * @param diff
+	 *            a resource refactoring diff
+	 * @return the refactored resource
+	 * @precondition {@code diff is-a} {@link ResourceRefactoringChange}
+	 */
+	protected Resource getRefactoredResource(Object diff) {
+		return getRefactoredResource(asResourceRefactoringChange(diff));
+	}
+
+	/**
+	 * Obtains the resource that was refactored in the given {@code diff}.
+	 * 
+	 * @param diff
+	 *            a resource refactoring diff
+	 * @return the refactored resource
+	 * @postcondition {@code result != null}
+	 */
+	protected Resource getRefactoredResource(ResourceRefactoringChange diff) {
+
+		// We wouldn't have this diff if the match didn't have both left and right sides
+		DifferenceSource side;
+		if (diff.getState() == DifferenceState.DISCARDED) {
+			side = diff.getSource();
+		} else {
+			side = opposite(diff.getSource());
+		}
+		Resource result = MatchUtil.getMatchedObject(diff.getMatch(), side).eResource();
+
+		if (result == null) {
+			throw new IllegalStateException("diff has no resource on its source side"); //$NON-NLS-1$
+		}
+
+		return result;
+	}
+
+	@Override
+	public Object getImage(Object object) {
+		ResourceRefactoringChange diff = asResourceRefactoringChange(object);
+		Resource resource = getRefactoredResource(diff);
+
+		Object result = getItemDelegator().getImage(resource);
+		if (result == null) {
+			result = super.getImage(diff);
+		}
+
+		// Invert the presentation
+		ResourceAttachmentChange realDiff = diff.toDiff();
+		boolean oldDeliver = realDiff.eDeliver();
+		try {
+			// Flip the direction to get the opposite decoration
+			realDiff.eSetDeliver(false);
+			realDiff.setSource(opposite(realDiff.getSource()));
+			Object overlay = getOverlayProvider().getComposedImage(realDiff, result);
+
+			result = overlayImage(object, overlay);
+		} finally {
+			// Restore the direction
+			realDiff.setSource(opposite(realDiff.getSource()));
+			realDiff.eSetDeliver(oldDeliver);
+		}
+
+		return result;
+	}
+
+	@Override
+	public String getText(Object object) {
+		return getStyledText(object).getString();
+	}
+
+	@Override
+	public IComposedStyledString getStyledText(Object object) {
+		final ResourceRefactoringChange diff = asResourceRefactoringChange(object);
+
+		String value = getString("_UI_ResourceRefactoringChange_label", //$NON-NLS-1$
+				new Object[] {getSemanticObjectLabel(diff.toDiff()) });
+
+		final Style baseStyle;
+		switch (diff.getState()) {
+			case MERGED:
+			case DISCARDED:
+				baseStyle = Style.QUALIFIER_STYLER;
+				break;
+			default:
+				baseStyle = Style.NO_STYLE;
+				break;
+		}
+		ComposedStyledString result = new ComposedStyledString(value, baseStyle);
+
+		// When the diff is rejected, we show the new URI, so present the decoration
+		// with the old URI
+		DifferenceSource decorationDirection = diff.getState() != DifferenceState.DISCARDED //
+				? DifferenceSource.RIGHT
+				: DifferenceSource.LEFT;
+		switch (diff.getKind()) {
+			case MOVE:
+				switch (decorationDirection) {
+					case RIGHT: // Invert the presentation
+						result.append(getString("_UI_ResourceRefactoringChange_detailLeft", //$NON-NLS-1$
+								new Object[] {diff.getNewURI() }), Style.DECORATIONS_STYLER);
+						break;
+					case LEFT: // Invert the presentation
+						result.append(getString("_UI_ResourceRefactoringChange_detailRight", //$NON-NLS-1$
+								new Object[] {diff.getOldURI() }), Style.DECORATIONS_STYLER);
+						break;
+					default:
+						throw new IllegalArgumentException("diff side " + diff.getSource()); //$NON-NLS-1$
+				}
+				break;
+			default:
+				result.append(getString("_UI_ResourceRefactoringChange_detail", //$NON-NLS-1$
+						new Object[] {diff.getNewURI() }), Style.DECORATIONS_STYLER);
+				break;
+		}
+
+		return result;
+	}
+
+	@Override
+	public String getSemanticObjectLabel(Object object) {
+		return getItemDelegator().getText(getRefactoredResource(object));
+	}
+
+	@Override
+	public String getDescription(Object object) {
+		final ResourceRefactoringChange diff = asResourceRefactoringChange(object);
+		String subject = getSemanticObjectLabel(diff);
+
+		String action;
+		switch (diff.getSource()) {
+			case RIGHT: // Invert the presentation
+				action = getString("_UI_ResourceRefactoringChange_desc_actionLeft"); //$NON-NLS-1$
+				break;
+			case LEFT: // Invert the presentation
+				action = getString("_UI_ResourceRefactoringChange_desc_actionRight"); //$NON-NLS-1$
+				break;
+			default:
+				throw new IllegalArgumentException("diff side " + diff.getSource()); //$NON-NLS-1$
+		}
+
+		// Invert the presentation
+		return getString("_UI_ResourceRefactoringChange_desc", //$NON-NLS-1$
+				new Object[] {subject, action, diff.getOldURI(), diff.getNewURI() });
+	}
+
+	static DifferenceSource opposite(DifferenceSource side) {
+		return DifferenceSource.VALUES.get(1 - side.ordinal());
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.classpath
new file mode 100644
index 0000000..22f3064
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.project
new file mode 100644
index 0000000..3abd25e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.compare</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.runtime.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8a12f2c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.nonnullisdefault=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.includeFieldsInNullAnalysis=disabled
+org.eclipse.jdt.core.compiler.problem.nullSpecInsufficientInfo=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullSpecViolation=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.ui.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..30e1954
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+formatter_settings_version=14
+sp_cleanup.use_type_arguments=false
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.pde.api.tools.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..01461e0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,97 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Warning
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Warning
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Warning
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Warning
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Warning
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Warning
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Warning
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Warning
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Warning
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Warning
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Warning
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Warning
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Warning
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Warning
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Warning
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Warning
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Warning
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Warning
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Warning
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Warning
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Warning
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Warning
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Warning
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Warning
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Warning
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Warning
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Warning
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Warning
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Warning
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Warning
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Warning
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Warning
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Warning
+malformed_since_tag=Warning
+missing_since_tag=Warning
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5c267cf
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.compare;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.compare
+Bundle-Version: 0.7.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.compare.rcp,
+ org.eclipse.emf.compare,
+ org.eclipse.uml2.uml,
+ org.eclipse.gmf.runtime.notation,
+ org.eclipse.papyrus.infra.core
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.papyrus.gitlight.compare.ComparePlugin
+Bundle-Vendor: %providerName
+Export-Package: org.eclipse.papyrus.gitlight.compare,
+ org.eclipse.papyrus.gitlight.compare.util
+Bundle-Localization: plugin
+Import-Package: com.google.common.base;version="[15.0.0,22.0.0)",
+ com.google.common.collect;version="[15.0.0,22.0.0)"
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/build.properties
new file mode 100644
index 0000000..f6c19f1
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/build.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.properties
new file mode 100644
index 0000000..d64de5f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Compare
+providerName = Eclipse Modeling Project
+
+papyrus-diagram-post-processor=Papyrus Diagram Post-Processor
+ignore-papyrus-difiles-post-processor=Ignore Papyrus Di-files Post-Processor
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.xml
new file mode 100644
index 0000000..0b2cd72
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/plugin.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+   <extension
+         point="org.eclipse.emf.compare.rcp.postProcessor">
+      <processor
+            class="org.eclipse.papyrus.gitlight.compare.internal.PapyrusDiagramPostProcessor"
+            description="Post-processor that handles specifics of Papyrus UML diagrams."
+            label="%papyrus-diagram-post-processor"
+            ordinal="35">
+         <nsURI
+               value="http://www.eclipse.org/gmf/runtime/\d.\d.\d/notation">
+         </nsURI>
+      </processor>
+   </extension>
+   <extension
+         point="org.eclipse.emf.compare.rcp.postProcessor">
+      <processor
+            class="org.eclipse.papyrus.gitlight.compare.internal.IgnoreDiFilePostProcessor"
+            description="Post-processor that causes changes applied to the contents of di-files to be ignored."
+            label="%ignore-papyrus-difiles-post-processor"
+            ordinal="35">
+         <nsURI
+               value="http://www.eclipse.org/papyrus/\d.\d.\d/sashdi">
+         </nsURI>
+      </processor>
+   </extension>
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/pom.xml
new file mode 100644
index 0000000..a7ed93b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.compare</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePapyrusMessages.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePapyrusMessages.java
new file mode 100644
index 0000000..1e96445
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePapyrusMessages.java
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Utility class to access externalized Strings for this bundle.
+ * 
+ * @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
+ */
+public final class ComparePapyrusMessages {
+	/** Fully qualified path to the properties file in which to seek the keys. */
+	private static final String BUNDLE_NAME = "org.eclipse.papyrus.gitlight.compare.compare_papyrus_messages"; //$NON-NLS-1$
+
+	/** Contains the locale specific {@link String}s needed by this plug-in. */
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+	/**
+	 * Utility classes don't need to (and shouldn't) be instantiated.
+	 */
+	private ComparePapyrusMessages() {
+		// prevents instantiation
+	}
+
+	/**
+	 * Returns a specified {@link String} from the resource bundle.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @return The String from the resource bundle associated with <code>key</code>.
+	 */
+	public static String getString(String key) {
+		// Pass through MessageFormat to be consistent in the handling of special chars such as the apostrophe
+		return MessageFormat.format(internalGetString(key), new Object[] {});
+	}
+
+	/**
+	 * Returns a String from the resource bundle bound with the given arguments.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @param arguments
+	 *            Arguments for the String formatting.
+	 * @return formatted {@link String}.
+	 * @see MessageFormat#format(String, Object[])
+	 */
+	public static String getString(String key, Object... arguments) {
+		if (arguments == null) {
+			return getString(key);
+		}
+		return MessageFormat.format(internalGetString(key), arguments);
+	}
+
+	/**
+	 * This will return an unformatted String from the resource bundle.
+	 * 
+	 * @param key
+	 *            Key of the String we seek.
+	 * @return An unformatted String from the bundle.
+	 */
+	private static String internalGetString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!'; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePlugin.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePlugin.java
new file mode 100644
index 0000000..ede73cb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/ComparePlugin.java
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Activator.
+ */
+public class ComparePlugin extends Plugin {
+
+	/** The plugin ID. */
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.gitlight.compare"; //$NON-NLS-1$
+
+	/** This plug-in's shared instance. */
+	private static ComparePlugin plugin;
+
+	/**
+	 * Returns the shared instance.
+	 * 
+	 * @return The shared instance.
+	 */
+	public static ComparePlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(final BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(final BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/compare_papyrus_messages.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/compare_papyrus_messages.properties
new file mode 100644
index 0000000..696f035
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/compare_papyrus_messages.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+## ! note ! double the apostrophes if you need one in the printed String
+
+ModelExtensionUtil.InvalidConfig=Configuration error: Unable to create executable extension for extension ''{0}'', attribute ''classname'' is missing or invalid.
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/AbstractPapyrusDiagramDiffHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/AbstractPapyrusDiagramDiffHandler.java
new file mode 100644
index 0000000..8c9bfb3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/AbstractPapyrusDiagramDiffHandler.java
@@ -0,0 +1,119 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.compare.utils.MatchUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * Super-class of handlers of this project to mutualize some code.
+ */
+public abstract class AbstractPapyrusDiagramDiffHandler implements IDiffHandler {
+
+	/**
+	 * Indicates whether the given {@link Diff} is a change of the reference <code>uml::Property.type</code>.
+	 * 
+	 * @param diff
+	 *            The diff
+	 * @return <code>true</code> if and only if the given diff is a {@link ReferenceChange} that concerns the
+	 *         <code>uml::TypedElement.type</code> reference, on an Property
+	 */
+	protected boolean isPropertyTypeChange(ReferenceChange diff) {
+		EReference ref = diff.getReference();
+		return ref == UMLPackage.Literals.TYPED_ELEMENT__TYPE
+				&& getOriginMatchObject(diff) instanceof Property;
+	}
+
+	/**
+	 * Indicates whether the given {@link ReferenceChange} is a change of the "source" or "target" EReference
+	 * of a uml::Transition.
+	 * 
+	 * @param diff
+	 *            The diff
+	 * @return <code>true</code> if and only if the change is that of a Transition's target or source
+	 *         reference.
+	 */
+	protected boolean isTransitionReferenceChange(ReferenceChange diff) {
+		EReference ref = diff.getReference();
+		return (ref == UMLPackage.Literals.TRANSITION__TARGET
+				|| ref == UMLPackage.Literals.TRANSITION__SOURCE)
+				&& getOriginMatchObject(diff) instanceof Transition;
+	}
+
+	/**
+	 * Indicates whether the given {@link ReferenceChange} is a change of the "source" or "target" EReference
+	 * of a notation::Connector.
+	 * 
+	 * @param diff
+	 *            the ref change
+	 * @return <code>true</code> if and only if the change is that of a Connector'target or source reference.
+	 */
+	protected boolean isConnectorReferenceChange(ReferenceChange diff) {
+		EReference ref = diff.getReference();
+		return (ref == NotationPackage.Literals.EDGE__TARGET || ref == NotationPackage.Literals.EDGE__SOURCE)
+				&& getOriginMatchObject(diff) instanceof Connector;
+	}
+
+	/**
+	 * Indicates whether the given {@link ReferenceChange} is a part of a more global ADD or DELETE change.
+	 * 
+	 * @param refChange
+	 *            The ref change
+	 * @return <code>true</code> if and only if the given change is part of an ADD or DELETE.
+	 */
+	protected boolean isContainedInAddOrDelete(ReferenceChange refChange) {
+		EObject eContainer = refChange.getMatch().eContainer();
+		if (eContainer instanceof Match) {
+			if (MatchUtil.getOriginValue(refChange.getMatch().getComparison(), refChange) == null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Provides the EObject of the given diff's match that is on the "origin" side, which is LEFT for 2-way
+	 * and ORIGIN for 3-way.
+	 * 
+	 * @param diff
+	 *            The diff
+	 * @return The EObject of the diff's match that is on the LEFT if the diff's comparison is 2-way, and on
+	 *         the ORIGIN side if the diff's comparison is 3-way.
+	 */
+	protected EObject getOriginMatchObject(Diff diff) {
+		Match match = diff.getMatch();
+		final EObject result;
+		if (match == null) {
+			result = null; // diff is a ResourceLocationChange, for instance
+		} else {
+			if (match.getOrigin() != null) {
+				result = match.getOrigin();
+			} else {
+				result = match.getLeft();
+			}
+		}
+		return result;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/DiffIndexer.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/DiffIndexer.java
new file mode 100644
index 0000000..168eda0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/DiffIndexer.java
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import com.google.common.collect.LinkedHashMultimap;
+
+import java.util.Set;
+
+import org.eclipse.emf.compare.Diff;
+
+/**
+ * A DiffIndexer allows to store {@link Diff}s by arbitrary keys. It basically wrpas a Multimap, but it could
+ * be enriched to index several different kinds of relations between {@link Diff}s.
+ */
+public class DiffIndexer {
+
+	/** The multimap used to indef Diffs. */
+	private final LinkedHashMultimap<Object, Diff> equivalentDiffsByKey;
+
+	/**
+	 * Constructor.
+	 */
+	public DiffIndexer() {
+		this.equivalentDiffsByKey = LinkedHashMultimap.create();
+	}
+
+	/**
+	 * Store a Diff in the index.
+	 * 
+	 * @param key
+	 *            The key to use
+	 * @param diff
+	 *            The Diff to index
+	 */
+	public void putEquivalentDiff(Object key, Diff diff) {
+		equivalentDiffsByKey.put(key, diff);
+	}
+
+	/**
+	 * Retrieve all the {@link Diff}s for the given key.
+	 * 
+	 * @param key
+	 *            The key
+	 * @return A Set od diffs indexed for the given key, which may be empty but never <code>null</code>.
+	 */
+	public Set<Diff> getEquivalentDiffs(Object key) {
+		return equivalentDiffsByKey.get(key);
+	}
+
+	/**
+	 * Retrieve all the keys in the index.
+	 * 
+	 * @return a Set of all the keys contained in this indexer.
+	 */
+	public Set<Object> getEquivalentDiffsKeySet() {
+		return equivalentDiffsByKey.keySet();
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/FeatureInstance.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/FeatureInstance.java
new file mode 100644
index 0000000..0706154
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/FeatureInstance.java
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * Instance of a feature for an EObject, designed to be used as a key in a Map.
+ */
+class FeatureInstance {
+	/** The EObject. */
+	private final EObject eObject;
+
+	/** The feature. */
+	private final EStructuralFeature feature;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param eObject
+	 *            The EObject
+	 * @param feature
+	 *            The feature
+	 */
+	FeatureInstance(EObject eObject, EStructuralFeature feature) {
+		super();
+		this.eObject = eObject;
+		this.feature = feature;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		// CHECKSTYLE:OFF Code generated by JDT
+		result = prime * result + ((eObject == null) ? 0 : eObject.hashCode());
+		result = prime * result + ((feature == null) ? 0 : feature.hashCode());
+		// CHECKSTYLE:ON
+		return result;
+	}
+
+	// CHECKSTYLE:OFF Code generated by JDT
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		FeatureInstance other = (FeatureInstance)obj;
+		if (eObject != other.eObject) {
+			return false;
+		}
+		if (feature != other.feature) {
+			return false;
+		}
+		return true;
+		// CHECKSTYLE:ON
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder b = new StringBuilder();
+		if (eObject == null) {
+			b.append("<null>."); //$NON-NLS-1$
+		} else {
+			b.append(eObject.eClass().getName()).append('@');
+			b.append(Integer.toHexString(eObject.hashCode())).append('.');
+		}
+		if (feature == null) {
+			b.append("<null>"); //$NON-NLS-1$
+		} else {
+			b.append(feature.getName());
+		}
+		return b.toString();
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IDiffHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IDiffHandler.java
new file mode 100644
index 0000000..0f456b9
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IDiffHandler.java
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.Diff;
+
+/**
+ * A Diff handler performs some treatment on a given {@link Diff}.
+ */
+public interface IDiffHandler {
+
+	/**
+	 * Handles the given diff.
+	 * 
+	 * @param diff
+	 *            The diff ta handle.
+	 */
+	void handle(Diff diff);
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IgnoreDiFilePostProcessor.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IgnoreDiFilePostProcessor.java
new file mode 100644
index 0000000..1470d4c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/IgnoreDiFilePostProcessor.java
@@ -0,0 +1,180 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.Monitor;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.MatchResource;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+
+/**
+ * Post-processor that causes changes applied to the contents of di-files to be ignored.
+ * <p>
+ * This post-processor removes the matches of model elements contained in di-files. Thus, those elements will
+ * be ignored in the subsequent phases of the comparison.
+ * </p>
+ */
+public class IgnoreDiFilePostProcessor implements IPostProcessor {
+
+	/** The name of the class that represents the di-file's root container. */
+	private static final String SASH_WINDOWS_MNGR = "SashWindowsMngr"; //$NON-NLS-1$
+
+	/** The file extension of di-files. */
+	private static final String DI = "di"; //$NON-NLS-1$
+
+	/**
+	 * Removes the matches of or within di-files.
+	 * <p>
+	 * By removing the matches of resource matches and element matches of or within di-files, any changes
+	 * within di-files are ignored during the remaining comparison.
+	 * </p>
+	 * 
+	 * @param comparison
+	 *            The comparison
+	 * @param monitor
+	 *            The progress monitor
+	 */
+	public void postMatch(Comparison comparison, Monitor monitor) {
+		if (monitor == null || !monitor.isCanceled()) {
+			filterSashModelMngrMatches(comparison);
+			filterDiFileMatchResources(comparison);
+		}
+	}
+
+	/**
+	 * Removes the di-file {@link MatchResource match resources} of the given <code>comparison</code>.
+	 * 
+	 * @param comparison
+	 *            The comparison to remove the match resources from.
+	 */
+	private void filterDiFileMatchResources(Comparison comparison) {
+		final EList<MatchResource> matchedResources = comparison.getMatchedResources();
+		for (Iterator<MatchResource> iterator = matchedResources.iterator(); iterator.hasNext();) {
+			if (isDiFile(iterator.next())) {
+				iterator.remove();
+			}
+		}
+	}
+
+	/**
+	 * Removes the root matches that match an {@link EObject} of type {@link SashWindowsMngr} in di-files.
+	 * 
+	 * @param comparison
+	 *            The comparison to remove the {@link SashWindowsMngr} root matches from.
+	 */
+	private void filterSashModelMngrMatches(Comparison comparison) {
+		final EList<Match> matches = comparison.getMatches();
+		for (Iterator<Match> iterator = matches.iterator(); iterator.hasNext();) {
+			final EObject eObject = getMatchedEObject(iterator.next());
+			if (isDiResource(eObject.eResource()) && SASH_WINDOWS_MNGR.equals(eObject.eClass().getName())) {
+				iterator.remove();
+			}
+		}
+	}
+
+	/**
+	 * Specifies whether the given <code>resource</code> is a di-file.
+	 * 
+	 * @param resource
+	 *            The resource to check.
+	 * @return <code>true</code> if it is a di-file (or null), <code>false</code> otherwise.
+	 */
+	private boolean isDiResource(Resource resource) {
+		return resource == null || DI.equals(resource.getURI().fileExtension());
+	}
+
+	/**
+	 * Returns the {@link EObject} of the given <code>match</code>.
+	 * <p>
+	 * It is either the {@link Match#getLeft() left}, {@link Match#getRight() right}, or
+	 * {@link Match#getOrigin() origin} of the given {@link Match}.
+	 * 
+	 * @param match
+	 *            The match.
+	 * @return The {@link EObject} of the given <code>match</code>.
+	 */
+	private EObject getMatchedEObject(Match match) {
+		final EObject eObject;
+		if (match.getLeft() != null) {
+			eObject = match.getLeft();
+		} else if (match.getRight() != null) {
+			eObject = match.getRight();
+		} else {
+			eObject = match.getOrigin();
+		}
+		return eObject;
+	}
+
+	/**
+	 * Specifies whether the given <code>matchResource</code> concerns a di-file.
+	 * 
+	 * @param matchResource
+	 *            The {@link MatchResource} to check.
+	 * @return <code>true</code> if <code>matchResource</code> concerns a di-file, <code>false</code>
+	 *         otherwise.
+	 */
+	private boolean isDiFile(MatchResource matchResource) {
+		final Resource resource;
+		if (matchResource.getLeft() != null) {
+			resource = matchResource.getLeft();
+		} else if (matchResource.getRight() != null) {
+			resource = matchResource.getRight();
+		} else {
+			resource = matchResource.getOrigin();
+		}
+		return isDiResource(resource);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postDiff(Comparison comparison, Monitor monitor) {
+		// nothing to do
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postRequirements(Comparison comparison, Monitor monitor) {
+		// nothing to do
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postEquivalences(Comparison comparison, Monitor monitor) {
+		// nothing to do
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postConflicts(Comparison comparison, Monitor monitor) {
+		// nothing to do
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postComparison(Comparison comparison, Monitor monitor) {
+		// nothing to do
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram2WayDiffHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram2WayDiffHandler.java
new file mode 100644
index 0000000..be88dab
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram2WayDiffHandler.java
@@ -0,0 +1,115 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <p>
+ * Handles a diff for 2-way comparisons by indexing the given diff with a relevant key if this diff can be
+ * related to another diff in the same model. It only cares about notation and UML diffs that can be related
+ * with one another (changing the target of an Edge and the related change of UML Property if the Edge
+ * represents an Association, an so on).
+ * </p>
+ * This should only be used with 2-way comparisons!
+ */
+public class PapyrusDiagram2WayDiffHandler extends AbstractPapyrusDiagramDiffHandler {
+	/** The indexer. */
+	private final DiffIndexer indexer;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param indexer
+	 *            The indexer
+	 */
+	public PapyrusDiagram2WayDiffHandler(DiffIndexer indexer) {
+		this.indexer = indexer;
+	}
+
+	/**
+	 * Handle the given diff.
+	 * 
+	 * @param diff
+	 *            he diff to handle
+	 */
+	public void handle(Diff diff) {
+		if (diff instanceof ReferenceChange && diff.getKind() == DifferenceKind.CHANGE) {
+			ReferenceChange refChange = (ReferenceChange)diff;
+			// Check the match is not contained in an ADD or DELETE
+			if (!isContainedInAddOrDelete(refChange)) {
+				handleActualReferenceChange(refChange);
+			}
+		}
+	}
+
+	/**
+	 * Handles an actual reference change, that is to say a reference change that is not contained in an ADD
+	 * or a DELETE diff.
+	 * 
+	 * @param refChange
+	 *            The {@link ReferenceChange} to handle
+	 */
+	private void handleActualReferenceChange(ReferenceChange refChange) {
+		if (isConnectorReferenceChange(refChange)) {
+			// Changing the target of an edge that represents an
+			// association has consequences
+			Match match = refChange.getMatch();
+			Connector left = (Connector)match.getLeft();
+			if (left == null) {
+				return;
+			}
+			EObject leftElement = left.getElement();
+			if (leftElement instanceof Association) {
+				Association assoc = (Association)leftElement;
+				for (Property memberEnd : assoc.getMemberEnds()) {
+					indexer.putEquivalentDiff(memberEnd, refChange);
+				}
+			} else if (leftElement instanceof Transition) {
+				if (refChange.getReference() == NotationPackage.Literals.EDGE__SOURCE) {
+					indexer.putEquivalentDiff(
+							new FeatureInstance(leftElement, UMLPackage.Literals.TRANSITION__SOURCE),
+							refChange);
+				} else if (refChange.getReference() == NotationPackage.Literals.EDGE__TARGET) {
+					indexer.putEquivalentDiff(
+							new FeatureInstance(leftElement, UMLPackage.Literals.TRANSITION__TARGET),
+							refChange);
+				}
+			}
+		} else if (isPropertyTypeChange(refChange)) {
+			// We record property type changes for properties
+			// because those that participate in relations
+			// materialize in notation files by a target change in
+			// the related Connector
+			indexer.putEquivalentDiff(refChange.getMatch().getLeft(), refChange);
+		} else if (isTransitionReferenceChange(refChange)) {
+			indexer.putEquivalentDiff(
+					new FeatureInstance(refChange.getMatch().getLeft(), refChange.getReference()), refChange);
+		}
+		// TODO Manage other kinds of relations (Dependency, what
+		// else in UML?)
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram3WayDiffHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram3WayDiffHandler.java
new file mode 100644
index 0000000..fa7a199
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagram3WayDiffHandler.java
@@ -0,0 +1,138 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.ReferenceChange;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.notation.Connector;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.uml2.uml.Association;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <p>
+ * Handles a diff for 3-way comparisons by indexing the given diff with a relevant key if this diff can be
+ * related to another diff in the same model. It only cares about notation and UML diffs that can be related
+ * with one another (changing the target of an Edge and the related change of UML Property if the Edge
+ * represents an Association, an so on).
+ * </p>
+ * This should only be used with 3-way comparisons!
+ */
+public class PapyrusDiagram3WayDiffHandler extends AbstractPapyrusDiagramDiffHandler {
+	/**
+	 * Constructor.
+	 * 
+	 * @param indexer
+	 *            The indexer
+	 */
+	private final DiffIndexer indexer;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param indexer
+	 *            The indexer
+	 */
+	public PapyrusDiagram3WayDiffHandler(DiffIndexer indexer) {
+		this.indexer = indexer;
+	}
+
+	/**
+	 * Handle the given diff.
+	 * 
+	 * @param diff
+	 *            he diff to handle
+	 */
+	public void handle(Diff diff) {
+		if (diff instanceof ReferenceChange && diff.getKind() == DifferenceKind.CHANGE) {
+			ReferenceChange refChange = (ReferenceChange)diff;
+			if (!isContainedInAddOrDelete(refChange)) {
+				handleActualReferenceChange(refChange);
+			}
+		}
+	}
+
+	/**
+	 * Handles a {@link ReferenceChange} that is not part of an ADD or DELETE.
+	 * 
+	 * @param refChange
+	 *            The {@link ReferenceChange} to handle
+	 */
+	private void handleActualReferenceChange(ReferenceChange refChange) {
+		if (isConnectorReferenceChange(refChange)) {
+			// Changing the target of an edge that represents an
+			// association has consequences
+			Connector connectorOnDiffSide = (Connector)getMatchObjectOnSameSideAs(refChange);
+			if (connectorOnDiffSide == null) {
+				return;
+			}
+			EObject element = connectorOnDiffSide.getElement();
+			if (element instanceof Association) {
+				Association assoc = (Association)element;
+				for (Property memberEnd : assoc.getMemberEnds()) {
+					indexer.putEquivalentDiff(new SidedEObject(memberEnd, refChange.getSource()), refChange);
+				}
+			} else if (element instanceof Transition) {
+				if (refChange.getReference() == NotationPackage.Literals.EDGE__SOURCE) {
+					indexer.putEquivalentDiff(new SidedFeatureInstance(element,
+							UMLPackage.Literals.TRANSITION__SOURCE, refChange.getSource()), refChange);
+				} else if (refChange.getReference() == NotationPackage.Literals.EDGE__TARGET) {
+					indexer.putEquivalentDiff(new SidedFeatureInstance(element,
+							UMLPackage.Literals.TRANSITION__TARGET, refChange.getSource()), refChange);
+				}
+			}
+		} else if (isPropertyTypeChange(refChange)) {
+			// We record property type changes for properties
+			// because those that participate in relations
+			// materialize in notation files by a target change in
+			// the related Connector
+			indexer.putEquivalentDiff(
+					new SidedEObject(getMatchObjectOnSameSideAs(refChange), refChange.getSource()),
+					refChange);
+		} else if (isTransitionReferenceChange(refChange)) {
+			indexer.putEquivalentDiff(new SidedFeatureInstance(getMatchObjectOnSameSideAs(refChange),
+					refChange.getReference(), refChange.getSource()), refChange);
+		}
+		// TODO Manage other kinds of relations (Dependency, what
+		// else in UML?)
+	}
+
+	/**
+	 * Provides the EObject of the given diff's match that is on the same side as the given diff.
+	 * 
+	 * @param diff
+	 *            The diff
+	 * @return The EObject of the given diff's match that's on the same side as the diff.
+	 */
+	protected EObject getMatchObjectOnSameSideAs(Diff diff) {
+		Match match = diff.getMatch();
+		// CHECKSTYLE:OFF No need of a default case
+		switch (diff.getSource()) {
+			case LEFT:
+				return match.getLeft();
+			case RIGHT:
+				return match.getRight();
+		}
+		// CHECKSTYLE:ON
+		throw new IllegalStateException(
+				"The diff should be part of a 3-way comparison and have a non-null source."); //$NON-NLS-1$
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostComparison.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostComparison.java
new file mode 100644
index 0000000..22ae847
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostComparison.java
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import com.google.common.collect.LinkedHashMultimap;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.merge.ResourceChangeAdapter;
+import org.eclipse.emf.compare.merge.ResourceChangeAdapter.IResourceChangeParticipant;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+/**
+ * This class materializes the post-comparison treatment. This treatment manages relations between notation
+ * changes and UML semantic changes when such changes should be linked. For instance, when the target of a
+ * connector is changed in the representation, it is also changed in the UML model. This treatment also
+ * installs a {@link IResourceChangeParticipant} on the comparison to make sure Papyrus resources are
+ * created/deleted together.
+ */
+public class PapyrusDiagramPostComparison implements Runnable {
+	/** The comparison. */
+	private final Comparison comparison;
+
+	/** The indexer. */
+	private final DiffIndexer indexer;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param comparison
+	 *            The comparison
+	 */
+	public PapyrusDiagramPostComparison(Comparison comparison) {
+		this.comparison = comparison;
+		indexer = new DiffIndexer();
+	}
+
+	/**
+	 * Executes the treatment.
+	 * <p>
+	 * In a first step, a participant is registered on the comparison to deal with resources to delete.
+	 * </p>
+	 * <p>
+	 * In a second step, implications are created. The algorithm takes 2 passes:
+	 * <ol>
+	 * <li>Index all {@link Diff}s that may be related with another {@link Diff}, using specific keys</li>
+	 * <li>for each key in the index, create bi-directional implication links between the concerned diffs</li>
+	 * </ol>
+	 * This algorithm is linear, indexing in the first pass prevents fancy searches in the comparison model
+	 * which may impede scalability.
+	 * </p>
+	 */
+	public void run() {
+		registerResourceChangeParticipant();
+		IDiffHandler handler = getHandler();
+		for (Diff diff : comparison.getDifferences()) {
+			handler.handle(diff);
+		}
+		linkEquivalentDiffsWithRequiresRelations();
+	}
+
+	/**
+	 * Register a {@link IResourceChangeParticipant} on the comparison for Papyrus resources.
+	 */
+	protected void registerResourceChangeParticipant() {
+		final Adapter adapter = EcoreUtil.getAdapter(comparison.eAdapters(), ResourceChangeAdapter.class);
+		if (adapter instanceof ResourceChangeAdapter) {
+			((ResourceChangeAdapter)adapter)
+					.addParticipant(new PapyrusResourceChangeParticipant((ResourceChangeAdapter)adapter));
+		}
+	}
+
+	/**
+	 * Once all related differences are indexed, walk through the index and create the implication links
+	 * between all concerned {@link Diff}s. The indexing of {@link Diff}s must have been done before calling
+	 * this method.
+	 */
+	private void linkEquivalentDiffsWithRequiresRelations() {
+		for (Object key : indexer.getEquivalentDiffsKeySet()) {
+			Set<Diff> diffs = indexer.getEquivalentDiffs(key);
+			if (diffs.size() > 1) {
+				// Keep a map of equivalent diffs based on having the same source.
+				LinkedHashMultimap<DifferenceSource, Diff> sourceDiffs = LinkedHashMultimap.create();
+				try {
+					for (Diff diff : diffs) {
+						sourceDiffs.put(diff.getSource(), diff);
+						// Turn off notification delivery because we can end up populating very large
+						// relations; processing all those notifications is unnecessary at this point in time,
+						// because the reference involved is bi-directional, cross referencers don't need to
+						// monitor it.
+						diff.eSetDeliver(false);
+					}
+
+					for (DifferenceSource differenceSource : sourceDiffs.keySet()) {
+						Set<Diff> equivalentDiffs = sourceDiffs.get(differenceSource);
+						for (Diff diff : equivalentDiffs) {
+							List<Diff> requires = diff.getRequires();
+							requires.addAll(equivalentDiffs);
+							// Remove the circular requirement.
+							requires.remove(diff);
+						}
+					}
+				} finally {
+					for (Diff diff : diffs) {
+						// Turn notification delivery back on after updating the requires references.
+						diff.eSetDeliver(true);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Provide the {@link IDiffHandler} for the comparison used by this instance.
+	 * 
+	 * @return An indexer that manages 3-way comparisons if the comparison is 3-way, or an indexer that
+	 *         manages 2-way comparisons otherwise.
+	 */
+	protected IDiffHandler getHandler() {
+		if (comparison.isThreeWay()) {
+			return new PapyrusDiagram3WayDiffHandler(indexer);
+		} else {
+			return new PapyrusDiagram2WayDiffHandler(indexer);
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostProcessor.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostProcessor.java
new file mode 100644
index 0000000..5b20080
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusDiagramPostProcessor.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.common.util.Monitor;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.postprocessor.IPostProcessor;
+
+/**
+ * Post-processor used to manage interactions between papyrus diagrams (*.notation files) and the related UML
+ * models (*.uml files).
+ */
+public class PapyrusDiagramPostProcessor implements IPostProcessor {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postMatch(Comparison comparison, Monitor monitor) {
+		// Nothing to do here
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postDiff(Comparison comparison, Monitor monitor) {
+		// Nothing to do here
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postRequirements(Comparison comparison, Monitor monitor) {
+		// Nothing to do here
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postEquivalences(Comparison comparison, Monitor monitor) {
+		// Nothing to do here
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void postConflicts(Comparison comparison, Monitor monitor) {
+		// Nothing to do here
+	}
+
+	/**
+	 * creates links between notation and UML changes when they should be linked.
+	 * 
+	 * @param comparison
+	 *            The comparison
+	 * @param monitor
+	 *            The progress monitor
+	 */
+	public void postComparison(Comparison comparison, Monitor monitor) {
+		if (monitor == null || !monitor.isCanceled()) {
+			new PapyrusDiagramPostComparison(comparison).run();
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusResourceChangeParticipant.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusResourceChangeParticipant.java
new file mode 100644
index 0000000..a8a045a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/PapyrusResourceChangeParticipant.java
@@ -0,0 +1,126 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.all;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.compare.merge.ResourceChangeAdapter;
+import org.eclipse.emf.compare.merge.ResourceChangeAdapter.IResourceChangeParticipant;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.gitlight.compare.util.ModelExtensionUtil;
+
+/**
+ * Implementation of {@link IResourceChangeParticipant} dedicated to papyrus, which makes sure that all
+ * papyrus resources (di, notation, uml, ...) are deleted at the same time.
+ */
+public final class PapyrusResourceChangeParticipant implements IResourceChangeParticipant {
+
+	/**
+	 * The ResourceChangeAdapter.
+	 */
+	private final ResourceChangeAdapter resourceChangeAdapter;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param adapter
+	 *            The adapter, must not be <code>null</code>
+	 */
+	public PapyrusResourceChangeParticipant(ResourceChangeAdapter adapter) {
+		this.resourceChangeAdapter = checkNotNull(adapter);
+	}
+
+	/**
+	 * This participant is interested in all papyrus resources.
+	 * 
+	 * @param r
+	 *            The resource
+	 * @return <code>true</code> if r is a papyrus resource.
+	 */
+	public boolean interestedIn(Resource r) {
+		return ModelExtensionUtil.getRegisteredFileExtensions().contains(r.getURI().fileExtension());
+	}
+
+	/**
+	 * The URIs of the resources associated to a given resource are those with the same URI but a different
+	 * file extension.
+	 * 
+	 * @param r
+	 *            The resource
+	 * @return a collection of URI, never <code>null</code> but possibly empty.
+	 */
+	public Collection<URI> associatedResourceURIs(Resource r) {
+		URI trimmedURI = r.getURI().trimFileExtension();
+		List<URI> result = Lists.newArrayList();
+		for (String fileExtension : ModelExtensionUtil.getRegisteredFileExtensions()) {
+			result.add(trimmedURI.appendFileExtension(fileExtension));
+		}
+		return result;
+	}
+
+	/**
+	 * The resources associated to a given resource are those with the same URI but a different file
+	 * extension.
+	 * 
+	 * @param r
+	 *            The resource
+	 * @return a collection of resources, never <code>null</code> but possibly empty.
+	 */
+	protected Collection<Resource> associatedResources(Resource r) {
+		URI trimmedURI = r.getURI().trimFileExtension();
+		List<Resource> result = Lists.newArrayList();
+		for (String fileExtension : ModelExtensionUtil.getRegisteredFileExtensions()) {
+			Resource other = r.getResourceSet().getResource(trimmedURI.appendFileExtension(fileExtension),
+					false);
+			if (other != null && other != r) {
+				result.add(other);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * The deletion of a resource is accepted if all the associated resources can also be deleted.
+	 * 
+	 * @param r
+	 *            The resource
+	 * @return <code>true</code> if r can be deleted.
+	 */
+	public boolean acceptDelete(Resource r) {
+		return all(associatedResources(r), canBeDeleted());
+	}
+
+	/**
+	 * Predicate to check whether a resource can be deleted.
+	 * 
+	 * @return A predicate that returns <code>true</code> for resources that are empty and not matched on the
+	 *         other side of the comparison.
+	 */
+	private Predicate<Resource> canBeDeleted() {
+		return new Predicate<Resource>() {
+			public boolean apply(Resource input) {
+				return resourceChangeAdapter.isEmptyAndMissingOnOtherSide(input);
+			}
+		};
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedEObject.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedEObject.java
new file mode 100644
index 0000000..acb0e2a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedEObject.java
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * Instance of a feature for an EObject, designed to be used as a key in a Map.
+ */
+class SidedEObject {
+	/** The EObject. */
+	private final EObject eObject;
+
+	/** The side. */
+	private final DifferenceSource side;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param eObject
+	 *            The EObject
+	 * @param side
+	 *            The side
+	 */
+	SidedEObject(EObject eObject, DifferenceSource side) {
+		super();
+		this.eObject = eObject;
+		this.side = side;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		// CHECKSTYLE:OFF Code generated by JDT
+		result = prime * result + ((eObject == null) ? 0 : eObject.hashCode());
+		result = prime * result + ((side == null) ? 0 : side.hashCode());
+		// CHECKSTYLE:ON
+		return result;
+	}
+
+	// CHECKSTYLE:OFF Code generated by JDT
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		SidedEObject other = (SidedEObject)obj;
+		if (eObject != other.eObject) {
+			return false;
+		}
+		if (side != other.side) {
+			return false;
+		}
+		return true;
+		// CHECKSTYLE:ON
+	}
+
+	@Override
+	public String toString() {
+		if (eObject == null) {
+			return "<null>-" + side; //$NON-NLS-1$
+		}
+		return eObject.eClass().getName() + '-' + side.getName(); //$NON-NLS-1$
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedFeatureInstance.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedFeatureInstance.java
new file mode 100644
index 0000000..132eca3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/internal/SidedFeatureInstance.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.internal;
+
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * Instance of a feature for an EObject on a side of a comparison.
+ */
+class SidedFeatureInstance extends FeatureInstance {
+	/** The side. */
+	private final DifferenceSource side;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param eObject
+	 *            The EObject
+	 * @param feature
+	 *            The feature
+	 * @param side
+	 *            The side
+	 */
+	SidedFeatureInstance(EObject eObject, EStructuralFeature feature, DifferenceSource side) {
+		super(eObject, feature);
+		this.side = side;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = super.hashCode();
+		// CHECKSTYLE:OFF Code generated by JDT
+		result = prime * result + ((side == null) ? 0 : side.hashCode());
+		// CHECKSTYLE:ON
+		return result;
+	}
+
+	// CHECKSTYLE:OFF Code generated by JDT
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (!super.equals(obj)) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		SidedFeatureInstance other = (SidedFeatureInstance)obj;
+		if (side != other.side) {
+			return false;
+		}
+		return true;
+		// CHECKSTYLE:ON
+	}
+
+	@Override
+	public String toString() {
+		return super.toString() + '-' + side.getName(); //$NON-NLS-1$
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/util/ModelExtensionUtil.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/util/ModelExtensionUtil.java
new file mode 100644
index 0000000..d8ee0d3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.compare/src/org/eclipse/papyrus/gitlight/compare/util/ModelExtensionUtil.java
@@ -0,0 +1,227 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.compare.util;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.gitlight.compare.ComparePapyrusMessages;
+import org.eclipse.papyrus.gitlight.compare.ComparePlugin;
+import org.eclipse.papyrus.infra.core.resource.AbstractBaseModel;
+import org.eclipse.papyrus.infra.core.resource.IModel;
+import org.eclipse.papyrus.infra.core.resource.ModelsReader;
+
+/**
+ * This class can be used to handle the model extension point of Papyrus.
+ */
+public final class ModelExtensionUtil {
+
+	/**
+	 * Defined because the corresponding field in ModelsReader is private.
+	 */
+	private static final String FILE_EXTENSION_ATTRIBUTE = "fileExtension"; //$NON-NLS-1$
+
+	/**
+	 * Defined because the corresponding field in ModelsReader is private.
+	 */
+	private static final String CLASSNAME_ATTRIBUTE = "classname"; //$NON-NLS-1$
+
+	/**
+	 * Method name to request save parameters.
+	 */
+	private static final String SAVE_PARAMETERS_METHOD = "getSaveOptions"; //$NON-NLS-1$
+
+	/**
+	 * Disallow Constructor for Util classes.
+	 */
+	private ModelExtensionUtil() {
+		// Disallow Constructor
+	}
+
+	/**
+	 * Checks the platform registry for extensions registered on the model extension point of Papyrus.
+	 * 
+	 * @return A possibly empty array of {@link IConfigurationElement}s.
+	 */
+	public static IConfigurationElement[] getModelExtensions() {
+		return Platform.getExtensionRegistry().getConfigurationElementsFor(
+				org.eclipse.papyrus.infra.core.Activator.PLUGIN_ID, ModelsReader.EXTENSION_POINT_NAME);
+	}
+
+	/**
+	 * Determines all file extensions directly registered with the model extension point of Papyrus.
+	 * 
+	 * @return A possibly empty collection of registered file extensions. Does not contain {@code null} values
+	 *         or duplicates.
+	 */
+	public static Collection<String> getRegisteredFileExtensions() {
+		Set<String> fileExtensions = new LinkedHashSet<String>();
+		IConfigurationElement[] modelExtensions = getModelExtensions();
+
+		for (IConfigurationElement element : modelExtensions) {
+			if (ModelsReader.MODEL_ELEMENT_NAME.equals(element.getName())) {
+				String fileExtension = element.getAttribute(FILE_EXTENSION_ATTRIBUTE);
+				if (fileExtension != null) {
+					fileExtensions.add(fileExtension);
+				}
+			}
+		}
+		return fileExtensions;
+	}
+
+	/**
+	 * <p>
+	 * Returns the save parameters for the given {@code resourceExtension}. First a dynamic instance of the
+	 * model registered to the extension point is created. If this model offers the option to determine its
+	 * save options, they will be returned. If any error occurs during that process, the default save options
+	 * for Papyrus models will be returned. If no dynamic instance can be created or the dynamic instance does
+	 * not offer a way to determine its save options, an empty map will be returned.
+	 * </p>
+	 * <p>
+	 * If multiple models are registered for the same file extension only the first model is looked at.
+	 * </p>
+	 * 
+	 * @param resourceExtension
+	 *            The file extension for which the save parameters are tried to be determined.
+	 * @return A map with save options if they were successfully determined, an empty map otherwise.
+	 */
+	public static Map<?, ?> getSaveParameters(String resourceExtension) {
+		IConfigurationElement[] modelExtensions = getModelExtensions();
+
+		Map<?, ?> saveOptions = Collections.EMPTY_MAP;
+
+		for (IConfigurationElement element : modelExtensions) {
+			if (ModelsReader.MODEL_ELEMENT_NAME.equals(element.getName())) {
+				String fileExtension = element.getAttribute(FILE_EXTENSION_ATTRIBUTE);
+				if (fileExtension != null && fileExtension.equals(resourceExtension)) {
+
+					// Try to load the IModel class and request save parameters if the IModel class extends
+					// the AbstractBaseModel. This should not fail but maybe does anyway since the IModel
+					// class can't be initialized here. If this is the case return the default Papyrus save
+					// parameters.
+					try {
+						IModel imodel = (IModel)element.createExecutableExtension(CLASSNAME_ATTRIBUTE);
+
+						if (imodel instanceof AbstractBaseModel) {
+							try {
+								AbstractBaseModel model = (AbstractBaseModel)imodel;
+
+								// use reflection since there is no good reason why this method is protected
+								// instead of public (like the static default version since version 1.1.0).
+								// Also
+								// protected means it is part of the API and will not change.
+								Method getSaveParametersMethod = model.getClass()
+										.getDeclaredMethod(SAVE_PARAMETERS_METHOD, new Class[0]);
+								getSaveParametersMethod.setAccessible(true);
+								saveOptions = (Map<?, ?>)getSaveParametersMethod.invoke(model, new Object[0]);
+								// CHECKSTYLE:OFF We do want to catch any exception
+							} catch (Exception e) {
+								// CHECKSTYLE:ON
+								return getDefaultSaveOptions();
+							}
+						}
+					} catch (CoreException e) {
+						// Configuration problem
+						ComparePlugin.getDefault().getLog()
+								.log(new Status(IStatus.ERROR, ComparePlugin.PLUGIN_ID,
+										ComparePapyrusMessages.getString("ModelExtensionUtil.InvalidConfig", //$NON-NLS-1$
+												fileExtension)));
+					}
+					break; // We have found the extension, no need to continue iterating
+				}
+			}
+		}
+
+		if (saveOptions == null) {
+			saveOptions = Collections.EMPTY_MAP;
+		}
+
+		return saveOptions;
+	}
+
+	/**
+	 * This method returns the default save options of {@link AbstractBaseModel}.
+	 * 
+	 * @return The default save options of {@link AbstractBaseModel}.
+	 */
+	private static Map<?, ?> getDefaultSaveOptions() {
+		DefaultSaveOptionsClass saveOptions = new DefaultSaveOptionsClass();
+		return saveOptions.getMyDefaultSaveOptions();
+	}
+
+	/**
+	 * Workaround class to access the default save options which are hidden behind a "protected" barrier
+	 * before version 1.1.0.
+	 */
+	private static class DefaultSaveOptionsClass extends AbstractBaseModel {
+
+		public Map<?, ?> getMyDefaultSaveOptions() {
+			return getSaveOptions();
+		}
+
+		@Override
+		protected String getModelFileExtension() {
+			return null;
+		}
+
+		@Override
+		public String getIdentifier() {
+			return null;
+		}
+
+		/**
+		 * Stub implementation, which always returns <code>false</code>.
+		 * <p>
+		 * Since Papyrus 2.0, {@link AbstractBaseModel} forces us to implement
+		 * {@link AbstractBaseModel#canPersist(EObject)}. We omit <code>@Override</code> on purpose to be
+		 * backward compatible.
+		 * </p>
+		 * 
+		 * @param eObject
+		 *            This parameter will be ignored.
+		 * @return <code>false</code>.
+		 */
+		@SuppressWarnings("all")
+		public boolean canPersist(EObject eObject) {
+			return false;
+		}
+
+		/**
+		 * Stub implementation, which does nothing.
+		 * <p>
+		 * Since Papyrus 2.0, {@link AbstractBaseModel} forces us to implement
+		 * {@link AbstractBaseModel#persist(EObject)}. We omit <code>@Override</code> on purpose to be
+		 * backward compatible.
+		 * </p>
+		 * 
+		 * @param eObject
+		 *            This parameter will be ignored.
+		 */
+		@SuppressWarnings("all")
+		public void persist(EObject eObject) {
+			// no implementation
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.project
new file mode 100644
index 0000000..7b303ec
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.git.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..baf433c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.git.ui
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.git.ui;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.papyrus.gitlight.git.ui.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.papyrus.infra.core.log,
+ org.eclipse.jgit,
+ org.eclipse.core.expressions,
+ org.eclipse.egit.core,
+ org.eclipse.egit.ui,
+ org.eclipse.papyrus.infra.widgets,
+ org.eclipse.uml2.uml,
+ org.eclipse.papyrus.uml.internationalization.utils,
+ org.eclipse.papyrus.infra.emf,
+ org.eclipse.papyrus.gitlight.git;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.gitlight.review.profile;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.papyrus.uml.tools,
+ org.eclipse.papyrus.uml.tools.utils
+Export-Package: org.eclipse.papyrus.gitlight.git.ui,
+ org.eclipse.papyrus.gitlight.git.ui.dialogs,
+ org.eclipse.papyrus.gitlight.git.ui.handlers,
+ org.eclipse.papyrus.gitlight.git.ui.providers,
+ org.eclipse.papyrus.gitlight.git.ui.testers,
+ org.eclipse.papyrus.gitlight.git.ui.utils,
+ org.eclipse.papyrus.gitlight.git.ui.views
+Import-Package: com.google.common.base;version="21.0.0",
+ com.google.common.collect;version="21.0.0"
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/build.properties
new file mode 100644
index 0000000..1002368
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/build.properties
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               resources/,\
+               about.html
+source.. = src/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.properties
new file mode 100644
index 0000000..efaf09d
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.properties
@@ -0,0 +1,40 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Git UI
+providerName = Eclipse Modeling Project
+
+activate_track_changes_label=&Activate track changes...
+activate_track_changes_description=Share the project into the git repository
+create_contribution_label=&Create contribution...
+create_contribution_description=Create a contribution of this model
+update_contribution_label=&Update a contribution...
+update_contribution_description=Update an existing contribution of this model
+get_base_label=&Get current base
+get_base_description=Get the model defined in the current base
+compare_with_base_label=&Compare with base
+compare_with_base_description=Compare with base model
+get_contribution_label=&Get this contribution
+get_contribution_description=Get this contribution
+review_contribution_label=&Review contribution
+review_contribution_description=Review this contribution
+contribute_review_label=Contribute review
+contribute_review_description=Contribute the review
+push_contribution_label=&Define this as repository
+push_contribution_description=Define this as repository
+reject_contribution_label=&Reject this contribution
+reject_contribution_description=Reject this contribution
+
+contribution_view_label=Contributions
+contribution_view_description=The contributions view to detect the contributions available for the selected model.
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.xml
new file mode 100644
index 0000000..ea603dc
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/plugin.xml
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            allPopups="false"
+            locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.share.project.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/shareProject.png"
+               label="%activate_track_changes_label"
+               style="push"
+               tooltip="%activate_track_changes_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <test
+                        forcePluginActivation="true"
+                        property="org.eclipse.papyrus.gitlight.git.isEnabled">
+                  </test>
+                  <test
+                        forcePluginActivation="true"
+                        property="org.eclipse.papyrus.gitlight.git.isSharedProject"
+                        value="false">
+                  </test>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.create.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/branch.png"
+               label="%create_contribution_label"
+               style="push"
+               tooltip="%create_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                    <test
+                          forcePluginActivation="true"
+                          property="org.eclipse.papyrus.gitlight.git.isEnabled">
+                    </test>
+                    <test
+                          forcePluginActivation="true"
+                          property="org.eclipse.papyrus.gitlight.git.isSharedProject"
+                          value="true">
+                    </test>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.update.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/branch.png"
+               label="%update_contribution_label"
+               style="push"
+               tooltip="%update_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                    <test
+                          forcePluginActivation="true"
+                          property="org.eclipse.papyrus.gitlight.git.isEnabled">
+                    </test>
+                    <test
+                          forcePluginActivation="true"
+                          property="org.eclipse.papyrus.gitlight.git.isSharedProject"
+                          value="true">
+                    </test>
+                    <test
+                          forcePluginActivation="true"
+                          property="org.eclipse.papyrus.gitlight.git.canUpdateContribution"
+                          value="true">
+                    </test>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <separator
+               name="org.eclipse.papyrus.gitlight.git.ui.checkout.separator">
+         </separator>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.get.base.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getBase.png"
+               label="%get_base_label"
+               style="push"
+               tooltip="%get_base_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <test
+                        forcePluginActivation="true"
+                        property="org.eclipse.papyrus.gitlight.git.isEnabled">
+                  </test>
+                  <test
+                        forcePluginActivation="true"
+                        property="org.eclipse.papyrus.gitlight.git.isSharedProject"
+                        value="true">
+                  </test>
+                  <test
+                        forcePluginActivation="true"
+                        property="org.eclipse.papyrus.gitlight.git.canCheckoutMaster"
+                        value="true">
+                  </test>
+               </iterate>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+      <menuContribution
+            allPopups="false"
+            locationURI="popup:org.eclipse.papyrus.gitlight.git.ui.contributions.view.popup">
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.compare.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/compare.png"
+               label="%compare_with_base_label"
+               style="push"
+               tooltip="%compare_with_base_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <instanceof
+                        value="org.eclipse.jgit.lib.Ref">
+                  </instanceof>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.get.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getContribution.png"
+               label="%get_contribution_label"
+               style="push"
+               tooltip="%get_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <instanceof
+                        value="org.eclipse.jgit.lib.Ref">
+                  </instanceof>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.review.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reviewContribution.png"
+               label="%review_contribution_label"
+               style="push"
+               tooltip="%review_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <instanceof
+                        value="org.eclipse.jgit.lib.Ref">
+                  </instanceof>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.contribute.review.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributeReview.png"
+               label="%contribute_review_label"
+               style="push"
+               tooltip="%contribute_review_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <and>
+                     <instanceof
+                           value="org.eclipse.jgit.lib.Ref">
+                     </instanceof>
+                     <test
+                           forcePluginActivation="true"
+                           property="org.eclipse.papyrus.gitlight.git.canContributeReview"
+                           value="true">
+                     </test>
+                  </and>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.push.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/accept.png"
+               label="%push_contribution_label"
+               style="push"
+               tooltip="%push_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <instanceof
+                        value="org.eclipse.jgit.lib.Ref">
+                  </instanceof>
+               </iterate>
+            </visibleWhen>
+         </command>
+         <command
+               commandId="org.eclipse.papyrus.gitlight.git.reject.contribution.command"
+               icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reject.png"
+               label="%reject_contribution_label"
+               style="push"
+               tooltip="%reject_contribution_description">
+            <visibleWhen
+                  checkEnabled="false">
+               <iterate
+                     ifEmpty="false"
+                     operator="and">
+                  <instanceof
+                        value="org.eclipse.jgit.lib.Ref">
+                  </instanceof>
+               </iterate>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.ShareProjectHandler"
+            description="%activate_track_changes_description"
+            id="org.eclipse.papyrus.gitlight.git.share.project.command"
+            name="%activate_track_changes_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.CreateModelContributionHandler"
+            description="%create_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.create.contribution.command"
+            name="%create_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.UpdateModelContributionHandler"
+            description="%update_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.update.contribution.command"
+            name="%update_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.PushContributionHandler"
+            description="%push_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.push.contribution.command"
+            name="%push_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.CompareWithBaseHandler"
+            description="%compare_with_base_description"
+            id="org.eclipse.papyrus.gitlight.git.compare.command"
+            name="%compare_with_base_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.RejectContributionHandler"
+            description="%reject_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.reject.contribution.command"
+            name="%reject_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.ContributeReviewHandler"
+            description="%contribute_review_description"
+            id="org.eclipse.papyrus.gitlight.git.contribute.review.command"
+            name="%contribute_review_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.ReviewContributionHandler"
+            description="%review_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.review.contribution.command"
+            name="%review_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.GetContributionVersionHandler"
+            description="%get_contribution_description"
+            id="org.eclipse.papyrus.gitlight.git.get.contribution.command"
+            name="%get_contribution_label">
+      </command>
+      <command
+            defaultHandler="org.eclipse.papyrus.gitlight.git.ui.handlers.GetBaseVersionHandler"
+            description="%get_base_description"
+            id="org.eclipse.papyrus.gitlight.git.get.base.command"
+            name="%get_base_label">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.core.expressions.propertyTesters">
+      <propertyTester
+            class="org.eclipse.papyrus.gitlight.git.ui.testers.PapyrusFilePropertyTester"
+            id="org.eclipse.papyrus.gitlight.git.papyrusfile.propertytester.isEnabled"
+            namespace="org.eclipse.papyrus.gitlight.git"
+            properties="isEnabled"
+            type="java.lang.Object">
+      </propertyTester>
+      <propertyTester
+            class="org.eclipse.papyrus.gitlight.git.ui.testers.PapyrusProjectPropertyTester"
+            id="org.eclipse.papyrus.gitlight.git.papyrusfile.propertytester.canCheckoutMaster"
+            namespace="org.eclipse.papyrus.gitlight.git"
+            properties="canCheckoutMaster"
+            type="java.lang.Object">
+      </propertyTester>
+      <propertyTester
+            class="org.eclipse.papyrus.gitlight.git.ui.testers.PapyrusProjectPropertyTester"
+            id="org.eclipse.papyrus.gitlight.git.papyrusfile.propertytester.isSharedProject"
+            namespace="org.eclipse.papyrus.gitlight.git"
+            properties="isSharedProject"
+            type="java.lang.Object">
+      </propertyTester>
+      <propertyTester
+            class="org.eclipse.papyrus.gitlight.git.ui.testers.CanContributeReviewPropertyTester"
+            id="org.eclipse.papyrus.gitlight.git.papyrusfile.propertytester.canContributeReview"
+            namespace="org.eclipse.papyrus.gitlight.git"
+            properties="canContributeReview"
+            type="java.lang.Object">
+      </propertyTester>
+      <propertyTester
+            class="org.eclipse.papyrus.gitlight.git.ui.testers.ContributionPropertyTester"
+            id="org.eclipse.papyrus.gitlight.git.papyrusfile.propertytester.canUpdateContribution"
+            namespace="org.eclipse.papyrus.gitlight.git"
+            properties="canUpdateContribution"
+            type="java.lang.Object">
+      </propertyTester>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="false"
+            class="org.eclipse.papyrus.gitlight.git.ui.views.ContributionsView"
+            icon="platform:/plugin/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributionsView.png"
+            id="org.eclipse.papyrus.gitlight.git.ui.contributions.view"
+            name="%contribution_view_label"
+            restorable="true">
+         <description>
+            %contribution_view_description
+         </description>
+      </view>
+   </extension>
+   <extension
+         point="org.eclipse.ui.navigator.viewer">
+      <viewer
+            popupMenuId="org.eclipse.papyrus.gitlight.git.ui.contributions.view.popup"
+            viewerId="org.eclipse.papyrus.gitlight.git.ui.contributions.view">
+         <options>
+            <property
+                  name="org.eclipse.ui.navigator.hideCollapseAllAction"
+                  value="true">
+            </property>
+         </options>
+      </viewer>
+      <viewerContentBinding
+            viewerId="org.eclipse.papyrus.gitlight.git.ui.contributions.*">
+      </viewerContentBinding>
+   </extension>
+  
+   
+   
+   
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/pom.xml
new file mode 100644
index 0000000..667fa90
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.git.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/accept.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/accept.png
new file mode 100644
index 0000000..d87e6ed
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/accept.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/branch.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/branch.png
new file mode 100644
index 0000000..91b08ac
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/branch.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/compare.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/compare.png
new file mode 100644
index 0000000..5a40dc8
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/compare.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributeReview.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributeReview.png
new file mode 100644
index 0000000..de22513
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributeReview.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributionsView.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributionsView.png
new file mode 100644
index 0000000..a3339a0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/contributionsView.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getBase.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getBase.png
new file mode 100644
index 0000000..8227385
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getBase.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getContribution.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getContribution.png
new file mode 100644
index 0000000..ec07f79
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/getContribution.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reject.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reject.png
new file mode 100644
index 0000000..2cdf8fc
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reject.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/repository.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/repository.png
new file mode 100644
index 0000000..3523f21
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/repository.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reviewContribution.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reviewContribution.png
new file mode 100644
index 0000000..227c9c3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/reviewContribution.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/shareProject.png b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/shareProject.png
new file mode 100644
index 0000000..930ca22
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/resources/icons/shareProject.png
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/Activator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/Activator.java
new file mode 100644
index 0000000..3d5235f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/Activator.java
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui;
+
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.gitlight.git.ui"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+
+	/** Logging helper. */
+	private static LogHelper logHelper;
+
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		logHelper = new LogHelper(plugin);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+		logHelper = null;
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the log helper
+	 * 
+	 * @return the log helper
+	 */
+	public static LogHelper getLogHelper() {
+		return logHelper;
+	}
+
+	/**
+	 * Returns the image from the given image descriptor
+	 *
+	 * @param pluginId
+	 *            The plugin in which the image is located
+	 * @param path
+	 *            The path to the image from the plugin
+	 * @return
+	 * 		The Image at the given location, or null if it couldn't be found
+	 */
+	public Image getImage(final String pluginId, final String path) {
+		final ImageRegistry registry = getImageRegistry();
+		String key = pluginId + "/" + path; //$NON-NLS-1$
+		Image image = registry.get(key);
+		if (image == null) {
+			registry.put(key, AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, path));
+			image = registry.get(key);
+		}
+		return image;
+	}
+
+}
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/GitIcons.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/GitIcons.java
new file mode 100644
index 0000000..05fd414
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/GitIcons.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * The git icons.
+ */
+public class GitIcons {
+
+	/** The branch icon. */
+	public final static ImageDescriptor BRANCH;
+	
+	/** The review view icon. */
+	public final static ImageDescriptor REVIEWS_VIEW;
+
+	/** The repository icon. */
+	public final static ImageDescriptor REPOSITORY;
+
+	/** base URL */
+	public final static URL base;
+
+	static {
+		base = init();
+		BRANCH = map("resources/icons/branch.png"); //$NON-NLS-1$
+		REVIEWS_VIEW = map("resources/icons/reviewsView.png"); //$NON-NLS-1$
+		REPOSITORY = map("resources/icons/repository.png"); //$NON-NLS-1$
+	}
+
+	/**
+	 * This allows to initialize the base url.
+	 * 
+	 * @return The base URL.
+	 */
+	private static URL init() {
+		try {
+			return new URL(Activator.getDefault().getBundle().getEntry("/"), "/"); //$NON-NLS-1$ //$NON-NLS-2$
+		} catch (MalformedURLException mux) {
+			Activator.getLogHelper().error("Can't determine icon base.", mux); //$NON-NLS-1$
+			return null;
+		}
+	}
+
+	/**
+	 * This allows to get the image descriptor with base URL.
+	 * 
+	 * @param icon
+	 *            The icon path.
+	 * @return The image descriptor.
+	 */
+	private static ImageDescriptor map(final String icon) {
+		if (base != null) {
+			try {
+				return ImageDescriptor.createFromURL(new URL(base, icon));
+			} catch (MalformedURLException mux) {
+				Activator.getLogHelper().error("Can't load plug-in image.", mux); //$NON-NLS-1$
+			}
+		}
+		return ImageDescriptor.getMissingImageDescriptor();
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ContributionSelectionDialog.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ContributionSelectionDialog.java
new file mode 100644
index 0000000..596f386
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ContributionSelectionDialog.java
@@ -0,0 +1,170 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.dialogs;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.providers.BranchLabelProvider;
+import org.eclipse.papyrus.gitlight.git.ui.providers.BranchesContentProvider;
+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.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * This class define the contributions (branches) selection dialog.
+ */
+public class ContributionSelectionDialog extends SelectionDialog {
+
+	/**
+	 * The tree viewer.
+	 */
+	protected TreeViewer treeViewer;
+
+	/**
+	 * The git (and also the input of the treeviewer).
+	 */
+	protected Git git;
+
+	/**
+	 * The selected repository result.
+	 */
+	protected Ref selectedBranch;
+
+	/**
+	 * The validation message.
+	 */
+	protected Label statusMessage;
+
+	/**
+	 * Default constructor.
+	 *
+	 * @param parentShell
+	 *            The parent shell.
+	 * @param git
+	 *            The git.
+	 */
+	public ContributionSelectionDialog(final Shell parentShell, final Git git) {
+		super(parentShell);
+		setTitle("Select contribution"); //$NON-NLS-1$
+		this.git = git;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected Control createDialogArea(final Composite parent) {
+		// create composite
+		final Composite area = (Composite) super.createDialogArea(parent);
+
+		getShell().setImage(Activator.getDefault().getImage("org.eclipse.papyrus.infra.widgets", "/icons/papyrus.png")); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// container selection group
+		final GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		area.setLayout(layout);
+		area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		final Label label = new Label(area, SWT.WRAP);
+		label.setText("Contributions:"); //$NON-NLS-1$
+
+		final Composite drillDown = new Composite(area, SWT.BORDER);
+		GridData spec = new GridData(SWT.FILL, SWT.FILL, true, true);
+		spec.widthHint = 620;
+		spec.heightHint = 300;
+		drillDown.setLayoutData(spec);
+		drillDown.setLayout(new GridLayout());
+
+		// Create tree viewer inside drill down.
+		treeViewer = new TreeViewer(drillDown, SWT.BORDER | SWT.SINGLE);
+		treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		treeViewer.setContentProvider(new BranchesContentProvider(false));
+		treeViewer.setLabelProvider(new BranchLabelProvider(git));
+		treeViewer.setUseHashlookup(true);
+		treeViewer.addSelectionChangedListener(event -> {
+			IStructuredSelection selection = event.getStructuredSelection();
+			if (selection.getFirstElement() instanceof Ref) {
+				branchSelectionChanged((Ref) selection.getFirstElement()); // allow null
+			} else {
+				branchSelectionChanged(null);
+			}
+		});
+		treeViewer.addDoubleClickListener(event -> {
+			ISelection selection = event.getSelection();
+			if (selection instanceof IStructuredSelection) {
+				Object item = ((IStructuredSelection) selection)
+						.getFirstElement();
+				if (item == null) {
+					return;
+				}
+				if (treeViewer.getExpandedState(item)) {
+					treeViewer.collapseToLevel(item, 1);
+				} else {
+					treeViewer.expandToLevel(item, 1);
+				}
+			}
+		});
+
+		// This has to be done after the viewer has been laid out
+		treeViewer.setInput(git);
+
+		statusMessage = new Label(area, SWT.WRAP);
+		statusMessage.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		statusMessage.setText(" \n "); //$NON-NLS-1$
+		statusMessage.setFont(parent.getFont());
+
+		drillDown.layout();
+
+		return dialogArea;
+	}
+
+	/**
+	 * Manage the selection changed to update the message.
+	 * 
+	 * @param selectedBranch
+	 *            The selected branch.
+	 */
+	protected void branchSelectionChanged(final Ref selectedBranch) {
+		this.selectedBranch = selectedBranch;
+
+		if (null == this.selectedBranch) {
+			statusMessage.setText("Please select a contribution"); //$NON-NLS-1$
+			getOkButton().setEnabled(false);
+		} else {
+			statusMessage.setText(" \n "); //$NON-NLS-1$
+			getOkButton().setEnabled(true);
+		}
+	}
+
+	/**
+	 * Get the result selected branch.
+	 * 
+	 * @return The result selected branch.
+	 */
+	public Ref getSelectedBranch() {
+		return selectedBranch;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/RepositorySelectionDialog.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/RepositorySelectionDialog.java
new file mode 100644
index 0000000..ab3c426
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/RepositorySelectionDialog.java
@@ -0,0 +1,168 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.dialogs;
+
+import java.util.Collection;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.providers.RepositoryAsStringLabelProvider;
+import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider;
+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.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * This class define the repository selection dialog.
+ */
+public class RepositorySelectionDialog extends SelectionDialog {
+
+	/**
+	 * The tree viewer.
+	 */
+	protected TreeViewer treeViewer;
+
+	/**
+	 * The collection of repositories to display.
+	 */
+	protected Collection<String> repositories;
+
+	/**
+	 * The selected repository result.
+	 */
+	protected String selectedRepository;
+
+	/**
+	 * The validation message.
+	 */
+	protected Label statusMessage;
+
+	/**
+	 * Default constructor.
+	 *
+	 * @param parentShell
+	 *            The parent shell.
+	 * @param repositories
+	 *            The list of existing repositories.
+	 */
+	public RepositorySelectionDialog(final Shell parentShell, final Collection<String> repositories) {
+		super(parentShell);
+		setTitle("Select Git repository"); //$NON-NLS-1$
+		this.repositories = repositories;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected Control createDialogArea(final Composite parent) {
+		// create composite
+		final Composite area = (Composite) super.createDialogArea(parent);
+		
+		getShell().setImage(Activator.getDefault().getImage("org.eclipse.papyrus.infra.widgets", "/icons/papyrus.png")); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// container selection group
+		final GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		area.setLayout(layout);
+		area.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		final Label label = new Label(area, SWT.WRAP);
+		label.setText("Repositories:"); //$NON-NLS-1$
+
+		final Composite drillDown = new Composite(area, SWT.BORDER);
+		GridData spec = new GridData(SWT.FILL, SWT.FILL, true, true);
+		spec.widthHint = 320;
+		spec.heightHint = 300;
+		drillDown.setLayoutData(spec);
+		drillDown.setLayout(new GridLayout());
+
+		// Create tree viewer inside drill down.
+		treeViewer = new TreeViewer(drillDown, SWT.BORDER | SWT.SINGLE);
+		treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		treeViewer.setContentProvider(CollectionContentProvider.instance);
+		treeViewer.setLabelProvider(new RepositoryAsStringLabelProvider());
+		treeViewer.setComparator(new ViewerComparator());
+		treeViewer.setUseHashlookup(true);
+		treeViewer.addSelectionChangedListener(event -> {
+			IStructuredSelection selection = event.getStructuredSelection();
+			repositorySelectionChanged((String) selection.getFirstElement()); // allow null
+		});
+		treeViewer.addDoubleClickListener(event -> {
+			ISelection selection = event.getSelection();
+			if (selection instanceof IStructuredSelection) {
+				Object item = ((IStructuredSelection) selection)
+						.getFirstElement();
+				if (item == null) {
+					return;
+				}
+				if (treeViewer.getExpandedState(item)) {
+					treeViewer.collapseToLevel(item, 1);
+				} else {
+					treeViewer.expandToLevel(item, 1);
+				}
+			}
+		});
+
+		// This has to be done after the viewer has been laid out
+		treeViewer.setInput(repositories);
+
+		statusMessage = new Label(area, SWT.WRAP);
+		statusMessage.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		statusMessage.setText(" \n "); //$NON-NLS-1$
+		statusMessage.setFont(parent.getFont());
+
+		drillDown.layout();
+
+		return dialogArea;
+	}
+
+	/**
+	 * Manage the selection changed to update the message.
+	 * 
+	 * @param selectedRepository
+	 *            The selected repository.
+	 */
+	protected void repositorySelectionChanged(final String selectedRepository) {
+		this.selectedRepository = selectedRepository;
+
+		if (this.selectedRepository.isEmpty()) {
+			statusMessage.setText("Please select a repository"); //$NON-NLS-1$
+			getOkButton().setEnabled(false);
+		} else {
+			statusMessage.setText(" \n "); //$NON-NLS-1$
+			getOkButton().setEnabled(true);
+		}
+	}
+
+	/**
+	 * Get the result selected repository.
+	 * 
+	 * @return The result selected repository.
+	 */
+	public String getSelectedRepository() {
+		return selectedRepository;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ReviewDialog.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ReviewDialog.java
new file mode 100644
index 0000000..39c95f9
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/dialogs/ReviewDialog.java
@@ -0,0 +1,401 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.dialogs;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.papyrus.gitlight.git.data.CatalogVersion;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.utils.GitAnnotationUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.uml2.uml.Element;
+
+
+/**
+ * The dialog to create a review of the model.
+ */
+public class ReviewDialog extends TitleAreaDialog {
+
+	/** Text area that displays previous version of the profile definition. */
+	protected Text oldVersionText;
+
+	/** Button to select the new version number (major release). */
+	protected Button majorVersionButton;
+
+	/** Button to select the new version number (minor release). */
+	protected Button minorVersionButton;
+
+	/** Button to select the new version number (custom version). */
+	protected Button customVersionButton;
+
+	/** Text area where custom version number can be entered. */
+	protected Text customVersionText;
+
+	/** The root model. */
+	protected Element rootModel;
+
+	/** The major version value. */
+	private CatalogVersion majorVersionValue;
+
+	/** The minor version value. */
+	private CatalogVersion minorVersionValue;
+
+	/** The oldVersion version value. */
+	private CatalogVersion oldVersionValue;
+
+	/** The custom version value. */
+	private CatalogVersion customReleaseVersionValue;
+
+	/** The new version value. */
+	private CatalogVersion newVersionValue;
+
+	/** Comment text area. */
+	private Text commentText;
+
+	/** Author text area. */
+	private Text authorText;
+
+	/** The comment value. */
+	private String commentValue;
+
+	/** The author value. */
+	private String authorValue;
+
+	/** Boolean to determinate if the version will be displayed or not. */
+	private boolean displayVersion;
+
+
+	/**
+	 * Creates a new ProfileDefinitionDialog
+	 *
+	 * @param parentShell
+	 *            The parent shell for this dialog.
+	 * @param rootModel
+	 *            The root model element.
+	 * @param displayVersion
+	 *            Boolean to determinate if the version will be displayed or not.
+	 */
+	public ReviewDialog(final Shell parentShell, final Element rootModel, final boolean displayVersion) {
+		super(parentShell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.rootModel = rootModel;
+		this.displayVersion = displayVersion;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 */
+	@Override
+	protected void okPressed() {
+		commentValue = commentText.getText();
+		authorValue = authorText.getText();
+		super.okPressed();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	protected Control createDialogArea(final Composite parent) {
+		// top level composite
+		final Composite parentComposite = (Composite) super.createDialogArea(parent);
+
+		setTitle("Information about new version"); //$NON-NLS-1$
+		getShell().setImage(Activator.getDefault().getImage("org.eclipse.papyrus.infra.widgets", "/icons/papyrus.png")); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// create a composite with standard margins and spacing
+		final Composite composite = new Composite(parentComposite, SWT.NONE);
+		final GridLayout layout = new GridLayout(2, true);
+		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		composite.setFont(parentComposite.getFont());
+
+		// fill composite with information about new definition:
+		// 1. version
+		// 2. author
+		// 3. comment
+
+		GridData gd = null;
+		if (displayVersion) {
+			// compute initial values
+			computeVersionValues();
+
+			final Composite versionArea = createVersionArea(composite);
+			gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+			versionArea.setLayoutData(gd);
+		}
+
+		final Composite infoArea = createInfoArea(composite);
+		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+		if (!displayVersion) {
+			gd.horizontalSpan = 2;
+		}
+		infoArea.setLayoutData(gd);
+
+		final Composite commentArea = createCommentArea(composite);
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1);
+		commentArea.setLayoutData(gd);
+
+		applyDialogFont(parentComposite);
+		return parentComposite;
+	}
+
+	/**
+	 * Creates and returns the content of the information area.
+	 *
+	 * @param composite
+	 *            The parent composite to contain the information area.
+	 */
+	private Composite createInfoArea(final Composite composite) {
+		final Group group = new Group(composite, SWT.CENTER);
+		group.setText("Info"); //$NON-NLS-1$
+		final GridLayout layout = new GridLayout(2, false);
+		group.setLayout(layout);
+
+		final Label authorLabel = new Label(group, SWT.LEFT);
+		authorLabel.setText("Author"); //$NON-NLS-1$
+		GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		authorLabel.setLayoutData(gd);
+		authorText = new Text(group, SWT.SINGLE | SWT.BORDER);
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		authorText.setLayoutData(gd);
+
+		return group;
+	}
+
+	/**
+	 * Creates and returns the content of the comment area.
+	 *
+	 * @param composite
+	 *            The parent composite to contain the comment area.
+	 */
+	private Composite createCommentArea(final Composite composite) {
+		final Group group = new Group(composite, SWT.CENTER);
+		group.setText("Comment"); //$NON-NLS-1$
+		final GridLayout layout = new GridLayout(1, false);
+		group.setLayout(layout);
+
+		// new comment area
+		commentText = new Text(group, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+		commentText.setText(""); //$NON-NLS-1$
+		final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, true);
+		gd.heightHint = 60;
+		commentText.setLayoutData(gd);
+
+		return group;
+	}
+
+	/**
+	 * Creates and returns the content of the version area.
+	 *
+	 * @param composite
+	 *            The parent composite to contain the version area.
+	 */
+	private Composite createVersionArea(final Composite composite) {
+		final Group group = new Group(composite, SWT.CENTER);
+		group.setText("Version"); //$NON-NLS-1$
+		final GridLayout layout = new GridLayout(2, false);
+		group.setLayout(layout);
+
+		// old version label
+		final Label oldVersionLabel = new Label(group, SWT.LEFT);
+		oldVersionLabel.setText("Previous Version"); //$NON-NLS-1$
+		GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		oldVersionLabel.setLayoutData(gd);
+		final Text oldVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+		oldVersionText.setText(oldVersionValue.toString());
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		oldVersionText.setLayoutData(gd);
+
+		// new version:
+		// 1. Minor
+		// 2. Major
+		// 3. Custom
+
+		// Minor area
+		minorVersionButton = new Button(group, SWT.CHECK);
+		minorVersionButton.setText("Minor Version"); //$NON-NLS-1$
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		minorVersionButton.setLayoutData(gd);
+		minorVersionButton.setSelection(true);
+		minorVersionButton.addSelectionListener(new SelectionAdapter() {
+
+			public void widgetSelected(SelectionEvent e) {
+				minorVersionButtonPressed();
+			}
+		});
+		final Text releaseVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+		releaseVersionText.setText(minorVersionValue.toString());
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		releaseVersionText.setLayoutData(gd);
+
+		// Major area
+		majorVersionButton = new Button(group, SWT.CHECK);
+		majorVersionButton.setText("Major Version"); //$NON-NLS-1$
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		majorVersionButton.setLayoutData(gd);
+		majorVersionButton.addSelectionListener(new SelectionAdapter() {
+
+			public void widgetSelected(SelectionEvent e) {
+				majorVersionButtonPressed();
+			}
+		});
+		final Text majorReleaseVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+		majorReleaseVersionText.setText(majorVersionValue.toString());
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		majorReleaseVersionText.setLayoutData(gd);
+
+		// Custom area
+		customVersionButton = new Button(group, SWT.CHECK);
+		customVersionButton.setText("Custom"); //$NON-NLS-1$
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		customVersionButton.setLayoutData(gd);
+		customVersionButton.addSelectionListener(new SelectionAdapter() {
+
+			public void widgetSelected(SelectionEvent e) {
+				customVersionButtonPressed();
+			}
+		});
+		customVersionText = new Text(group, SWT.SINGLE | SWT.BORDER);
+		customVersionText.setEditable(false); // by default
+		customVersionText.setText(customReleaseVersionValue.toString());
+		gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+		customVersionText.setLayoutData(gd);
+		customVersionText.addFocusListener(new FocusListener() {
+
+			public void focusGained(final FocusEvent e) {
+				customVersionText.setText(customReleaseVersionValue.toString());
+			}
+
+			public void focusLost(final FocusEvent e) {
+				try {
+					customReleaseVersionValue = CatalogVersion.parseVersion(customVersionText.getText());
+					newVersionValue = customReleaseVersionValue;
+					setErrorMessage(null);
+				} catch (IllegalArgumentException iae) {
+					setErrorMessage("Custom version number format should be X.Y, not " + customVersionText.getText()); //$NON-NLS-1$
+					customReleaseVersionValue = minorVersionValue; // default value
+					minorVersionButtonPressed();
+				}
+			}
+		});
+
+		return group;
+	}
+
+	/**
+	 * Compute the value of the versions.
+	 */
+	private void computeVersionValues() {
+		oldVersionValue = GitAnnotationUtils.getVersionAnnotation(rootModel);
+		minorVersionValue = new CatalogVersion(oldVersionValue.getMajor(), oldVersionValue.getMinor() + 1);
+		majorVersionValue = new CatalogVersion(oldVersionValue.getMajor() + 1, 0);
+		customReleaseVersionValue = minorVersionValue;
+		newVersionValue = minorVersionValue;
+	}
+
+	/**
+	 * Action called as the major version button is pressed.
+	 */
+	private void majorVersionButtonPressed() {
+		minorVersionButton.setSelection(false);
+		majorVersionButton.setSelection(true);
+		customVersionButton.setSelection(false);
+		newVersionValue = majorVersionValue;
+		customVersionText.setEditable(false);
+	}
+
+	/**
+	 * Action called as the minor version button is pressed.
+	 */
+	private void minorVersionButtonPressed() {
+		minorVersionButton.setSelection(true);
+		majorVersionButton.setSelection(false);
+		customVersionButton.setSelection(false);
+		newVersionValue = minorVersionValue;
+		customVersionText.setEditable(false);
+	}
+
+	/**
+	 * Action called as the custom version button is pressed.
+	 */
+	private void customVersionButtonPressed() {
+		minorVersionButton.setSelection(false);
+		majorVersionButton.setSelection(false);
+		customVersionButton.setSelection(true);
+		newVersionValue = customReleaseVersionValue;
+		customVersionText.setEditable(true);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void configureShell(final Shell shell) {
+		super.configureShell(shell);
+		setShellStyle(getShellStyle() | SWT.RESIZE);
+		shell.setText("Version Definition"); //$NON-NLS-1$
+	}
+
+	/**
+	 * Get the new version value.
+	 * 
+	 * @return The new version value.
+	 */
+	public CatalogVersion getNewVersionValue() {
+		return newVersionValue;
+	}
+
+	/**
+	 * Get the comment value.
+	 * 
+	 * @return The comment value.
+	 */
+	public String getComment() {
+		return commentValue;
+	}
+
+	/**
+	 * Get the author value.
+	 * 
+	 * @return The author value.
+	 */
+	public String getAuthor() {
+		return authorValue;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CompareWithBaseHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CompareWithBaseHandler.java
new file mode 100644
index 0000000..a94d8e6
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CompareWithBaseHandler.java
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.io.IOException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.egit.ui.internal.CompareUtils;
+import org.eclipse.egit.ui.internal.selection.SelectionUtils;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.infra.emf.utils.ResourceUtils;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The handler for the action of compare which allow to compare the branch with the master.
+ */
+@SuppressWarnings("restriction")
+public class CompareWithBaseHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				// Get the current git instance and repository
+				final Element rootElement = GitInstance.getInstance().getRootElement();
+
+				// Compare the model
+				final IWorkbenchPage workBenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+				// Get the resources corresponding to the model
+				final IPath umlPath = getCurrentUMLPath(rootElement);
+				final IFile umlFile = PapyrusFileUtils.getFile(rootElement);
+				final IProject project = umlFile.getProject();
+
+				// We need to get the repo from the project because if we get this from the git instance, this one is not the correct one and there is no differences
+				final Repository repo = SelectionUtils.getRepositoryOrWarn(new StructuredSelection(project), getShell(event));
+				if (null != repo) {
+					try {
+						// Compare the remote branch with the remote master
+						CompareUtils.compare(umlFile, repo, umlPath.toString(), umlPath.toString(), ((Ref) firstElement).getName(), Constants.R_REMOTES + GitConstants.MASTER_REPOSITORY_PATH, false, workBenchPage);
+					} catch (final IOException e) {
+						Activator.getLogHelper().error(e);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to get shell from the execution event.
+	 * 
+	 * @param event
+	 *            The execution event.
+	 * @return The correct shell.
+	 * @throws ExecutionException
+	 *             The possible execution exception.
+	 */
+	protected Shell getShell(final ExecutionEvent event) throws ExecutionException {
+		return HandlerUtil.getActiveShellChecked(event);
+	}
+
+	/**
+	 * Get the current path of the uml file.
+	 * 
+	 * @param rootElement
+	 *            The root element.
+	 * @return The path of the uml file.
+	 */
+	protected IPath getCurrentUMLPath(final Element rootElement) {
+		// Get the workspace root location
+		final Resource eResource = rootElement.eResource();
+		return new Path(ResourceUtils.getFile(eResource).getProject().getName() + "/" + eResource.getURI().lastSegment()); //$NON-NLS-1$
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ContributeReviewHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ContributeReviewHandler.java
new file mode 100644
index 0000000..93c08e1
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ContributeReviewHandler.java
@@ -0,0 +1,135 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.dialogs.ReviewDialog;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.gitlight.git.utils.GitProcessUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.papyrus.gitlight.review.profile.utils.ReviewProfileUtils;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The handler to commit a review on the branch.
+ */
+public class ContributeReviewHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				// Get the current git instance
+				final Git git = GitInstance.getInstance().getGit();
+				final Element rootElement = GitInstance.getInstance().getRootElement();
+				if (null != git && null != rootElement) {
+
+					final ReviewDialog dialog = new ReviewDialog(Display.getCurrent().getActiveShell(), rootElement, false);
+					if (dialog.open() == Window.OK) {
+						final String commentValue = dialog.getComment();
+						final String authorValue = dialog.getAuthor();
+
+						final String reviewsComment = ReviewProfileUtils.getModelReviewMessage(rootElement);
+						String commitMessage = commentValue;
+						if (!commitMessage.isEmpty() && !reviewsComment.isEmpty()) {
+							commitMessage += "\n\n"; //$NON-NLS-1$
+						}
+						commitMessage += reviewsComment;
+
+						// Merge the version
+						mergeVersion(git, (Ref) firstElement, commitMessage, authorValue, rootElement);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	protected void mergeVersion(final Git git, final Ref branch, final String message, final String reviewerValue, final Element rootElement) {
+		if (null != git) {
+
+			try {
+				new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+					monitor.beginTask("Contribute review", 3); //$NON-NLS-1$
+
+					final String fullBranchName = branch.getName();
+					final String shortBranchName = fullBranchName.substring(fullBranchName.indexOf(Constants.R_REMOTES) + Constants.R_REMOTES.length() + Constants.DEFAULT_REMOTE_NAME.length() + 1);
+
+					// Manage the message
+					String commitMessage = message;
+					if (commitMessage.isEmpty()) {
+						commitMessage = ""; //$NON-NLS-1$
+					}
+					commitMessage += "\n\n" + GitConstants.CHANGE_ID; //$NON-NLS-1$
+					if (null != reviewerValue && !reviewerValue.isEmpty()) {
+						commitMessage += "\n" + Constants.SIGNED_OFF_BY_TAG + reviewerValue; //$NON-NLS-1$
+					}
+
+					// Add git model files
+					monitor.subTask("Add git files"); //$NON-NLS-1$
+					final Repository repository = git.getRepository();
+					GitProcessUtils.addGitFiles(git, repository.getWorkTree(), ""); //$NON-NLS-1$
+					monitor.worked(1);
+
+					// Create the commit message
+					monitor.subTask("Create the commit"); //$NON-NLS-1$
+					GitUtils.createCommit(git, commitMessage);
+					monitor.worked(1);
+
+					// Push the commit
+					monitor.subTask("Push the commit on branch"); //$NON-NLS-1$
+					GitUtils.pushBranchCommit(git, shortBranchName);
+					monitor.worked(1);
+
+					monitor.done();
+				});
+			} catch (final InvocationTargetException e) {
+				Activator.getLogHelper().error(e);
+			} catch (final InterruptedException e) {
+				Activator.getLogHelper().error("Creation cancelled.", e); //$NON-NLS-1$
+			}
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CreateModelContributionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CreateModelContributionHandler.java
new file mode 100644
index 0000000..382c7ac
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/CreateModelContributionHandler.java
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.data.CatalogVersion;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.dialogs.ReviewDialog;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitAnnotationUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitProcessUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.papyrus.uml.tools.model.UmlModel;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The handler to create a review of the model.
+ */
+public class CreateModelContributionHandler extends AbstractHandler {
+
+	/**
+	 * [{@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check that the selection is an papyrus file
+			final IFile file = PapyrusFileUtils.getFile(firstElement);
+			if (null != file) {
+
+				// Get the model
+				URI modelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
+				if (!UmlModel.UML_FILE_EXTENSION.equals(modelURI.fileExtension())) {
+					modelURI = modelURI.trimFileExtension().appendFileExtension(UmlModel.UML_FILE_EXTENSION);
+				}
+				final EObject root = PapyrusFileUtils.getRootModel(modelURI);
+				if (root instanceof Element) {
+
+					// Get the parent project
+					final IProject project = file.getProject();
+
+					// Call the reiew dialog to create the version
+					final ReviewDialog dialog = new ReviewDialog(Display.getCurrent().getActiveShell(), (Element) root, true);
+					if (dialog.open() == Window.OK) {
+						final CatalogVersion newVersionValue = dialog.getNewVersionValue();
+						final String commentValue = dialog.getComment();
+						final String authorValue = dialog.getAuthor();
+
+						// Share the project
+						createVersion(project, newVersionValue, commentValue, authorValue, (Element) root);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to create a version of the model.
+	 * 
+	 * @param project
+	 *            The project.
+	 * @param newVersionValue
+	 *            The new version number.
+	 * @param commentValue
+	 *            The message of the commit.
+	 * @param authorValue
+	 *            The author of the commit.
+	 * @param rootElement
+	 *            The root element.
+	 */
+	protected void createVersion(final IProject project, final CatalogVersion newVersionValue, final String commentValue, final String authorValue, final Element rootElement) {
+
+		// Retrieve the repository from the project
+		final Repository repository = GitUtils.getRepository(project);
+		if (null != repository) {
+			// Get the git
+			final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+
+			if (null != git) {
+				try {
+					new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+						monitor.beginTask("Create a contribution", 5); //$NON-NLS-1$
+
+						// Annotate the model with the new version
+						monitor.subTask("Annotate the model"); //$NON-NLS-1$
+						GitAnnotationUtils.addVersionAnnotation(rootElement, newVersionValue);
+						monitor.worked(1);
+
+						// Build the branch comment
+						String message = commentValue;
+						if (message.isEmpty()) {
+							message = "Creation of version " + newVersionValue.toString(); //$NON-NLS-1$
+						}
+						message += "\n\n" + GitConstants.CHANGE_ID; //$NON-NLS-1$
+						if (null != authorValue && !authorValue.isEmpty()) {
+							message += "\n" + Constants.SIGNED_OFF_BY_TAG + authorValue; //$NON-NLS-1$
+						}
+
+						final StringBuilder branchName = new StringBuilder();
+						branchName.append(GitConstants.CONTRIBUTION_BRANCH_PREFIX);
+						branchName.append(getIDfromDate());
+						branchName.append("_"); //$NON-NLS-1$
+						branchName.append(newVersionValue.toString());
+
+						// Create the local branch
+						monitor.subTask("Create the branch"); //$NON-NLS-1$
+						GitUtils.createBranch(git, branchName.toString());
+						monitor.worked(1);
+
+						// Add git model files
+						monitor.subTask("Add git files"); //$NON-NLS-1$
+						GitProcessUtils.addGitFiles(git, repository.getWorkTree(), ""); //$NON-NLS-1$
+						monitor.worked(1);
+
+						// Create the commit message
+						monitor.subTask("Create the commit"); //$NON-NLS-1$
+						GitUtils.createCommit(git, message);
+						monitor.worked(1);
+
+						// Push the commit
+						monitor.subTask("Push the commit"); //$NON-NLS-1$
+						GitUtils.pushBranchCommit(git, branchName.toString());
+						monitor.worked(1);
+
+						monitor.done();
+					});
+				} catch (final InvocationTargetException e) {
+					Activator.getLogHelper().error(e);
+				} catch (final InterruptedException e) {
+					Activator.getLogHelper().error("Creation cancelled.", e); //$NON-NLS-1$
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get an 'unique' identifier depending to the date.
+	 * 
+	 * @return The 'unique' identifier depending to the date.
+	 */
+	protected String getIDfromDate() {
+		return String.valueOf(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); //$NON-NLS-1$
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetBaseVersionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetBaseVersionHandler.java
new file mode 100644
index 0000000..9739c2b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetBaseVersionHandler.java
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.ui.utils.GitActionsUtils;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * The handler to get the base of a project in the workspace.
+ */
+public class GetBaseVersionHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			final IFile file = PapyrusFileUtils.getFile(firstElement);
+			if (null != file) {
+
+				final Shell shell = Display.getCurrent().getActiveShell();
+
+				// Ask to user that he will lose all modifications on model to review it
+				final MessageDialog dialog = new MessageDialog(shell, "Confirm", null, "You will lose modifications on the project if you have it in your workspace.\nAre you sure you want to get this contribution ?", MessageDialog.QUESTION, 0,
+						IDialogConstants.YES_LABEL, IDialogConstants.CANCEL_LABEL);
+				dialog.open();
+				final int dialogResult = dialog.getReturnCode();
+
+				// The user want to lose modifications
+				if (dialogResult == 0) {
+
+					final IProject project = file.getProject();
+					final Repository repository = GitUtils.getRepository(project);
+					if (null != repository) {
+						final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+						if (null != git) {
+							final Ref masterBranch = GitUtils.getBranchForName(git, Constants.MASTER);
+							// Get the project of the contribution
+							GitActionsUtils.getIProjectContribution(shell, git, masterBranch, file, "Get the base"); //$NON-NLS-1$
+						}
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetContributionVersionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetContributionVersionHandler.java
new file mode 100644
index 0000000..0870993
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/GetContributionVersionHandler.java
@@ -0,0 +1,74 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.papyrus.gitlight.git.ui.utils.GitActionsUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * The handler to get a contribution in the workspace
+ */
+public class GetContributionVersionHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				final Shell shell = Display.getCurrent().getActiveShell();
+
+				// Ask to user that he will lose all modifications on model to review it
+				final MessageDialog dialog = new MessageDialog(shell, "Confirm", null, "You will lose modifications on the project if you have it in your workspace.\nAre you sure you want to get this contribution ?", MessageDialog.QUESTION, 0,
+						IDialogConstants.YES_LABEL, IDialogConstants.CANCEL_LABEL);
+				dialog.open();
+				final int dialogResult = dialog.getReturnCode();
+
+				// The user want to lose modifications
+				if (dialogResult == 0) {
+
+					final Git git = GitInstance.getInstance().getGit();
+					// Get the project of the contribution
+					GitActionsUtils.getIProjectContribution(shell, git, (Ref) firstElement, GitInstance.getInstance().getRootElement(), "Get a contribution"); //$NON-NLS-1$
+				}
+			}
+		}
+
+		return null;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/PushContributionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/PushContributionHandler.java
new file mode 100644
index 0000000..db7bdca
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/PushContributionHandler.java
@@ -0,0 +1,112 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * The handler to merge a review into the master.
+ */
+public class PushContributionHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				// Get the current git instance
+				final Git git = GitInstance.getInstance().getGit();
+				if (null != git) {
+
+					// Merge the version
+					mergeVersion(git, (Ref) firstElement);
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to merge a version branch into master.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branch
+	 *            The branch to merge.
+	 */
+	protected void mergeVersion(final Git git, final Ref branch) {
+		try {
+			new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+				monitor.beginTask("Merging a contribution", 4); //$NON-NLS-1$
+
+				// Merge the branch into master
+				monitor.subTask("Merge the branch into master"); //$NON-NLS-1$
+				GitUtils.mergeBranch(git, Constants.MASTER, branch);
+				monitor.worked(1);
+
+				monitor.subTask("Push the merge"); //$NON-NLS-1$
+				GitUtils.pushCommit(git);
+				monitor.worked(1);
+				
+				// First, checkout the master branch (else we can't delete the other branch)
+				monitor.subTask("Checkout the master"); //$NON-NLS-1$
+				GitUtils.checkoutExistingBranch(git, Constants.MASTER);
+				monitor.worked(1);
+
+				// Delete the existing branch
+				monitor.subTask("Delete the contribution branch"); //$NON-NLS-1$
+				final String branchShortName = GitUtils.getBranchShortName(branch);
+				final Ref localBranch = GitUtils.getLocalBranch(git, branchShortName);
+				GitUtils.deleteBranch(git, localBranch.getName());
+				monitor.worked(1);
+
+				monitor.done();
+			});
+		} catch (final InvocationTargetException e) {
+			Activator.getLogHelper().error(e);
+		} catch (final InterruptedException e) {
+			Activator.getLogHelper().error("Merge cancelled.", e); //$NON-NLS-1$
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/RejectContributionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/RejectContributionHandler.java
new file mode 100644
index 0000000..eab945b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/RejectContributionHandler.java
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * The handler to reject a review and delete the branch.
+ */
+public class RejectContributionHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				// Get the current git instance
+				final Git git = GitInstance.getInstance().getGit();
+				if (null != git) {
+
+					// Merge the version
+					deleteBranch(git, (Ref) firstElement);
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to merge a version branch into master.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branch
+	 *            The branch to merge.
+	 */
+	protected void deleteBranch(final Git git, final Ref branch) {
+		try {
+			new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+				monitor.beginTask("Deleting the contribution", 2); //$NON-NLS-1$
+
+				// First, checkout the master branch (else we can't delete the other branch)
+				monitor.subTask("Checkout the master"); //$NON-NLS-1$
+				GitUtils.checkoutExistingBranch(git, Constants.MASTER);
+				monitor.worked(1);
+
+				// Delete the existing branch
+				monitor.subTask("Delete the contribution branch"); //$NON-NLS-1$
+				final String branchShortName = GitUtils.getBranchShortName(branch);
+				final Ref localBranch = GitUtils.getLocalBranch(git, branchShortName);
+				GitUtils.deleteBranch(git, localBranch.getName());
+				monitor.worked(1);
+
+				monitor.done();
+			});
+		} catch (final InvocationTargetException e) {
+			Activator.getLogHelper().error(e);
+		} catch (final InterruptedException e) {
+			Activator.getLogHelper().error("Delete cancelled.", e); //$NON-NLS-1$
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ReviewContributionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ReviewContributionHandler.java
new file mode 100644
index 0000000..3bbdf6e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ReviewContributionHandler.java
@@ -0,0 +1,134 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.io.IOException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.egit.ui.internal.CompareUtils;
+import org.eclipse.egit.ui.internal.selection.SelectionUtils;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.utils.GitActionsUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The handler to review a contribution.
+ */
+@SuppressWarnings("restriction")
+public class ReviewContributionHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check if the selection is a branch
+			if (firstElement instanceof Ref) {
+
+				final Shell shell = getShell(event);
+
+				// Ask to user that he will lose all modifications on model to review it
+				final MessageDialog dialog = new MessageDialog(shell, "Confirm review", null, "To review a contribution, you will lose modifications on the project to review.\nAre you sure you want to review this contribution ?", //$NON-NLS-1$ //$NON-NLS-2$
+						MessageDialog.QUESTION, 0, IDialogConstants.YES_LABEL, IDialogConstants.CANCEL_LABEL);
+				dialog.open();
+				final int dialogResult = dialog.getReturnCode();
+
+				// The user want to lose modifications
+				if (dialogResult == 0) {
+
+					// Manage the project (delete and re-import) and compare
+					manageProjectAndCompare(GitInstance.getInstance().getRootElement(), (Ref) firstElement, shell);
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to get shell from the execution event.
+	 * 
+	 * @param event
+	 *            The execution event.
+	 * @return The correct shell.
+	 * @throws ExecutionException
+	 *             The possible execution exception.
+	 */
+	protected Shell getShell(final ExecutionEvent event) throws ExecutionException {
+		return HandlerUtil.getActiveShellChecked(event);
+	}
+
+	/**
+	 * This allows to update the git, update the project and compare it with master.
+	 * 
+	 * @param rootElement
+	 *            The root element.
+	 * @param branch
+	 *            The branch.
+	 * @param shell
+	 *            The shell.
+	 */
+	protected void manageProjectAndCompare(final Element rootElement, final Ref branch, final Shell shell) {
+
+		final Git git = GitInstance.getInstance().getGit();
+		// Get the project of the contribution
+		final IProject importedProject = GitActionsUtils.getIProjectContribution(shell, git, branch, rootElement, "Review a contribution"); //$NON-NLS-1$
+
+		try {
+			// We need to get the repo from the project because if we get this from the git instance, this one is not the correct one and there is no differences
+			if (null != importedProject) {
+				final Repository repository = SelectionUtils.getRepositoryOrWarn(new StructuredSelection(importedProject), shell);
+				if (null != repository) {
+
+					// Calculate the workbench page before to open the progress monitor
+					final IWorkbenchPage workBenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+					// Compare the remote branch with the remote master
+					CompareUtils.compare(new IResource[] { importedProject }, repository, Constants.HEAD, Constants.R_REMOTES + GitConstants.MASTER_REPOSITORY_PATH, true, workBenchPage);
+				}
+			}
+		} catch (IOException e) {
+			Activator.getLogHelper().error("Error while compare the two models", e); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ShareProjectHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ShareProjectHandler.java
new file mode 100644
index 0000000..5b41adf
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/ShareProjectHandler.java
@@ -0,0 +1,206 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.egit.core.RepositoryUtil;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.dialogs.RepositorySelectionDialog;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitProcessUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.papyrus.gitlight.review.profile.ReviewProfileResource;
+import org.eclipse.papyrus.uml.tools.utils.PackageUtil;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Package;
+import org.eclipse.uml2.uml.Profile;
+
+/**
+ * The handler which allow to share a project.
+ */
+@SuppressWarnings("restriction")
+public class ShareProjectHandler extends AbstractHandler {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check that the selection is an papyrus file
+			final IFile file = PapyrusFileUtils.getFile(firstElement);
+			if (null != file) {
+
+				// Get the model
+				URI modelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
+				if (!"uml".equals(modelURI.fileExtension())) { //$NON-NLS-1$
+					modelURI = modelURI.trimFileExtension().appendFileExtension("uml"); //$NON-NLS-1$
+				}
+				final EObject root = PapyrusFileUtils.getRootModel(modelURI);
+
+				if (root instanceof Element) {
+
+					// Get the parent project
+					final IProject project = file.getProject();
+
+					// Get the repository util which allow to get all the repositories
+					RepositoryUtil repositoryUtil = org.eclipse.egit.ui.Activator.getDefault().getRepositoryUtil();
+					String selectedRepository = null;
+
+					// Open the dialog to select a repository
+					final RepositorySelectionDialog dialog = new RepositorySelectionDialog(Display.getCurrent().getActiveShell(), repositoryUtil.getRepositories());
+					if (dialog.open() == Window.OK) {
+						selectedRepository = dialog.getSelectedRepository();
+
+						// Share the project
+						manageShareProject(selectedRepository, project, (Element) root);
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to share a project into git.
+	 * 
+	 * @param selectedRepository
+	 *            The repository path.
+	 * @param project
+	 *            The project to share.
+	 * @param rootElement
+	 *            The root element.
+	 */
+	protected void manageShareProject(final String selectedRepository, final IProject project, final Element rootElement) {
+
+		// Only continue if the selected repository path is not null or empty
+		if (null != selectedRepository && !selectedRepository.isEmpty()) {
+
+			// Get the git
+			final Git git = GitUtils.openGit(selectedRepository);
+			if (null != git) {
+				try {
+					new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+						monitor.beginTask("Share project", 6); //$NON-NLS-1$
+
+						// Add the review profile
+						monitor.subTask("Add the review profile"); //$NON-NLS-1$
+						addReviewProfile((Package) rootElement);
+						monitor.worked(1);
+
+						// Build the parent git folder (where the data are)
+						monitor.subTask("Copy the project into the repository"); //$NON-NLS-1$
+						GitProcessUtils.copyProject(git, project);
+						monitor.worked(1);
+
+						// Create the commit message
+						monitor.subTask("Create the commit"); //$NON-NLS-1$
+						GitUtils.createCommit(git, GitConstants.INITIAL_COMMIT_MESSAGE);
+						monitor.worked(1);
+
+						// Push the commit
+						monitor.subTask("Push the commit"); //$NON-NLS-1$
+						GitUtils.pushCommit(git);
+						monitor.worked(1);
+
+						try {
+							// Keep the project name
+							final String projectName = project.getName();
+
+							// Delete the project from workspace
+							monitor.subTask("Delete the project from the workspace"); //$NON-NLS-1$
+							project.delete(false, true, monitor);
+							monitor.worked(1);
+
+							// Create and open the project from the new path
+							monitor.subTask("Import the project from the repository"); //$NON-NLS-1$
+							final URI gitPath = URI.createURI(selectedRepository.replace("\\", "/")).trimSegments(1); //$NON-NLS-1$ //$NON-NLS-2
+							final String projectFilePath = gitPath.toString() + "/" + projectName + "/.project"; //$NON-NLS-1$ //$NON-NLS-2$
+							final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+							final IProjectDescription description = workspace.loadProjectDescription(new Path(projectFilePath));
+							final IProject newProject = workspace.getRoot().getProject(description.getName());
+							newProject.create(description, monitor);
+							newProject.open(monitor);
+							newProject.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+							monitor.worked(1);
+						} catch (CoreException e) {
+							Activator.getLogHelper().error("Unknown error while deleting project from workspace", e); //$NON-NLS-1$
+						} finally {
+							monitor.done();
+						}
+					});
+				} catch (final InvocationTargetException e) {
+					Activator.getLogHelper().error(e);
+				} catch (final InterruptedException e) {
+					Activator.getLogHelper().error("Share cancelled.", e); //$NON-NLS-1$
+				}
+			}
+		}
+	}
+
+	/**
+	 * This allows to apply the profile to the model.
+	 * 
+	 * @param rootElement
+	 *            The root element (as package).
+	 */
+	protected void addReviewProfile(final Package rootElement) {
+		final Resource resource = rootElement.eResource();
+		final Profile review = (Profile) PackageUtil.loadPackage(URI.createURI(ReviewProfileResource.PROFILE_PATH), resource.getResourceSet());
+		if (review != null && !rootElement.getAppliedProfiles().contains(review)) {
+			PackageUtil.applyProfile(rootElement, review, true);
+
+			try {
+				resource.save(null);
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error during save of UML file", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/UpdateModelContributionHandler.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/UpdateModelContributionHandler.java
new file mode 100644
index 0000000..08746df
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/handlers/UpdateModelContributionHandler.java
@@ -0,0 +1,189 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.dialogs.ContributionSelectionDialog;
+import org.eclipse.papyrus.gitlight.git.ui.dialogs.ReviewDialog;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitAnnotationUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitProcessUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.papyrus.uml.tools.model.UmlModel;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The handler to create a review of the model.
+ */
+public class UpdateModelContributionHandler extends AbstractHandler {
+
+	/**
+	 * [{@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+	 */
+	@Override
+	public Object execute(final ExecutionEvent event) throws ExecutionException {
+
+		// Get the selection
+		final ISelection selection = HandlerUtil.getCurrentSelection(event);
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection selec = (IStructuredSelection) selection;
+			final Object firstElement = selec.getFirstElement();
+
+			// Check that the selection is an papyrus file
+			final IFile file = PapyrusFileUtils.getFile(firstElement);
+			if (null != file) {
+
+				// Get the model
+				URI modelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
+				if (!UmlModel.UML_FILE_EXTENSION.equals(modelURI.fileExtension())) {
+					modelURI = modelURI.trimFileExtension().appendFileExtension(UmlModel.UML_FILE_EXTENSION);
+				}
+				final EObject root = PapyrusFileUtils.getRootModel(modelURI);
+				if (root instanceof Element) {
+
+					final Repository repository = GitUtils.getRepository((Element) root);
+					if (null != repository) {
+						final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+						if (null != git) {
+
+							// Get the parent project
+							final IProject project = file.getProject();
+
+							// Call the reiew dialog to create the version
+							final ContributionSelectionDialog contributionDialog = new ContributionSelectionDialog(Display.getCurrent().getActiveShell(), git);
+							if (contributionDialog.open() == Window.OK) {
+								final Ref branch = contributionDialog.getSelectedBranch();
+
+								final ReviewDialog reviewDialog = new ReviewDialog(Display.getCurrent().getActiveShell(), (Element) root, false);
+								if (reviewDialog.open() == Window.OK) {
+									final String commentValue = reviewDialog.getComment();
+									final String authorValue = reviewDialog.getAuthor();
+
+									// Share the project
+									createNewCommit(project, git, repository, branch, commentValue, authorValue, (Element) root);
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This allows to create a version of the model.
+	 * 
+	 * @param project
+	 *            The project.
+	 * @param git
+	 *            The git.
+	 * @param repository
+	 *            The repository.
+	 * @param branch
+	 *            The branch.
+	 * @param commentValue
+	 *            The message of the commit.
+	 * @param authorValue
+	 *            The author of the commit.
+	 * @param rootElement
+	 *            The root element.
+	 */
+	protected void createNewCommit(final IProject project, final Git git, final Repository repository, final Ref branch, final String commentValue, final String authorValue, final Element rootElement) {
+
+		// Retrieve the repository from the project
+		try {
+			// Get the branch name
+			final String fullBranchName = branch.getName();
+			final String shortBranchName = fullBranchName.substring(fullBranchName.indexOf(Constants.R_REMOTES) + Constants.R_REMOTES.length() + Constants.DEFAULT_REMOTE_NAME.length() + 1);
+
+			new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, false, monitor -> {
+				monitor.beginTask("Update a contribution", 5); //$NON-NLS-1$
+
+				// Build the branch comment
+				String message = commentValue;
+				if (message.isEmpty()) {
+					message = "Update of version " + GitAnnotationUtils.getVersionAnnotation(rootElement).toString(); //$NON-NLS-1$
+				}
+				message += "\n\n" + GitConstants.CHANGE_ID; //$NON-NLS-1$
+				if (null != authorValue && !authorValue.isEmpty()) {
+					message += "\n" + Constants.SIGNED_OFF_BY_TAG + authorValue; //$NON-NLS-1$
+				}
+
+				// Search about a local branch with correct name
+				monitor.subTask("Search local branch"); //$NON-NLS-1$
+				final Ref localBranch = GitUtils.getLocalBranch(git, shortBranchName);
+				monitor.worked(1);
+
+				// The local branch exist, checkout it and pull
+				if (null != localBranch) {
+					monitor.subTask("Checkout and pull local branch"); //$NON-NLS-1$
+					GitUtils.checkoutExistingBranch(git, shortBranchName);
+					GitUtils.pull(git);
+					monitor.worked(1);
+				} else {
+					// Create the local branch
+					monitor.subTask("Create the branch"); //$NON-NLS-1$
+					GitUtils.createBranch(git, shortBranchName);
+					monitor.worked(1);
+				}
+
+				// Add git model files
+				monitor.subTask("Add git files"); //$NON-NLS-1$
+				GitProcessUtils.addGitFiles(git, repository.getWorkTree(), ""); //$NON-NLS-1$
+				monitor.worked(1);
+
+				// Create the commit message
+				monitor.subTask("Create the commit"); //$NON-NLS-1$
+				GitUtils.createCommit(git, message);
+				monitor.worked(1);
+
+				// Push the commit
+				monitor.subTask("Push the commit"); //$NON-NLS-1$
+				GitUtils.pushBranchCommit(git, shortBranchName);
+				monitor.worked(1);
+
+				monitor.done();
+			});
+		} catch (final InvocationTargetException e) {
+			Activator.getLogHelper().error(e);
+		} catch (final InterruptedException e) {
+			Activator.getLogHelper().error("Creation cancelled.", e); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchLabelProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchLabelProvider.java
new file mode 100644
index 0000000..0650ea1
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchLabelProvider.java
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.providers;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.papyrus.gitlight.git.ui.GitIcons;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * The label provider for git branches.
+ */
+public class BranchLabelProvider extends LabelProvider {
+
+	/**
+	 * The cache for the image.
+	 */
+	private final ResourceManager imageCache = new LocalResourceManager(JFaceResources.getResources());
+
+	/**
+	 * The git.
+	 */
+	private final Git git;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param git
+	 *            The git.
+	 */
+	public BranchLabelProvider(final Git git) {
+		this.git = git;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	@Override
+	public Image getImage(final Object element) {
+		if (element instanceof Ref) {
+			return imageCache.createImage(GitIcons.BRANCH);
+		}
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+	 */
+	@Override
+	public String getText(final Object element) {
+		if (element instanceof Ref) {
+			final Ref branch = (Ref) element;
+			final StringBuilder constructName = new StringBuilder();
+
+			// First manage the name
+			final String name = branch.getName();
+			if (name.contains(GitConstants.CONTRIBUTION_BRANCH_PREFIX) && name.length() > (GitConstants.CONTRIBUTION_BRANCH_PREFIX.length() + 18)) {
+				// 18 is the number of character for the unique identifier generated from the date (it is always the same size)
+				constructName.append(name.substring(name.indexOf(GitConstants.CONTRIBUTION_BRANCH_PREFIX) + GitConstants.CONTRIBUTION_BRANCH_PREFIX.length() + 18));
+			} else {
+				constructName.append(name);
+			}
+
+			// Second (in parenthesis), manage a short message and the committer
+			if (null != git && constructName.length() > 0) {
+				final RevCommit lastCommit = GitUtils.getLastCommitOfBranch(git, branch);
+
+				// Get the message (X char max)
+				String shortMessage = lastCommit.getShortMessage();
+				if (shortMessage.length() > 60) {
+					shortMessage = shortMessage.substring(0, 56);
+					shortMessage += "..."; //$NON-NLS-1$
+				}
+
+				// Get the author
+				String author = null;
+				if (lastCommit.getFullMessage().contains(Constants.SIGNED_OFF_BY_TAG)) {
+					try {
+						final String subSignedOff = lastCommit.getFullMessage().substring(lastCommit.getFullMessage().indexOf(Constants.SIGNED_OFF_BY_TAG) + Constants.SIGNED_OFF_BY_TAG.length());
+						author = subSignedOff.contains("\n") ? subSignedOff.substring(0, subSignedOff.indexOf("\n")) : subSignedOff; //$NON-NLS-1$ //$NON-NLS-2$
+					} catch (Exception e) {
+						// Do nothing
+					}
+				}
+				if (null == author || author.isEmpty()) {
+					author = lastCommit.getAuthorIdent().getName();
+				}
+
+				if (!shortMessage.isEmpty() && !author.isEmpty()) {
+					constructName.append("("); //$NON-NLS-1$
+					if (!shortMessage.isEmpty()) {
+						constructName.append("\""); //$NON-NLS-1$
+						constructName.append(shortMessage);
+						constructName.append("\", "); //$NON-NLS-1$
+					}
+					if (!author.isEmpty()) {
+						constructName.append("by "); //$NON-NLS-1$
+						constructName.append(author);
+					}
+					constructName.append(")"); //$NON-NLS-1$
+				}
+			}
+
+			return constructName.toString();
+		}
+		return "No branch available"; //$NON-NLS-1$
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+	 */
+	@Override
+	public void dispose() {
+		imageCache.dispose();
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchesContentProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchesContentProvider.java
new file mode 100644
index 0000000..0fa9a43
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/BranchesContentProvider.java
@@ -0,0 +1,113 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.providers;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The content provider for git branches.
+ */
+public class BranchesContentProvider implements ITreeContentProvider {
+
+	/**
+	 * The empty children definition.
+	 */
+	private final Object[] children = new Object[0];
+
+	/**
+	 * This allows to determinate if the git must be updated or not.
+	 */
+	private final boolean updateGit;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param updateGit
+	 *            Boolean to determinate if the git must be updated or not.
+	 */
+	public BranchesContentProvider(final boolean updateGit) {
+		this.updateGit = updateGit;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
+	 */
+	@Override
+	public Object[] getElements(final Object inputElement) {
+		if (inputElement instanceof Element) {
+			final Repository repository = GitUtils.getRepository((Element) inputElement);
+			if (null != repository) {
+				final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+				if (null != git) {
+					if (updateGit) {
+						GitInstance.getInstance().setCurrentGitAndRootElement(git, (Element) inputElement);
+					}
+					final List<Ref> branches = GitUtils.getReviewBranches(git);
+					return branches.toArray();
+				}
+			}
+		} else if (inputElement instanceof Git) {
+			final List<Ref> branches = GitUtils.getReviewBranches((Git) inputElement);
+			return branches.toArray();
+		}
+		if (updateGit) {
+			GitInstance.getInstance().setCurrentGitAndRootElement(null, null);
+		}
+		return children;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+	 */
+	@Override
+	public Object[] getChildren(final Object parentElement) {
+		// only first level of tree
+		return children;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+	 */
+	@Override
+	public Object getParent(final Object element) {
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+	 */
+	@Override
+	public boolean hasChildren(final Object element) {
+		// only first level of tree
+		return false;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/RepositoryAsStringLabelProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/RepositoryAsStringLabelProvider.java
new file mode 100644
index 0000000..c7c7282
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/providers/RepositoryAsStringLabelProvider.java
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.providers;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.papyrus.gitlight.git.ui.GitIcons;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * The label provider for the git repositories.
+ */
+public final class RepositoryAsStringLabelProvider extends LabelProvider {
+
+	/**
+	 * The cache for the image.
+	 */
+	private final ResourceManager imageCache = new LocalResourceManager(JFaceResources.getResources());
+
+	/**
+	 * Default constructor.
+	 */
+	public RepositoryAsStringLabelProvider() {
+		// Do nothing
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
+	 */
+	@Override
+	public Image getImage(final Object element) {
+		return !element.toString().isEmpty() ? imageCache.createImage(GitIcons.REPOSITORY) : null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
+	 */
+	@Override
+	public String getText(final Object element) {
+		String repositoryString = element.toString();
+		if (repositoryString.endsWith(GitConstants.GIT_FOLDER)) {
+			repositoryString = repositoryString.substring(0, repositoryString.length() - GitConstants.GIT_FOLDER.length());
+		}
+		return repositoryString;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+	 */
+	@Override
+	public void dispose() {
+		imageCache.dispose();
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/CanContributeReviewPropertyTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/CanContributeReviewPropertyTester.java
new file mode 100644
index 0000000..f6e0c6a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/CanContributeReviewPropertyTester.java
@@ -0,0 +1,83 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.testers;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.egit.core.RepositoryUtil;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+
+/**
+ * This defines the property tester to calculate if the selected contribution has been reviewed (if there is at least one modification).
+ */
+@SuppressWarnings("restriction")
+public class CanContributeReviewPropertyTester extends PropertyTester {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+	 */
+	@Override
+	public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) {
+
+		boolean result = false;
+		if ("canContributeReview".equals(property)) { //$NON-NLS-1$
+			final Ref getRef = getRef(receiver);
+			if (null != getRef) {
+				final Git git = GitInstance.getInstance().getGit();
+				final Repository repository = git.getRepository();
+				if (null != repository) {
+					result = RepositoryUtil.hasChanges(repository);
+				}
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * This allows to get the branch depending to the object in parameter.
+	 * 
+	 * @param receiver
+	 *            The initial object.
+	 * @return The branch found or <code>null</code>.
+	 */
+	private Ref getRef(final Object receiver) {
+		Ref result = null;
+
+		if (null != receiver) {
+			if (receiver instanceof Ref) {
+				result = (Ref) receiver;
+			} else if (receiver instanceof IAdaptable) {
+				final Ref selectedRef = (Ref) ((IAdaptable) receiver).getAdapter(Ref.class); // Can be null
+				if (null != selectedRef) {
+					result = selectedRef;
+				}
+			} else if (receiver instanceof IStructuredSelection && ((IStructuredSelection) receiver).size() == 1) {
+				final Object firstElement = ((IStructuredSelection) receiver).getFirstElement();
+				if (firstElement instanceof Ref) {
+					result = (Ref) firstElement;
+				}
+			}
+		}
+
+		return result;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/ContributionPropertyTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/ContributionPropertyTester.java
new file mode 100644
index 0000000..1e8960b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/ContributionPropertyTester.java
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.testers;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+
+/**
+ * This defines the property tester to calculate if the contribution menus will be displayed.
+ */
+public class ContributionPropertyTester extends PropertyTester {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+	 */
+	@Override
+	public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) {
+
+		boolean result = false;
+
+		// We have to check that branches are available to do update
+		if ("canUpdateContribution".equals(property)) { //$NON-NLS-1$
+			final IFile file = PapyrusFileUtils.getFile(receiver);
+			if (null != file) {
+				final Repository repository = GitUtils.getRepository(file.getProject());
+				final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+				if (null != git) {
+					result = !GitUtils.getReviewBranches(git).isEmpty();
+				}
+			}
+		}
+
+		final boolean expected = expectedValue instanceof Boolean ? ((Boolean) expectedValue).booleanValue() : true;
+		return expected == result;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusFilePropertyTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusFilePropertyTester.java
new file mode 100644
index 0000000..73457f5
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusFilePropertyTester.java
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.testers;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+
+/**
+ * The papyrus file property tester.
+ */
+public class PapyrusFilePropertyTester extends org.eclipse.core.expressions.PropertyTester {
+
+	/**
+	 * [{@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+	 */
+	@Override
+	public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) {
+		boolean result = false;
+		if ("isEnabled".equals(property)) { //$NON-NLS-1$
+			final IFile file = PapyrusFileUtils.getFile(receiver);
+			result = file != null;
+		}
+		return result;
+
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusProjectPropertyTester.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusProjectPropertyTester.java
new file mode 100644
index 0000000..5a114fa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/testers/PapyrusProjectPropertyTester.java
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.testers;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * The property tester to test if a project is already shared into a git.
+ */
+public class PapyrusProjectPropertyTester extends org.eclipse.core.expressions.PropertyTester {
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+	 */
+	@Override
+	public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) {
+		boolean result = false;
+		if ("isSharedProject".equals(property)) { //$NON-NLS-1$
+			final IFile file = PapyrusFileUtils.getFile(receiver);
+			if (file != null) {
+				final Element root = (Element) PapyrusFileUtils.getRootModel(file);
+				final Repository repository = GitUtils.getRepository(root);
+				result = root instanceof Element && null != repository;
+			}
+		} else if ("canCheckoutMaster".equals(property)) { //$NON-NLS-1$
+			final IFile file = PapyrusFileUtils.getFile(receiver);
+			if (file != null) {
+				final Element root = (Element) PapyrusFileUtils.getRootModel(file);
+				final Repository repository = GitUtils.getRepository(root);
+				if (null != repository) {
+					final Git git = GitUtils.openGit(repository.getWorkTree().getAbsolutePath());
+					final Ref currentBranch = GitUtils.getCurrentBranch(git);
+					result = !currentBranch.getName().endsWith(Constants.MASTER) || GitUtils.isCurrentBranchIsUpToDate(git);
+				}
+			}
+		}
+		final boolean expected = expectedValue instanceof Boolean ? ((Boolean) expectedValue).booleanValue() : true;
+		return expected == result;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/utils/GitActionsUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/utils/GitActionsUtils.java
new file mode 100644
index 0000000..4a0ca54
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/utils/GitActionsUtils.java
@@ -0,0 +1,149 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.utils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * This allows to define git UI utils actions.
+ */
+public class GitActionsUtils {
+
+	/**
+	 * This allows to get the project corresponding to the contribution.
+	 * 
+	 * @param shell
+	 *            The shell.
+	 * @param git
+	 *            The git.
+	 * @param branch
+	 *            The branch which one get.
+	 * @param rootElement
+	 *            The root element corresponding to the project to import.
+	 * @param taskName
+	 *            The UI task name.
+	 * @return The (re-)imported project.
+	 */
+	public static IProject getIProjectContribution(final Shell shell, final Git git, final Ref branch, final Element rootElement, final String taskName) {
+		return getIProjectContribution(shell, git, branch, PapyrusFileUtils.getFile(rootElement), taskName);
+	}
+
+	/**
+	 * This allows to get the project corresponding to the contribution.
+	 * 
+	 * @param shell
+	 *            The shell.
+	 * @param git
+	 *            The git.
+	 * @param branch
+	 *            The branch which one get.
+	 * @param file
+	 *            The file corresponding to the project to import.
+	 * @param taskName
+	 *            The UI task name.
+	 * @return The (re-)imported project.
+	 */
+	public static IProject getIProjectContribution(final Shell shell, final Git git, final Ref branch, final IFile umlFile, final String taskName) {
+
+		// Get the resources corresponding to the model
+		final IProject project = umlFile.getProject();
+		final String projectName = project.getName();
+
+		// Get the branch name
+		final String fullBranchName = branch.getName();
+		final String shortBranchName = fullBranchName.substring(fullBranchName.indexOf(Constants.R_REMOTES) + Constants.R_REMOTES.length() + Constants.DEFAULT_REMOTE_NAME.length() + 1);
+
+		final List<IProject> importedProject = new ArrayList<IProject>(1);
+
+		try {
+			new ProgressMonitorDialog(shell).run(true, false, monitor -> {
+				monitor.beginTask(taskName, 6);
+
+				try {
+					// First, reset the current branch
+					monitor.subTask("Reset the branch"); //$NON-NLS-1$
+					GitUtils.resetHardCurrentBranch(git);
+					monitor.worked(1);
+
+					// First, checkout the master branch (else we can't delete the other branch)
+					monitor.subTask("Checkout the master"); //$NON-NLS-1$
+					GitUtils.checkoutExistingBranch(git, Constants.MASTER);
+					monitor.worked(1);
+
+					// Second, we have to delete local branch if exist
+					monitor.subTask("Delete the local branch"); //$NON-NLS-1$
+					GitUtils.deleteLocalBranch(git, shortBranchName);
+					monitor.worked(1);
+
+					// After, create the local branch from the remote branch
+					monitor.subTask("Create the local branch from the remote branch"); //$NON-NLS-1$
+					GitUtils.createBranch(git, shortBranchName, shortBranchName);
+					monitor.worked(1);
+
+					// Delete the project from workspace
+					monitor.subTask("Delete the project from the workspace"); //$NON-NLS-1$
+					project.delete(false, true, monitor);
+					monitor.worked(1);
+
+					// Create and open the project from its path
+					final String repositoryPath = git.getRepository().getWorkTree().getAbsolutePath();
+					monitor.subTask("Import the project from the repository"); //$NON-NLS-1$
+					final URI gitPath = URI.createURI(repositoryPath.replace("\\", "/")); //$NON-NLS-1$ //$NON-NLS-2
+					final String projectFilePath = gitPath.toString() + "/" + projectName + "/.project"; //$NON-NLS-1$ //$NON-NLS-2$
+					final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+					final IProjectDescription description = workspace.loadProjectDescription(new Path(projectFilePath));
+					final IProject reimportedProject = workspace.getRoot().getProject(description.getName());
+					reimportedProject.create(description, monitor);
+					reimportedProject.open(monitor);
+					reimportedProject.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+					importedProject.add(reimportedProject);
+					monitor.worked(1);
+				} catch (final CoreException e) {
+					Activator.getLogHelper().error("Error while deleting the project", e); //$NON-NLS-1$
+				} finally {
+					monitor.done();
+				}
+			});
+		} catch (InvocationTargetException e) {
+			Activator.getLogHelper().error(e);
+		} catch (InterruptedException e) {
+			Activator.getLogHelper().error(e);
+		}
+
+		return importedProject.isEmpty() ? null : importedProject.get(0);
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsPropertySheetPage.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsPropertySheetPage.java
new file mode 100644
index 0000000..c6578be
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsPropertySheetPage.java
@@ -0,0 +1,131 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.views;
+
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.papyrus.infra.core.operation.DelegatingUndoContext;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.operations.RedoActionHandler;
+import org.eclipse.ui.operations.UndoActionHandler;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+import com.google.common.base.Supplier;
+
+/**
+ * The property sheet page for the requirements dependence views.
+ */
+public class ContributionsPropertySheetPage extends TabbedPropertySheetPage implements IContributionsViewPageListener {
+
+	/**
+	 * The view to manage.
+	 */
+	private final ContributionsView reviewsView;
+
+	/**
+	 * The undo.
+	 */
+	private UndoActionHandler undo = null;
+
+	/**
+	 * The redo.
+	 */
+	private RedoActionHandler redo = null;
+
+	/**
+	 * The undo context.
+	 */
+	private DelegatingUndoContext undoContext = null;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param reviewsView
+	 *            The reviews view that owns me.
+	 */
+	public ContributionsPropertySheetPage(final ContributionsView reviewsView) {
+		super(reviewsView);
+
+		this.reviewsView = reviewsView;
+		reviewsView.addPageListener(this);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#setActionBars(org.eclipse.ui.IActionBars)
+	 */
+	@Override
+	public void setActionBars(final IActionBars actionBars) {
+		super.setActionBars(actionBars);
+
+		undoContext = new DelegatingUndoContext.Dynamic(new Supplier<IUndoContext>() {
+
+			public IUndoContext get() {
+				return PlatformHelper.getAdapter(reviewsView, IUndoContext.class);
+			}
+		});
+
+		undo = new UndoActionHandler(getSite().getPage().getActivePart().getSite(), undoContext);
+		redo = new RedoActionHandler(getSite().getPage().getActivePart().getSite(), undoContext);
+
+		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undo);
+		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), redo);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#dispose()
+	 */
+	@Override
+	public void dispose() {
+		reviewsView.removePageListener(this);
+
+		if (undo != null) {
+			undo.dispose();
+		}
+		if (redo != null) {
+			redo.dispose();
+		}
+
+		super.dispose();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.papyrus.gitlight.git.ui.views.IContributionsViewPageListener#pageActivated(org.eclipse.papyrus.gitlight.git.ui.views.ContributionsView)
+	 */
+	@Override
+	public void pageActivated(final ContributionsView reviewsView) {
+		// Ensure that I am showing the up-to-date selection
+		selectionChanged(reviewsView, reviewsView.getSite().getSelectionProvider().getSelection());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.papyrus.gitlight.git.ui.views.IContributionsViewPageListener#pageClosing(org.eclipse.papyrus.gitlight.git.ui.views.ContributionsView)
+	 */
+	@Override
+	public void pageClosing(final ContributionsView reviewsView) {
+		// Forget the selection because it is now invalid and we don't want to show it when next the Model Explorer is activated
+		selectionChanged(reviewsView, StructuredSelection.EMPTY);
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsView.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsView.java
new file mode 100644
index 0000000..3e81781
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/ContributionsView.java
@@ -0,0 +1,631 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.views;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnPixelData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.papyrus.gitlight.git.ui.Activator;
+import org.eclipse.papyrus.gitlight.git.ui.providers.BranchesContentProvider;
+import org.eclipse.papyrus.gitlight.git.utils.PapyrusFileUtils;
+import org.eclipse.papyrus.gitlight.git.utils.GitConstants;
+import org.eclipse.papyrus.gitlight.git.utils.GitInstance;
+import org.eclipse.papyrus.gitlight.git.utils.GitUtils;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * The Reviews view.
+ */
+public class ContributionsView extends ViewPart implements ITabbedPropertySheetPageContributor {
+
+	/**
+	 * The ID of the view as specified by the extension.
+	 */
+	public static final String ID = "org.eclipse.papyrus.gitlight.git.ui.contributions.view"; //$NON-NLS-1$
+
+	/**
+	 * The menu id.
+	 */
+	public static final String MENU_ID = "org.eclipse.papyrus.gitlight.git.ui.contributions.view.popup"; //$NON-NLS-1$
+
+	/**
+	 * The used page book.
+	 */
+	private PageBook pagebook;
+
+	/**
+	 * The used table viewer for the branches.
+	 */
+	private TableViewer tableViewer;
+
+	/**
+	 * The property sheet pages.
+	 */
+	private List<IPropertySheetPage> propertiesSheetPages = new LinkedList<IPropertySheetPage>();
+
+	/**
+	 * The page listeners.
+	 */
+	private final CopyOnWriteArrayList<IContributionsViewPageListener> pageListeners = new CopyOnWriteArrayList<IContributionsViewPageListener>();
+
+	/**
+	 * The table layout for columns.
+	 */
+	private AutoResizeTableLayout tableLayout;
+
+
+	/**
+	 * The listener we register with the selection service.
+	 */
+	private ISelectionListener listener = new ISelectionListener() {
+		public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
+			// we ignore our own selections
+			if (sourcepart != ContributionsView.this) {
+				showSelection(sourcepart, selection);
+			}
+		}
+	};
+
+	/**
+	 * Default constructor.
+	 */
+	public ContributionsView() {
+		// Do nothing
+	}
+
+	/**
+	 * Shows the given selection in this view.
+	 * 
+	 * @param sourcepart
+	 *            The source part workbench.
+	 * @param selection
+	 *            The selection.
+	 */
+	public void showSelection(final IWorkbenchPart sourcepart, final ISelection selection) {
+		String contentDescription = "Selection is not managed"; //$NON-NLS-1$
+		if (selection instanceof IStructuredSelection) {
+			final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+			if (structuredSelection.size() == 1) {
+				final Element element = getRootElement(structuredSelection.getFirstElement());
+				tableViewer.setInput(element);
+				if (null != element) {
+					if (element instanceof NamedElement) {
+						contentDescription = "Contributions for model '" + ((NamedElement) element).getName() + "'"; //$NON-NLS-1$ //$NON-NLS-2$
+					}
+				}
+				pagebook.showPage(tableViewer.getControl());
+			}
+		}
+		setContentDescription(contentDescription);
+	}
+
+	/**
+	 * Get the root of the selected element (it ban be file, EObject, others...).
+	 * 
+	 * @param selectedObject
+	 *            The selected object.
+	 * @return The root element or <code>null</code>.
+	 */
+	protected Element getRootElement(final Object selectedObject) {
+		Element result = null;
+
+		// Manage the possible selected file
+		final IFile file = PapyrusFileUtils.getFile(selectedObject);
+		if (null != file) {
+			String fullPath = file.getFullPath().toString();
+			URI modelURI = URI.createPlatformResourceURI(fullPath, false);
+			if (!"uml".equals(modelURI.fileExtension())) { //$NON-NLS-1$
+				modelURI = modelURI.trimFileExtension().appendFileExtension("uml"); //$NON-NLS-1$
+			}
+			final ModelSet modelSet = new ModelSet();
+			final Resource resource = modelSet.getResource(modelURI, true);
+
+			if (null != resource) {
+				final EObject root = resource.getContents().get(0);
+
+				if (root instanceof Element) {
+					result = (Element) root;
+				}
+			}
+		}
+
+		// Manage other possibilities
+		if (null == result && selectedObject instanceof IAdaptable) {
+			final Element adapter = ((IAdaptable) selectedObject).getAdapter(Element.class);
+			if (null != adapter) {
+				result = adapter.getModel();
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+	 */
+	@Override
+	public void createPartControl(final Composite parent) {
+		pagebook = new PageBook(parent, SWT.NONE);
+
+		tableViewer = new TableViewer(pagebook, SWT.SINGLE | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
+		tableViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
+		tableViewer.setContentProvider(new BranchesContentProvider(true));
+		tableViewer.getTable().setHeaderVisible(true);
+		tableViewer.getTable().setLinesVisible(true);
+
+		// Initialize the columns layout data
+		tableLayout = new AutoResizeTableLayout(tableViewer.getTable());
+		tableViewer.getTable().setLayout(tableLayout);
+
+		// Create the columns
+		createReviewDateColumn();
+		createReviewVersionColumn();
+		createReviewAuthorColumn();
+		createReviewCommentColumn();
+
+		final MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+		menuManager.setRemoveAllWhenShown(true);
+		menuManager.addMenuListener(new IMenuListener() {
+
+			public void menuAboutToShow(IMenuManager manager) {
+				manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+			}
+
+		});
+
+		final Menu menu = menuManager.createContextMenu(tableViewer.getTable());
+		tableViewer.getTable().setMenu(menu);
+		getSite().registerContextMenu(MENU_ID, menuManager, tableViewer);
+
+		// Provider the table selection
+		getSite().setSelectionProvider(tableViewer);
+
+		// Add the selection listener
+		getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(listener);
+	}
+
+	/**
+	 * This allows to create the date column.
+	 */
+	protected void createReviewDateColumn() {
+		final TableViewerColumn dateColumn = new TableViewerColumn(tableViewer, SWT.NONE);
+		dateColumn.getColumn().setText("Date"); //$NON-NLS-1$
+		dateColumn.getColumn().setWidth(150);
+		dateColumn.getColumn().setResizable(true);
+		tableLayout.addColumnData(new ColumnWeightData(150, 100, true));
+		dateColumn.setLabelProvider(new ColumnLabelProvider() {
+
+			/**
+			 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
+			 *
+			 * @param element
+			 * @return
+			 */
+			@Override
+			public String getText(Object element) {
+				if (element instanceof Ref) {
+					final Git git = GitInstance.getInstance().getGit();
+					final RevCommit lastCommit = GitUtils.getLastCommitOfBranch(git, (Ref) element);
+					PersonIdent authorIdent = lastCommit.getAuthorIdent();
+					Date authorDate = authorIdent.getWhen();
+					SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); //$NON-NLS-1$
+					return dateFormat.format(authorDate);
+				}
+				return "Not specified"; //$NON-NLS-1$
+			}
+		});
+	}
+
+	/**
+	 * This allows to create the version column.
+	 */
+	protected void createReviewVersionColumn() {
+		final TableViewerColumn versionColumn = new TableViewerColumn(tableViewer, SWT.NONE);
+		versionColumn.getColumn().setText("Version"); //$NON-NLS-1$
+		versionColumn.getColumn().setWidth(100);
+		versionColumn.getColumn().setResizable(true);
+		tableLayout.addColumnData(new ColumnWeightData(100, 50, true));
+		versionColumn.setLabelProvider(new ColumnLabelProvider() {
+
+			/**
+			 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
+			 *
+			 * @param element
+			 * @return
+			 */
+			@Override
+			public String getText(Object element) {
+				if (element instanceof Ref) {
+					final String name = ((Ref) element).getName();
+					if (name.contains(GitConstants.CONTRIBUTION_BRANCH_PREFIX) && name.length() > (GitConstants.CONTRIBUTION_BRANCH_PREFIX.length() + 18)) {
+						// 18 is the number of character for the unique identifier generated from the date (it is always the same size)
+						return name.substring(name.indexOf(GitConstants.CONTRIBUTION_BRANCH_PREFIX) + GitConstants.CONTRIBUTION_BRANCH_PREFIX.length() + 18);
+					}
+					return name;
+				}
+				return "Not specified"; //$NON-NLS-1$
+			}
+		});
+	}
+
+	/**
+	 * This allows to create the author column.
+	 */
+	protected void createReviewAuthorColumn() {
+		final TableViewerColumn authorColumn = new TableViewerColumn(tableViewer, SWT.NONE);
+		authorColumn.getColumn().setText("Author"); //$NON-NLS-1$
+		authorColumn.getColumn().setWidth(200);
+		authorColumn.getColumn().setResizable(true);
+		tableLayout.addColumnData(new ColumnWeightData(200, 100, true));
+		authorColumn.setLabelProvider(new ColumnLabelProvider() {
+
+			/**
+			 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
+			 *
+			 * @param element
+			 * @return
+			 */
+			@Override
+			public String getText(Object element) {
+				if (element instanceof Ref) {
+					final Git git = GitInstance.getInstance().getGit();
+					final RevCommit lastCommit = GitUtils.getLastCommitOfBranch(git, (Ref) element);
+
+					String author = null;
+					if (lastCommit.getFullMessage().contains(Constants.SIGNED_OFF_BY_TAG)) {
+						try {
+							final String subSignedOff = lastCommit.getFullMessage().substring(lastCommit.getFullMessage().indexOf(Constants.SIGNED_OFF_BY_TAG) + Constants.SIGNED_OFF_BY_TAG.length());
+							author = subSignedOff.contains("\n") ? subSignedOff.substring(0, subSignedOff.indexOf("\n")) : subSignedOff; //$NON-NLS-1$ //$NON-NLS-2$
+						} catch (Exception e) {
+							// Do nothing
+						}
+					}
+					if (null == author || author.isEmpty()) {
+						author = lastCommit.getAuthorIdent().getName();
+					}
+
+					return author;
+				}
+				return "Unknown"; //$NON-NLS-1$
+			}
+		});
+	}
+
+	/**
+	 * This allows to create the comment column.
+	 */
+	protected void createReviewCommentColumn() {
+		final TableViewerColumn commentColumn = new TableViewerColumn(tableViewer, SWT.NONE);
+		commentColumn.getColumn().setText("Comment"); //$NON-NLS-1$
+		commentColumn.getColumn().setWidth(600);
+		commentColumn.getColumn().setResizable(true);
+		tableLayout.addColumnData(new ColumnPixelData(600, true));
+		commentColumn.setLabelProvider(new ColumnLabelProvider() {
+
+			/**
+			 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
+			 *
+			 * @param element
+			 * @return
+			 */
+			@Override
+			public String getText(Object element) {
+				if (element instanceof Ref) {
+					final Git git = GitInstance.getInstance().getGit();
+					final RevCommit lastCommit = GitUtils.getLastCommitOfBranch(git, (Ref) element);
+					return lastCommit.getShortMessage();
+				}
+				return "Not specified"; //$NON-NLS-1$
+			}
+		});
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+	 */
+	@Override
+	public void setFocus() {
+		pagebook.setFocus();
+		firePageActivated();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
+
+		if (IPropertySheetPage.class == adapter) {
+			// Do not test if tabbedPropertySheetPage is null before calling new
+			// this is managed by Eclipse which only call current method when necessary
+			return getPropertySheetPage();
+		}
+
+		return super.getAdapter(adapter);
+	}
+
+	/**
+	 * This allows to define the property sheet page associated to this view.
+	 * 
+	 * @return The property sheet page.
+	 */
+	private IPropertySheetPage getPropertySheetPage() {
+		IPropertySheetPage propertySheetPage = new ContributionsPropertySheetPage(this);
+		propertiesSheetPages.add(propertySheetPage);
+		return propertySheetPage;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	@Override
+	public void dispose() {
+		// important: We need do unregister our listener when the view is disposed
+		getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(listener);
+
+		for (final IPropertySheetPage page : propertiesSheetPages) {
+			page.dispose();
+		}
+		propertiesSheetPages.clear();
+		super.dispose();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
+	 */
+	@Override
+	public String getContributorId() {
+		return "TreeOutlinePage"; //$NON-NLS-1$
+	}
+
+	/**
+	 * This allows to add a page listener.
+	 * 
+	 * @param listener
+	 *            The page listener to add.
+	 */
+	void addPageListener(final IContributionsViewPageListener listener) {
+		pageListeners.addIfAbsent(listener);
+	}
+
+	/**
+	 * This allows to remove a page listener.
+	 * 
+	 * @param listener
+	 *            The page listener to remove.
+	 */
+	void removePageListener(final IContributionsViewPageListener listener) {
+		pageListeners.remove(listener);
+	}
+
+	/**
+	 * This allows to call the activated pages.
+	 */
+	private void firePageActivated() {
+		for (final IContributionsViewPageListener next : pageListeners) {
+			try {
+				next.pageActivated(this);
+			} catch (Exception e) {
+				Activator.getLogHelper().error("Uncaught exception in page activation listener.", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This class allows to manage correctly the columns in the table viewer.
+	 */
+	public class AutoResizeTableLayout extends TableLayout implements ControlListener {
+
+		/**
+		 * The table to manage.
+		 */
+		private final Table table;
+
+		/**
+		 * The columns layout data.
+		 */
+		private List<ColumnLayoutData> columns = new ArrayList<ColumnLayoutData>();
+
+		/**
+		 * This manage the auto sizing of the columns.
+		 */
+		private boolean autosizing = false;
+
+		/**
+		 * Default constructor.
+		 *
+		 * @param table
+		 *            The table to manage.
+		 */
+		public AutoResizeTableLayout(final Table table) {
+			this.table = table;
+			table.addControlListener(this);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.jface.viewers.TableLayout#addColumnData(org.eclipse.jface.viewers.ColumnLayoutData)
+		 */
+		@Override
+		public void addColumnData(final ColumnLayoutData data) {
+			columns.add(data);
+			super.addColumnData(data);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
+		 */
+		@Override
+		public void controlMoved(final ControlEvent e) {
+			// Do nothing
+		}
+
+		/**
+		 * {@inheritDoc}
+		 * 
+		 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
+		 */
+		@Override
+		public void controlResized(final ControlEvent e) {
+			if (autosizing)
+				return;
+			autosizing = true;
+			try {
+				autoSizeColumns();
+			} finally {
+				autosizing = false;
+			}
+		}
+
+		/**
+		 * This allows to auto resize the columns depending to the space available.
+		 */
+		private void autoSizeColumns() {
+			int width = table.getClientArea().width;
+
+			// Layout is being called with an invalid value the first time it is being called on Linux.
+			// This method resets the layout to null, so we run it only when the value is OK.
+			if (width <= 1) {
+				return;
+			}
+
+			final TableColumn[] tableColumns = table.getColumns();
+			int size = Math.min(columns.size(), tableColumns.length);
+			int[] widths = new int[size];
+			int fixedWidth = 0;
+			int numberOfWeightColumns = 0;
+			int totalWeight = 0;
+
+			// First calc space occupied by fixed columns.
+			for (int i = 0; i < size; i++) {
+				final ColumnLayoutData col = columns.get(i);
+				if (col instanceof ColumnPixelData) {
+					int pixels = ((ColumnPixelData) col).width;
+					widths[i] = pixels;
+					fixedWidth += pixels;
+				} else if (col instanceof ColumnWeightData) {
+					final ColumnWeightData cw = (ColumnWeightData) col;
+					numberOfWeightColumns++;
+					int weight = cw.weight;
+					totalWeight += weight;
+				} else {
+					throw new IllegalStateException("Unknown column layout data");
+				}
+			}
+
+			// Do we have columns that have a weight?
+			if (numberOfWeightColumns > 0) {
+				// Now, distribute the rest to the columns with weight.
+				// Make sure there's enough room, even if we have to scroll.
+				if (width < fixedWidth + totalWeight) {
+					width = fixedWidth + totalWeight;
+				}
+				int rest = width - fixedWidth;
+				int totalDistributed = 0;
+				for (int i = 0; i < size; i++) {
+					final ColumnLayoutData col = columns.get(i);
+					if (col instanceof ColumnWeightData) {
+						final ColumnWeightData cw = (ColumnWeightData) col;
+						int weight = cw.weight;
+						int pixels = totalWeight == 0 ? 0 : weight * rest / totalWeight;
+						if (pixels < cw.minimumWidth) {
+							pixels = cw.minimumWidth;
+						}
+						totalDistributed += pixels;
+						widths[i] = pixels;
+					}
+				}
+
+				// Distribute any remaining pixels to columns with weight.
+				int diff = rest - totalDistributed;
+				for (int i = 0; diff > 0; i++) {
+					if (i == size) {
+						i = 0;
+					}
+					final ColumnLayoutData col = columns.get(i);
+					if (col instanceof ColumnWeightData) {
+						++widths[i];
+						--diff;
+					}
+				}
+			}
+
+			for (int i = 0; i < size; i++) {
+				if (tableColumns[i].getWidth() != widths[i]) {
+					tableColumns[i].setWidth(widths[i]);
+				}
+			}
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/IContributionsViewPageListener.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/IContributionsViewPageListener.java
new file mode 100644
index 0000000..cd0171a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git.ui/src/org/eclipse/papyrus/gitlight/git/ui/views/IContributionsViewPageListener.java
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.ui.views;
+
+/**
+ * The page listener for the reviews views.
+ */
+public interface IContributionsViewPageListener {
+
+	/**
+	 * This will be called when a page is activated.
+	 * 
+	 * @param reviewsView
+	 *            The reviews view.
+	 */
+	public void pageActivated(final ContributionsView reviewsView);
+
+	/**
+	 * This will be called when a page is closing.
+	 * 
+	 * @param reviewsView
+	 *            The reviews view.
+	 */
+	public void pageClosing(final ContributionsView reviewsView);
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.project
new file mode 100644
index 0000000..70a2f06
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.git</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..89c3975
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.git;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.git
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.papyrus.gitlight.git.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.papyrus.infra.core.log,
+ org.eclipse.jgit,
+ org.eclipse.core.expressions,
+ org.eclipse.egit.core,
+ org.eclipse.egit.ui,
+ org.eclipse.papyrus.infra.widgets,
+ org.eclipse.uml2.uml,
+ org.eclipse.papyrus.infra.emf.gmf,
+ org.eclipse.papyrus.infra.onefile
+Export-Package: org.eclipse.papyrus.gitlight.git,
+ org.eclipse.papyrus.gitlight.git.data,
+ org.eclipse.papyrus.gitlight.git.utils
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/build.properties
new file mode 100644
index 0000000..99a0eef
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/build.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.properties,\
+               about.html
+source.. = src/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/plugin.properties
new file mode 100644
index 0000000..73c9052
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Git
+providerName = Eclipse Modeling Project
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/pom.xml
new file mode 100644
index 0000000..3b35a46
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.git</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/Activator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/Activator.java
new file mode 100644
index 0000000..42efdc6
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/Activator.java
@@ -0,0 +1,80 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.gitlight.git"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+
+	/** Logging helper. */
+	private static LogHelper logHelper;
+
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		logHelper = new LogHelper(plugin);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+		logHelper = null;
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the log helper
+	 * 
+	 * @return the log helper
+	 */
+	public static LogHelper getLogHelper() {
+		return logHelper;
+	}
+
+}
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/data/CatalogVersion.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/data/CatalogVersion.java
new file mode 100644
index 0000000..9c87860
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/data/CatalogVersion.java
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.data;
+
+import java.util.NoSuchElementException;
+import java.util.StringTokenizer;
+
+/**
+ * This class represent the catalog version.
+ */
+public class CatalogVersion {
+
+	/** The major version number. */
+	protected int major;
+
+	/** The minor version number. */
+	protected int minor;
+
+	/** The separator for the version string. */
+	private final static String SEPARATOR = "."; //$NON-NLS-1$
+
+	/** The empty version "0.0". Equivalent to calling <code>new Version(0,0)</code>. */
+	public static final CatalogVersion emptyVersion = new CatalogVersion(0, 0);
+
+	/**
+	 * Creates a new Version.
+	 *
+	 * @param major
+	 *            The major version value (should be positive).
+	 * @param minor
+	 *            The minor version value (should be positive).
+	 */
+	public CatalogVersion(final int major, final int minor) {
+		updateVersion(major, minor);
+	}
+
+	/**
+	 * Creates a new Version, parsing a string value.
+	 *
+	 * @param value
+	 *            The string representing the version.
+	 */
+	public CatalogVersion(final String value) throws IllegalArgumentException {
+		try {
+			final StringTokenizer st = new StringTokenizer(value, SEPARATOR, true);
+			major = Integer.parseInt(st.nextToken());
+
+			if (st.hasMoreTokens()) {
+				st.nextToken(); // consume delimiter
+				minor = Integer.parseInt(st.nextToken());
+
+				if (st.hasMoreTokens()) {
+					throw new IllegalArgumentException("invalid format"); //$NON-NLS-1$
+				}
+			}
+		} catch (NoSuchElementException e) {
+			throw new IllegalArgumentException("invalid format"); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Returns the major version number.
+	 *
+	 * @return The major version number.
+	 */
+	public int getMajor() {
+		return major;
+	}
+
+	/**
+	 * Returns the minor version number.
+	 *
+	 * @return The minor version number.
+	 */
+	public int getMinor() {
+		return minor;
+	}
+
+	/**
+	 * Updates the version numbers.
+	 *
+	 * @param major
+	 *            The new major value.
+	 * @param minor
+	 *            The new minor value.
+	 */
+	public void updateVersion(final int major, final int minor) {
+		this.major = major;
+		this.minor = minor;
+	}
+
+	/**
+	 * Creates a version given the specific String.
+	 *
+	 * @param version
+	 *            The string to parse.
+	 * @return The version value corresponding to the String.
+	 */
+	public static CatalogVersion parseVersion(final String version) throws IllegalArgumentException {
+		if (version == null) {
+			return emptyVersion;
+		}
+
+		final String currentVersion = version.trim();
+		if (currentVersion.length() == 0) {
+			return emptyVersion;
+		}
+		return new CatalogVersion(currentVersion);
+	}
+
+	/**
+	 * Returns the string corresponding to the version.
+	 * 
+	 * @return The string corresponding to the version.
+	 */
+	@Override
+	public String toString() {
+		return major + SEPARATOR + minor;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitAnnotationUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitAnnotationUtils.java
new file mode 100644
index 0000000..73d1960
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitAnnotationUtils.java
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import java.io.IOException;
+
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.gitlight.git.Activator;
+import org.eclipse.papyrus.gitlight.git.data.CatalogVersion;
+import org.eclipse.uml2.common.util.UML2Util;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * This class allows to manage the annotation concerning the git management.
+ */
+public class GitAnnotationUtils {
+
+	/**
+	 * This allows to add the 'version' annotation to an element.
+	 * 
+	 * @param element
+	 *            The element to which one add the annotation.
+	 * @param version
+	 *            The version to store.
+	 */
+	public static void addVersionAnnotation(final Element element, final CatalogVersion version) {
+		final Resource resource = element.eResource();
+		if (null != resource) {
+			final EAnnotation eAnnotation = UML2Util.getEAnnotation(element, GitConstants.VERSION_ANNOTATION, true);
+			eAnnotation.getDetails().put(GitConstants.VERSION_DETAILS_NAME, version.toString());
+
+			try {
+				resource.save(null);
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error during save of UML file", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to get the 'version' annotation from the element.
+	 * 
+	 * @param element
+	 *            The element to check.
+	 * @return The 'version' annotation value or <code>null</code>.
+	 */
+	public static CatalogVersion getVersionAnnotation(final Element element) {
+		CatalogVersion result = CatalogVersion.emptyVersion;
+		if (null != element) {
+			final EAnnotation eAnnotation = UML2Util.getEAnnotation(element, GitConstants.VERSION_ANNOTATION, false);
+			if (null != eAnnotation && eAnnotation.getDetails().containsKey(GitConstants.VERSION_DETAILS_NAME)) {
+				result = CatalogVersion.parseVersion(eAnnotation.getDetails().get(GitConstants.VERSION_DETAILS_NAME));
+			}
+		}
+
+		return result;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitConstants.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitConstants.java
new file mode 100644
index 0000000..d922e1b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitConstants.java
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import org.eclipse.jgit.lib.Constants;
+
+/**
+ * This allows to define the constants needed for the git management.
+ */
+public interface GitConstants {
+
+	/**
+	 * The 'version' annotation key.
+	 */
+	public static final String VERSION_ANNOTATION = "version"; //$NON-NLS-1$
+
+	/**
+	 * The 'version' details name key.
+	 */
+	public static final String VERSION_DETAILS_NAME = "current"; //$NON-NLS-1$
+
+	/**
+	 * The master repository path.
+	 */
+	public static final String MASTER_REPOSITORY_PATH = Constants.DEFAULT_REMOTE_NAME + "/" + Constants.MASTER; //$NON-NLS-1$
+
+	/**
+	 * The contribution branch name prefix.
+	 */
+	public static final String CONTRIBUTION_BRANCH_PREFIX = "Review_"; //$NON-NLS-1$
+
+	/**
+	 * The initial commit message.
+	 */
+	public static final String INITIAL_COMMIT_MESSAGE = "Initial commit"; //$NON-NLS-1$
+	
+	/**
+	 * The git folder.
+	 */
+	public static final String GIT_FOLDER = "\\" + Constants.DOT_GIT; //$NON-NLS-1$
+	
+	/**
+	 * The change id.
+	 */
+	public static final String CHANGE_ID = "Change-Id: I0000000000000000000000000000000000000000"; //$NON-NLS-1$
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitInstance.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitInstance.java
new file mode 100644
index 0000000..e528bd3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitInstance.java
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * This singleton allows to store the current git and the current root element.
+ * This allows to simplify the management.
+ */
+public class GitInstance {
+
+	/**
+	 * The singleton instance.
+	 */
+	private static GitInstance instance;
+
+	/**
+	 * The current git to manage.
+	 */
+	private Git git;
+
+	/**
+	 * The current root element.
+	 */
+	private Element rootElement;
+
+	/**
+	 * Private constructor to avoid external initialization.
+	 */
+	private GitInstance() {
+		// Do nothing
+	}
+
+	/**
+	 * Get the instance.
+	 * 
+	 * @return The instance.
+	 */
+	public static GitInstance getInstance() {
+		if (null == instance) {
+			instance = new GitInstance();
+		}
+		return instance;
+	}
+
+	/**
+	 * This allows to get the current git.
+	 * 
+	 * @return The current git.
+	 */
+	public Git getGit() {
+		return git;
+	}
+
+	/**
+	 * This allows to get the root element.
+	 * 
+	 * @return The current root element.
+	 */
+	public Element getRootElement() {
+		return rootElement;
+	}
+
+	/**
+	 * This allows to set the current git and root element.
+	 * 
+	 * @param git
+	 *            The current git to store.
+	 * @param rootElement
+	 *            The current root element.
+	 */
+	public void setCurrentGitAndRootElement(final Git git, final Element rootElement) {
+		this.git = git;
+		this.rootElement = rootElement;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitProcessUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitProcessUtils.java
new file mode 100644
index 0000000..f99c64f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitProcessUtils.java
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Thi class allows to manage the static methods for the git process.
+ */
+public class GitProcessUtils {
+
+	/**
+	 * This allows to copy the project into the git folder and add files into the git.
+	 * 
+	 * @param git
+	 *            The git where add the project.
+	 * @param project
+	 *            The project to copy.
+	 */
+	public static void copyProject(final Git git, final IProject project) {
+		final Repository repository = git.getRepository();
+		final URI gitPath = URI.createURI(repository.getWorkTree().toString().replace("\\", "/")); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// Copy all project and sub files
+		copySubFolder(project, gitPath);
+
+		// Add this copied files to git
+		addGitFiles(git, repository.getWorkTree(), ""); //$NON-NLS-1$
+	}
+
+	/**
+	 * This allows to copy a folder from a container info the folder represented by its path.
+	 * 
+	 * @param container
+	 *            The container to copy.
+	 * @param folderPath
+	 *            The folder path where copy the container.
+	 */
+	private static void copySubFolder(final IContainer container, final URI folderPath) {
+		final URI createdContainerPath = folderPath.appendSegment(container.getName());
+		PapyrusFileUtils.copyFolder(container.getLocation().toString(), createdContainerPath.toString());
+	}
+
+	/**
+	 * This allows to add the files into the git (to prepare commit).
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param directory
+	 *            The directory file.
+	 * @param parentDirectory
+	 *            The parent directory path.
+	 */
+	public static void addGitFiles(final Git git, final File directory, final String parentDirectory) {
+		if (directory.isDirectory()) {
+			for (final File subFile : directory.listFiles()) {
+				if (subFile.isDirectory()) {
+					final String newParentDirectory = parentDirectory.isEmpty() ? subFile.getName() : parentDirectory + "/" + subFile.getName(); //$NON-NLS-1$
+					addGitFiles(git, subFile, newParentDirectory);
+				} else {
+					final String filePath = parentDirectory.isEmpty() ? subFile.getName() : parentDirectory + "/" + subFile.getName(); //$NON-NLS-1$
+					GitUtils.addFile(git, filePath);
+				}
+			}
+		}
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitUtils.java
new file mode 100644
index 0000000..6b4b9b5
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/GitUtils.java
@@ -0,0 +1,600 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.egit.ui.internal.selection.SelectionUtils;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jgit.api.CheckoutCommand;
+import org.eclipse.jgit.api.CreateBranchCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.ListBranchCommand.ListMode;
+import org.eclipse.jgit.api.MergeCommand;
+import org.eclipse.jgit.api.MergeResult;
+import org.eclipse.jgit.api.PushCommand;
+import org.eclipse.jgit.api.ResetCommand.ResetType;
+import org.eclipse.jgit.api.errors.AbortedByHookException;
+import org.eclipse.jgit.api.errors.CanceledException;
+import org.eclipse.jgit.api.errors.CheckoutConflictException;
+import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.InvalidConfigurationException;
+import org.eclipse.jgit.api.errors.InvalidRefNameException;
+import org.eclipse.jgit.api.errors.InvalidRemoteException;
+import org.eclipse.jgit.api.errors.NoFilepatternException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.api.errors.NoMessageException;
+import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
+import org.eclipse.jgit.api.errors.RefNotAdvertisedException;
+import org.eclipse.jgit.api.errors.RefNotFoundException;
+import org.eclipse.jgit.api.errors.TransportException;
+import org.eclipse.jgit.api.errors.UnmergedPathsException;
+import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.papyrus.gitlight.git.Activator;
+import org.eclipse.uml2.uml.Element;
+
+/**
+ * This class allows to define utils method for the git.
+ */
+@SuppressWarnings("restriction")
+public class GitUtils {
+
+	/**
+	 * This allows to open the git.
+	 * 
+	 * @param repositoryPath
+	 *            The repository path.
+	 * @return The opened git or <code>null</code>.
+	 */
+	public static Git openGit(final String repositoryPath) {
+		if (!repositoryPath.isEmpty()) {
+			try {
+				Git git = Git.open(new File(repositoryPath));
+				return git;
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error during the repository opening", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to get repository from project.
+	 * 
+	 * @param project
+	 *            The project.
+	 * @param shell
+	 *            The shell.
+	 * @return The repository corresponding to the project.
+	 */
+	public static Repository getRepository(final Element element) {
+		final IFile umlFile = PapyrusFileUtils.getFile(element);
+		final IProject project = umlFile.getProject();
+		return null != project ? getRepository(project) : null;
+	}
+
+	/**
+	 * This allows to get repository from project.
+	 * 
+	 * @param project
+	 *            The project.
+	 * @param shell
+	 *            The shell.
+	 * @return The repository corresponding to the project.
+	 */
+	public static Repository getRepository(final IProject project) {
+		return SelectionUtils.getRepository(new StructuredSelection(project));
+	}
+
+	/**
+	 * This allows to add a file for the commit.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param filePath
+	 *            The file path of file to add.
+	 */
+	public static void addFile(final Git git, final String filePath) {
+		if (null != git && !filePath.isEmpty()) {
+			try {
+				git.add().addFilepattern(filePath).call();
+			} catch (NoFilepatternException e) {
+				Activator.getLogHelper().error("Error while adding file: Pattern file is not correct", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while adding file: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to create a commit.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param message
+	 *            The commit message.
+	 * @return The commit revision or <code>null</code>.
+	 */
+	public static RevCommit createCommit(final Git git, final String message) {
+		if (null != git) {
+			try {
+				return git.commit().setMessage(message).call();
+			} catch (NoHeadException e) {
+				Activator.getLogHelper().error("Error while creating commit: No head defined", e); //$NON-NLS-1$
+			} catch (NoMessageException e) {
+				Activator.getLogHelper().error("Error while creating commit: No defined message", e); //$NON-NLS-1$
+			} catch (UnmergedPathsException e) {
+				Activator.getLogHelper().error("Error while creating commit: Unknow error", e); //$NON-NLS-1$
+			} catch (ConcurrentRefUpdateException e) {
+				Activator.getLogHelper().error("Error while creating commit: Concurrent update", e); //$NON-NLS-1$
+			} catch (WrongRepositoryStateException e) {
+				Activator.getLogHelper().error("Error while creating commit: Wrong repository state", e); //$NON-NLS-1$
+			} catch (AbortedByHookException e) {
+				Activator.getLogHelper().error("Error while creating commit: Repository hooked", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while creating commit: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to push the commit.
+	 * 
+	 * @param git
+	 *            The git.
+	 */
+	public static void pushCommit(final Git git) {
+		if (null != git) {
+			try {
+				git.push().call();
+			} catch (InvalidRemoteException e) {
+				Activator.getLogHelper().error("Error while pushing: Invalid remote", e); //$NON-NLS-1$
+			} catch (TransportException e) {
+				Activator.getLogHelper().error("Error while pushing: Connection problem", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while pushing: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to push a branch into repository.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name to push.
+	 */
+	public static void pushBranchCommit(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				final PushCommand pushCommand = git.push();
+				pushCommand.setRemote(Constants.DEFAULT_REMOTE_NAME);
+				pushCommand.setRefSpecs(new RefSpec(branchName + ":" + branchName));
+				pushCommand.call();
+			} catch (InvalidRemoteException e) {
+				Activator.getLogHelper().error("Error while pushing: Invalid remote", e); //$NON-NLS-1$
+			} catch (TransportException e) {
+				Activator.getLogHelper().error("Error while pushing: Connection problem", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while pushing: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to create a local branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name.
+	 */
+	public static void createBranch(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				git.checkout().setCreateBranch(true).setName(branchName).call();
+			} catch (RefAlreadyExistsException e) {
+				Activator.getLogHelper().error("Error while creating branch: Branch '" + branchName + "' already exists", e); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (RefNotFoundException e) {
+				Activator.getLogHelper().error("Error while creating branch: Reference not found", e); //$NON-NLS-1$
+			} catch (InvalidRefNameException e) {
+				Activator.getLogHelper().error("Error while creating branch: Invalid name", e); //$NON-NLS-1$
+			} catch (CheckoutConflictException e) {
+				Activator.getLogHelper().error("Error while creating branch: Checkout conflict", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while creating branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to create a local branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name.
+	 */
+	public static void createBranch(final Git git, final String branchName, final String remoteBranchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				git.checkout()
+						.setCreateBranch(true)
+						.setName(branchName)
+						.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
+						.setStartPoint(Constants.DEFAULT_REMOTE_NAME + "/" + remoteBranchName) //$NON-NLS-1$
+						.call();
+			} catch (RefAlreadyExistsException e) {
+				Activator.getLogHelper().error("Error while creating branch: Branch '" + branchName + "' already exists", e); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (RefNotFoundException e) {
+				Activator.getLogHelper().error("Error while creating branch: Reference not found", e); //$NON-NLS-1$
+			} catch (InvalidRefNameException e) {
+				Activator.getLogHelper().error("Error while creating branch: Invalid name", e); //$NON-NLS-1$
+			} catch (CheckoutConflictException e) {
+				Activator.getLogHelper().error("Error while creating branch: Checkout conflict", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while creating branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to reset hard the current branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 */
+	public static void resetHardCurrentBranch(final Git git) {
+		if (null != git) {
+			try {
+				git.reset().setMode(ResetType.HARD).call();
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while creating branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * this allows to checkout an existing local branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name.
+	 */
+	public static void checkoutExistingBranch(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				git.checkout().setCreateBranch(false).setName(branchName).call();
+			} catch (RefNotFoundException e) {
+				Activator.getLogHelper().error("Error while creating branch: Reference not found", e); //$NON-NLS-1$
+			} catch (InvalidRefNameException e) {
+				Activator.getLogHelper().error("Error while creating branch: Invalid name", e); //$NON-NLS-1$
+			} catch (CheckoutConflictException e) {
+				Activator.getLogHelper().error("Error while creating branch: Checkout conflict", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while creating branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to pull the current local branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 */
+	public static void pull(final Git git) {
+		if (null != git) {
+			try {
+				git.pull().call();
+			} catch (WrongRepositoryStateException e) {
+				Activator.getLogHelper().error("Error while pulling: Reference not found", e); //$NON-NLS-1$
+			} catch (InvalidConfigurationException e) {
+				Activator.getLogHelper().error("Error while pulling: Invalid configuration", e); //$NON-NLS-1$
+			} catch (InvalidRemoteException e) {
+				Activator.getLogHelper().error("Error while pulling: Invalid Remote", e); //$NON-NLS-1$
+			} catch (CanceledException e) {
+				Activator.getLogHelper().error("Error while pulling: Cancel request", e); //$NON-NLS-1$
+			} catch (RefNotFoundException e) {
+				Activator.getLogHelper().error("Error while pulling: Branch not found", e); //$NON-NLS-1$
+			} catch (RefNotAdvertisedException e) {
+				Activator.getLogHelper().error("Error while pulling: Branch not Advertised", e); //$NON-NLS-1$
+			} catch (NoHeadException e) {
+				Activator.getLogHelper().error("Error while pulling: No head", e); //$NON-NLS-1$
+			} catch (TransportException e) {
+				Activator.getLogHelper().error("Error while pulling: Transport Exception", e); //$NON-NLS-1$
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while pulling: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to delete a local branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name to delete.
+	 */
+	public static void deleteLocalBranch(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				final List<Ref> branches = git.branchList().setListMode(ListMode.ALL).call();
+				branches.removeAll(git.branchList().setListMode(ListMode.REMOTE).call());
+
+				for (final Ref branch : branches) {
+					if (branch.getName().endsWith(branchName)) {
+						git.branchDelete().setBranchNames(branch.getName()).setForce(true).call();
+						break;
+					}
+				}
+
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while deleting local branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to get a local branch, return <code>null</code> if it does not exist.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name to search.
+	 * @return The branch found or <code>null</code>.
+	 */
+	public static Ref getLocalBranch(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				final List<Ref> branches = git.branchList().setListMode(ListMode.ALL).call();
+				branches.removeAll(git.branchList().setListMode(ListMode.REMOTE).call());
+
+				for (final Ref branch : branches) {
+					if (branch.getName().endsWith(branchName)) {
+						return branch;
+					}
+				}
+
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while deleting local branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to delete a remote branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name to delete.
+	 */
+	public static void deleteBranch(final Git git, final String branchName) {
+		if (null != git && !branchName.isEmpty()) {
+			try {
+				git.branchDelete().setBranchNames(branchName).setForce(true).call();
+
+				final RefSpec refSpec = new RefSpec().setSource(null).setDestination(branchName);
+				git.push().setRefSpecs(refSpec).setRemote(Constants.DEFAULT_REMOTE_NAME).call();
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while deleting branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+	}
+
+	/**
+	 * This allows to get the list of reviews branches (branches started with 'Review_'.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @return The list of reviews branches.
+	 */
+	public static List<Ref> getReviewBranches(final Git git) {
+		final List<Ref> reviewsBranches = new ArrayList<Ref>();
+		if (null != git) {
+			try {
+				final List<Ref> branches = git.branchList().setListMode(ListMode.REMOTE).call();
+
+				for (final Ref branch : branches) {
+					if (branch.getName().contains(GitConstants.CONTRIBUTION_BRANCH_PREFIX)) {
+						reviewsBranches.add(branch);
+					}
+				}
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while getting branches: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return reviewsBranches;
+	}
+
+	/**
+	 * This allows to get a branch depending to its name.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branchName
+	 *            The branch name to search.
+	 * @return The found branch or <code>null</code>.
+	 */
+	public static Ref getBranchForName(final Git git, final String branchName) {
+		if (null != git) {
+			try {
+				final List<Ref> branches = git.branchList().setListMode(ListMode.REMOTE).call();
+
+				for (final Ref branch : branches) {
+					if (branch.getName().endsWith(branchName)) {
+						return branch;
+					}
+				}
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while getting branches: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to get the current branch.
+	 * 
+	 * @param git
+	 *            The git;
+	 * @return The current branch or <code>null</code> if any problem.
+	 */
+	public static Ref getCurrentBranch(final Git git) {
+		if (null != git) {
+			try {
+				final String branchName = git.getRepository().getFullBranch();
+				return getLocalBranch(git, branchName);
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error while getting current branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to determinate if the current branch is up-do_date with the remote master.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @return <code>true</code> if the current branch is up-do-date, <code>false</code> otherwise.
+	 */
+	public static boolean isCurrentBranchIsUpToDate(final Git git) {
+		if (null != git) {
+			try {
+				final String branchName = git.getRepository().getFullBranch();
+				final Ref currentBranch = getLocalBranch(git, branchName);
+				final Ref remoteBranch = getBranchForName(git, getBranchShortName(branchName));
+				if (null != currentBranch && null != remoteBranch) {
+					final RevCommit lastCommitOnLocal = getLastCommitOfBranch(git, currentBranch);
+					final RevCommit lastCommitOnRemote = getLastCommitOfBranch(git, remoteBranch);
+					return null != lastCommitOnLocal && null != lastCommitOnRemote && lastCommitOnLocal.getId().getName().equals(lastCommitOnRemote.getId().getName());
+				}
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error while getting current branch: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * This allows to merge a branch into master.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param masterBranchName
+	 *            The master branch (can be null or empty).
+	 * @param branch
+	 *            The branch.
+	 */
+	public static void mergeBranch(final Git git, final String masterBranchName, final Ref branch) {
+		if (null != git && null != branch) {
+			try {
+				String masterName = null == masterBranchName || masterBranchName.isEmpty() ? Constants.MASTER : masterBranchName;
+
+				// Checkout the master branch
+				final CheckoutCommand checkoutCommand = (CheckoutCommand) git.checkout();
+				checkoutCommand.setName(masterName).setCreateBranch(false).call();
+
+				// Create the merge command
+				final MergeCommand mergeCommand = git.merge();
+				mergeCommand.include(branch);
+				MergeResult res = mergeCommand.call();
+
+				if (res.getMergeStatus().equals(MergeResult.MergeStatus.CONFLICTING)) {
+					throw new Exception("Cannot merge the branch due to conflict status"); //$NON-NLS-1$
+				}
+			} catch (GitAPIException e) {
+				Activator.getLogHelper().error("Error while merging branch: Unknow error", e); //$NON-NLS-1$
+			} catch (Exception e) {
+				Activator.getLogHelper().error(e);
+			}
+		}
+	}
+
+	/**
+	 * Get the list commit of a branch.
+	 * 
+	 * @param git
+	 *            The git.
+	 * @param branch
+	 *            The branch.
+	 * @return The last commit of the branch or <code>null</code>.
+	 */
+	public static RevCommit getLastCommitOfBranch(final Git git, final Ref branch) {
+		if (null != git && null != branch) {
+			try {
+				final RevWalk revWalk = new RevWalk(git.getRepository());
+				final RevCommit lastCommit = revWalk.parseCommit(branch.getObjectId());
+				revWalk.close();
+				return lastCommit;
+			} catch (MissingObjectException e) {
+				e.printStackTrace();
+			} catch (IncorrectObjectTypeException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				Activator.getLogHelper().error("Error while getting last commit: Unknow error", e); //$NON-NLS-1$
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * This allows to get the short name (removing refs/heads or refs/remotes/origin) of a branch.
+	 * 
+	 * @param branch
+	 *            The branch.
+	 * @return The short name.
+	 */
+	public static String getBranchShortName(final Ref branch) {
+		return getBranchShortName(branch.getName());
+	}
+
+	/**
+	 * This allows to get the short name (removing refs/heads or refs/remotes/origin) of a branch.
+	 * 
+	 * @param branchName
+	 *            The branch name.
+	 * @return The short name.
+	 */
+	public static String getBranchShortName(final String branchName) {
+		if (branchName.contains(Constants.R_REMOTES)) {
+			return branchName.substring(branchName.indexOf(Constants.R_REMOTES) + Constants.R_REMOTES.length() + Constants.DEFAULT_REMOTE_NAME.length() + 1);
+		} else if (branchName.contains(Constants.R_HEADS)) {
+			return branchName.substring(branchName.indexOf(Constants.R_HEADS) + Constants.R_HEADS.length());
+		}
+		return branchName;
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/PapyrusFileUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/PapyrusFileUtils.java
new file mode 100644
index 0000000..2728bdd
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.git/src/org/eclipse/papyrus/gitlight/git/utils/PapyrusFileUtils.java
@@ -0,0 +1,350 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.git.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.papyrus.gitlight.git.Activator;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.onefile.model.IPapyrusFile;
+import org.eclipse.papyrus.infra.widgets.util.FileUtil;
+
+/**
+ * The file utils methods needed.
+ */
+public class PapyrusFileUtils {
+
+	/**
+	 * This allows to copy file by streams (with source as URL).
+	 * 
+	 * @param source
+	 *            The source path.
+	 * @param dest
+	 *            The destination path.
+	 * @throws IOException
+	 *             The possible Input output exception.
+	 */
+	public static void copyFileWithURL(final String source, final String dest) throws IOException {
+		final File destFile = FileUtil.getFile(dest);
+		InputStream inputStream = null;
+		OutputStream outputStream = null;
+		try {
+			final URL url = new URL(source);
+			inputStream = url.openConnection().getInputStream();
+			outputStream = new FileOutputStream(destFile);
+			byte[] buffer = new byte[1024];
+			int length;
+			while ((length = inputStream.read(buffer)) > 0) {
+				outputStream.write(buffer, 0, length);
+			}
+		} finally {
+			inputStream.close();
+			outputStream.close();
+		}
+	}
+
+	/**
+	 * This allows to copy file by streams.
+	 * 
+	 * @param source
+	 *            The source path.
+	 * @param dest
+	 *            The destination path.
+	 * @throws IOException
+	 *             The possible Input output exception.
+	 */
+	public static void copyFile(final String source, final String dest) throws IOException {
+		final File destFile = FileUtil.getFile(dest);
+		InputStream inputStream = null;
+		OutputStream outputStream = null;
+		try {
+			final File srcFile = FileUtil.getFile(source);
+			inputStream = new FileInputStream(srcFile);
+			outputStream = new FileOutputStream(destFile);
+			byte[] buffer = new byte[1024];
+			int length;
+			while ((length = inputStream.read(buffer)) > 0) {
+				outputStream.write(buffer, 0, length);
+			}
+		} finally {
+			inputStream.close();
+			outputStream.close();
+		}
+	}
+
+	/**
+	 * This allows to create the folder if needed.
+	 * 
+	 * @param folderLocation
+	 *            The folder location.
+	 */
+	public static void copyFolder(final String source, final String dest) {
+		final File srcFolder = getFolder(source);
+		final File destFolder = getFolder(dest);
+		if (srcFolder.exists()) {
+			if (!destFolder.exists()) {
+				destFolder.mkdir();
+			}
+			// Copy sub folders and files
+			for (final File subFile : srcFolder.listFiles()) {
+				if (subFile.isDirectory()) {
+					copyFolder(subFile.getAbsolutePath(), dest + "/" + subFile.getName()); //$NON-NLS-1$
+				} else {
+					try {
+						copyFile(subFile.getAbsolutePath(), dest + "/" + subFile.getName()); //$NON-NLS-1$
+					} catch (IOException e) {
+						Activator.getLogHelper().error(e);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Returns the Java File from the given location.
+	 * The location may be either absolute (From the FileSystem) or relative to the workspace root.
+	 *
+	 * @param location
+	 *            The location of the folder.
+	 * @return The file
+	 */
+	public static File getFolder(String location) {
+		final IContainer iFolder = getIContainer(location);
+		if (iFolder == null || !iFolder.exists()) {
+			return new File(location);
+		}
+
+		return new File(iFolder.getLocationURI());
+	}
+
+	/**
+	 * Returns the IFolder (Workspace folder) from the given location.
+	 * The location may be either absolute (From the FileSystem) or relative to the workspace root.
+	 *
+	 * @param location
+	 *            The location of the folder.
+	 * @return The container.
+	 */
+	public static IContainer getIContainer(String location) {
+		// Search the file in the workspace
+		final IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
+		final IPath path = new Path(location);
+		IContainer currentFolder = null;
+		try {
+			currentFolder = workspace.getFolder(path);
+		} catch (IllegalArgumentException ex) {
+			// Ignore
+		}
+
+		// Then search it on the disk
+		if (currentFolder == null || !currentFolder.exists()) {
+			currentFolder = (IContainer) workspace.getContainerForLocation(path);
+		}
+
+		return currentFolder;
+	}
+
+	/**
+	 * This allows to get the input stream corresponding to a file.
+	 * 
+	 * @param urlString
+	 *            The url corresponding to the string.
+	 * @return The input stream corresponding to the url.
+	 */
+	public static InputStream getInputStream(final String urlString) {
+		String realURL = urlString.replace("\\\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+		realURL = urlString.replace("\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		InputStream inputStream = null;
+
+		if (realURL.startsWith("platform:/resource/")) { //$NON-NLS-1$
+			try {
+				URL url = new URL(realURL);
+				inputStream = url.openConnection().getInputStream();
+			} catch (MalformedURLException e) {
+				Activator.getLogHelper().error("The link of the file '" + urlString + "' is not correct", e); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (IOException e) {
+				Activator.getLogHelper().error(e);
+			}
+		} else {
+			try {
+				inputStream = new FileInputStream(realURL);
+			} catch (FileNotFoundException e) {
+				Activator.getLogHelper().error("The link of the file '" + urlString + "' is not correct", e); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return inputStream;
+	}
+
+	/**
+	 * This allows to get the output stream corresponding to a file.
+	 * 
+	 * @param urlString
+	 *            The url corresponding to the string.
+	 * @return The output stream corresponding to the url.
+	 */
+	public static OutputStream getOutputStream(final String urlString) {
+		String realURL = urlString.replace("\\\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+		realURL = urlString.replace("\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+
+		OutputStream outputStream = null;
+
+		if (realURL.startsWith("platform:/resource/")) { //$NON-NLS-1$
+			try {
+				URL url = new URL(realURL);
+				outputStream = url.openConnection().getOutputStream();
+			} catch (MalformedURLException e) {
+				Activator.getLogHelper().error("The link of the file '" + urlString + "' is not correct", e); //$NON-NLS-1$ //$NON-NLS-2$
+			} catch (IOException e) {
+				Activator.getLogHelper().error(e);
+			}
+		} else {
+			try {
+				outputStream = new FileOutputStream(realURL);
+			} catch (FileNotFoundException e) {
+				Activator.getLogHelper().error("The link of the file '" + urlString + "' is not correct", e); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		return outputStream;
+	}
+
+	/**
+	 * This allows to refresh a project where a file (specified by its file name) is available.
+	 * 
+	 * @param fileName
+	 *            The file name of file which is in the project to refresh or <code>null</code> to refresh all projects.
+	 */
+	public static void refreshProject(final String fileName) {
+		try {
+			for (final IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
+				if (null == fileName || fileName.isEmpty() || fileName.contains(project.getFullPath().toOSString())) {
+					project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
+				}
+			}
+		} catch (CoreException e) {
+			Activator.getLogHelper().error(e);
+		}
+	}
+
+	/**
+	 * This allows to refresh all projects of workspace.
+	 */
+	public static void refreshProjects() {
+		refreshProject(null);
+	}
+
+	/**
+	 * This allows to get the corresponding file of the parameter (if this is possible).
+	 * 
+	 * @param selectedObject
+	 *            The initial selected object.
+	 * @return The file or <code>null</code>.
+	 */
+	public static IFile getFile(final Object selectedObject) {
+		IFile selectedFile = null;
+		if (selectedObject != null) {
+			if (selectedObject instanceof IPapyrusFile) {
+				for (IResource resource : ((IPapyrusFile) selectedObject).getAssociatedResources()) {
+					if ((resource instanceof IFile) && (isUMLFile((IFile) resource))) {
+						selectedFile = (IFile) resource;
+						break;
+					} // else continue
+				}
+			} else if (selectedObject instanceof EObject) {
+				EObject eobject = (EObject) selectedObject;
+				selectedFile = WorkspaceSynchronizer.getFile(eobject.eResource());
+			} else if (selectedObject instanceof IAdaptable) {
+				selectedFile = (IFile) ((IAdaptable) selectedObject).getAdapter(IFile.class); // Can be null
+				if (selectedFile == null) {
+					EObject eobject = (EObject) ((IAdaptable) selectedObject).getAdapter(EObject.class);
+					if (eobject != null) {
+						selectedFile = WorkspaceSynchronizer.getFile(eobject.eResource());
+					}
+				}
+			} else if (selectedObject instanceof IFile) {
+				selectedFile = (IFile) selectedObject;
+			} else {
+				// No valid selection
+			}
+
+		} else {
+			// No valid selection
+		}
+
+		return selectedFile;
+	}
+
+	/**
+	 * Check if this is an UML file.
+	 * 
+	 * @param file
+	 *            The file to check.
+	 * @return <code>true</code> if this is an UML file, <code>false</code> otherwise.
+	 */
+	private static boolean isUMLFile(final IFile file) {
+		return "uml".equals(file.getFileExtension()); //$NON-NLS-1$
+	}
+
+	/**
+	 * This allows to get the root model for a file.
+	 * 
+	 * @param file
+	 *            The file.
+	 * @return The root content of the file.
+	 */
+	public static EObject getRootModel(final IFile file) {
+		URI modelURI = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
+		if (!"uml".equals(modelURI.fileExtension())) { //$NON-NLS-1$
+			modelURI = modelURI.trimFileExtension().appendFileExtension("uml"); //$NON-NLS-1$
+		}
+		return getRootModel(modelURI);
+	}
+
+	/**
+	 * This allows to get the root model for an URI.
+	 * 
+	 * @param modelURI
+	 *            The model URI.
+	 * @return The root content of the file.
+	 */
+	public static EObject getRootModel(final URI modelURI) {
+		final ModelSet modelSet = new ModelSet();
+		final Resource resource = modelSet.getResource(modelURI, true);
+		return resource.getContents().get(0);
+	}
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.classpath
new file mode 100644
index 0000000..858bac4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.project
new file mode 100644
index 0000000..1eeca73
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.review.profile.edit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..beadb2a
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.review.profile.edit;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.review.profile.edit
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.papyrus.gitlight.reviewprofile.provider.ReviewprofileEditPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.papyrus.gitlight.reviewprofile.provider
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.papyrus.gitlight.review.profile;bundle-version="[0.7.0,1.0.0)",
+ org.eclipse.emf.edit,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.ecore.edit,
+ org.eclipse.uml2.types,
+ org.eclipse.uml2.uml,
+ org.eclipse.uml2.uml.edit,
+ org.eclipse.uml2.common.edit
+Bundle-ActivationPolicy: lazy
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/build.properties
new file mode 100644
index 0000000..3cd130f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/build.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html
+jars.compile.order = .
+source.. = src-gen/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/icons/full/obj16/ReviewComment.gif b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/icons/full/obj16/ReviewComment.gif
new file mode 100644
index 0000000..e91b8d1
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/icons/full/obj16/ReviewComment.gif
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.properties
new file mode 100644
index 0000000..fe76f16
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.properties
@@ -0,0 +1,38 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Review Profile Edit Support
+providerName = Eclipse Modeling Project
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_UI_CreateChild_text3 = {1}
+_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
+_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
+_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
+
+_UI_PropertyDescriptor_description = The {0} of the {1}
+
+_UI_ReviewComment_type = Review Comment
+_UI_Unknown_type = Object
+
+_UI_Unknown_datatype= Value
+
+_UI_ReviewComment_base_Comment_feature = Base Comment
+_UI_ReviewComment_severity_feature = Severity
+_UI_Unknown_feature = Unspecified
+
+_UI_ReviewSeverity_INFO_literal = INFO
+_UI_ReviewSeverity_WARNING_literal = WARNING
+_UI_ReviewSeverity_ERROR_literal = ERROR
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.xml
new file mode 100644
index 0000000..73ed5a3
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/plugin.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+      <!-- @generated reviewprofile -->
+      <factory
+            uri="http://www.eclipse.org/papyrus/reviewprofile/0.1.0"
+            class="org.eclipse.papyrus.gitlight.reviewprofile.provider.ReviewProfileItemProviderAdapterFactory"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource"/>
+   </extension>
+
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/pom.xml
new file mode 100644
index 0000000..f570c3c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.review.profile.edit</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewCommentItemProvider.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewCommentItemProvider.java
new file mode 100644
index 0000000..cd5ecfb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewCommentItemProvider.java
@@ -0,0 +1,194 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ReviewCommentItemProvider 
+	extends ItemProviderAdapter
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewCommentItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addBase_CommentPropertyDescriptor(object);
+			addSeverityPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Base Comment feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBase_CommentPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_ReviewComment_base_Comment_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_ReviewComment_base_Comment_feature", "_UI_ReviewComment_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 ReviewProfilePackage.Literals.REVIEW_COMMENT__BASE_COMMENT,
+				 true,
+				 false,
+				 true,
+				 null,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Severity feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addSeverityPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_ReviewComment_severity_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_ReviewComment_severity_feature", "_UI_ReviewComment_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 ReviewProfilePackage.Literals.REVIEW_COMMENT__SEVERITY,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This returns ReviewComment.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReviewComment")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		ReviewSeverity labelValue = ((ReviewComment)object).getSeverity();
+		String label = labelValue == null ? null : labelValue.toString();
+		return label == null || label.length() == 0 ?
+			getString("_UI_ReviewComment_type") : //$NON-NLS-1$
+			getString("_UI_ReviewComment_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(ReviewComment.class)) {
+			case ReviewProfilePackage.REVIEW_COMMENT__SEVERITY:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+	/**
+	 * Return the resource locator for this item provider's resources.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getResourceLocator() {
+		return ReviewprofileEditPlugin.INSTANCE;
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewProfileItemProviderAdapterFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewProfileItemProviderAdapterFactory.java
new file mode 100644
index 0000000..00d020c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewProfileItemProviderAdapterFactory.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.provider;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.util.ReviewProfileAdapterFactory;
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support Viewers.
+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
+ * The adapters also support Eclipse property sheets.
+ * Note that most of the adapters are shared among multiple instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ReviewProfileItemProviderAdapterFactory extends ReviewProfileAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
+	/**
+	 * This keeps track of the root adapter factory that delegates to this adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ComposedAdapterFactory parentAdapterFactory;
+
+	/**
+	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+	/**
+	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Collection<Object> supportedTypes = new ArrayList<Object>();
+
+	/**
+	 * This constructs an instance.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewProfileItemProviderAdapterFactory() {
+		supportedTypes.add(IEditingDomainItemProvider.class);
+		supportedTypes.add(IStructuredItemContentProvider.class);
+		supportedTypes.add(ITreeItemContentProvider.class);
+		supportedTypes.add(IItemLabelProvider.class);
+		supportedTypes.add(IItemPropertySource.class);
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ReviewCommentItemProvider reviewCommentItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createReviewCommentAdapter() {
+		if (reviewCommentItemProvider == null) {
+			reviewCommentItemProvider = new ReviewCommentItemProvider(this);
+		}
+
+		return reviewCommentItemProvider;
+	}
+
+	/**
+	 * This returns the root adapter factory that contains this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ComposeableAdapterFactory getRootAdapterFactory() {
+		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+	}
+
+	/**
+	 * This sets the composed adapter factory that contains this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
+		this.parentAdapterFactory = parentAdapterFactory;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object type) {
+		return supportedTypes.contains(type) || super.isFactoryForType(type);
+	}
+
+	/**
+	 * This implementation substitutes the factory itself as the key for the adapter.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter adapt(Notifier notifier, Object type) {
+		return super.adapt(notifier, this);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object adapt(Object object, Object type) {
+		if (isFactoryForType(type)) {
+			Object adapter = super.adapt(object, type);
+			if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter))) {
+				return adapter;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * This adds a listener.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void addListener(INotifyChangedListener notifyChangedListener) {
+		changeNotifier.addListener(notifyChangedListener);
+	}
+
+	/**
+	 * This removes a listener.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void removeListener(INotifyChangedListener notifyChangedListener) {
+		changeNotifier.removeListener(notifyChangedListener);
+	}
+
+	/**
+	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void fireNotifyChanged(Notification notification) {
+		changeNotifier.fireNotifyChanged(notification);
+
+		if (parentAdapterFactory != null) {
+			parentAdapterFactory.fireNotifyChanged(notification);
+		}
+	}
+
+	/**
+	 * This disposes all of the item providers created by this factory. 
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void dispose() {
+		if (reviewCommentItemProvider != null) reviewCommentItemProvider.dispose();
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewprofileEditPlugin.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewprofileEditPlugin.java
new file mode 100644
index 0000000..53baaee
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/provider/ReviewprofileEditPlugin.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.provider;
+
+import org.eclipse.emf.common.EMFPlugin;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.provider.EcoreEditPlugin;
+
+import org.eclipse.uml2.uml.edit.UMLEditPlugin;
+
+/**
+ * This is the central singleton for the Reviewprofile edit plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ReviewprofileEditPlugin extends EMFPlugin {
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final ReviewprofileEditPlugin INSTANCE = new ReviewprofileEditPlugin();
+
+	/**
+	 * Keep track of the singleton.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static Implementation plugin;
+
+	/**
+	 * Create the instance.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewprofileEditPlugin() {
+		super
+		  (new ResourceLocator [] {
+		     EcoreEditPlugin.INSTANCE,
+		     UMLEditPlugin.INSTANCE,
+		   });
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+	@Override
+	public ResourceLocator getPluginResourceLocator() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the singleton instance.
+	 * @generated
+	 */
+	public static Implementation getPlugin() {
+		return plugin;
+	}
+
+	/**
+	 * The actual implementation of the Eclipse <b>Plugin</b>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static class Implementation extends EclipsePlugin {
+		/**
+		 * Creates an instance.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public Implementation() {
+			super();
+
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.classpath
new file mode 100644
index 0000000..f0c5549
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src-gen"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.project
new file mode 100644
index 0000000..d72aee0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.review.profile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6fede16
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.review.profile;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.review.profile
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.papyrus.gitlight.review.profile.Activator$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.papyrus.gitlight.review.profile,
+ org.eclipse.papyrus.gitlight.review.profile.utils,
+ org.eclipse.papyrus.gitlight.reviewprofile,
+ org.eclipse.papyrus.gitlight.reviewprofile.impl,
+ org.eclipse.papyrus.gitlight.reviewprofile.util
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.osgi,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore,
+ org.eclipse.uml2.types,
+ org.eclipse.papyrus.infra.core.log,
+ org.eclipse.uml2.uml
+
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/build.properties
new file mode 100644
index 0000000..539c156
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/build.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               models/,\
+               about.html
+jars.compile.order = .
+source.. = src/,\
+           src-gen/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.di b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.di
new file mode 100644
index 0000000..247ed5e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<architecture:ArchitectureDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:architecture="http://www.eclipse.org/papyrus/infra/core/architecture" contextId="org.eclipse.papyrus.uml.architecture.Profile"/>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.ecore b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.ecore
new file mode 100644
index 0000000..db0d6d5
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.ecore
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="reviewprofile" nsURI="http://www.eclipse.org/papyrus/reviewprofile/0.1.0"
+    nsPrefix="reviewprofile">
+  <eClassifiers xsi:type="ecore:EClass" name="ReviewComment">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="base_Comment" ordered="false"
+        lowerBound="1" eType="ecore:EClass ../../org.eclipse.uml2.uml/model/UML.ecore#//Comment"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="severity" ordered="false"
+        lowerBound="1" eType="#//ReviewSeverity" defaultValueLiteral="INFO"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="ReviewSeverity">
+    <eLiterals name="INFO"/>
+    <eLiterals name="WARNING" value="1"/>
+    <eLiterals name="ERROR" value="2"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.genmodel b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.genmodel
new file mode 100644
index 0000000..4b42978
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.genmodel
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/uml2/2.2.0/GenModel"
+    copyrightText="Copyright (c) 2019 CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;https://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA;  CEA LIST - Initial API and implementation"
+    modelDirectory="/org.eclipse.papyrus.gitlight.review.profile/src-gen" editDirectory="/org.eclipse.papyrus.gitlight.review.profile.edit/src-gen"
+    editorDirectory="/org.eclipse.papyrus.gitlight.review.profile.editor/src-gen"
+    modelPluginID="org.eclipse.papyrus.gitlight.review.profile" modelName="Reviewprofile"
+    nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    importerID="org.eclipse.uml2.uml.ecore.importer" complianceLevel="8.0" copyrightFields="false"
+    usedGenPackages="../../org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore ../../org.eclipse.uml2.types/model/Types.genmodel#//types ../../org.eclipse.uml2.uml/model/UML.genmodel#//uml"
+    operationReflection="true" importOrganizing="true">
+  <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
+    <details key="OPPOSITE_ROLE_NAMES" value="IGNORE"/>
+    <details key="DUPLICATE_FEATURES" value="DISCARD"/>
+    <details key="ANNOTATION_DETAILS" value="PROCESS"/>
+    <details key="PROPERTY_DEFAULT_EXPRESSIONS" value="IGNORE"/>
+    <details key="DUPLICATE_FEATURE_INHERITANCE" value="DISCARD"/>
+    <details key="COMMENTS" value="PROCESS"/>
+    <details key="DERIVED_FEATURES" value="PROCESS"/>
+    <details key="SUPER_CLASS_ORDER" value="PROCESS"/>
+    <details key="DUPLICATE_OPERATION_INHERITANCE" value="DISCARD"/>
+    <details key="REDEFINING_OPERATIONS" value="REPORT"/>
+    <details key="INVARIANT_CONSTRAINTS" value="PROCESS"/>
+    <details key="UNION_PROPERTIES" value="REPORT"/>
+    <details key="DUPLICATE_OPERATIONS" value="DISCARD"/>
+    <details key="NON_API_INVARIANTS" value="IGNORE"/>
+    <details key="CAMEL_CASE_NAMES" value="IGNORE"/>
+    <details key="SUBSETTING_PROPERTIES" value="REPORT"/>
+    <details key="OPERATION_BODIES" value="IGNORE"/>
+    <details key="ECORE_TAGGED_VALUES" value="PROCESS"/>
+    <details key="UNTYPED_PROPERTIES" value="REPORT"/>
+    <details key="REDEFINING_PROPERTIES" value="REPORT"/>
+    <details key="INVOCATION_DELEGATES" value="IGNORE"/>
+    <details key="VALIDATION_DELEGATES" value="IGNORE"/>
+  </genAnnotations>
+  <foreignModel>reviewprofile.uml</foreignModel>
+  <genPackages xsi:type="genmodel:GenPackage" prefix="ReviewProfile" basePackage="org.eclipse.papyrus.gitlight"
+      disposableProviderFactory="true" ecorePackage="reviewprofile.ecore#/">
+    <genEnums xsi:type="genmodel:GenEnum" typeSafeEnumCompatible="false" ecoreEnum="reviewprofile.ecore#//ReviewSeverity">
+      <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="reviewprofile.ecore#//ReviewSeverity/INFO"/>
+      <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="reviewprofile.ecore#//ReviewSeverity/WARNING"/>
+      <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="reviewprofile.ecore#//ReviewSeverity/ERROR"/>
+    </genEnums>
+    <genClasses xsi:type="genmodel:GenClass" ecoreClass="reviewprofile.ecore#//ReviewComment">
+      <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+          propertySortChoices="true" ecoreFeature="ecore:EReference reviewprofile.ecore#//ReviewComment/base_Comment"/>
+      <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute reviewprofile.ecore#//ReviewComment/severity"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.notation b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.notation
new file mode 100644
index 0000000..3f9dfb4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.notation
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/gmfdiag/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_FcENsBQwEemy-MyDPgTDag" type="PapyrusUMLProfileDiagram" name="Profile Diagram" measurementUnit="Pixel">
+  <children xmi:type="notation:Shape" xmi:id="_J9ZD0RQwEemy-MyDPgTDag" type="Class_MetaclassShape">
+    <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_J9i00hQwEemy-MyDPgTDag" source="Stereotype_Annotation">
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_J9i00xQwEemy-MyDPgTDag" key="StereotypeWithQualifiedNameList" value=""/>
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_J9i01BQwEemy-MyDPgTDag" key="StereotypeList" value="StandardProfile::Metaclass"/>
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_J9i01RQwEemy-MyDPgTDag" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_J9i01hQwEemy-MyDPgTDag" key="PropStereoDisplay" value=""/>
+      <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_J9i01xQwEemy-MyDPgTDag" key="StereotypePropertyLocation" value="Compartment"/>
+    </eAnnotations>
+    <children xmi:type="notation:DecorationNode" xmi:id="_J9i00BQwEemy-MyDPgTDag" type="Class_MetaclassNameLabel"/>
+    <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Comment"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J9i00RQwEemy-MyDPgTDag" x="260" y="100" width="121" height="61"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_J-vHoxQwEemy-MyDPgTDag" type="StereotypeComment">
+    <styles xmi:type="notation:TitleStyle" xmi:id="_J-vHpBQwEemy-MyDPgTDag"/>
+    <styles xmi:type="notation:EObjectValueStyle" xmi:id="_J-vHphQwEemy-MyDPgTDag" name="BASE_ELEMENT">
+      <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Comment"/>
+    </styles>
+    <element xsi:nil="true"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_J-vHpRQwEemy-MyDPgTDag" x="460" y="100"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_LjllkRQwEemy-MyDPgTDag" type="Stereotype_Shape">
+    <children xmi:type="notation:DecorationNode" xmi:id="_LjllkxQwEemy-MyDPgTDag" type="Stereotype_NameLabel"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_LjlllBQwEemy-MyDPgTDag" type="Stereotype_AttributeCompartment">
+      <children xmi:type="notation:Shape" xmi:id="_OnNuoBQwEemy-MyDPgTDag" type="Property_ClassAttributeLabel">
+        <element xmi:type="uml:Property" href="reviewprofile.uml#_OnEksBQwEemy-MyDPgTDag"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_OnNuoRQwEemy-MyDPgTDag"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_LjlllRQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_LjlllhQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_LjlllxQwEemy-MyDPgTDag"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LjllmBQwEemy-MyDPgTDag"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_LjllmRQwEemy-MyDPgTDag" type="Stereotype_OperationCompartment">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_LjllmhQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_LjllmxQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_LjllnBQwEemy-MyDPgTDag"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LjllnRQwEemy-MyDPgTDag"/>
+    </children>
+    <element xmi:type="uml:Stereotype" href="reviewprofile.uml#_LjllkBQwEemy-MyDPgTDag"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LjllkhQwEemy-MyDPgTDag" x="240" y="240" width="161" height="141"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_U4NyoBQwEemy-MyDPgTDag" type="Enumeration_Shape">
+    <children xmi:type="notation:DecorationNode" xmi:id="_U4NyohQwEemy-MyDPgTDag" type="Enumeration_NameLabel"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_U4NyoxQwEemy-MyDPgTDag" type="Enumeration_LiteralCompartment">
+      <children xmi:type="notation:Shape" xmi:id="_X4Y_EBQwEemy-MyDPgTDag" type="EnumerationLiteral_LiteralLabel">
+        <element xmi:type="uml:EnumerationLiteral" href="reviewprofile.uml#_X4POEBQwEemy-MyDPgTDag"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_X4Y_ERQwEemy-MyDPgTDag"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_YHGwgRQwEemy-MyDPgTDag" type="EnumerationLiteral_LiteralLabel">
+        <element xmi:type="uml:EnumerationLiteral" href="reviewprofile.uml#_YHGwgBQwEemy-MyDPgTDag"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_YHGwghQwEemy-MyDPgTDag"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_YZoq8BQwEemy-MyDPgTDag" type="EnumerationLiteral_LiteralLabel">
+        <element xmi:type="uml:EnumerationLiteral" href="reviewprofile.uml#_YZfhABQwEemy-MyDPgTDag"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_YZoq8RQwEemy-MyDPgTDag"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_U4NypBQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_U4NypRQwEemy-MyDPgTDag"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_U4NyphQwEemy-MyDPgTDag"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U4NypxQwEemy-MyDPgTDag"/>
+    </children>
+    <element xmi:type="uml:Enumeration" href="reviewprofile.uml#_U4EBoBQwEemy-MyDPgTDag"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U4NyoRQwEemy-MyDPgTDag" x="500" y="240" width="141" height="121"/>
+  </children>
+  <styles xmi:type="notation:StringValueStyle" xmi:id="_FcENsRQwEemy-MyDPgTDag" name="diagram_compatibility_version" stringValue="1.4.0"/>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_FcENshQwEemy-MyDPgTDag"/>
+  <styles xmi:type="style:PapyrusDiagramStyle" xmi:id="_FcENsxQwEemy-MyDPgTDag" diagramKindId="org.eclipse.papyrus.uml.diagram.profile">
+    <owner xmi:type="uml:Profile" href="reviewprofile.uml#_FXDx4BQwEemy-MyDPgTDag"/>
+  </styles>
+  <element xmi:type="uml:Profile" href="reviewprofile.uml#_FXDx4BQwEemy-MyDPgTDag"/>
+  <edges xmi:type="notation:Connector" xmi:id="_J-44oBQwEemy-MyDPgTDag" type="StereotypeCommentLink" source="_J9ZD0RQwEemy-MyDPgTDag" target="_J-vHoxQwEemy-MyDPgTDag">
+    <styles xmi:type="notation:FontStyle" xmi:id="_J-44oRQwEemy-MyDPgTDag"/>
+    <styles xmi:type="notation:EObjectValueStyle" xmi:id="_J-44pRQwEemy-MyDPgTDag" name="BASE_ELEMENT">
+      <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Comment"/>
+    </styles>
+    <element xsi:nil="true"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_J-44ohQwEemy-MyDPgTDag" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_J-44oxQwEemy-MyDPgTDag"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_J-44pBQwEemy-MyDPgTDag"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_OHOnABQwEemy-MyDPgTDag" type="Extension_Edge" source="_LjllkRQwEemy-MyDPgTDag" target="_J9ZD0RQwEemy-MyDPgTDag">
+    <styles xmi:type="notation:FontStyle" xmi:id="_OHOnARQwEemy-MyDPgTDag"/>
+    <element xmi:type="uml:Extension" href="reviewprofile.uml#_OG7sEBQwEemy-MyDPgTDag"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_OHOnAhQwEemy-MyDPgTDag" points="[320, 240, -643984, -643984]$[320, 161, -643984, -643984]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OH-N4BQwEemy-MyDPgTDag" id="(0.4968944099378882,0.0)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OH-N4RQwEemy-MyDPgTDag" id="(0.49586776859504134,1.0)"/>
+  </edges>
+</notation:Diagram>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.uml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.uml
new file mode 100644
index 0000000..c7f1b57
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/models/reviewprofile.uml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+  <uml:Profile xmi:id="ReviewProfile" name="ReviewProfile" URI="http://www.eclipse.org/papyrus/reviewprofile/0.1.0" metaclassReference="_J9ZD0BQwEemy-MyDPgTDag">
+    <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_s-LtERQwEemy-MyDPgTDag" source="http://www.eclipse.org/uml2/2.0.0/UML">
+      <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_w5MBADUUEemud6WLE6ZbNQ" source="PapyrusVersion">
+        <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_w5MoEDUUEemud6WLE6ZbNQ" key="Version" value="0.0.0"/>
+        <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_w5MoETUUEemud6WLE6ZbNQ" key="Comment" value="&lt;undefined>"/>
+        <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_w5MoEjUUEemud6WLE6ZbNQ" key="Copyright" value=""/>
+        <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_w5MoEzUUEemud6WLE6ZbNQ" key="Date" value=""/>
+        <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_w5MoFDUUEemud6WLE6ZbNQ" key="Author" value="&lt;undefined>"/>
+      </eAnnotations>
+      <contents xmi:type="ecore:EPackage" xmi:id="_s-LtEhQwEemy-MyDPgTDag" name="reviewprofile" nsURI="http://www.eclipse.org/papyrus/reviewprofile/0.1.0" nsPrefix="reviewprofile">
+        <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_s-LtHxQwEemy-MyDPgTDag" source="PapyrusVersion">
+          <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_s-LtIBQwEemy-MyDPgTDag" key="Version" value="0.0.1"/>
+          <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_s-LtIRQwEemy-MyDPgTDag" key="Comment" value=""/>
+          <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_s-LtIhQwEemy-MyDPgTDag" key="Copyright" value=""/>
+          <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_s-LtIxQwEemy-MyDPgTDag" key="Date" value="2019-01-09"/>
+          <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_s-LtJBQwEemy-MyDPgTDag" key="Author" value=""/>
+        </eAnnotations>
+        <eClassifiers xmi:type="ecore:EClass" xmi:id="_s-LtExQwEemy-MyDPgTDag" name="ReviewComment">
+          <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_s-LtFBQwEemy-MyDPgTDag" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_LjllkBQwEemy-MyDPgTDag"/>
+          <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_s-LtFRQwEemy-MyDPgTDag" name="base_Comment" ordered="false" lowerBound="1">
+            <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Comment"/>
+          </eStructuralFeatures>
+          <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_s-LtFxQwEemy-MyDPgTDag" name="severity" ordered="false" lowerBound="1" eType="_s-LtGRQwEemy-MyDPgTDag" defaultValueLiteral="INFO"/>
+        </eClassifiers>
+        <eClassifiers xmi:type="ecore:EEnum" xmi:id="_s-LtGRQwEemy-MyDPgTDag" name="ReviewSeverity">
+          <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_s-LtGhQwEemy-MyDPgTDag" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_U4EBoBQwEemy-MyDPgTDag"/>
+          <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_s-LtGxQwEemy-MyDPgTDag" name="INFO"/>
+          <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_s-LtHBQwEemy-MyDPgTDag" name="WARNING" value="1"/>
+          <eLiterals xmi:type="ecore:EEnumLiteral" xmi:id="_s-LtHRQwEemy-MyDPgTDag" name="ERROR" value="2"/>
+        </eClassifiers>
+      </contents>
+    </eAnnotations>
+    <elementImport xmi:type="uml:ElementImport" xmi:id="_J9ZD0BQwEemy-MyDPgTDag" alias="Comment">
+      <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Comment"/>
+    </elementImport>
+    <packageImport xmi:type="uml:PackageImport" xmi:id="_FtQrYBQwEemy-MyDPgTDag">
+      <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+    </packageImport>
+    <packageImport xmi:type="uml:PackageImport" xmi:id="_FtQrYRQwEemy-MyDPgTDag">
+      <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+    </packageImport>
+    <packagedElement xmi:type="uml:Stereotype" xmi:id="_LjllkBQwEemy-MyDPgTDag" name="ReviewComment">
+      <ownedAttribute xmi:type="uml:Property" xmi:id="_OHE2ABQwEemy-MyDPgTDag" name="base_Comment" association="_OG7sEBQwEemy-MyDPgTDag">
+        <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Comment"/>
+      </ownedAttribute>
+      <ownedAttribute xmi:type="uml:Property" xmi:id="_OnEksBQwEemy-MyDPgTDag" name="severity" type="_U4EBoBQwEemy-MyDPgTDag">
+        <defaultValue xmi:type="uml:InstanceValue" xmi:id="_qVsA0BQwEemy-MyDPgTDag" name="INFO" instance="_X4POEBQwEemy-MyDPgTDag">
+          <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#EnumerationLiteral"/>
+        </defaultValue>
+      </ownedAttribute>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Extension" xmi:id="_OG7sEBQwEemy-MyDPgTDag" name="E_ReviewComment_Comment5" memberEnd="_OG7sERQwEemy-MyDPgTDag _OHE2ABQwEemy-MyDPgTDag">
+      <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_OG7sERQwEemy-MyDPgTDag" name="extension_ReviewComment" type="_LjllkBQwEemy-MyDPgTDag" aggregation="composite" association="_OG7sEBQwEemy-MyDPgTDag"/>
+    </packagedElement>
+    <packagedElement xmi:type="uml:Enumeration" xmi:id="_U4EBoBQwEemy-MyDPgTDag" name="ReviewSeverity">
+      <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_X4POEBQwEemy-MyDPgTDag" name="INFO"/>
+      <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_YHGwgBQwEemy-MyDPgTDag" name="WARNING"/>
+      <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_YZfhABQwEemy-MyDPgTDag" name="ERROR"/>
+    </packagedElement>
+    <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_74xboBS1Eemy-MyDPgTDag">
+      <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_74zQ0BS1Eemy-MyDPgTDag" source="http://www.eclipse.org/uml2/2.0.0/UML">
+        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+      </eAnnotations>
+      <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+    </profileApplication>
+  </uml:Profile>
+  <Ecore:EPackage xmi:id="_8WvKABS1Eemy-MyDPgTDag" base_Package="ReviewProfile" packageName="reviewprofile" nsPrefix="reviewprofile" nsURI="http://www.eclipse.org/papyrus/reviewprofile/0.1.0" basePackage="org.eclipse.papyrus.gitlight" prefix="ReviewProfile"/>
+</xmi:XMI>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.properties
new file mode 100644
index 0000000..6e70757
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Review Profile
+providerName = Eclipse Modeling Project
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.xml
new file mode 100644
index 0000000..091ad4b
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/plugin.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated reviewprofile -->
+      <package
+            uri="http://www.eclipse.org/papyrus/reviewprofile/0.1.0"
+            class="org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage"
+            genModel="models/reviewprofile.genmodel"/>
+   </extension>
+   <extension
+         point="org.eclipse.emf.ecore.uri_mapping">
+      <mapping
+            source="pathmap://REVIEWPROFILE/"
+            target="platform:/plugin/org.eclipse.papyrus.gitlight.review.profile/models/">
+      </mapping>
+   </extension>
+   
+   <extension point="org.eclipse.uml2.uml.generated_package">
+     <profile uri="http://www.eclipse.org/papyrus/reviewprofile/0.1.0"
+           location="pathmap://REVIEWPROFILE/reviewprofile.uml#ReviewProfile"/>
+  </extension>  
+
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/pom.xml
new file mode 100644
index 0000000..6c4e460
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.review.profile</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewComment.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewComment.java
new file mode 100644
index 0000000..4cfb1cb
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewComment.java
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.uml2.uml.Comment;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Review Comment</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getBase_Comment <em>Base Comment</em>}</li>
+ *   <li>{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getSeverity <em>Severity</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage#getReviewComment()
+ * @model
+ * @generated
+ */
+public interface ReviewComment extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Base Comment</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Base Comment</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Base Comment</em>' reference.
+	 * @see #setBase_Comment(Comment)
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage#getReviewComment_Base_Comment()
+	 * @model required="true" ordered="false"
+	 * @generated
+	 */
+	Comment getBase_Comment();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getBase_Comment <em>Base Comment</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Base Comment</em>' reference.
+	 * @see #getBase_Comment()
+	 * @generated
+	 */
+	void setBase_Comment(Comment value);
+
+	/**
+	 * Returns the value of the '<em><b>Severity</b></em>' attribute.
+	 * The default value is <code>"INFO"</code>.
+	 * The literals are from the enumeration {@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Severity</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Severity</em>' attribute.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity
+	 * @see #setSeverity(ReviewSeverity)
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage#getReviewComment_Severity()
+	 * @model default="INFO" required="true" ordered="false"
+	 * @generated
+	 */
+	ReviewSeverity getSeverity();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getSeverity <em>Severity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Severity</em>' attribute.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity
+	 * @see #getSeverity()
+	 * @generated
+	 */
+	void setSeverity(ReviewSeverity value);
+
+} // ReviewComment
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfileFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfileFactory.java
new file mode 100644
index 0000000..0abe319
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfileFactory.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage
+ * @generated
+ */
+public interface ReviewProfileFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ReviewProfileFactory eINSTANCE = org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfileFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Review Comment</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Review Comment</em>'.
+	 * @generated
+	 */
+	ReviewComment createReviewComment();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	ReviewProfilePackage getReviewProfilePackage();
+
+} //ReviewProfileFactory
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfilePackage.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfilePackage.java
new file mode 100644
index 0000000..484b83f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewProfilePackage.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfileFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ReviewProfilePackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "reviewprofile";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/papyrus/reviewprofile/0.1.0";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "reviewprofile";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	ReviewProfilePackage eINSTANCE = org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfilePackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl <em>Review Comment</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfilePackageImpl#getReviewComment()
+	 * @generated
+	 */
+	int REVIEW_COMMENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Base Comment</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REVIEW_COMMENT__BASE_COMMENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Severity</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REVIEW_COMMENT__SEVERITY = 1;
+
+	/**
+	 * The number of structural features of the '<em>Review Comment</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REVIEW_COMMENT_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Review Comment</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int REVIEW_COMMENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity <em>Review Severity</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfilePackageImpl#getReviewSeverity()
+	 * @generated
+	 */
+	int REVIEW_SEVERITY = 1;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment <em>Review Comment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Review Comment</em>'.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment
+	 * @generated
+	 */
+	EClass getReviewComment();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getBase_Comment <em>Base Comment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Base Comment</em>'.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getBase_Comment()
+	 * @see #getReviewComment()
+	 * @generated
+	 */
+	EReference getReviewComment_Base_Comment();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getSeverity <em>Severity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Severity</em>'.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment#getSeverity()
+	 * @see #getReviewComment()
+	 * @generated
+	 */
+	EAttribute getReviewComment_Severity();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity <em>Review Severity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Review Severity</em>'.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity
+	 * @generated
+	 */
+	EEnum getReviewSeverity();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	ReviewProfileFactory getReviewProfileFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl <em>Review Comment</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl
+		 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfilePackageImpl#getReviewComment()
+		 * @generated
+		 */
+		EClass REVIEW_COMMENT = eINSTANCE.getReviewComment();
+
+		/**
+		 * The meta object literal for the '<em><b>Base Comment</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference REVIEW_COMMENT__BASE_COMMENT = eINSTANCE.getReviewComment_Base_Comment();
+
+		/**
+		 * The meta object literal for the '<em><b>Severity</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute REVIEW_COMMENT__SEVERITY = eINSTANCE.getReviewComment_Severity();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity <em>Review Severity</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity
+		 * @see org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewProfilePackageImpl#getReviewSeverity()
+		 * @generated
+		 */
+		EEnum REVIEW_SEVERITY = eINSTANCE.getReviewSeverity();
+
+	}
+
+} //ReviewProfilePackage
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewSeverity.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewSeverity.java
new file mode 100644
index 0000000..fe7bb5d
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/ReviewSeverity.java
@@ -0,0 +1,255 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Review Severity</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage#getReviewSeverity()
+ * @model
+ * @generated
+ */
+public enum ReviewSeverity implements Enumerator {
+	/**
+	 * The '<em><b>INFO</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #INFO_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	INFO(0, "INFO", "INFO"),
+
+	/**
+	 * The '<em><b>WARNING</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #WARNING_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	WARNING(1, "WARNING", "WARNING"),
+
+	/**
+	 * The '<em><b>ERROR</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ERROR_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ERROR(2, "ERROR", "ERROR");
+
+	/**
+	 * The '<em><b>INFO</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>INFO</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #INFO
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int INFO_VALUE = 0;
+
+	/**
+	 * The '<em><b>WARNING</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>WARNING</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #WARNING
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int WARNING_VALUE = 1;
+
+	/**
+	 * The '<em><b>ERROR</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>ERROR</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #ERROR
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ERROR_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Review Severity</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final ReviewSeverity[] VALUES_ARRAY =
+		new ReviewSeverity[] {
+			INFO,
+			WARNING,
+			ERROR,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Review Severity</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<ReviewSeverity> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Review Severity</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param literal the literal.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ReviewSeverity get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ReviewSeverity result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Review Severity</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param name the name.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ReviewSeverity getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			ReviewSeverity result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Review Severity</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the integer value.
+	 * @return the matching enumerator or <code>null</code>.
+	 * @generated
+	 */
+	public static ReviewSeverity get(int value) {
+		switch (value) {
+			case INFO_VALUE: return INFO;
+			case WARNING_VALUE: return WARNING;
+			case ERROR_VALUE: return ERROR;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private ReviewSeverity(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //ReviewSeverity
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewCommentImpl.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewCommentImpl.java
new file mode 100644
index 0000000..ae8d907
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewCommentImpl.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity;
+
+import org.eclipse.uml2.uml.Comment;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Review Comment</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl#getBase_Comment <em>Base Comment</em>}</li>
+ *   <li>{@link org.eclipse.papyrus.gitlight.reviewprofile.impl.ReviewCommentImpl#getSeverity <em>Severity</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ReviewCommentImpl extends MinimalEObjectImpl.Container implements ReviewComment {
+	/**
+	 * The cached value of the '{@link #getBase_Comment() <em>Base Comment</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBase_Comment()
+	 * @generated
+	 * @ordered
+	 */
+	protected Comment base_Comment;
+
+	/**
+	 * The default value of the '{@link #getSeverity() <em>Severity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSeverity()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final ReviewSeverity SEVERITY_EDEFAULT = ReviewSeverity.INFO;
+
+	/**
+	 * The cached value of the '{@link #getSeverity() <em>Severity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSeverity()
+	 * @generated
+	 * @ordered
+	 */
+	protected ReviewSeverity severity = SEVERITY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ReviewCommentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ReviewProfilePackage.Literals.REVIEW_COMMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Comment getBase_Comment() {
+		if (base_Comment != null && base_Comment.eIsProxy()) {
+			InternalEObject oldBase_Comment = (InternalEObject)base_Comment;
+			base_Comment = (Comment)eResolveProxy(oldBase_Comment);
+			if (base_Comment != oldBase_Comment) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT, oldBase_Comment, base_Comment));
+			}
+		}
+		return base_Comment;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Comment basicGetBase_Comment() {
+		return base_Comment;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setBase_Comment(Comment newBase_Comment) {
+		Comment oldBase_Comment = base_Comment;
+		base_Comment = newBase_Comment;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT, oldBase_Comment, base_Comment));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ReviewSeverity getSeverity() {
+		return severity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setSeverity(ReviewSeverity newSeverity) {
+		ReviewSeverity oldSeverity = severity;
+		severity = newSeverity == null ? SEVERITY_EDEFAULT : newSeverity;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ReviewProfilePackage.REVIEW_COMMENT__SEVERITY, oldSeverity, severity));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT:
+				if (resolve) return getBase_Comment();
+				return basicGetBase_Comment();
+			case ReviewProfilePackage.REVIEW_COMMENT__SEVERITY:
+				return getSeverity();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT:
+				setBase_Comment((Comment)newValue);
+				return;
+			case ReviewProfilePackage.REVIEW_COMMENT__SEVERITY:
+				setSeverity((ReviewSeverity)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT:
+				setBase_Comment((Comment)null);
+				return;
+			case ReviewProfilePackage.REVIEW_COMMENT__SEVERITY:
+				setSeverity(SEVERITY_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ReviewProfilePackage.REVIEW_COMMENT__BASE_COMMENT:
+				return base_Comment != null;
+			case ReviewProfilePackage.REVIEW_COMMENT__SEVERITY:
+				return severity != SEVERITY_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (severity: "); //$NON-NLS-1$
+		result.append(severity);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ReviewCommentImpl
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfileFactoryImpl.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfileFactoryImpl.java
new file mode 100644
index 0000000..b6980f4
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfileFactoryImpl.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ReviewProfileFactoryImpl extends EFactoryImpl implements ReviewProfileFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static ReviewProfileFactory init() {
+		try {
+			ReviewProfileFactory theReviewProfileFactory = (ReviewProfileFactory)EPackage.Registry.INSTANCE.getEFactory(ReviewProfilePackage.eNS_URI);
+			if (theReviewProfileFactory != null) {
+				return theReviewProfileFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new ReviewProfileFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewProfileFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case ReviewProfilePackage.REVIEW_COMMENT: return createReviewComment();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case ReviewProfilePackage.REVIEW_SEVERITY:
+				return createReviewSeverityFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case ReviewProfilePackage.REVIEW_SEVERITY:
+				return convertReviewSeverityToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ReviewComment createReviewComment() {
+		ReviewCommentImpl reviewComment = new ReviewCommentImpl();
+		return reviewComment;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewSeverity createReviewSeverityFromString(EDataType eDataType, String initialValue) {
+		ReviewSeverity result = ReviewSeverity.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertReviewSeverityToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ReviewProfilePackage getReviewProfilePackage() {
+		return (ReviewProfilePackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static ReviewProfilePackage getPackage() {
+		return ReviewProfilePackage.eINSTANCE;
+	}
+
+} //ReviewProfileFactoryImpl
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfilePackageImpl.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfilePackageImpl.java
new file mode 100644
index 0000000..688f117
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/impl/ReviewProfilePackageImpl.java
@@ -0,0 +1,245 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfileFactory;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity;
+
+import org.eclipse.uml2.types.TypesPackage;
+
+import org.eclipse.uml2.uml.UMLPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ReviewProfilePackageImpl extends EPackageImpl implements ReviewProfilePackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass reviewCommentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum reviewSeverityEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private ReviewProfilePackageImpl() {
+		super(eNS_URI, ReviewProfileFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 *
+	 * <p>This method is used to initialize {@link ReviewProfilePackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static ReviewProfilePackage init() {
+		if (isInited) return (ReviewProfilePackage)EPackage.Registry.INSTANCE.getEPackage(ReviewProfilePackage.eNS_URI);
+
+		// Obtain or create and register package
+		Object registeredReviewProfilePackage = EPackage.Registry.INSTANCE.get(eNS_URI);
+		ReviewProfilePackageImpl theReviewProfilePackage = registeredReviewProfilePackage instanceof ReviewProfilePackageImpl ? (ReviewProfilePackageImpl)registeredReviewProfilePackage : new ReviewProfilePackageImpl();
+
+		isInited = true;
+
+		// Initialize simple dependencies
+		EcorePackage.eINSTANCE.eClass();
+		TypesPackage.eINSTANCE.eClass();
+		UMLPackage.eINSTANCE.eClass();
+
+		// Create package meta-data objects
+		theReviewProfilePackage.createPackageContents();
+
+		// Initialize created meta-data
+		theReviewProfilePackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theReviewProfilePackage.freeze();
+
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(ReviewProfilePackage.eNS_URI, theReviewProfilePackage);
+		return theReviewProfilePackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EClass getReviewComment() {
+		return reviewCommentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getReviewComment_Base_Comment() {
+		return (EReference)reviewCommentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getReviewComment_Severity() {
+		return (EAttribute)reviewCommentEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EEnum getReviewSeverity() {
+		return reviewSeverityEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public ReviewProfileFactory getReviewProfileFactory() {
+		return (ReviewProfileFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		reviewCommentEClass = createEClass(REVIEW_COMMENT);
+		createEReference(reviewCommentEClass, REVIEW_COMMENT__BASE_COMMENT);
+		createEAttribute(reviewCommentEClass, REVIEW_COMMENT__SEVERITY);
+
+		// Create enums
+		reviewSeverityEEnum = createEEnum(REVIEW_SEVERITY);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Obtain other dependent packages
+		UMLPackage theUMLPackage = (UMLPackage)EPackage.Registry.INSTANCE.getEPackage(UMLPackage.eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(reviewCommentEClass, ReviewComment.class, "ReviewComment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEReference(getReviewComment_Base_Comment(), theUMLPackage.getComment(), null, "base_Comment", null, 1, 1, ReviewComment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getReviewComment_Severity(), this.getReviewSeverity(), "severity", "INFO", 1, 1, ReviewComment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
+
+		// Initialize enums and add enum literals
+		initEEnum(reviewSeverityEEnum, ReviewSeverity.class, "ReviewSeverity"); //$NON-NLS-1$
+		addEEnumLiteral(reviewSeverityEEnum, ReviewSeverity.INFO);
+		addEEnumLiteral(reviewSeverityEEnum, ReviewSeverity.WARNING);
+		addEEnumLiteral(reviewSeverityEEnum, ReviewSeverity.ERROR);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //ReviewProfilePackageImpl
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileAdapterFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileAdapterFactory.java
new file mode 100644
index 0000000..79d6247
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileAdapterFactory.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage
+ * @generated
+ */
+public class ReviewProfileAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ReviewProfilePackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewProfileAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = ReviewProfilePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ReviewProfileSwitch<Adapter> modelSwitch =
+		new ReviewProfileSwitch<Adapter>() {
+			@Override
+			public Adapter caseReviewComment(ReviewComment object) {
+				return createReviewCommentAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment <em>Review Comment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment
+	 * @generated
+	 */
+	public Adapter createReviewCommentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //ReviewProfileAdapterFactory
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileSwitch.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileSwitch.java
new file mode 100644
index 0000000..241b84f
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src-gen/org/eclipse/papyrus/gitlight/reviewprofile/util/ReviewProfileSwitch.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2019 CEA LIST, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *   CEA LIST - Initial API and implementation
+ */
+package org.eclipse.papyrus.gitlight.reviewprofile.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfilePackage
+ * @generated
+ */
+public class ReviewProfileSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static ReviewProfilePackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ReviewProfileSwitch() {
+		if (modelPackage == null) {
+			modelPackage = ReviewProfilePackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case ReviewProfilePackage.REVIEW_COMMENT: {
+				ReviewComment reviewComment = (ReviewComment)theEObject;
+				T result = caseReviewComment(reviewComment);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Review Comment</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Review Comment</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseReviewComment(ReviewComment object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //ReviewProfileSwitch
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/Activator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/Activator.java
new file mode 100644
index 0000000..26ee251
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/Activator.java
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.profile;
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+/**
+ * This is the central singleton for the Reviewprofile model plugin. <!--
+ * begin-user-doc --> <!-- end-user-doc -->
+ */
+public final class Activator extends EMFPlugin {
+	/**
+	 * Keep track of the singleton. <!-- begin-user-doc --> <!-- end-user-doc
+	 * -->
+	 */
+	public static final Activator INSTANCE = new Activator();
+
+	/**
+	 * Keep track of the singleton. <!-- begin-user-doc --> <!-- end-user-doc
+	 * -->
+	 */
+	private static Implementation plugin;
+
+	/**
+	 * Create the instance. <!-- begin-user-doc --> <!-- end-user-doc -->
+	 */
+	public Activator() {
+		super(new ResourceLocator[] {});
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin. <!-- begin-user-doc
+	 * --> <!-- end-user-doc -->
+	 * 
+	 * @return the singleton instance.
+	 */
+	@Override
+	public ResourceLocator getPluginResourceLocator() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the singleton instance of the Eclipse plugin. <!-- begin-user-doc
+	 * --> <!-- end-user-doc -->
+	 * 
+	 * @return the singleton instance.
+	 */
+	public static Implementation getPlugin() {
+		return plugin;
+	}
+
+	/**
+	 * The actual implementation of the Eclipse <b>Plugin</b>. <!--
+	 * begin-user-doc --> <!-- end-user-doc -->
+	 */
+	public static class Implementation extends EclipsePlugin {
+		/**
+		 * Creates an instance. <!-- begin-user-doc --> <!-- end-user-doc -->
+		 */
+		public Implementation() {
+			super();
+
+			// Remember the static instance.
+			//
+			plugin = this;
+		}
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/ReviewProfileResource.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/ReviewProfileResource.java
new file mode 100644
index 0000000..ff0a1f0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/ReviewProfileResource.java
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.profile;
+
+/**
+ * Some needed constants depending to the profile.
+ */
+public class ReviewProfileResource {
+
+	/**
+	 * The path map.
+	 */
+	public static final String PROFILES_PATHMAP = "pathmap://REVIEWPROFILE/"; //$NON-NLS-1$
+
+	/**
+	 * The profile path.
+	 */
+	public static final String PROFILE_PATH = PROFILES_PATHMAP + "reviewprofile.uml"; //$NON-NLS-1$
+
+	/**
+	 * the profile URI.
+	 */
+	public static final String PROFILE_URI = "http://www.eclipse.org/papyrus/reviewprofile/0.1.0"; //$NON-NLS-1$
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/utils/ReviewProfileUtils.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/utils/ReviewProfileUtils.java
new file mode 100644
index 0000000..de6d691
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.profile/src/org/eclipse/papyrus/gitlight/review/profile/utils/ReviewProfileUtils.java
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.profile.utils;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewProfileFactory;
+import org.eclipse.uml2.uml.Comment;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.UMLFactory;
+
+/**
+ * The review profile utils methods.
+ */
+public class ReviewProfileUtils {
+
+	/**
+	 * This allows to create a review comment.
+	 * 
+	 * @return The created review comment.
+	 */
+	public static ReviewComment createReviewComment() {
+		final ReviewComment createdReviewComment = ReviewProfileFactory.eINSTANCE.createReviewComment();
+		final Comment createdComment = UMLFactory.eINSTANCE.createComment();
+		createdReviewComment.setBase_Comment(createdComment);
+
+		return createdReviewComment;
+	}
+
+	/**
+	 * This allows to get the review comments representation of a model.
+	 * 
+	 * @param rootElement
+	 *            The root element of the model.
+	 * @return The review comments representation.
+	 */
+	public static String getModelReviewMessage(final Element rootElement) {
+		final StringBuilder reviewMessage = new StringBuilder();
+
+		// Search on resource contents to get stereotype applications
+		for (final EObject content : rootElement.eResource().getContents()) {
+			if (content instanceof ReviewComment) {
+				if (reviewMessage.length() > 0) {
+					reviewMessage.append("\n\n"); //$NON-NLS-1$
+				}
+				reviewMessage.append(((ReviewComment) content).getBase_Comment().getBody());
+			}
+		}
+
+		return reviewMessage.toString();
+	}
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.classpath b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.classpath
new file mode 100644
index 0000000..d251a50
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin/"/>
+</classpath>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.project b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.project
new file mode 100644
index 0000000..be6d981
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.gitlight.review.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.core.resources.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.jdt.core.prefs b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/META-INF/MANIFEST.MF b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..616a54e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.gitlight.review.ui;singleton:=true
+Automatic-Module-Name: org.eclipse.papyrus.gitlight.review.ui
+Bundle-Version: 0.7.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.papyrus.gitlight.review.ui.Activator
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.papyrus.infra.ui,
+ org.eclipse.papyrus.infra.properties.ui,
+ org.eclipse.papyrus.uml.properties,
+ org.eclipse.core.filesystem,
+ org.eclipse.papyrus.gitlight.review.profile;bundle-version="[0.7.0,1.0.0)"
+Export-Package: org.eclipse.papyrus.gitlight.review.ui,
+ org.eclipse.papyrus.gitlight.review.ui.databinding,
+ org.eclipse.papyrus.gitlight.review.ui.dialogs
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/about.html b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/about.html
new file mode 100644
index 0000000..3e183aa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 30, 2017</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/build.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/build.properties
new file mode 100644
index 0000000..1002368
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/build.properties
@@ -0,0 +1,23 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               resources/,\
+               about.html
+source.. = src/
+output.. = bin/
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.properties b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.properties
new file mode 100644
index 0000000..6f3c9da
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2019 CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+#   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+#
+###############################################################################
+pluginName = Papyrus GitLight Review UI
+providerName = Eclipse Modeling Project
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.xml
new file mode 100644
index 0000000..535f994
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/plugin.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2019 CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+   CEA LIST - Initial API and implementation
+-->
+
+<plugin>
+   <extension
+        point="org.eclipse.papyrus.uml.extensionpoints.UMLProfile">
+     <profile
+           description="UML profile for Reviews and git"
+           iconpath="resources/icons/reviewprofile.gif"
+           name="ReviewProfile"
+           path="pathmap://REVIEWPROFILE/reviewprofile.uml"
+           provider="CEA LIST">
+     </profile>
+  </extension>
+   <extension point="org.eclipse.papyrus.infra.properties.contexts">
+      <context contextModel="resources/properties/reviewprofile.ctx"></context>
+   </extension>
+   <extension
+         point="org.eclipse.papyrus.infra.properties.environments">
+      <environment environmentModel="resources/Environment.xmi"/>
+   </extension>
+</plugin>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/pom.xml b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/pom.xml
new file mode 100644
index 0000000..ca59843
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent configuration -->
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- Current project description -->
+	<artifactId>org.eclipse.papyrus.gitlight.review.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/Environment.xmi b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/Environment.xmi
new file mode 100644
index 0000000..c66c85e
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/Environment.xmi
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="ASCII"?>
+<environment:Environment
+    xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI"
+    xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9">
+  <modelElementFactories
+      name="Review Stereotype Factory"
+      factoryClass="org.eclipse.papyrus.gitlight.review.ui.databinding.ReviewModelElementFactory"/>
+  <namespaces
+      name="review"
+      value="org.eclipse.papyrus.gitlight.review.ui.widgets"/>
+</environment:Environment>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/icons/reviewprofile.gif b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/icons/reviewprofile.gif
new file mode 100644
index 0000000..281e827
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/icons/reviewprofile.gif
Binary files differ
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/reviewprofile.ctx b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/reviewprofile.ctx
new file mode 100644
index 0000000..8d3c981
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/reviewprofile.ctx
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_V9BbIBTLEem2w6RpAUIUuA" name="Reviewprofile">
+  <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+  <tabs xmi:id="_W97egBTLEem2w6RpAUIUuA" label="Review" id="Reviewprofile" priority="4">
+    <sections xmi:id="_W-CMMBTLEem2w6RpAUIUuA" name="Single ReviewComment" sectionFile="ui/SingleReviewComment.xwt">
+      <widget href="ui/SingleReviewComment.xwt#/"/>
+    </sections>
+    <sections xmi:id="_W-CMMRTLEem2w6RpAUIUuA" name="Multiple ReviewComment" sectionFile="ui/MultipleReviewComment.xwt">
+      <widget href="ui/MultipleReviewComment.xwt#/"/>
+    </sections>
+  </tabs>
+  <views xmi:id="_V9BbIRTLEem2w6RpAUIUuA" name="Single ReviewComment" sections="_W-CMMBTLEem2w6RpAUIUuA" automaticContext="true" datacontexts="_V9BbKhTLEem2w6RpAUIUuA">
+    <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_V9BbIhTLEem2w6RpAUIUuA" name="isSingleReviewComment">
+      <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+      <properties xsi:type="constraints:ValueProperty" xmi:id="_V9BbJBTLEem2w6RpAUIUuA" name="stereotypeName" value="ReviewProfile::ReviewComment"/>
+    </constraints>
+  </views>
+  <views xmi:id="_V9BbJRTLEem2w6RpAUIUuA" elementMultiplicity="-1" name="Multiple ReviewComment" sections="_W-CMMRTLEem2w6RpAUIUuA" automaticContext="true" datacontexts="_V9BbKhTLEem2w6RpAUIUuA">
+    <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_V9BbJhTLEem2w6RpAUIUuA" name="isMultipleReviewComment">
+      <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+      <properties xsi:type="constraints:ValueProperty" xmi:id="_V9BbJxTLEem2w6RpAUIUuA" name="stereotypeName" value="ReviewProfile::ReviewComment"/>
+    </constraints>
+  </views>
+  <dataContexts xmi:id="_V9BbKRTLEem2w6RpAUIUuA" name="ReviewProfile">
+    <elements xmi:id="_V9BbKhTLEem2w6RpAUIUuA" name="ReviewComment">
+      <properties xmi:id="_V9BbKxTLEem2w6RpAUIUuA" name="base_Comment" type="Reference"/>
+      <properties xmi:id="_V9BbLBTLEem2w6RpAUIUuA" name="severity" type="Enumeration"/>
+      <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xgqDJEeSZxfCXzZz3-w"/>
+    </elements>
+    <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.gitlight.review.ui/resources/Environment.xmi#//@modelElementFactories.0"/>
+  </dataContexts>
+</contexts:Context>
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/MultipleReviewComment.xwt b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/MultipleReviewComment.xwt
new file mode 100644
index 0000000..9974d67
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/MultipleReviewComment.xwt
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite xmlns="http://www.eclipse.org/xwt/presentation"
+	xmlns:j="clr-namespace:java.lang"
+	xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets"
+	xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout"
+	xmlns:x="http://www.eclipse.org/xwt">
+	<Composite.layout>
+		<ppel:PropertiesLayout></ppel:PropertiesLayout>
+	</Composite.layout>
+	<Composite>
+		<Composite.layout>
+			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
+		</Composite.layout>
+		<ppe:EnumCombo input="{Binding}"
+			property="ReviewProfile:ReviewComment:severity"></ppe:EnumCombo>
+	</Composite>
+</Composite>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/SingleReviewComment.xwt b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/SingleReviewComment.xwt
new file mode 100644
index 0000000..a407b98
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/resources/properties/ui/SingleReviewComment.xwt
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite xmlns="http://www.eclipse.org/xwt/presentation"
+	xmlns:j="clr-namespace:java.lang"
+	xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets"
+	xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout"
+	xmlns:uml="clr-namespace:org.eclipse.papyrus.uml.properties.widgets"
+	xmlns:x="http://www.eclipse.org/xwt">
+	<Composite.layout>
+		<ppel:PropertiesLayout></ppel:PropertiesLayout>
+	</Composite.layout>
+	<Composite>
+		<Composite.layout>
+			<ppel:PropertiesLayout numColumns="1"></ppel:PropertiesLayout>
+		</Composite.layout>
+		<ppe:EnumCombo input="{Binding}"
+			property="ReviewProfile:ReviewComment:severity"></ppe:EnumCombo>
+		<uml:CommentBodyWrapperEditor input="{Binding}"
+			property="UML:Comment:body"></uml:CommentBodyWrapperEditor>
+		<ppe:MultiReference input="{Binding}"
+			property="UML:Comment:annotatedElement"></ppe:MultiReference>
+	</Composite>
+</Composite>
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/Activator.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/Activator.java
new file mode 100644
index 0000000..7f4c680
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/Activator.java
@@ -0,0 +1,185 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.papyrus.infra.widgets.util.ImageDescriptorManager;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.papyrus.review.ui"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+
+	/** Logging helper. */
+	private static LogHelper logHelper;
+
+	public ImageDescriptorManager imageDescriptorManager;
+
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.
+	 * BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		logHelper = new LogHelper(plugin);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.
+	 * BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+		logHelper = null;
+	}
+
+	/**
+	 * Returns the image at the given path from this plugin
+	 *
+	 * @param path
+	 *            the path of the image to be displayed
+	 * @return The Image at the given location, or null if it couldn't be found
+	 */
+	public Image getImage(String path) {
+		return getImage(PLUGIN_ID, path);
+	}
+
+	/**
+	 * Returns the image from the given image descriptor
+	 *
+	 * @param pluginId
+	 *            The plugin in which the image is located
+	 * @param path
+	 *            The path to the image from the plugin
+	 * @return The Image at the given location, or null if it couldn't be found
+	 */
+	public Image getImage(String pluginId, String path) {
+		final ImageRegistry registry = getImageRegistry();
+		String key = pluginId + "/" + path; //$NON-NLS-1$
+		Image image = registry.get(key);
+		if (image == null) {
+			registry.put(key, AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, path));
+			image = registry.get(key);
+		}
+		return image;
+	}
+
+	public Image getImage(ImageDescriptor descriptor) {
+		final ImageRegistry registry = getImageRegistry();
+		if (imageDescriptorManager == null || registry == null) {
+			return null; // should never happen => is set to null when activator
+							// is not started
+		}
+		String key = imageDescriptorManager.getKey(descriptor);
+		Image image = registry.get(key);
+		if (image == null) {
+			registry.put(key, descriptor);
+			image = registry.get(key);
+		}
+		return image;
+	}
+
+	/**
+	 * Returns the image from the given image location
+	 *
+	 * @param pluginId
+	 *            The plugin in which the image is located
+	 * @param path
+	 *            The path to the image from the plugin
+	 * @return The Image Descriptor at the given location, or null if it
+	 *         couldn't be found
+	 */
+	public ImageDescriptor getImageDescriptor(String pluginId, String path) {
+		final ImageRegistry registry = getImageRegistry();
+		String key = pluginId + "/" + path; //$NON-NLS-1$
+		ImageDescriptor descriptor = registry.getDescriptor(key);
+		if (descriptor == null) {
+			registry.put(key, AbstractUIPlugin.imageDescriptorFromPlugin(pluginId, path));
+			descriptor = registry.getDescriptor(key);
+		}
+		return descriptor;
+	}
+
+	/**
+	 * Returns the image descriptor at the given path from this plugin
+	 *
+	 * @param path
+	 *            the path of the image to be displayed
+	 * @return The ImageDescriptor at the given location, or null if it couldn't
+	 *         be found
+	 */
+	public ImageDescriptor getImageDescriptor(String path) {
+		return getImageDescriptor(PLUGIN_ID, path);
+	}
+
+	/**
+	 * Returns the image from the given path
+	 *
+	 * @param imagePath
+	 *            The path of the image, in the form /<plug-in ID>/<path to the
+	 *            image>
+	 * @return The Image at the given location, or null if none was found
+	 */
+	public Image getImageFromPlugin(String imagePath) {
+		if (imagePath.startsWith("/")) { //$NON-NLS-1$
+			String pluginId, path;
+			imagePath = imagePath.substring(1, imagePath.length());
+			pluginId = imagePath.substring(0, imagePath.indexOf("/")); //$NON-NLS-1$
+			path = imagePath.substring(imagePath.indexOf("/"), imagePath.length()); //$NON-NLS-1$
+			return getImage(pluginId, path);
+		} else {
+			return getImage(imagePath);
+		}
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the log helper
+	 * 
+	 * @return the log helper
+	 */
+	public static LogHelper getLogHelper() {
+		return logHelper;
+	}
+
+}
\ No newline at end of file
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/databinding/ReviewModelElementFactory.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/databinding/ReviewModelElementFactory.java
new file mode 100644
index 0000000..1ae321c
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/databinding/ReviewModelElementFactory.java
@@ -0,0 +1,24 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.ui.databinding;
+
+import org.eclipse.papyrus.uml.properties.modelelement.StereotypeModelElementFactory;
+
+/**
+ * The review model element factory.
+ */
+public class ReviewModelElementFactory extends StereotypeModelElementFactory {
+
+}
diff --git a/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/dialogs/ReviewCommentDialog.java b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/dialogs/ReviewCommentDialog.java
new file mode 100644
index 0000000..a535baa
--- /dev/null
+++ b/gitlight/plugins/org.eclipse.papyrus.gitlight.review.ui/src/org/eclipse/papyrus/gitlight/review/ui/dialogs/ReviewCommentDialog.java
@@ -0,0 +1,164 @@
+/*****************************************************************************
+ * Copyright (c) 2019 CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *   Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.gitlight.review.ui.dialogs;
+
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewComment;
+import org.eclipse.papyrus.gitlight.reviewprofile.ReviewSeverity;
+import org.eclipse.papyrus.infra.properties.ui.widgets.layout.PropertiesLayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * This allows to define the dialog to edit to review comment.
+ */
+public class ReviewCommentDialog extends SelectionDialog {
+
+	/** The properties composite for the package. */
+	private Composite mainComposite;
+
+	/** The review comment to edit. */
+	private ReviewComment reviewComment;
+
+	/** The severity combo will allow to define the review comment severity. */
+	private Combo severityCombo;
+
+	/** The text field will allow to define the comment body. */
+	private Text bodyText;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param parentShell
+	 *            The parent shell.
+	 * @param element
+	 *            The element to edit
+	 */
+	public ReviewCommentDialog(final Shell parentShell, final ReviewComment reviewComment) {
+		super(parentShell);
+
+		this.reviewComment = reviewComment;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#create()
+	 */
+	@Override
+	public void create() {
+		super.create();
+		if (getShell().getText() == null || getShell().getText().isEmpty()) {
+			getShell().setText("Edit Review Comment"); //$NON-NLS-1$
+		}
+		getShell().setImage(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/papyrus.png")); //$NON-NLS-1$
+
+		// Create the parent composite
+		final Composite parent = new Composite(getDialogArea(), SWT.NONE);
+		parent.setLayout(new PropertiesLayout());
+		parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		// Create properties view
+		createMainComposite(parent);
+
+		getShell().pack();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#getDialogArea()
+	 */
+	@Override
+	public Composite getDialogArea() {
+		return (Composite) super.getDialogArea();
+	}
+
+	/**
+	 * Create the properties group.
+	 * 
+	 * @param parent
+	 *            The parent composite.
+	 */
+	protected void createMainComposite(final Composite parent) {
+		mainComposite = new Composite(parent, SWT.NONE);
+		final GridLayout layout = new GridLayout(2, false);
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		mainComposite.setLayout(layout);
+		final GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+		data.minimumHeight = 200;
+		data.widthHint = 400;
+		mainComposite.setLayoutData(data);
+
+		// Manage the severity
+		final Label severityLabel = new Label(mainComposite, SWT.NONE);
+		severityLabel.setText("Severity:"); //$NON-NLS-1$
+		severityCombo = new Combo(mainComposite, SWT.NONE);
+		severityCombo.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
+		severityCombo.setItems(ReviewSeverity.INFO.getName(), ReviewSeverity.WARNING.getName(), ReviewSeverity.ERROR.getName());
+		final int initialSeverityIndex = reviewComment.getSeverity().equals(ReviewSeverity.INFO) ? 0 : reviewComment.getSeverity().equals(ReviewSeverity.WARNING) ? 1 : 2;
+		severityCombo.select(initialSeverityIndex);
+
+		// Manage the comment body
+		final Label bodyLabel = new Label(mainComposite, SWT.NONE);
+		bodyLabel.setText("Body"); //$NON-NLS-1$
+		final GridData bodyLabelLayoutData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
+		bodyLabelLayoutData.horizontalSpan = 2;
+		bodyLabel.setLayoutData(bodyLabelLayoutData);
+		bodyText = new Text(mainComposite, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
+		final GridData bodyLayoutData = new GridData(GridData.FILL_BOTH);
+		bodyLayoutData.horizontalSpan = 2;
+		bodyLayoutData.heightHint = 60;
+		bodyText.setLayoutData(bodyLayoutData);
+		if (null != reviewComment.getBase_Comment().getBody()) {
+			bodyText.setText(reviewComment.getBase_Comment().getBody());
+		}
+		// set the focus to the body
+		bodyText.forceFocus();
+	}
+
+	/**
+	 * Manage review comment values before manage the ok button.
+	 * [{@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+	 *
+	 */
+	@Override
+	protected void okPressed() {
+		// Add values to review comment
+		switch (severityCombo.getSelectionIndex()) {
+		case 0:
+			reviewComment.setSeverity(ReviewSeverity.INFO);
+			break;
+		case 1:
+			reviewComment.setSeverity(ReviewSeverity.WARNING);
+			break;
+		case 2:
+			reviewComment.setSeverity(ReviewSeverity.ERROR);
+			break;
+		}
+		reviewComment.getBase_Comment().setBody(bodyText.getText());
+
+		super.okPressed();
+	}
+}
diff --git a/gitlight/plugins/pom.xml b/gitlight/plugins/pom.xml
new file mode 100644
index 0000000..05a0cb4
--- /dev/null
+++ b/gitlight/plugins/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.parent</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.plugins</artifactId>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>org.eclipse.papyrus.gitlight.git</module>
+		<module>org.eclipse.papyrus.gitlight.git.ui</module>
+		<module>org.eclipse.papyrus.gitlight.review.profile</module>
+		<module>org.eclipse.papyrus.gitlight.review.profile.edit</module>
+		<module>org.eclipse.papyrus.gitlight.review.ui</module>
+		<module>org.eclipse.papyrus.gitlight.compare</module>
+		<module>org.eclipse.papyrus.gitlight.compare.ui</module>
+		<module>org.eclipse.papyrus.gitlight.compare.uml2.edit</module>
+	</modules>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/pom.xml b/gitlight/pom.xml
new file mode 100644
index 0000000..45cd5af
--- /dev/null
+++ b/gitlight/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.all</artifactId>
+		<version>3.1.0-SNAPSHOT</version>
+	</parent>
+
+	<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.parent</artifactId>
+	<version>0.7.0-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>features</module>
+		<module>plugins</module>
+	</modules>
+
+	<profiles>
+		<profile>
+			<id>gitlight</id>
+			<properties>
+				<targetplatform.groupId>org.eclipse.papyrus.incubation.gitlight</targetplatform.groupId>
+				<targetplatform.artifactId>org.eclipse.papyrus.incubation.gitlight.targetplatform.${target.suffix}</targetplatform.artifactId>
+				<targetplatform.version>0.7.0-SNAPSHOT</targetplatform.version>
+			</properties>
+
+			<modules>
+				<module>releng</module>
+			</modules>
+		</profile>
+		<profile>
+			<id>eclipsehippIntegration</id>
+			<activation>
+				<property>
+					<name>JENKINS_URL</name>
+				</property>
+			</activation>
+			<properties>
+				<target.suffix>eclipse</target.suffix> <!-- set to 'eclipse' when building on HIPP, to improve performances -->
+			</properties>
+		</profile>
+		<profile>
+			<id>localIntegration</id>
+			<activation>
+				<property>
+					<name>!JENKINS_URL</name>
+				</property>
+			</activation>
+			<properties>
+				<target.suffix>portable</target.suffix>
+			</properties>
+		</profile>
+	</profiles>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/releng/.project b/gitlight/releng/.project
new file mode 100644
index 0000000..43a73bf
--- /dev/null
+++ b/gitlight/releng/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>releng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/gitlight/releng/.settings/org.eclipse.core.resources.prefs b/gitlight/releng/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/gitlight/releng/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/category.xml b/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/category.xml
new file mode 100644
index 0000000..cabbed1
--- /dev/null
+++ b/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/category.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/org.eclipse.papyrus.gitlight.feature_0.7.0.qualifier.jar" id="org.eclipse.papyrus.gitlight.feature" version="0.7.0.qualifier">
+      <category name="org.eclipse.papyrus.incubation.category"/>
+   </feature>
+   <feature url="features/org.eclipse.papyrus.gitlight.feature.source_0.7.0.qualifier.jar" id="org.eclipse.papyrus.gitlight.feature.source" version="0.7.0.qualifier">
+      <category name="org.eclipse.papyrus.incubation.category"/>
+   </feature>
+   <category-def name="org.eclipse.papyrus.incubation.category" label="Papyrus Incubation">
+      <description>
+         Papyrus Incubation features
+      </description>
+   </category-def>
+</site>
diff --git a/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/pom.xml b/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/pom.xml
new file mode 100644
index 0000000..633748a
--- /dev/null
+++ b/gitlight/releng/org.eclipse.papyrus.incubation.gitlight.p2/pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.releng</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.p2</artifactId>
+	<packaging>eclipse-repository</packaging>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-deploy-plugin</artifactId>
+				<version>2.8.2</version>
+				<configuration>
+					<skip>true</skip>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/gitlight/releng/pom.xml b/gitlight/releng/pom.xml
new file mode 100644
index 0000000..fba4df3
--- /dev/null
+++ b/gitlight/releng/pom.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.parent</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.releng</artifactId>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>targetplatform</module>
+		<module>org.eclipse.papyrus.incubation.gitlight.p2</module>
+	</modules>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/releng/promote/gitlight.sh b/gitlight/releng/promote/gitlight.sh
new file mode 100644
index 0000000..cf7eede
--- /dev/null
+++ b/gitlight/releng/promote/gitlight.sh
@@ -0,0 +1,258 @@
+#Based upon Gef4 publish.sh script
+
+#causes the shell to exit if any subcommand or pipeline returns a non-zero status.
+#set -e
+
+# Script may take 5-6 command line parameters:
+# $1: Hudson job name: <name>
+# $2: Hudson build id: <id>
+# $3: Build type: i(ntegration), s(table), r(elease)
+# $4: The release label used to label the drop files, e.g. 3.10.0 or 3.10.1
+# $5: The eclipse target version, e.g. mars or neon
+# $6: Override if exists
+# $7: An optional release label suffix to be appended to drop files name, e.g. M1, RC1 
+
+##Additional variables to specify for each project
+
+#The root url that enables to find the job with ${hudsonJobRootUrl}/$jobName/$buildNumber
+hudsonJobRootUrl="https://hudson.eclipse.org/papyrus/job"
+
+#The name of the tool
+repo="incubation"
+subRepo="uml.export"
+updates="updates"
+drops="downloads/drops"
+
+#The specific localization
+remoteRoot="/home/data/httpd/download.eclipse.org"
+papyrusRoot="modeling/mdt/papyrus"
+remoteUpdateSiteRoot=${remoteRoot}/${papyrusRoot}/${repo}
+remoteUpdateSite=${remoteUpdateSiteRoot}/${subRepo}
+remoteUpdateSiteDir=${remoteUpdateSite}/${updates}
+echo "remoteUpdateSiteDir: $remoteUpdateSiteDir"
+
+#The localization of the local build target
+targetResults="archive/${subRepo}/releng/org.eclipse.papyrus.${repo}.${subRepo}.p2/target/repository"
+echo "targetResults: $targetResults"
+
+#The rcpPrompote.sh script may be used to publish the Incubation build results. 
+#if [ $# -eq 6 -o $# -eq 7  ];
+#then
+#	jobName=$1
+jobName="Papyrus-Incubation-GitLight"
+	echo "jobName: $jobName"
+#	buildNumber=$2
+buildNumber="4"
+	echo "buildNumber: $buildNumber"
+#	releaseType=$3
+releaseType="i"
+	echo "releaseType: $releaseType"
+#	releaseLabel=$4	
+releaseLabel="1.2.0"
+	echo "releaseLabel: $releaseLabel"
+#	eclipseTarget=$5
+eclipseTarget="oxygen"	
+	echo "eclipseTarget: $eclipseTarget"
+#	override=$6	
+override="y"
+	echo "override: $override"
+
+	if [ -n "$7" ];
+	then
+		releaseLabelSuffix=$7
+		echo "releaseLabelSuffix: $releaseLabelSuffix"
+	fi
+#else
+#	echo "Missing so parameters: command jobName buildNumber releaseType releaseLabel eclipseTarget override [releaseLabelSuffix]"
+#	exit 1;
+#fi
+
+###########jobName parameter###########
+if [ -z "$jobName" ];
+then
+	echo "The Hudson job you want to promote must be specified"
+	exit 1
+fi
+
+###########buildNumber parameter###########
+if [ -z "$buildNumber" ];
+then
+	echo "The id of the $jobName build you want to promote must be specified"
+	exit 1
+fi
+
+###########releaseType parameter###########
+if [ -z "$releaseType" ];
+then
+    echo "The type of build you want to publish to [i(integration), s(table), r(elease)]."
+    exit;
+fi
+echo "Publishing as $releaseType build"
+
+###########releaseLabel parameter###########
+if [ -z "$releaseLabel" ];
+then
+    echo "The release label (e.g. 3.10.0, 3.10.1M2) must be specified."
+    exit 1
+fi
+echo "Release label: $releaseLabel"
+
+###########eclipseTarget parameter###########
+if [ -z "$eclipseTarget" ];
+then
+    echo "The Eclipse target (e.g. mars, neon) must be specified."
+    exit 1
+fi
+echo "Eclipse target : $eclipseTarget"
+
+###########Override parameter###########
+if [ "$override" != y -a "$override" != n ];
+then
+	echo "Parameter override has to 'y'(es) or 'n'(o) but was: $override"
+    exit 0
+fi
+
+if [ "$override" == "y" ];
+then
+	echo "Will override the previous artifacts if found"
+else
+	echo "Will not override the previous arifacts if found"
+fi
+
+########### Compute local build results using buildNumber ###########
+if [ "$buildNumber" = "lastStable" -o "$buildNumber" = "lastSuccessful" ];
+then
+	# Reverse lookup the build id (in case lastSuccessful or lastStable was used)
+	for i in $(find ~/.hudson/jobs/$jobName/builds/ -type l)
+	do
+		if [ "$(readlink -f $i)" = "$(readlink -f ~/.hudson/jobs/$jobName/$buildNumber)" ];
+		then
+			buildNumber=${i##*/}
+		fi
+	done
+	echo "Reverse lookup (lastStable/lastSuccessful) yielded buildNumber: $buildNumber"
+fi
+
+echo "~/.hudson/jobs/${jobName}/builds/${buildNumber}"
+jobDir=$(readlink -f ~/.hudson/jobs/${jobName}/builds/${buildNumber})
+if ! [ -d $jobDir ];
+then
+	echo "The specified buildNumber does not refer to an existing build: $buildNumber"
+	exit 1
+fi
+
+localResults=${jobDir}/${targetResults}
+echo "localResults: ${localResults}"
+
+########### Promote Job ###########
+destination=$remoteUpdateSiteDir/$eclipseTarget/${releaseLabel}${releaseLabelSuffix}
+echo "Destination: $destination"
+
+if [ "$override" == "n" ];
+then
+	if [ -d $destination ];
+	then
+		if [ "$(ls -A ${destination})" ];
+		then
+			echo "The destination is not empty. You may consider overriding or archiving"
+			exit 1
+		fi
+	fi
+fi
+
+if [ "$override" == "y" ];
+then
+	if [ -d $destination ];
+	then
+		echo "Overriding the RCP by cleaning the $destination folder"
+		rm -rf ${destination}/*
+	fi
+fi
+
+#Go to the artifact directory
+cd $localResults
+echo "Promoting the Job to $destination"
+#No error if exists, makes parent directories as needed
+mkdir -p $destination
+
+#Copy the contents onto the temp folder and change the permissions
+cp -R * $destination
+
+
+########### Update composites ###########
+# TODO update composite root ./eclipseTarget/* and parent ./*
+echo "Update Composites"
+timestamp=$(date +%s000)
+
+# This function indents the text with two white spaces
+indent() {
+sed 's/^/  /';
+}
+
+# This function is used to generate the composites
+function updateComposites() {
+cat > "compositeArtifacts.xml" <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<repository name="Papyrus" type="org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository" version="1.0.0">
+  <properties size="1">
+    <property name="p2.timestamp" value="$1"/>
+  </properties>
+  <children size="$2">
+$(	
+for file in *; do 
+if [ -d $file ]; then 
+    printf "<child location='${file}'/>" | indent | indent
+fi
+done
+)
+  </children>
+</repository>
+EOF
+
+cat > "compositeContent.xml" <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<repository name="Papyrus" type="org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository" version="1.0.0">
+  <properties size="1">
+    <property name="p2.timestamp" value="$1"/>
+  </properties>
+  <children size="$2">
+$(	
+for file in *; do 
+if [ -d $file ]; then 
+    printf "<child location='${file}'/>" | indent | indent
+fi
+done
+)
+  </children>
+</repository>
+EOF
+}
+
+echo "Update root composites: $remoteUpdateSite"
+cd $remoteUpdateSite
+childrenCount=$(find . -maxdepth 1 -type d  \( ! -iname ".*" \) | wc -l)
+updateComposites $timestamp $childrenCount
+
+echo "Update eclipseTarget composites: $remoteUpdateSiteDir"
+cd $remoteUpdateSiteDir
+childrenCount=$(find . -maxdepth 1 -type d  \( ! -iname ".*" \) | wc -l)
+updateComposites $timestamp $childrenCount
+
+echo "Update releaseLabel composites: $remoteUpdateSiteDir/$eclipseTarget"
+cd $remoteUpdateSiteDir/$eclipseTarget
+childrenCount=$(find . -maxdepth 1 -type d  \( ! -iname ".*" \) | wc -l)
+updateComposites $timestamp $childrenCount
+
+
+########### Set Access Rights ###########
+
+# This function sets the acess rights to allow all memebers of the group to edit the files
+function setAccessRights() {
+	chmod -R 775 "$1"
+	chgrp -hR modeling.mdt.papyrus "$1"
+}
+echo "Set access right -R: $remoteUpdateSiteDir"
+setAccessRights $remoteUpdateSiteDir
+
+
+echo "publishing done."
\ No newline at end of file
diff --git a/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse.target b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse.target
new file mode 100644
index 0000000..50713f0
--- /dev/null
+++ b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse.target
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde?>
+<!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform -->
+<target name="UML export - Oxygen" sequenceNumber="1504259019">
+  <locations>
+    <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.papyrus.sdk.feature.feature.group" version="4.2.0.201812120922"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/modeling/mdt/papyrus/updates/releases/2018-12"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.uml2.sdk.feature.group" version="5.5.0.v20181203-1331"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/releases/2018-12/201812191000"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.papyrus.compare.feature.feature.group" version="0.7.0.201901250021"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/modeling/mdt/papyrus/components/compare/updates/integration/"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.emf.compare.diagram.gmf.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.egit.feature.group" version="1.2.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.ide.ui.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.rcp.ui.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.uml2.feature.group" version="3.3.3.201805161152"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/modeling/emf/compare/updates/releases/3.3/R201805161152/"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.egit.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.egit.mylyn.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.jgit.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.jgit.pgm.feature.group" version="5.0.0.201806131550-r"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/egit/updates-5.0"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
+		  <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+		  <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
+		  <unit id="com.google.guava.source" version="21.0.0.v20170206-1425"/>
+		  <unit id="org.apache.commons.lang3" version="3.1.0.v201403281430"/>
+		  <unit id="org.apache.commons.lang3.source" version="3.1.0.v201403281430"/>
+		  <repository location="file:/home/data/httpd/download.eclipse.org/tools/orbit/downloads/drops/R20180606145124/repository"/>
+	  </location>
+  </locations>
+</target>
diff --git a/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/pom.xml b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/pom.xml
new file mode 100644
index 0000000..09b0dcd
--- /dev/null
+++ b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.releng.targetplatform</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.targetplatform.eclipse</artifactId>
+	<packaging>eclipse-target-definition</packaging>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable.target b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable.target
new file mode 100644
index 0000000..c87fd92
--- /dev/null
+++ b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable.target
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><?pde?><!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform --><target name="GitLight - 2018-12" sequenceNumber="1504259019">
+  <locations>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.papyrus.sdk.feature.feature.group" version="4.2.0.201812120922"/>
+		  <repository location="http://download.eclipse.org/modeling/mdt/papyrus/updates/releases/2018-12"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.uml2.sdk.feature.group" version="5.5.0.v20181203-1331"/>
+		  <repository location="http://download.eclipse.org/releases/2018-12/201812191000"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.papyrus.compare.feature.feature.group" version="0.7.0.201901250021"/>
+		  <repository location="http://download.eclipse.org/modeling/mdt/papyrus/components/compare/updates/integration/"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.emf.compare.diagram.gmf.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.egit.feature.group" version="1.2.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.ide.ui.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.rcp.ui.feature.group" version="3.3.3.201805161152"/>
+		  <unit id="org.eclipse.emf.compare.uml2.feature.group" version="3.3.3.201805161152"/>
+		  <repository location="http://download.eclipse.org/modeling/emf/compare/updates/releases/3.3/R201805161152/"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="org.eclipse.egit.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.egit.mylyn.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.jgit.feature.group" version="5.0.0.201806131550-r"/>
+		  <unit id="org.eclipse.jgit.pgm.feature.group" version="5.0.0.201806131550-r"/>
+		  <repository location="http://download.eclipse.org/egit/updates-5.0"/>
+	  </location>
+	  <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+		  <unit id="com.google.gson" version="2.8.2.v20180104-1110"/>
+		  <unit id="com.google.gson.source" version="2.8.2.v20180104-1110"/>
+		  <unit id="com.google.guava" version="21.0.0.v20170206-1425"/>
+		  <unit id="com.google.guava.source" version="21.0.0.v20170206-1425"/>
+		  <unit id="org.apache.commons.lang3" version="3.1.0.v201403281430"/>
+		  <unit id="org.apache.commons.lang3.source" version="3.1.0.v201403281430"/>
+		  <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20180606145124/repository"/>
+	  </location>
+  </locations>
+</target>
\ No newline at end of file
diff --git a/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/pom.xml b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/pom.xml
new file mode 100644
index 0000000..0bdd5b9
--- /dev/null
+++ b/gitlight/releng/targetplatform/org.eclipse.papyrus.incubation.gitlight.targetplatform.portable/pom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.releng.targetplatform</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.targetplatform.portable</artifactId>
+	<packaging>eclipse-target-definition</packaging>
+
+</project>
\ No newline at end of file
diff --git a/gitlight/releng/targetplatform/pom.xml b/gitlight/releng/targetplatform/pom.xml
new file mode 100644
index 0000000..7ec63a1
--- /dev/null
+++ b/gitlight/releng/targetplatform/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.papyrus.incubation.gitlight</groupId>
+		<artifactId>org.eclipse.papyrus.incubation.gitlight.releng</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>org.eclipse.papyrus.incubation.gitlight.releng.targetplatform</artifactId>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>org.eclipse.papyrus.incubation.gitlight.targetplatform.${target.suffix}</module>
+	</modules>
+
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 1a0d831..1d5c092 100755
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,14 @@
 		</pluginRepository>
 	</pluginRepositories>	
 	
+	<repositories>
+		<repository>
+			<id>license-feature</id>
+			<url>http://download.eclipse.org/cbi/updates/license/</url>
+			<layout>p2</layout>
+		</repository>
+	</repositories>
+	
 	<build>
 		<pluginManagement>
 			<plugins>