/// <summary>
		/// Adds a proto element to the current element.
		/// </summary>
		/// <param name="protoElement">Proto element representation of the element that is to be added.</param>
		/// <param name="groupMerger">
		/// Group merger class used to track id mapping, merge errors/warnings and 
		/// postprocess merging by rebuilding reference relationships.
		/// </param>
		/// <param name="isRoot">Root element?</param>
		public virtual void ModelMerge(DslEditorModeling::ModelProtoElement protoElement, DslEditorModeling::ModelProtoGroupMerger groupMerger, bool isRoot)
		{
			if( !ModelIsPasteAllowed(groupMerger.ProtoGroup.Operation) )
			{
				// add warning message
				groupMerger.MergeResult.AddMessage(new DslEditorModeling::ValidationMessage("ModelMergePasteDisallowedId",
		                     DslEditorModeling.ModelValidationViolationType.Warning, "Element couldn't be addded to DiagramClassView because paste is not allowed."));
				return;
			}
			if (protoElement != null)
			{
				DslModeling::DomainClassInfo elementDomainInfo = this.Partition.DomainDataDirectory.GetDomainClass(protoElement.DomainClassId);
				if (elementDomainInfo.IsDerivedFrom(global::Tum.PDE.LanguageDSL.RootDiagramNode.DomainClassId)) 
				{
					// get element id
					System.Guid newElementId = System.Guid.NewGuid();
					
					// create property assignments
					DslModeling::PropertyAssignment[] propertyAssignemnts = protoElement.GetPropertyAssignments(this.Store.DefaultPartition, newElementId);
					
		            // create the actual model element
					global::Tum.PDE.LanguageDSL.RootDiagramNode element = null;			
					if( global::Tum.PDE.LanguageDSL.RootDiagramNode.DomainClassId == elementDomainInfo.Id )
						element = new global::Tum.PDE.LanguageDSL.RootDiagramNode(this.Store, propertyAssignemnts);
					if( element == null )
						throw new System.ArgumentNullException("Element is null in ModelMerge: " + elementDomainInfo.Name);
					
					if( !element.ModelIsPasteAllowed(groupMerger.ProtoGroup.Operation) )
					{
						// add warning message
						groupMerger.MergeResult.AddMessage(new DslEditorModeling.ValidationMessage("ModelMergePasteDisallowedId",
		                     DslEditorModeling.ModelValidationViolationType.Warning, "Element couldn't be addded to DiagramClassView because paste is not allowed."));
						
						element.Delete();
						return;
		 			}
					
					if( isRoot && groupMerger.ProtoGroup.Operation != DslEditorModeling.ModelProtoGroupOperation.Move)
					{
						//element.Name = "Copy of " + element.Name;
					}
					
					// update id mapping
					groupMerger.SetIdMapping(protoElement.ElementId, newElementId);
					
					// add child element
					GetRoleCollection<DslModeling::LinkedElementCollection<global::Tum.PDE.LanguageDSL.RootDiagramNode>, global::Tum.PDE.LanguageDSL.RootDiagramNode>(global::Tum.PDE.LanguageDSL.DiagramClassViewHasRootDiagramNodes.DiagramClassViewDomainRoleId).Add(element);
		
					// continue with child elements (Embedding Relationship)
					System.Collections.Generic.List<DslEditorModeling::ModelProtoElement> embeddedProtoElements = groupMerger.GetEmbeddedElements(this.Store.DefaultPartition, protoElement);
					if( embeddedProtoElements.Count > 0 )
					{
						foreach (DslEditorModeling::ModelProtoElement p in embeddedProtoElements)
							(element as DslEditorModeling::IModelMergeElements).ModelMerge(p, groupMerger, false);
					}
				}
			}
		}