diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java
index 5b268da..22149cf 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/IModelTransfo.java
@@ -83,5 +83,13 @@
 	 * @return
 	 */
 	public Command getInstantiateGDPRConsentPatternCommand(TransactionalEditingDomain domain, Activity process);
+	
+	/**
+	 * Instantiate a GDPR pattern to notify the data subject in case of personal data breach
+	 * @param domain
+	 * @param process
+	 * @return
+	 */
+	public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process);
 
 }
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java
index b9747af..39c62f2 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/api/ModelTransfoFactory.java
@@ -69,5 +69,11 @@
 		// TODO Auto-generated method stub
 		return factoryImpl.getInstantiateGDPRConsentPatternCommand(domain, process);
 	}
+	
+	@Override
+	public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process) {
+		// TODO Auto-generated method stub
+		return factoryImpl.getInstantiateGDPRNotificationsPatternCommand(domain, process);
+	}
 
 }
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java
new file mode 100644
index 0000000..86bc88e
--- /dev/null
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/InstantiateGDPRNotificationsPatternCommand.java
@@ -0,0 +1,39 @@
+/**
+ *  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:
+ *  CEA LIST - Initial API and implementation
+ *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
+ * 
+ */
+package org.eclipse.papyrus.pdp4eng.designer.controller.internal;
+
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.uml.properties.profile.ui.dialogs.ChooseSetStereotypeDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.uml2.uml.Activity;
+
+public class InstantiateGDPRNotificationsPatternCommand extends RecordingCommand {
+	
+	protected Activity Process;
+
+	public InstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity Process) {
+		super(domain, "Instantiate a Notifications Pattern based upon the information provided by the engineer");
+		this.Process = Process;
+	}
+	
+	@Override
+	protected void doExecute() {
+		ChooseSetStereotypeDialog dialog = new ChooseSetStereotypeDialog(Display.getCurrent().getActiveShell(), Process);
+		dialog.open();
+		System.out.printf("==>>"+Process.toString());
+	}
+}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java
index a55cdd4..0fb1a69 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.controller/src/org/eclipse/papyrus/pdp4eng/designer/controller/internal/ModelTransfoFactoryImpl.java
@@ -81,4 +81,9 @@
 		return new InstantiateGDPRConsentPatternCommand(domain, process);
 	}
 
+	@Override
+	public Command getInstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity process) {
+		return new InstantiateGDPRNotificationsPatternCommand(domain, process);
+	}
+
 }
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java
index a160208..a18cdf6 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/Activator.java
@@ -40,6 +40,7 @@
 		CatalogFactory catalogFactory= new CatalogFactory();
 		IStrategyCatalog catalog=catalogFactory.createCatalog("Process-oriented Strategies");
 		catalog.addStrategy(new InstantiateGDPRConsentPatternStrategy());
+		catalog.addStrategy(new InstantiateGDPRNotificationsPatternStrategy());
 		engineFactory.getCurrentEngine().connectACatalog(catalog);
 
 	}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java
new file mode 100644
index 0000000..863294e
--- /dev/null
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/InstantiateGDPRNotificationsPatternStrategy.java
@@ -0,0 +1,51 @@
+/**
+ *  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:
+ *  CEA LIST - Initial API and implementation
+ *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
+ * 
+ */
+package org.eclipse.papyrus.pdp4eng.designer.processstrategies;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.pdp4eng.designer.engine.api.IStrategy;
+import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.papyrus.pdp4eng.designer.processstrategies.command.InstantiateGDPRNotificationsPatternCommand;
+
+public class InstantiateGDPRNotificationsPatternStrategy implements  IStrategy {
+
+	@Override
+	public String getName() {
+		return "GDPRNotificationsPatternStrategy";
+	}
+
+	@Override
+	public String getGoal() {
+		return "Instantiate GDPR Notifications Pattern Strategy";
+	}
+
+	@Override
+	public boolean canBeApplied(Element element) {
+		if( element instanceof org.eclipse.uml2.uml.Activity) {return true;}
+		return false;
+	}
+
+	@Override
+	public Command getCommand(Element element, TransactionalEditingDomain domain) {
+		// TODO Auto-generated method stub
+		return new InstantiateGDPRNotificationsPatternCommand(domain, (Activity) element);
+
+	}
+
+}
+
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java
index ed39108..a8a9fed 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRConsentPatternCommand.java
@@ -24,15 +24,11 @@
 
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.window.Window;
-import org.eclipse.papyrus.pdp4eng.designer.controller.api.*;
-import org.eclipse.papyrus.pdp4eng.designer.controller.internal.processcreation.ProcessBuilder;
 import org.eclipse.jface.dialogs.InputDialog;
 import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.uml2.uml.Action;
 import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
 import org.eclipse.uml2.uml.ActivityParameterNode;
 import org.eclipse.uml2.uml.CallBehaviorAction;
 import org.eclipse.uml2.uml.Classifier;
@@ -81,34 +77,39 @@
 		String title = "1. Consent Pattern - Select the Controller";
 		String message = "1. Select the Controller responsible for processing Personal Data";
 		ExternalEntity selectedController = selectExternalEntityFromActivityDFD(title,message);
-		Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName());
-		Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor");
+		Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Controller");
 		applyStereotypeToNamedElement(controllerEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Controller);
-		applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor);
 		selectedController.setEntity(controllerEntity);
+		
+		title = "2. Consent Pattern - Select the Processor";
+		message = "2. Select the Processor managing and processing the Personal Data";
+		ExternalEntity selectedProcessor = selectExternalEntityFromActivityDFD(title,message);
+		Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor");
+		applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor);
+		selectedProcessor.setEntity(processorEntity);
 
-		title = "2. Consent Pattern - Select the Data Subject";
-		message = "2. Select the Data Subject to ask for Consent";
+		title = "3. Consent Pattern - Select the Data Subject";
+		message = "3. Select the Data Subject to ask for Consent";
 		ExternalEntity selectedDataSubject = selectExternalEntityFromActivityDFD(title, message);
 		Entity dataSubjectEntity = createEntity(selectedDataSubject.getBase_ActivityParameterNode().getName());
 		applyStereotypeToNamedElement(dataSubjectEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_DataSubject);
 		selectedDataSubject.setEntity(dataSubjectEntity);
 
-		title = "3. Consent Pattern - Select the Process";
-		message = "3. Select the Process concerned by the Consent";
+		title = "4. Consent Pattern - Select the Process";
+		message = "4. Select the Process concerned by the Consent";
 		CallProcess selectedCallProcess = selectCallProcessFromActivityDFD(title, message);
 		applyStereotypeToAction(selectedCallProcess.getBase_CallBehaviorAction(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Process);
 
-		title = "4. Consent Pattern - Declare the Purpose";
-		message = "4. Declare the Purpose for which Data is processed";
+		title = "5. Consent Pattern - Declare the Purpose";
+		message = "5. Declare the Purpose for which Data is processed";
 		InputDialog dialog = new InputDialog(Display.getCurrent().getActiveShell(),
 				title, message, "", null);
 		dialog.open();
 		String purposeTxt = dialog.getValue();
 		Purpose purpose = createPurpose(purposeTxt);
 
-		title = "5. Consent Pattern - Select the Personal Data";
-		message = "5. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName();
+		title = "6. Consent Pattern - Select the Personal Data";
+		message = "6. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName();
 		PersonalData selectedPersonalData = selectPersonalDataFromActivityDFD(title, message);
 
 		/** Start to instantiate the Consent Pattern by completing and filling the model **/
@@ -691,6 +692,12 @@
 		}
 	}
 
+	/**
+	 * Apply the a stereotype to Pin
+	 * @param pin
+	 * @param profileName
+	 * @param stereotypeName
+	 */
 	public void applyStereotypeToPin(Pin pin, String profileName, String stereotypeName) {
 		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
 		EList<Stereotype> appliedStypes = pin.getAppliedStereotypes();
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java
new file mode 100644
index 0000000..e047b7c
--- /dev/null
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.processstrategies/src/org/eclipse/papyrus/pdp4eng/designer/processstrategies/command/InstantiateGDPRNotificationsPatternCommand.java
@@ -0,0 +1,685 @@
+/**
+ *  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:
+ *  CEA LIST - Initial API and implementation
+ *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr
+ * 
+ */
+package org.eclipse.papyrus.pdp4eng.designer.processstrategies.command;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.widgets.Display;
+
+import org.eclipse.uml2.uml.Action;
+import org.eclipse.uml2.uml.Activity;
+import org.eclipse.uml2.uml.ActivityParameterNode;
+import org.eclipse.uml2.uml.CallBehaviorAction;
+import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.InputPin;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.ObjectFlow;
+import org.eclipse.uml2.uml.OutputPin;
+import org.eclipse.uml2.uml.Package;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Pin;
+import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.ProfileApplication;
+import org.eclipse.uml2.uml.Stereotype;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.UMLFactory;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.util.UMLUtil;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.CallProcess;
+import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.Entity;
+import org.eclipse.papyrus.pdp4eng.designer.profile.pdp4engDesign.ExternalEntity;
+import org.eclipse.papyrus.pdp4eng.designer.utils.ModelPackageNames;
+import org.eclipse.papyrus.pdp4eng.designer.utils.ModelProfileNames;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Controller;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.DataSubject;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PersonalData;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.PersonalDataBreach;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Processor;
+import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Process;
+
+public class InstantiateGDPRNotificationsPatternCommand extends RecordingCommand {
+
+	protected Activity activityDFD;
+
+	public InstantiateGDPRNotificationsPatternCommand(TransactionalEditingDomain domain, Activity activityDFD) {
+		super(domain, "Instantiate a Notifications Pattern based upon the information provided by the engineer");
+		this.activityDFD = activityDFD;
+	}
+
+	@Override
+	protected void doExecute() {
+
+		String title = "1. Notifications Pattern - Select the Controller";
+		String message = "1. Select the Controller responsible for processing Personal Data";
+		ExternalEntity selectedController = selectExternalEntityFromActivityDFD(title,message);
+		Entity controllerEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Controller");
+		applyStereotypeToNamedElement(controllerEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Controller);
+		selectedController.setEntity(controllerEntity);
+		
+		title = "2. Notifications Pattern - Select the Processor";
+		message = "2. Select the Processor managing and processing the Personal Data";
+		ExternalEntity selectedProcessor = selectExternalEntityFromActivityDFD(title,message);
+		Entity processorEntity = createEntity(selectedController.getBase_ActivityParameterNode().getName()+"_Processor");
+		applyStereotypeToNamedElement(processorEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Processor);
+		selectedProcessor.setEntity(processorEntity);
+
+		title = "3. Notifications Pattern - Select the Data Subject";
+		message = "3. Select the Data Subject concerned by the Personal Data breach";
+		ExternalEntity selectedDataSubject = selectExternalEntityFromActivityDFD(title, message);
+		Entity dataSubjectEntity = createEntity(selectedDataSubject.getBase_ActivityParameterNode().getName());
+		applyStereotypeToNamedElement(dataSubjectEntity.getBase_NamedElement(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_DataSubject);
+		selectedDataSubject.setEntity(dataSubjectEntity);
+
+		title = "4. Notifications Pattern - Select the Process";
+		message = "4. Select the Process concerned by the Personal Data breach";
+		CallProcess selectedCallProcess = selectCallProcessFromActivityDFD(title, message);
+		applyStereotypeToAction(selectedCallProcess.getBase_CallBehaviorAction(), ModelProfileNames.commonGDPRProfileName, ModelProfileNames.commonGDPR_Process);
+
+
+		title = "5. Notifications Pattern - Select the Personal Data";
+		message = "5. Select the Personal Data involved in "+ selectedCallProcess.getBase_CallBehaviorAction().getName();
+		PersonalData selectedPersonalData = selectPersonalDataFromActivityDFD(title, message);
+		
+		title = "6. Notifications Pattern - Declare the Breach";
+		message = "6. Declare the impact of the Breach on Personal Data";
+		InputDialog dialog = new InputDialog(Display.getCurrent().getActiveShell(),
+				title, message, "", null);
+		dialog.open();
+		String databreachTxt = dialog.getValue();
+		PersonalDataBreach personalDataBreach = createPersonalDataBreach(databreachTxt, selectedPersonalData);
+
+		/** Start to instantiate the Notifications Pattern by completing and filling the model **/
+
+		/** 1st. Controller (and Processor) **/
+		Controller controller = getController(controllerEntity.getBase_NamedElement());
+		Processor processor = getProcessor(processorEntity.getBase_NamedElement());
+
+		if ((controller!=null) && (processor!=null) && (selectedPersonalData!=null)) {
+			controller.getPersonalData().add(selectedPersonalData);
+			controller.getProcessor().add(processor);
+		}
+
+		/** 2nd. Data Subject **/
+		DataSubject dataSubject = getDataSubject(dataSubjectEntity.getBase_NamedElement());
+		if (dataSubject!=null && selectedPersonalData!=null) {	
+			dataSubject.getPersonalData().add(selectedPersonalData);
+		}
+
+		/** 3rd. Process **/
+		Process process = getProcess(selectedCallProcess.getBase_CallBehaviorAction());
+		if (process!=null) {
+			processor.getProcess().add(process);
+			process.getPersonaldata().add(selectedPersonalData);
+		}
+
+		/** INSTANTIATE THE NOTIFICATIONS PATTERN **/
+
+		/** Create a CallProcess **/
+		Activity newProcess= UMLFactory.eINSTANCE.createActivity();
+		String notificationsName = "GDPRNotifications_"+process.getBase_NamedElement().getName();
+		newProcess.setName(notificationsName);
+		Package DFDL1_Pkg = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.DFD_L1_PackageName);
+		if (DFDL1_Pkg!=null && newProcess!=null) {
+			//System.err.printf(DFDL1_Pkg.toString()+"\n\n\n");
+			//System.err.printf(newProcess.toString()+"\n\n\n");
+			DFDL1_Pkg.getPackagedElements().add(newProcess);
+			CallBehaviorAction notificationsCallBehaviorAction=UMLFactory.eINSTANCE.createCallBehaviorAction();
+			activityDFD.getOwnedNodes().add(notificationsCallBehaviorAction);
+			notificationsCallBehaviorAction.setName("GDPRNotifications_"+process.getBase_NamedElement().getName());
+			notificationsCallBehaviorAction.setBehavior(newProcess);
+			applyStereotypeToAction(notificationsCallBehaviorAction, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_CallProcess);
+
+			/** Add DataInput and DataOutput pins **/
+			InputPin inPin = UMLFactory.eINSTANCE.createInputPin();
+			OutputPin outPin = UMLFactory.eINSTANCE.createOutputPin();
+			if (inPin != null && outPin!=null) {
+				inPin.setType((Type) personalDataBreach.getBase_NamedElement());
+				outPin.setType((Type) personalDataBreach.getBase_NamedElement());
+				inPin.setName("InputPin1");
+				outPin.setName("OutputPin2");
+				notificationsCallBehaviorAction.getArguments().add(inPin);
+				notificationsCallBehaviorAction.getResults().add(outPin);
+				applyStereotypeToPin(inPin, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_DataInput);
+				applyStereotypeToPin(outPin, ModelProfileNames.PDPbDProfileName, ModelProfileNames.PDPbD_DataOutput);
+
+				/** Connect Controller entity to the DataInput pin **/
+				ObjectFlow dataFlowEdge1 = UMLFactory.eINSTANCE.createObjectFlow();
+				if (dataFlowEdge1 !=null) {
+					dataFlowEdge1.setName("Notifications_"+selectedController.getBase_ActivityParameterNode().getName());
+					dataFlowEdge1.setSource(selectedController.getBase_ActivityParameterNode());
+					dataFlowEdge1.setTarget(inPin);
+					activityDFD.getEdges().add(dataFlowEdge1);
+
+					/** Connect DataOutput pin to Data Subject entity **/
+					ObjectFlow dataFlowEdge2 = UMLFactory.eINSTANCE.createObjectFlow();
+					if (dataFlowEdge2!=null) {
+						dataFlowEdge2.setName("Notifications_"+selectedDataSubject.getBase_ActivityParameterNode().getName());
+						dataFlowEdge2.setSource(outPin);
+						dataFlowEdge2.setTarget(selectedDataSubject.getBase_ActivityParameterNode());
+						activityDFD.getEdges().add(dataFlowEdge2);
+
+						/** Completing Behavior Process **/
+						ActivityParameterNode parameterIn=UMLFactory.eINSTANCE.createActivityParameterNode();
+						if (parameterIn!=null) {
+							parameterIn.setName(inPin.getName());
+							parameterIn.setType(inPin.getType());
+							newProcess.getOwnedNodes().add(parameterIn);	
+						}
+
+						ActivityParameterNode parameterOut=UMLFactory.eINSTANCE.createActivityParameterNode();
+						if (parameterOut!=null) {
+							parameterOut.setName(outPin.getName());
+							parameterOut.setType(outPin.getType());
+							newProcess.getOwnedNodes().add(parameterOut);	
+						}
+					}
+				}
+			}	
+		}
+	}
+
+
+	/**
+	 * Verify whether the needed profiles have been already loaded in the model
+	 * @param profileList
+	 * @return
+	 */
+	public boolean verifyProfilesApplied(EList<Profile> profileList) {
+		boolean found = false; 
+		int noProfiles = 0;
+		for (Iterator<Profile> profileListIt = profileList.iterator(); profileListIt.hasNext() && noProfiles!=2;) {
+			Profile profile = profileListIt.next();
+			if (profile!=null) {
+				String profileName = profile.getName(); 
+				switch (profileName) {
+				case "pdp4engDesign": 
+					noProfiles++;
+					break;
+
+				case "pdp4engCommonGDPR":
+					noProfiles++;
+					break;
+
+				}
+			}
+		}
+		if (noProfiles==2) {
+			found=true;
+		}
+		return found;
+	}
+
+	/**
+	 * Return the profile with the given name or null elsewhere
+	 * @param profileName
+	 * @return
+	 */
+	public Profile getProfile(String profileName) {
+		Profile profile = null;
+		for (ProfileApplication profileApplication : this.activityDFD.getModel().getProfileApplications()) {
+			profile = profileApplication.getAppliedProfile();
+			if (profile.getName().equals(profileName)){
+				return profile;
+			}
+		}
+		return profile;
+	}
+
+	/**
+	 * Create a Package with the given name.
+	 * @param packageName
+	 */
+	public void createIfMissingPackage(String packageName){
+		PackageableElement targetPackage = this.activityDFD.getModel().getPackagedElement(packageName);
+		if (targetPackage==null || !targetPackage.getName().equals(packageName)){
+			this.activityDFD.getModel().createPackagedElement(packageName, UMLPackage.eINSTANCE.getPackage());
+		}
+	}
+
+
+	/**
+	 * Shows all the Call Process associated to an Activity DFD. Returns the CallProcess selected by the user.
+	 * @return
+	 */
+	CallProcess selectCallProcessFromActivityDFD(String title, String message) {
+		CallProcess selectedCallProcess  = null;
+		EList<Action> selectedCallProcList = new BasicEList<Action>();
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName);
+			EList<Element> elementList = this.activityDFD.getNearestPackage().allOwnedElements();
+			if (elementList!=null && PDPbDprofile!=null) {
+				for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) {
+					Element element = elementListIt.next();
+					EList<Stereotype> elementStypesList = element.getAppliedStereotypes();
+					for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) {
+						Stereotype stype = elementStypeListIt.next();
+						if (stype!=null && stype.getName().equals(ModelProfileNames.PDPbD_CallProcess)) {
+							if (element instanceof org.eclipse.uml2.uml.Action) {
+								Action actionElmt = (Action) element;
+								System.out.printf("CallProcess Name: "+actionElmt.getName()+"\n");
+								if (!selectedCallProcList.contains(actionElmt)) {
+									selectedCallProcList.add(actionElmt);	
+								}	
+							}
+						}	
+					}
+				}
+			}
+		}
+
+		Object[] objList = new Object[selectedCallProcList.size()];
+		Iterator<Action> selectedElementListIt = selectedCallProcList.iterator();
+		for  (int i=0; selectedElementListIt.hasNext()&& i<objList.length; i++) {
+			Action callProc = selectedElementListIt.next();
+			objList[i] = callProc.getName();
+		}
+
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); 
+		dialog.setElements(objList);
+		dialog.setTitle(title);
+		dialog.setMessage(message);
+		dialog.setHelpAvailable(true);
+
+		if (dialog.open() != Window.OK) {
+			System.out.printf(">> A problem opening the CallProcess Window");
+		}
+
+		Object[] resultList = dialog.getResult();
+		if (resultList!=null && resultList.length>0) {
+			Object result = resultList[0];
+			for  (Iterator<Action> selectedElementListIt1 = selectedCallProcList.iterator(); selectedElementListIt1.hasNext();) {
+				Action callProc = selectedElementListIt1.next();
+				if (callProc.getName().equals(result)){
+					selectedCallProcess = UMLUtil.getStereotypeApplication(callProc,CallProcess.class) ;
+				}
+			}
+		}
+		return selectedCallProcess;
+	}
+
+	/**
+	 * Shows all the External Entities associated to an Activity DFD. Returns the ExternalEntity selected by the user.
+	 * @return
+	 */
+	ExternalEntity selectExternalEntityFromActivityDFD(String title, String message) {
+		ExternalEntity selectedEEntity  = null;
+		EList<ActivityParameterNode> selectedEEntityList = new BasicEList<ActivityParameterNode>();
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName);
+			EList<Element> elementList = this.activityDFD.getNearestPackage().allOwnedElements();
+			if (elementList!=null && PDPbDprofile!=null) {
+				for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) {
+					Element element = elementListIt.next();
+					EList<Stereotype> elementStypesList = element.getAppliedStereotypes();
+					for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) {
+						Stereotype stype = elementStypeListIt.next();
+						if (stype!=null && stype.getName().equals(ModelProfileNames.PDPbD_ExternalEntity)) {
+							if (element instanceof org.eclipse.uml2.uml.ActivityParameterNode) {
+								ActivityParameterNode activityParameterNodeElmt = (ActivityParameterNode) element;
+								System.out.printf("ExternalEntity Name: "+activityParameterNodeElmt.getName()+"\n");
+								if (!selectedEEntityList.contains(activityParameterNodeElmt)) {
+									selectedEEntityList.add(activityParameterNodeElmt);	
+								}	
+							}
+						}	
+					}
+				}
+			}
+		}
+
+		Object[] objList = new Object[selectedEEntityList.size()];
+		Iterator<ActivityParameterNode> selectedEEntityListIt = selectedEEntityList.iterator();
+		for  (int i=0; selectedEEntityListIt.hasNext()&& i<objList.length; i++) {
+			ActivityParameterNode extEntity = selectedEEntityListIt.next();
+			objList[i] = extEntity.getName();
+		}
+
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); 
+		dialog.setElements(objList);
+		dialog.setTitle(title);
+		dialog.setMessage(message);
+		dialog.setHelpAvailable(true);
+
+		if (dialog.open() != Window.OK) {
+			System.out.printf(">> A problem opening the ExternalEntity Window");
+		}
+
+		Object[] resultList = dialog.getResult();
+		if (resultList!=null && resultList.length>0) {
+			Object result = resultList[0];
+			for  (Iterator<ActivityParameterNode> selectedEEntityListIt1 = selectedEEntityList.iterator(); selectedEEntityListIt1.hasNext();) {
+				ActivityParameterNode activityParamNode = selectedEEntityListIt1.next();
+				if (activityParamNode.getName().equals(result)){
+					selectedEEntity = UMLUtil.getStereotypeApplication(activityParamNode,ExternalEntity.class);
+				}
+			}
+		}
+		return selectedEEntity;
+	}
+
+	/**
+	 * hows all the Data associated to an Activity DFD. Stereotypes the selected Data as Personal and returns them.
+	 * @param title
+	 * @param message
+	 * @return
+	 */
+	PersonalData selectPersonalDataFromActivityDFD(String title, String message) {
+		PersonalData selectedPersonalData  = null;
+		EList<Classifier> selectedPersonalDataList = new BasicEList<Classifier>();
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile PDPbDprofile = getProfile(ModelProfileNames.PDPbDProfileName);
+			EList<Element> elementList = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Data_PackageName).allOwnedElements();
+			if (elementList!=null && PDPbDprofile!=null) {
+				for (Iterator<Element> elementListIt = elementList.iterator(); elementListIt.hasNext();) {
+					Element element = elementListIt.next();
+					EList<Stereotype> elementStypesList = element.getAppliedStereotypes();
+					for (Iterator<Stereotype> elementStypeListIt = elementStypesList.iterator(); elementStypeListIt.hasNext();) {
+						Stereotype stype = elementStypeListIt.next();
+						if (stype!=null && stype.getName().equals(ModelProfileNames.commonGDPR_PersonalData)) {
+							if (element instanceof org.eclipse.uml2.uml.Classifier) {
+								Classifier classElmt = (Classifier) element;
+								System.out.printf("PersonalData Name: "+classElmt.getName()+"\n");
+								if (!selectedPersonalDataList.contains(classElmt)) {
+									selectedPersonalDataList.add(classElmt);	
+								}	
+							}
+						}	
+					}
+				}
+			}
+		}
+
+		Object[] objList = new Object[selectedPersonalDataList.size()];
+		Iterator<Classifier> selectedPersonalDataListIt = selectedPersonalDataList.iterator();
+		for  (int i=0; selectedPersonalDataListIt.hasNext()&& i<objList.length; i++) {
+			Classifier extEntity = selectedPersonalDataListIt.next();
+			objList[i] = extEntity.getName();
+		}
+
+		ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new LabelProvider()); 
+		dialog.setElements(objList);
+		dialog.setTitle(title);
+		dialog.setMessage(message);
+		dialog.setHelpAvailable(true);
+
+		if (dialog.open() != Window.OK) {
+			System.out.printf(">> A problem opening the PersonalData Window");
+		}
+
+		Object[] resultList = dialog.getResult();
+		if (resultList!=null && resultList.length>0) {
+			Object result = resultList[0];
+			for  (Iterator<Classifier> selectedPersonalDataListIt1 = selectedPersonalDataList.iterator(); selectedPersonalDataListIt1.hasNext();) {
+				Classifier activityParamNode = selectedPersonalDataListIt1.next();
+				if (activityParamNode.getName().equals(result)){
+					selectedPersonalData = UMLUtil.getStereotypeApplication(activityParamNode,PersonalData.class);
+				}
+			}
+		}
+		return selectedPersonalData;
+	}
+
+	/**
+	 * Create a PersonalDataBreach element with the given impact description within the Data package
+	 * @param name
+	 * @return
+	 */
+	PersonalDataBreach createPersonalDataBreach(String dataBreach, PersonalData breachedData) {
+		PersonalDataBreach personalDataBreach = null;
+		createIfMissingPackage(ModelPackageNames.Data_PackageName );
+		Classifier personalDataBreachCls = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Data_PackageName).
+				createOwnedClass("DataBreach_"+dataBreach+"_"+breachedData.getBase_NamedElement().getName(), false);
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName);
+			if (commonProfile!=null){
+				Stereotype personalDataBreachStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_PersonalDataBreach);
+				if (personalDataBreachStype!=null){
+					UMLUtil.safeApplyStereotype(personalDataBreachCls, personalDataBreachStype);
+					personalDataBreach = UMLUtil.getStereotypeApplication(personalDataBreachCls, PersonalDataBreach.class);
+					if (dataBreach!=null && dataBreach.length()>0) {
+						personalDataBreach.setBreachImpact(dataBreach);	
+					}
+					if (breachedData!=null && !personalDataBreach.getConcernedPersonalData().contains(breachedData)) {
+						personalDataBreach.getConcernedPersonalData().add(breachedData);
+					}
+				}
+			}
+		}
+		return personalDataBreach;
+	}
+
+	/**
+	 * Create an Entity with the given name within the Stakeholders package
+	 * @param name
+	 * @return
+	 */
+	Entity createEntity(String name) {
+		Entity entity = null;
+		createIfMissingPackage(ModelPackageNames.Stakeholder_PackageName);
+		Classifier entityCls = this.activityDFD.getModel().getNestedPackage(ModelPackageNames.Stakeholder_PackageName).
+				createOwnedClass(name, false);
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.PDPbDProfileName);
+			if (commonProfile!=null){
+				Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.PDPbD_Entity);
+				if (entityStype!=null){
+					UMLUtil.safeApplyStereotype(entityCls, entityStype);
+					entity = UMLUtil.getStereotypeApplication(entityCls, Entity.class);
+				}
+			}
+		}
+		return entity;
+	}
+
+	/**
+	 * Get the controller of an Entity
+	 * @param entityCls
+	 * @return
+	 */
+	Controller getController(NamedElement entityCls) {
+		Controller controller = null;
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName);
+			if (commonProfile!=null){
+				Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Controller);
+				if (entityStype!=null){
+					UMLUtil.safeApplyStereotype(entityCls, entityStype);
+					controller = UMLUtil.getStereotypeApplication(entityCls, Controller.class);
+				}
+			}
+		}
+		return controller;
+	}
+
+	/**
+	 * Get the processor of an Entity
+	 * @param entityCls
+	 * @return
+	 */
+	Processor getProcessor(NamedElement entityCls) {
+		Processor processor = null;
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName);
+			if (commonProfile!=null){
+				Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Processor);
+				if (entityStype!=null){
+					UMLUtil.safeApplyStereotype(entityCls, entityStype);
+					processor = UMLUtil.getStereotypeApplication(entityCls, Processor.class);
+				}
+			}
+		}
+		return processor;
+	}
+
+	/**
+	 * Get the Data Subject of an Entity
+	 * @param entityCls
+	 * @return
+	 */
+	DataSubject getDataSubject(NamedElement entityCls) {
+		DataSubject dataSubject = null;
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName);
+			if (commonProfile!=null){
+				Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_DataSubject);
+				if (entityStype!=null){
+					UMLUtil.safeApplyStereotype(entityCls, entityStype);
+					dataSubject = UMLUtil.getStereotypeApplication(entityCls, DataSubject.class);
+				}
+			}
+		}
+		return dataSubject;
+	}
+
+	/**
+	 * Get the process of a CallBehaviorAction
+	 * @param entityCls
+	 * @return
+	 */
+	Process getProcess(CallBehaviorAction callBehaviorAction) {
+		Process process = null;
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		if (verifyProfilesApplied(profileList)) {
+			Profile commonProfile = getProfile(ModelProfileNames.commonGDPRProfileName);
+			if (commonProfile!=null){
+				Stereotype entityStype = commonProfile.getOwnedStereotype(ModelProfileNames.commonGDPR_Process);
+				if (entityStype!=null){
+					UMLUtil.safeApplyStereotype(callBehaviorAction, entityStype);
+					process = UMLUtil.getStereotypeApplication(callBehaviorAction, Process.class);
+				}
+			}
+		}
+		return process;
+	}
+
+	/**
+	 * Safely apply the a stereotype to an ActivityParameterNode
+	 * @param classifier
+	 * @param stereotype
+	 */
+	public void applyStereotypeToActivityParameterNode(ActivityParameterNode activityPNode, String profileName, String stereotypeName) {
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		EList<Stereotype> appliedStypes = activityPNode.getAppliedStereotypes();
+		if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && activityPNode!=null) {
+			Profile profile = getProfile(profileName);
+			if (profile!=null){
+				Stereotype stereotype = profile.getOwnedStereotype(stereotypeName);
+				if (stereotype!=null && !appliedStypes.contains(stereotype)){
+					UMLUtil.safeApplyStereotype(activityPNode, stereotype);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Safely apply the a stereotype to a Classifier
+	 * @param classifier
+	 * @param profileName
+	 * @param stereotypeName
+	 */
+	public void applyStereotypeToClassifier(Classifier classifier, String profileName, String stereotypeName) {
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		EList<Stereotype> appliedStypes = classifier.getAppliedStereotypes();
+		if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && classifier!=null) {
+			Profile profile = getProfile(profileName);
+			if (profile!=null){
+				Stereotype stereotype = profile.getOwnedStereotype(stereotypeName);
+				if (stereotype!=null && !appliedStypes.contains(stereotype)){
+					UMLUtil.safeApplyStereotype(classifier, stereotype);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Safely apply the a stereotype to a NamedElement
+	 * @param namedElement
+	 * @param profileName
+	 * @param stereotypeName
+	 */
+	public void applyStereotypeToNamedElement(NamedElement namedElement, String profileName, String stereotypeName) {
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		EList<Stereotype> appliedStypes = namedElement.getAppliedStereotypes();
+		if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && namedElement!=null) {
+			Profile profile = getProfile(profileName);
+			if (profile!=null){
+				Stereotype stereotype = profile.getOwnedStereotype(stereotypeName);
+				if (stereotype!=null && !appliedStypes.contains(stereotype)){
+					UMLUtil.safeApplyStereotype(namedElement, stereotype);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Safely apply the a stereotype to an Action node
+	 * @param action
+	 * @param profileName
+	 * @param stereotypeName
+	 */
+	public void applyStereotypeToAction(Action action, String profileName, String stereotypeName) {
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		EList<Stereotype> appliedStypes = action.getAppliedStereotypes();
+		if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && action!=null) {
+			Profile profile = getProfile(profileName);
+			if (profile!=null){
+				Stereotype stereotype = profile.getOwnedStereotype(stereotypeName);
+				if (stereotype!=null && !appliedStypes.contains(stereotype)){
+					UMLUtil.safeApplyStereotype(action, stereotype);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Apply the a stereotype to Pin
+	 * @param pin
+	 * @param profileName
+	 * @param stereotypeName
+	 */
+	public void applyStereotypeToPin(Pin pin, String profileName, String stereotypeName) {
+		EList<Profile> profileList = this.activityDFD.getModel().getAppliedProfiles();
+		EList<Stereotype> appliedStypes = pin.getAppliedStereotypes();
+		if (verifyProfilesApplied(profileList) && profileName!=null && stereotypeName!=null && pin!=null) {
+			Profile profile = getProfile(profileName);
+			if (profile!=null){
+				Stereotype stereotype = profile.getOwnedStereotype(stereotypeName);
+				if (stereotype!=null && !appliedStypes.contains(stereotype)){
+					UMLUtil.safeApplyStereotype(pin, stereotype);
+				}
+			}
+		}
+	}
+}
diff --git a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java
index 2e7be81..151971d 100644
--- a/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java
+++ b/plugins/design/org.eclipse.papyrus.pdp4eng.designer.utils/src/org/eclipse/papyrus/pdp4eng/designer/utils/ModelProfileNames.java
@@ -48,4 +48,6 @@
 	public static String commonGDPR_PersonalData = "PersonalData";
 	
 	public static String commonGDPR_Consent = "Consent";
+	
+	public static String commonGDPR_PersonalDataBreach = "PersonalDataBreach";
 }
