<%if (!UML2GenModelUtil.getSubsetGenFeatures(genClass, genFeature, false, false).isEmpty() || !UML2GenModelUtil.getSupersetGenFeatures(genClass, genFeature, false, true).isEmpty()) {%>
		<%=genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource")%>.Internal eInternalResource = eInternalResource();
		if (eInternalResource == null || !eInternalResource.isLoading()) {
  <%for (Iterator subsetGenFeatures = UML2GenModelUtil.getSubsetGenFeatures(genClass, genFeature, false, false).iterator(); subsetGenFeatures.hasNext(); ) { GenFeature subsetGenFeature = (GenFeature) subsetGenFeatures.next();%>
    <%if (subsetGenFeature.isContainer()) {%>
			<%=subsetGenFeature.getImportedType()%> <%=subsetGenFeature.getSafeName()%> = <%=subsetGenFeature.isBasicGet() ? "basicGet" + subsetGenFeature.getAccessorName() : subsetGenFeature.getGetAccessor()%>();
    <%} else if (genClass.getImplementingGenModel(subsetGenFeature).isVirtualDelegation()) {%>
			Object <%=subsetGenFeature.getSafeName()%> = eVirtualGet(<%=genClass.getQualifiedFeatureID(subsetGenFeature)%>);
    <%}%>
			if (<%=subsetGenFeature.getSafeName()%> != null && <%=subsetGenFeature.getSafeName()%> != new<%=genFeature.getCapName()%>)
			{
				set<%=subsetGenFeature.getAccessorName()%>(null);
			}
  <%}%>
  <%for (Iterator supersetGenFeatures = UML2GenModelUtil.getSupersetGenFeatures(genClass, genFeature, false, true).iterator(); supersetGenFeatures.hasNext(); ) { GenFeature supersetGenFeature = (GenFeature) supersetGenFeatures.next();%>
			if (new<%=genFeature.getCapName()%> != null)
			{
    <%if (supersetGenFeature.isListType()) {%>
				<%=supersetGenFeature.getImportedType()%> <%=supersetGenFeature.getSafeName()%> = <%=supersetGenFeature.getGetAccessor()%>();
				if (!<%=supersetGenFeature.getSafeName()%>.contains(new<%=genFeature.getCapName()%>))
				{
					<%=supersetGenFeature.getSafeName()%>.add(new<%=genFeature.getCapName()%>);
				}
    <%} else {%>
      <%if (supersetGenFeature.isContainer()) {%>
				<%=supersetGenFeature.getImportedType()%> <%=supersetGenFeature.getSafeName()%> = <%=supersetGenFeature.isBasicGet() ? "basicGet" + supersetGenFeature.getAccessorName() : supersetGenFeature.getGetAccessor()%>();
      <%} else if (genClass.getImplementingGenModel(supersetGenFeature).isVirtualDelegation()) {%>
				Object <%=supersetGenFeature.getSafeName()%> = eVirtualGet(<%=genClass.getQualifiedFeatureID(supersetGenFeature)%>);
      <%}%>
				if (new<%=genFeature.getCapName()%> != <%=supersetGenFeature.getSafeName()%>)
				{
					set<%=supersetGenFeature.getAccessorName()%>(new<%=genFeature.getCapName()%>);
				}
    <%}%>
			}
  <%}%>
		}
<%}%>