diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
new file mode 100644
index 0000000..47bba3f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
@@ -0,0 +1,40 @@
+package org.eclipse.papyrus.pdp4eng.req.profile.constraints;
+
+import java.util.Iterator;
+
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Stereotype;
+
+public class GDPRRequiementHelper {
+	
+	public static boolean isGDPR_Requirement(Element element) {
+		
+		for (Iterator<Stereotype> iterator = element.getAppliedStereotypes().iterator(); iterator.hasNext();) {
+			Stereotype type = (Stereotype) iterator.next();
+			if(isGDPRRequirementStereotype(type)) {
+				return true;
+			}
+			
+		}
+		return false;
+	}
+
+	/**
+	 * test if the stereotype is a SysML Requirement Stereotype
+	 * @param stereotype a given stereotype
+	 * @return return true if this is a SysML stereotype or inherits directly or indirectly from requirement
+	 */
+	public static boolean isGDPRRequirementStereotype(Stereotype stereotype) {
+		if( "GDPRPrinciple".equals(stereotype.getName())){
+			return true;
+		}
+		for(org.eclipse.uml2.uml.Class superStereotype : stereotype.getSuperClasses()) {
+			if( superStereotype instanceof Stereotype){
+				if(isGDPRRequirementStereotype((Stereotype)superStereotype)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
index c1dede8..f84a6e0 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
@@ -23,13 +23,17 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.resource.UMLResource;
+import org.eclipse.uml2.uml.util.UMLUtil;
 
 public class TraceabilityIndexer {
 	private HashMap<Element,ArrayList<DirectedRelationship> > upwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
 	private HashMap<Element,ArrayList<DirectedRelationship> > downwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
+	private HashMap<Element,Element > ownerRequirement= new HashMap<Element, Element>();
+	private HashMap<Element,ArrayList<Element> > subRequirements= new HashMap<Element, ArrayList<Element>>();
 	private static TraceabilityIndexer instance=null;
 	public static TraceabilityIndexer getInstance() {
 		if( instance==null) {
@@ -43,14 +47,16 @@
 	public void loadTraceability(Element context) {
 		upwardTraceability.clear();
 		downwardTraceability.clear();
+		ownerRequirement.clear();
+		subRequirements.clear();
 		ResourceSet resourceSet=context.eResource().getResourceSet();
 		for(int i=0; i< resourceSet.getResources().size();i++) {
 			Resource resource = (Resource) resourceSet.getResources().get(i);
 			if( resource instanceof UMLResource) {
 				for (Iterator<EObject> iteratorObject = resource.getAllContents(); iteratorObject.hasNext();) {
-					EObject ownedElement = (EObject) iteratorObject.next();
-					if(ownedElement instanceof DirectedRelationship) {
-						DirectedRelationship directedRelationship= (DirectedRelationship)ownedElement;
+					EObject currentEobject = (EObject) iteratorObject.next();
+					if(currentEobject instanceof DirectedRelationship) {
+						DirectedRelationship directedRelationship= (DirectedRelationship)currentEobject;
 						for (Iterator<Element> iterator = directedRelationship.getSources().iterator(); iterator.hasNext();) {
 							Element currentSource = (Element) iterator.next();
 							if( upwardTraceability.get(currentSource)!=null) {
@@ -74,11 +80,30 @@
 							}
 						}
 					}
+
+					// add also Owner and composed Requirements
+					if( currentEobject instanceof org.eclipse.uml2.uml.Class) {
+						if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentEobject, Requirement.class)!=null) {
+							org.eclipse.uml2.uml.Class currentReq=(org.eclipse.uml2.uml.Class)currentEobject;
+							if( currentReq.eContainer() instanceof org.eclipse.uml2.uml.Class) {
+								if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentReq.eContainer(), Requirement.class)!=null) {
+									org.eclipse.uml2.uml.Class parentReq=(org.eclipse.uml2.uml.Class)currentReq.eContainer();
+									ownerRequirement.put(currentReq, (org.eclipse.uml2.uml.Class)currentEobject.eContainer());
+
+									if( subRequirements.get(parentReq)==null) {
+										ArrayList<Element> subElements= new ArrayList<Element>();
+										subRequirements.put(parentReq, subElements);
+									}
+									subRequirements.get(parentReq).add(currentReq);
+								}
+							}	
+						}
+					}
 				}
 			}
 		}
 	}
-	
+
 	public ArrayList<DirectedRelationship> getUpwardTraceabiltiy(Element context){
 		return upwardTraceability.get(context);
 	}
@@ -86,4 +111,11 @@
 	public ArrayList<DirectedRelationship> getDownwardTraceabiltiy(Element context){
 		return downwardTraceability.get(context);
 	}
+	public Element getParentRequirement(Element currentElement) {
+		return ownerRequirement.get(currentElement);
+	}
+	
+	public ArrayList<Element> getsubRequirements(Element currentElement) {
+		return subRequirements.get(currentElement);
+	}
 }
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
index 8e8f087..87e6ba4 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
@@ -14,7 +14,8 @@
  org.eclipse.papyrus.pdp4eng.req.gdprananalysis;bundle-version="[1.0.0,2.0.0)",
  org.eclipse.ui.workbench;bundle-version="[3.119.0,4.0.0)",
  org.eclipse.papyrus.infra.gmfdiag.css;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.papyrus.pdp4eng.req.profile
+ org.eclipse.papyrus.pdp4eng.req.profile;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.papyrus.sysml14;bundle-version="[1.3.0,2.0.0)"
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.papyrus.pdp4eng.req.ui
 Bundle-Activator: org.eclipse.papyrus.pdp4eng.req.ui.Activator
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
index 0795287..279f196 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
@@ -84,6 +84,18 @@
           stylesheetPath="styles/RequirementsModel.css">
     </stylesheet>
  </extension>
+  <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="false"
+            category="org.eclipse.papyrus.views.category"
+            class="org.eclipse.papyrus.pdp4eng.req.ui.view.RequirementView"
+            icon="icons/working.png"
+            id="org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"
+            name="Requirements View"
+            restorable="true">
+      </view>
+   </extension>
 
 </plugin>
    
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
new file mode 100644
index 0000000..d0b0f30
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
@@ -0,0 +1,47 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, 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:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+/** this class is used to display as a menu if the stereotype shall filtered **/
+
+public class RequirementAction extends Action {
+
+	private Class<?> stereotype;
+	ArrayList<Class<?>> steretotypeFilter;
+
+	public RequirementAction(Class<?> stereotype, ArrayList<Class<?>> steretotypeFilter) {
+		super(stereotype.getSimpleName(), IAction.AS_CHECK_BOX);
+		this.setChecked(true);
+		this.stereotype = stereotype;
+		this.steretotypeFilter = steretotypeFilter;
+	}
+
+	@Override
+	public void run() {
+		if (this.isChecked()) {
+			if (!steretotypeFilter.contains(stereotype)) {
+				steretotypeFilter.add(stereotype);
+			}
+		} else {
+			steretotypeFilter.remove(stereotype);
+		}
+		System.out.println(steretotypeFilter);
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
new file mode 100644
index 0000000..291e447
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
@@ -0,0 +1,227 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, 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:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Accuracy;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataMinimisation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Fairly;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByConsent;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByLegalObligation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByPublicInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByVitalInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PurposeLimitation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.SecuritySafety;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.StorageLimitation;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * This class is the requirements view that displays requirements that are associated to the selected element.
+ *
+ */
+public class RequirementView extends ViewPart implements ITabbedPropertySheetPageContributor {
+
+	private TreeViewer viewer;
+	// list of stereotype to filter
+	private ArrayList<Class<?>> steretotypeFilter = new ArrayList<>();
+	private List<IPropertySheetPage> propertySheetPages = new ArrayList<>();
+
+	private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
+		FontData[] styleData = new FontData[originalData.length];
+		for (int i = 0; i < styleData.length; i++) {
+			FontData base = originalData[i];
+			styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | additionalStyle);
+		}
+		return styleData;
+	}
+
+	public RequirementView() {
+		steretotypeFilter.add(Requirement.class);
+		steretotypeFilter.add(Lawful.class);
+		steretotypeFilter.add(LawfulByConsent.class);
+		steretotypeFilter.add(LawfulByContract.class);
+		steretotypeFilter.add(LawfulByLegalObligation.class);
+		steretotypeFilter.add(LawfulByPublicInterest.class);
+		steretotypeFilter.add(LawfulByVitalInterest.class);
+		steretotypeFilter.add(Fairly.class);
+		steretotypeFilter.add(org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Transparency.class);
+		steretotypeFilter.add(Accuracy.class);
+		steretotypeFilter.add(DataMinimisation.class);
+		steretotypeFilter.add(PurposeLimitation.class);
+		steretotypeFilter.add(StorageLimitation.class);
+		steretotypeFilter.add(SecuritySafety.class);
+
+
+	}
+
+	/**
+	 * create action in the view in order to filter stereotypes
+	 */
+	public void createActions() {
+		IMenuManager mainMenu = getViewSite().getActionBars().getMenuManager();
+		MenuManager GDPRmenu = new MenuManager("GDPR requirement", "GDPR.requirement.menu"); //$NON-NLS-1$ //$NON-NLS-2$
+		for (int i = 0; i < steretotypeFilter.size(); i++) {
+			GDPRmenu.add(new RequirementAction(steretotypeFilter.get(i), steretotypeFilter));
+			mainMenu.add(GDPRmenu);
+		}
+	}
+
+
+
+	@Override
+	public void createPartControl(Composite parent) {
+		viewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
+		viewer.setContentProvider(new ReviewsTreeContentProvider(steretotypeFilter));
+
+		// useful for the label provider
+		FontData[] boldFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.BOLD);
+		FontData[] italicFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.ITALIC);
+		Font boldFont = new Font(Display.getCurrent(), boldFontData);
+		Font italicFont = new Font(Display.getCurrent(), italicFontData);
+		// set label provider
+		viewer.setLabelProvider(new ReviewsTreeLabelProvider(boldFont, italicFont));
+		createActions();
+
+		Listener paintListener = makeTreeItemMultiline();
+		viewer.getTree().addListener(SWT.MeasureItem, paintListener);
+		viewer.getTree().addListener(SWT.EraseItem, paintListener);
+
+		// used to synchronize the selection on this view
+		getSite().setSelectionProvider(viewer);
+		ISelectionListener mylistener = new ISelectionListener() {
+			@Override
+			public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
+				if (sourcepart != RequirementView.this && selection instanceof IStructuredSelection) {
+					viewer.setInput(((IStructuredSelection) selection).getFirstElement());
+				}
+			}
+		};
+		getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(mylistener);
+
+	}
+
+	private Listener makeTreeItemMultiline() {
+		// this code comes from eclipse in oder to display multi line in a tree
+		Listener paintListener = new Listener() {
+			@Override
+			public void handleEvent(Event event) {
+				switch (event.type) {
+				case SWT.MeasureItem: {
+					TreeItem item = (TreeItem) event.item;
+					String text = item.getText();
+					Point size = event.gc.textExtent(text);
+					event.width = size.x + 20;
+					event.height = Math.max(event.height, size.y);
+					break;
+				}
+				case SWT.PaintItem: {
+					TreeItem item = (TreeItem) event.item;
+					String text = item.getText();
+					Point size = event.gc.textExtent(text);
+					int offset2 = event.index == 0 ? Math.max(0, (event.height - size.y) / 2) : 0;
+					event.gc.drawText(text, event.x, event.y + offset2, true);
+					break;
+				}
+				case SWT.EraseItem: {
+					event.detail &= ~SWT.FOREGROUND;
+					break;
+				}
+				}
+			}
+		};
+		return paintListener;
+	}
+
+	@Override
+	public String getContributorId() {
+		return "org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"; //$NON-NLS-1$
+	}
+
+	@Override
+	public void setFocus() {
+	}
+
+	@Override
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public Object getAdapter(Class adapter) {
+		if ((IPropertySheetPage.class.equals(adapter))) {
+			return getPropertySheetPage();
+		}
+
+		else {
+			return super.getAdapter(adapter);
+		}
+	}
+
+	/**
+	 * Retrieves the {@link IPropertySheetPage} that his Model Explorer uses.
+	 *
+	 * @return
+	 */
+	private IPropertySheetPage getPropertySheetPage() {
+		IWorkbenchPart part = null;
+		try {
+			IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			if (activeWorkbenchWindow != null) {
+				IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+				if (activePage != null) {
+					part = activePage.getActiveEditor();
+				}
+			}
+		} catch (NullPointerException e) {
+			// An element is not active yet
+			return null;
+		}
+
+
+		if (part instanceof IMultiDiagramEditor) {
+			if (part instanceof ITabbedPropertySheetPageContributor) {
+				ITabbedPropertySheetPageContributor contributor = (ITabbedPropertySheetPageContributor) part;
+				IPropertySheetPage propertySheetPage = new TabbedPropertySheetPage(contributor);
+				this.propertySheetPages.add(propertySheetPage);
+				return propertySheetPage;
+			}
+		}
+		return null;
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
new file mode 100644
index 0000000..a31c46f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
@@ -0,0 +1,133 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, 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:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.TraceabilityIndexer;
+import org.eclipse.uml2.uml.DirectedRelationship;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ * This is the content provider to display reviews in the review editor
+ *
+ */
+public class ReviewsTreeContentProvider implements ITreeContentProvider {
+
+	private static Object[] EMPTY = {};
+	private ArrayList<Class<?>> stereotypeFilter;
+
+	public ReviewsTreeContentProvider(ArrayList<Class<?>> stereotypeFilter) {
+		this.stereotypeFilter = stereotypeFilter;
+	}
+
+	@Override
+	public void dispose() {
+
+	}
+
+	@Override
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+	}
+
+	@Override
+	public Object[] getElements(Object inputElement) {
+
+		EObject eobject = EMFHelper.getEObject(inputElement);
+
+		if (eobject instanceof Element) {
+			TraceabilityIndexer.getInstance().loadTraceability((Element) eobject);
+			ArrayList<Element> result = new ArrayList<>();
+			if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject) != null) {
+
+				ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject);
+				for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+					DirectedRelationship directedRelationship = iterator.next();
+					result.addAll(directedRelationship.getTargets());
+				}
+			}
+			if (TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject) != null) {
+				result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject));
+			}
+			// return result.toArray();
+			return filter(result).toArray();
+
+		}
+
+		return EMPTY;
+	}
+
+	@Override
+	public Object[] getChildren(Object parentElement) {
+		return computeChildreen(parentElement);
+	}
+
+	private Object[] computeChildreen(Object parentElement) {
+		ArrayList<Element> result = new ArrayList<>();
+		if (parentElement instanceof Element) {
+			if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement) != null) {
+				ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement);
+				for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+					DirectedRelationship directedRelationship = iterator.next();
+					result.addAll(directedRelationship.getTargets());
+
+				}
+			}
+			if (TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement) != null) {
+				result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement));
+			}
+		}
+		// return result.toArray();
+		return filter(result).toArray();
+	}
+
+	@Override
+	public Object getParent(Object element) {
+		return null;
+	}
+
+	@Override
+	public boolean hasChildren(Object element) {
+
+		return computeChildreen(element).length > 0;
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	protected HashSet<Element> filter(Collection<Element> collection) {
+		HashSet<Element> result = new HashSet<>();
+		for (Iterator<Element> iterElement = collection.iterator(); iterElement.hasNext();) {
+			Element currentElement = iterElement.next();
+			for (Iterator<Class<?>> iterator = stereotypeFilter.iterator(); iterator.hasNext();) {
+				Class<?> stereoClass = iterator.next();
+				if (UMLUtil.getStereotypeApplication(currentElement, (Class) stereoClass) != null) {
+					result.add(currentElement);
+				}
+
+			}
+
+		}
+		return result;
+	}
+
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
new file mode 100644
index 0000000..6bb7ef4
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
@@ -0,0 +1,106 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, 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:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.GDPRRequiementHelper;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ *
+ * This is the label provider to display requirements in the view
+ */
+public class ReviewsTreeLabelProvider extends StyledCellLabelProvider {
+	protected Font italicFont;
+	protected Font boldFont;
+	private Styler fBoldStyler;
+	private Styler fItalicStyler;
+
+	/**
+	 * constructor
+	 *
+	 * @param boldFont
+	 * @param italicFont
+	 */
+	public ReviewsTreeLabelProvider(final Font boldFont, final Font italicFont) {
+		this.boldFont = boldFont;
+		this.italicFont = italicFont;
+		// Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
+		// With JFace 3.4, the font information (bold in this example) will be ignored.
+
+		fBoldStyler = new Styler() {
+
+			@Override
+			public void applyStyles(TextStyle textStyle) {
+				textStyle.font = boldFont;
+
+			}
+		};
+		fItalicStyler = new Styler() {
+
+			@Override
+			public void applyStyles(TextStyle textStyle) {
+				textStyle.font = italicFont;
+
+			}
+		};
+	}
+
+
+	/**
+	 * update visual appearance of a cell
+	 */
+	@Override
+	public void update(ViewerCell cell) {
+		Object obj = cell.getElement();
+
+		if (obj instanceof org.eclipse.uml2.uml.NamedElement) {
+			NamedElement namedElement = (NamedElement) obj;
+			StyledString styledString = new StyledString(""); //$NON-NLS-1$
+			// if no name
+			if (((org.eclipse.uml2.uml.NamedElement) obj).getName() == null) {
+				styledString.append("###"); //$NON-NLS-1$
+
+			} else {
+				// it has a name
+				styledString.append(((org.eclipse.uml2.uml.NamedElement) obj).getName() + ": ", fBoldStyler); //$NON-NLS-1$
+				Requirement reqStereotypeAppli = UMLUtil.getStereotypeApplication(namedElement, Requirement.class);
+				// this is a stereotype
+				if (reqStereotypeAppli != null) {
+					styledString.append(reqStereotypeAppli.getText(), fItalicStyler);
+				}
+			}
+
+			cell.setBackground(new Color(Display.getCurrent(), 255, 255, 200));
+			cell.setText(styledString.toString());
+			cell.setStyleRanges(styledString.getStyleRanges());
+			// this is a GDPR requirement
+			if (GDPRRequiementHelper.isGDPR_Requirement(namedElement)) {
+				cell.setBackground(new Color(Display.getCurrent(), 51, 204, 255));
+			}
+		}
+		super.update(cell);
+	}
+
+}
