diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessContext.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessContext.java
index d36adef..a0d412b 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessContext.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessContext.java
@@ -29,103 +29,103 @@
 public interface AccessContext extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Name</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Name</em>' attribute.
-   * @see #setName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_Name()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Name</em>' attribute.
+    * @see #setName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_Name()
+    * @model
+    * @generated
+    */
   String getName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Name</em>' attribute.
-   * @see #getName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Name</em>' attribute.
+    * @see #getName()
+    * @generated
+    */
   void setName(String value);
 
   /**
-   * Returns the value of the '<em><b>Super Access Contexts</b></em>' reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Super Access Contexts</b></em>' reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Super Access Contexts</em>' reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Super Access Contexts</em>' reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_SuperAccessContexts()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Super Access Contexts</em>' reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_SuperAccessContexts()
+    * @model
+    * @generated
+    */
   EList<AccessContext> getSuperAccessContexts();
 
   /**
-   * Returns the value of the '<em><b>Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Guid</em>' attribute.
-   * @see #setGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_Guid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Guid</em>' attribute.
+    * @see #setGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_Guid()
+    * @model
+    * @generated
+    */
   String getGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid <em>Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid <em>Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Guid</em>' attribute.
-   * @see #getGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Guid</em>' attribute.
+    * @see #getGuid()
+    * @generated
+    */
   void setGuid(String value);
 
   /**
-   * Returns the value of the '<em><b>Access Rules</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Access Rules</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Access Rules</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Access Rules</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_AccessRules()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Access Rules</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_AccessRules()
+    * @model containment="true"
+    * @generated
+    */
   EList<ObjectRestriction> getAccessRules();
 
   /**
-   * Returns the value of the '<em><b>Hierarchy Restrictions</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Hierarchy Restrictions</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Hierarchy Restrictions</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Hierarchy Restrictions</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_HierarchyRestrictions()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Hierarchy Restrictions</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAccessContext_HierarchyRestrictions()
+    * @model containment="true"
+    * @generated
+    */
   EList<HierarchyRestriction> getHierarchyRestrictions();
 
 } // AccessContext
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessPermissionEnum.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessPermissionEnum.java
index a770e9e..5cb5fb9 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessPermissionEnum.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AccessPermissionEnum.java
@@ -20,204 +20,198 @@
 public enum AccessPermissionEnum implements Enumerator
 {
   /**
-   * The '<em><b>ALLOW</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ALLOW</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ALLOW_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ALLOW_VALUE
+    * @generated
+    * @ordered
+    */
   ALLOW(0, "ALLOW", "ALLOW"),
 
   /**
-   * The '<em><b>DENY</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>DENY</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #DENY_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #DENY_VALUE
+    * @generated
+    * @ordered
+    */
   DENY(1, "DENY", "DENY");
 
   /**
-   * The '<em><b>ALLOW</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ALLOW</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>ALLOW</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ALLOW
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #ALLOW
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int ALLOW_VALUE = 0;
 
   /**
-   * The '<em><b>DENY</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>DENY</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>DENY</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #DENY
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #DENY
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int DENY_VALUE = 1;
 
   /**
-   * An array of all the '<em><b>Access Permission Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>Access Permission Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final AccessPermissionEnum[] VALUES_ARRAY =
-    new AccessPermissionEnum[]
-    {
-      ALLOW,
-      DENY,
-    };
+    new AccessPermissionEnum[] {
+         ALLOW,
+         DENY,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>Access Permission Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>Access Permission Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<AccessPermissionEnum> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static AccessPermissionEnum get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      AccessPermissionEnum result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         AccessPermissionEnum result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static AccessPermissionEnum getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      AccessPermissionEnum result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         AccessPermissionEnum result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Access Permission Enum</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static AccessPermissionEnum get(int value)
   {
-    switch (value)
-    {
-      case ALLOW_VALUE: return ALLOW;
-      case DENY_VALUE: return DENY;
-    }
-    return null;
-  }
+      switch (value) {
+         case ALLOW_VALUE: return ALLOW;
+         case DENY_VALUE: return DENY;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private AccessPermissionEnum(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //AccessPermissionEnum
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddAttribute.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddAttribute.java
index e74d70d..7dd0513 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddAttribute.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddAttribute.java
@@ -22,29 +22,29 @@
 public interface AddAttribute extends AttributeOverrideOption
 {
   /**
-   * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Attribute</em>' containment reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Attribute</em>' containment reference.
-   * @see #setAttribute(XAttributeTypeRef)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddAttribute_Attribute()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Attribute</em>' containment reference.
+    * @see #setAttribute(XAttributeTypeRef)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddAttribute_Attribute()
+    * @model containment="true"
+    * @generated
+    */
   XAttributeTypeRef getAttribute();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute <em>Attribute</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute <em>Attribute</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Attribute</em>' containment reference.
-   * @see #getAttribute()
-   * @generated
-   */
+    * @param value the new value of the '<em>Attribute</em>' containment reference.
+    * @see #getAttribute()
+    * @generated
+    */
   void setAttribute(XAttributeTypeRef value);
 
 } // AddAttribute
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddEnum.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddEnum.java
index d49bbc4..a352979 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddEnum.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AddEnum.java
@@ -25,107 +25,107 @@
 public interface AddEnum extends OverrideOption
 {
   /**
-   * Returns the value of the '<em><b>Enum Entry</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Entry</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Entry</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Entry</em>' attribute.
-   * @see #setEnumEntry(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_EnumEntry()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Enum Entry</em>' attribute.
+    * @see #setEnumEntry(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_EnumEntry()
+    * @model
+    * @generated
+    */
   String getEnumEntry();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry <em>Enum Entry</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry <em>Enum Entry</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Enum Entry</em>' attribute.
-   * @see #getEnumEntry()
-   * @generated
-   */
+    * @param value the new value of the '<em>Enum Entry</em>' attribute.
+    * @see #getEnumEntry()
+    * @generated
+    */
   void setEnumEntry(String value);
 
   /**
-   * Returns the value of the '<em><b>Ordinal</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Ordinal</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Ordinal</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Ordinal</em>' attribute.
-   * @see #setOrdinal(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_Ordinal()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Ordinal</em>' attribute.
+    * @see #setOrdinal(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_Ordinal()
+    * @model
+    * @generated
+    */
   String getOrdinal();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Ordinal</em>' attribute.
-   * @see #getOrdinal()
-   * @generated
-   */
+    * @param value the new value of the '<em>Ordinal</em>' attribute.
+    * @see #getOrdinal()
+    * @generated
+    */
   void setOrdinal(String value);
 
   /**
-   * Returns the value of the '<em><b>Entry Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Entry Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Entry Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Entry Guid</em>' attribute.
-   * @see #setEntryGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_EntryGuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Entry Guid</em>' attribute.
+    * @see #setEntryGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_EntryGuid()
+    * @model
+    * @generated
+    */
   String getEntryGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Entry Guid</em>' attribute.
-   * @see #getEntryGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Entry Guid</em>' attribute.
+    * @see #getEntryGuid()
+    * @generated
+    */
   void setEntryGuid(String value);
 
   /**
-   * Returns the value of the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Description</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Description</em>' attribute.
-   * @see #setDescription(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_Description()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Description</em>' attribute.
+    * @see #setDescription(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAddEnum_Description()
+    * @model
+    * @generated
+    */
   String getDescription();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Description</em>' attribute.
-   * @see #getDescription()
-   * @generated
-   */
+    * @param value the new value of the '<em>Description</em>' attribute.
+    * @see #getDescription()
+    * @generated
+    */
   void setDescription(String value);
 
 } // AddEnum
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactMatchRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactMatchRestriction.java
index 6930766..1a96a07 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactMatchRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactMatchRestriction.java
@@ -22,29 +22,29 @@
 public interface ArtifactMatchRestriction extends ObjectRestriction
 {
   /**
-   * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Matcher Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #setArtifactMatcherRef(XArtifactMatcher)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getArtifactMatchRestriction_ArtifactMatcherRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #setArtifactMatcherRef(XArtifactMatcher)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getArtifactMatchRestriction_ArtifactMatcherRef()
+    * @model
+    * @generated
+    */
   XArtifactMatcher getArtifactMatcherRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #getArtifactMatcherRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #getArtifactMatcherRef()
+    * @generated
+    */
   void setArtifactMatcherRef(XArtifactMatcher value);
 
 } // ArtifactMatchRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactTypeRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactTypeRestriction.java
index 5a932e9..da7c07f 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactTypeRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ArtifactTypeRestriction.java
@@ -22,29 +22,29 @@
 public interface ArtifactTypeRestriction extends ObjectRestriction
 {
   /**
-   * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #setArtifactTypeRef(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getArtifactTypeRestriction_ArtifactTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #setArtifactTypeRef(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getArtifactTypeRestriction_ArtifactTypeRef()
+    * @model
+    * @generated
+    */
   XArtifactType getArtifactTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #getArtifactTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #getArtifactTypeRef()
+    * @generated
+    */
   void setArtifactTypeRef(XArtifactType value);
 
 } // ArtifactTypeRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AttributeTypeRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AttributeTypeRestriction.java
index afbbe5e..53a0832 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AttributeTypeRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/AttributeTypeRestriction.java
@@ -23,55 +23,55 @@
 public interface AttributeTypeRestriction extends ObjectRestriction
 {
   /**
-   * Returns the value of the '<em><b>Attribute Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Attribute Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Attribute Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Attribute Type Ref</em>' reference.
-   * @see #setAttributeTypeRef(XAttributeType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAttributeTypeRestriction_AttributeTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Attribute Type Ref</em>' reference.
+    * @see #setAttributeTypeRef(XAttributeType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAttributeTypeRestriction_AttributeTypeRef()
+    * @model
+    * @generated
+    */
   XAttributeType getAttributeTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef <em>Attribute Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef <em>Attribute Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Attribute Type Ref</em>' reference.
-   * @see #getAttributeTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Attribute Type Ref</em>' reference.
+    * @see #getAttributeTypeRef()
+    * @generated
+    */
   void setAttributeTypeRef(XAttributeType value);
 
   /**
-   * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #setArtifactTypeRef(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAttributeTypeRestriction_ArtifactTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #setArtifactTypeRef(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getAttributeTypeRestriction_ArtifactTypeRef()
+    * @model
+    * @generated
+    */
   XArtifactType getArtifactTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #getArtifactTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #getArtifactTypeRef()
+    * @generated
+    */
   void setArtifactTypeRef(XArtifactType value);
 
 } // AttributeTypeRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompareOp.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompareOp.java
index a9fd2ba..3e2b64a 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompareOp.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompareOp.java
@@ -20,204 +20,198 @@
 public enum CompareOp implements Enumerator
 {
   /**
-   * The '<em><b>EQ</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>EQ</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #EQ_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #EQ_VALUE
+    * @generated
+    * @ordered
+    */
   EQ(0, "EQ", "EQ"),
 
   /**
-   * The '<em><b>LIKE</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>LIKE</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #LIKE_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #LIKE_VALUE
+    * @generated
+    * @ordered
+    */
   LIKE(1, "LIKE", "LIKE");
 
   /**
-   * The '<em><b>EQ</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>EQ</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>EQ</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #EQ
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #EQ
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int EQ_VALUE = 0;
 
   /**
-   * The '<em><b>LIKE</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>LIKE</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>LIKE</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #LIKE
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #LIKE
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int LIKE_VALUE = 1;
 
   /**
-   * An array of all the '<em><b>Compare Op</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>Compare Op</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final CompareOp[] VALUES_ARRAY =
-    new CompareOp[]
-    {
-      EQ,
-      LIKE,
-    };
+    new CompareOp[] {
+         EQ,
+         LIKE,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>Compare Op</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>Compare Op</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<CompareOp> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>Compare Op</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Compare Op</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static CompareOp get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      CompareOp result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         CompareOp result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Compare Op</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Compare Op</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static CompareOp getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      CompareOp result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         CompareOp result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Compare Op</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Compare Op</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static CompareOp get(int value)
   {
-    switch (value)
-    {
-      case EQ_VALUE: return EQ;
-      case LIKE_VALUE: return LIKE;
-    }
-    return null;
-  }
+      switch (value) {
+         case EQ_VALUE: return EQ;
+         case LIKE_VALUE: return LIKE;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private CompareOp(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //CompareOp
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompoundCondition.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompoundCondition.java
index 274166f..c86c7c9 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompoundCondition.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/CompoundCondition.java
@@ -24,37 +24,37 @@
 public interface CompoundCondition extends Condition
 {
   /**
-   * Returns the value of the '<em><b>Conditions</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Conditions</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Conditions</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Conditions</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getCompoundCondition_Conditions()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Conditions</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getCompoundCondition_Conditions()
+    * @model containment="true"
+    * @generated
+    */
   EList<SimpleCondition> getConditions();
 
   /**
-   * Returns the value of the '<em><b>Operators</b></em>' attribute list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Operators</b></em>' attribute list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Operators</em>' attribute list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Operators</em>' attribute list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getCompoundCondition_Operators()
-   * @model unique="false"
-   * @generated
-   */
+    * @return the value of the '<em>Operators</em>' attribute list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getCompoundCondition_Operators()
+    * @model unique="false"
+    * @generated
+    */
   EList<XLogicOperator> getOperators();
 
 } // CompoundCondition
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/HierarchyRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/HierarchyRestriction.java
index 1292fbd..2ef630e 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/HierarchyRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/HierarchyRestriction.java
@@ -26,45 +26,45 @@
 public interface HierarchyRestriction extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Matcher Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #setArtifactMatcherRef(XArtifactMatcher)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getHierarchyRestriction_ArtifactMatcherRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #setArtifactMatcherRef(XArtifactMatcher)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getHierarchyRestriction_ArtifactMatcherRef()
+    * @model
+    * @generated
+    */
   XArtifactMatcher getArtifactMatcherRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #getArtifactMatcherRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #getArtifactMatcherRef()
+    * @generated
+    */
   void setArtifactMatcherRef(XArtifactMatcher value);
 
   /**
-   * Returns the value of the '<em><b>Access Rules</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Access Rules</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Access Rules</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Access Rules</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getHierarchyRestriction_AccessRules()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Access Rules</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getHierarchyRestriction_AccessRules()
+    * @model containment="true"
+    * @generated
+    */
   EList<ObjectRestriction> getAccessRules();
 
 } // HierarchyRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Import.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Import.java
index 77759c4..9e34dd6 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Import.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Import.java
@@ -23,29 +23,29 @@
 public interface Import extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Import URI</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Import URI</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Import URI</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Import URI</em>' attribute.
-   * @see #setImportURI(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getImport_ImportURI()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Import URI</em>' attribute.
+    * @see #setImportURI(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getImport_ImportURI()
+    * @model
+    * @generated
+    */
   String getImportURI();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI <em>Import URI</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI <em>Import URI</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Import URI</em>' attribute.
-   * @see #getImportURI()
-   * @generated
-   */
+    * @param value the new value of the '<em>Import URI</em>' attribute.
+    * @see #getImportURI()
+    * @generated
+    */
   void setImportURI(String value);
 
 } // Import
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/LegacyRelationTypeRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/LegacyRelationTypeRestriction.java
index 1065147..6890c4c 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/LegacyRelationTypeRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/LegacyRelationTypeRestriction.java
@@ -26,113 +26,113 @@
 public interface LegacyRelationTypeRestriction extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Permission</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Permission</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Permission</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Permission</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @see #setPermission(AccessPermissionEnum)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_Permission()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Permission</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @see #setPermission(AccessPermissionEnum)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_Permission()
+    * @model
+    * @generated
+    */
   AccessPermissionEnum getPermission();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Permission</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @see #getPermission()
-   * @generated
-   */
+    * @param value the new value of the '<em>Permission</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @see #getPermission()
+    * @generated
+    */
   void setPermission(AccessPermissionEnum value);
 
   /**
-   * Returns the value of the '<em><b>Relation Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Relation Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Relation Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Relation Type Ref</em>' reference.
-   * @see #setRelationTypeRef(XRelationType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_RelationTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Relation Type Ref</em>' reference.
+    * @see #setRelationTypeRef(XRelationType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_RelationTypeRef()
+    * @model
+    * @generated
+    */
   XRelationType getRelationTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Relation Type Ref</em>' reference.
-   * @see #getRelationTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Relation Type Ref</em>' reference.
+    * @see #getRelationTypeRef()
+    * @generated
+    */
   void setRelationTypeRef(XRelationType value);
 
   /**
-   * Returns the value of the '<em><b>Restricted To Side</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Restricted To Side</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Restricted To Side</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Restricted To Side</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @see #setRestrictedToSide(XRelationSideEnum)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_RestrictedToSide()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Restricted To Side</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @see #setRestrictedToSide(XRelationSideEnum)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_RestrictedToSide()
+    * @model
+    * @generated
+    */
   XRelationSideEnum getRestrictedToSide();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Restricted To Side</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @see #getRestrictedToSide()
-   * @generated
-   */
+    * @param value the new value of the '<em>Restricted To Side</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @see #getRestrictedToSide()
+    * @generated
+    */
   void setRestrictedToSide(XRelationSideEnum value);
 
   /**
-   * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Matcher Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #setArtifactMatcherRef(XArtifactMatcher)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_ArtifactMatcherRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #setArtifactMatcherRef(XArtifactMatcher)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getLegacyRelationTypeRestriction_ArtifactMatcherRef()
+    * @model
+    * @generated
+    */
   XArtifactMatcher getArtifactMatcherRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #getArtifactMatcherRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #getArtifactMatcherRef()
+    * @generated
+    */
   void setArtifactMatcherRef(XArtifactMatcher value);
 
 } // LegacyRelationTypeRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/MatchField.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/MatchField.java
index e67e00a..cf8331f 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/MatchField.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/MatchField.java
@@ -20,258 +20,252 @@
 public enum MatchField implements Enumerator
 {
   /**
-   * The '<em><b>Artifact Name</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Artifact Name</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ARTIFACT_NAME_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ARTIFACT_NAME_VALUE
+    * @generated
+    * @ordered
+    */
   ARTIFACT_NAME(0, "artifactName", "artifactName"),
 
   /**
-   * The '<em><b>Artifact Guid</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Artifact Guid</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ARTIFACT_GUID_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ARTIFACT_GUID_VALUE
+    * @generated
+    * @ordered
+    */
   ARTIFACT_GUID(1, "artifactGuid", "artifactGuid"),
 
   /**
-   * The '<em><b>Branch Name</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Branch Name</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #BRANCH_NAME_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #BRANCH_NAME_VALUE
+    * @generated
+    * @ordered
+    */
   BRANCH_NAME(2, "branchName", "branchName"),
 
   /**
-   * The '<em><b>Branch Guid</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Branch Guid</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #BRANCH_GUID_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #BRANCH_GUID_VALUE
+    * @generated
+    * @ordered
+    */
   BRANCH_GUID(3, "branchGuid", "branchGuid");
 
   /**
-   * The '<em><b>Artifact Name</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Artifact Name</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>Artifact Name</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ARTIFACT_NAME
-   * @model name="artifactName"
-   * @generated
-   * @ordered
-   */
+    * @see #ARTIFACT_NAME
+    * @model name="artifactName"
+    * @generated
+    * @ordered
+    */
   public static final int ARTIFACT_NAME_VALUE = 0;
 
   /**
-   * The '<em><b>Artifact Guid</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Artifact Guid</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>Artifact Guid</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ARTIFACT_GUID
-   * @model name="artifactGuid"
-   * @generated
-   * @ordered
-   */
+    * @see #ARTIFACT_GUID
+    * @model name="artifactGuid"
+    * @generated
+    * @ordered
+    */
   public static final int ARTIFACT_GUID_VALUE = 1;
 
   /**
-   * The '<em><b>Branch Name</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Branch Name</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>Branch Name</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #BRANCH_NAME
-   * @model name="branchName"
-   * @generated
-   * @ordered
-   */
+    * @see #BRANCH_NAME
+    * @model name="branchName"
+    * @generated
+    * @ordered
+    */
   public static final int BRANCH_NAME_VALUE = 2;
 
   /**
-   * The '<em><b>Branch Guid</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>Branch Guid</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>Branch Guid</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #BRANCH_GUID
-   * @model name="branchGuid"
-   * @generated
-   * @ordered
-   */
+    * @see #BRANCH_GUID
+    * @model name="branchGuid"
+    * @generated
+    * @ordered
+    */
   public static final int BRANCH_GUID_VALUE = 3;
 
   /**
-   * An array of all the '<em><b>Match Field</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>Match Field</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final MatchField[] VALUES_ARRAY =
-    new MatchField[]
-    {
-      ARTIFACT_NAME,
-      ARTIFACT_GUID,
-      BRANCH_NAME,
-      BRANCH_GUID,
-    };
+    new MatchField[] {
+         ARTIFACT_NAME,
+         ARTIFACT_GUID,
+         BRANCH_NAME,
+         BRANCH_GUID,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>Match Field</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>Match Field</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<MatchField> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>Match Field</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Match Field</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static MatchField get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      MatchField result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         MatchField result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Match Field</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Match Field</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static MatchField getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      MatchField result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         MatchField result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Match Field</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Match Field</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static MatchField get(int value)
   {
-    switch (value)
-    {
-      case ARTIFACT_NAME_VALUE: return ARTIFACT_NAME;
-      case ARTIFACT_GUID_VALUE: return ARTIFACT_GUID;
-      case BRANCH_NAME_VALUE: return BRANCH_NAME;
-      case BRANCH_GUID_VALUE: return BRANCH_GUID;
-    }
-    return null;
-  }
+      switch (value) {
+         case ARTIFACT_NAME_VALUE: return ARTIFACT_NAME;
+         case ARTIFACT_GUID_VALUE: return ARTIFACT_GUID;
+         case BRANCH_NAME_VALUE: return BRANCH_NAME;
+         case BRANCH_GUID_VALUE: return BRANCH_GUID;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private MatchField(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //MatchField
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ObjectRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ObjectRestriction.java
index 0267dba..216bbb7 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ObjectRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ObjectRestriction.java
@@ -23,32 +23,32 @@
 public interface ObjectRestriction extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Permission</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Permission</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Permission</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Permission</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @see #setPermission(AccessPermissionEnum)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getObjectRestriction_Permission()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Permission</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @see #setPermission(AccessPermissionEnum)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getObjectRestriction_Permission()
+    * @model
+    * @generated
+    */
   AccessPermissionEnum getPermission();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Permission</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @see #getPermission()
-   * @generated
-   */
+    * @param value the new value of the '<em>Permission</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @see #getPermission()
+    * @generated
+    */
   void setPermission(AccessPermissionEnum value);
 
 } // ObjectRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDsl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDsl.java
index 8421b13..e342d3b 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDsl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDsl.java
@@ -34,163 +34,163 @@
 public interface OseeDsl extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Imports</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Imports</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Imports</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Imports</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_Imports()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Imports</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_Imports()
+    * @model containment="true"
+    * @generated
+    */
   EList<Import> getImports();
 
   /**
-   * Returns the value of the '<em><b>Artifact Types</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Types</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Types</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Types</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactTypes()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Types</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactTypes()
+    * @model containment="true"
+    * @generated
+    */
   EList<XArtifactType> getArtifactTypes();
 
   /**
-   * Returns the value of the '<em><b>Relation Types</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Relation Types</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Relation Types</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Relation Types</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_RelationTypes()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Relation Types</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_RelationTypes()
+    * @model containment="true"
+    * @generated
+    */
   EList<XRelationType> getRelationTypes();
 
   /**
-   * Returns the value of the '<em><b>Attribute Types</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Attribute Types</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Attribute Types</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Attribute Types</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_AttributeTypes()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Attribute Types</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_AttributeTypes()
+    * @model containment="true"
+    * @generated
+    */
   EList<XAttributeType> getAttributeTypes();
 
   /**
-   * Returns the value of the '<em><b>Enum Types</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Types</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Types</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Types</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_EnumTypes()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Enum Types</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_EnumTypes()
+    * @model containment="true"
+    * @generated
+    */
   EList<XOseeEnumType> getEnumTypes();
 
   /**
-   * Returns the value of the '<em><b>Enum Overrides</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Overrides</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Overrides</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Overrides</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_EnumOverrides()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Enum Overrides</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_EnumOverrides()
+    * @model containment="true"
+    * @generated
+    */
   EList<XOseeEnumOverride> getEnumOverrides();
 
   /**
-   * Returns the value of the '<em><b>Artifact Type Overrides</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Type Overrides</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Type Overrides</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Type Overrides</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactTypeOverrides()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Type Overrides</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactTypeOverrides()
+    * @model containment="true"
+    * @generated
+    */
   EList<XOseeArtifactTypeOverride> getArtifactTypeOverrides();
 
   /**
-   * Returns the value of the '<em><b>Artifact Match Refs</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Match Refs</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Match Refs</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Match Refs</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactMatchRefs()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Match Refs</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_ArtifactMatchRefs()
+    * @model containment="true"
+    * @generated
+    */
   EList<XArtifactMatcher> getArtifactMatchRefs();
 
   /**
-   * Returns the value of the '<em><b>Access Declarations</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Access Declarations</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Access Declarations</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Access Declarations</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_AccessDeclarations()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Access Declarations</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_AccessDeclarations()
+    * @model containment="true"
+    * @generated
+    */
   EList<AccessContext> getAccessDeclarations();
 
   /**
-   * Returns the value of the '<em><b>Role Declarations</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Role Declarations</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Role Declarations</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Role Declarations</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_RoleDeclarations()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Role Declarations</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeDsl_RoleDeclarations()
+    * @model containment="true"
+    * @generated
+    */
   EList<Role> getRoleDeclarations();
 
 } // OseeDsl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslFactory.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslFactory.java
index dbec4c7..1c764fc 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslFactory.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslFactory.java
@@ -15,353 +15,353 @@
 public interface OseeDslFactory extends EFactory
 {
   /**
-   * The singleton instance of the factory.
-   * <!-- begin-user-doc -->
+    * The singleton instance of the factory.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   OseeDslFactory eINSTANCE = org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslFactoryImpl.init();
 
   /**
-   * Returns a new object of class '<em>Osee Dsl</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Osee Dsl</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Osee Dsl</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Osee Dsl</em>'.
+    * @generated
+    */
   OseeDsl createOseeDsl();
 
   /**
-   * Returns a new object of class '<em>Import</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Import</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Import</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Import</em>'.
+    * @generated
+    */
   Import createImport();
 
   /**
-   * Returns a new object of class '<em>Osee Element</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Osee Element</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Osee Element</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Osee Element</em>'.
+    * @generated
+    */
   OseeElement createOseeElement();
 
   /**
-   * Returns a new object of class '<em>Osee Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Osee Type</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Osee Type</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Osee Type</em>'.
+    * @generated
+    */
   OseeType createOseeType();
 
   /**
-   * Returns a new object of class '<em>XArtifact Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XArtifact Type</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XArtifact Type</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XArtifact Type</em>'.
+    * @generated
+    */
   XArtifactType createXArtifactType();
 
   /**
-   * Returns a new object of class '<em>XAttribute Type Ref</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XAttribute Type Ref</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XAttribute Type Ref</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XAttribute Type Ref</em>'.
+    * @generated
+    */
   XAttributeTypeRef createXAttributeTypeRef();
 
   /**
-   * Returns a new object of class '<em>XAttribute Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XAttribute Type</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XAttribute Type</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XAttribute Type</em>'.
+    * @generated
+    */
   XAttributeType createXAttributeType();
 
   /**
-   * Returns a new object of class '<em>XOsee Enum Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XOsee Enum Type</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XOsee Enum Type</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XOsee Enum Type</em>'.
+    * @generated
+    */
   XOseeEnumType createXOseeEnumType();
 
   /**
-   * Returns a new object of class '<em>XOsee Enum Entry</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XOsee Enum Entry</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XOsee Enum Entry</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XOsee Enum Entry</em>'.
+    * @generated
+    */
   XOseeEnumEntry createXOseeEnumEntry();
 
   /**
-   * Returns a new object of class '<em>XOsee Enum Override</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XOsee Enum Override</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XOsee Enum Override</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XOsee Enum Override</em>'.
+    * @generated
+    */
   XOseeEnumOverride createXOseeEnumOverride();
 
   /**
-   * Returns a new object of class '<em>Override Option</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Override Option</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Override Option</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Override Option</em>'.
+    * @generated
+    */
   OverrideOption createOverrideOption();
 
   /**
-   * Returns a new object of class '<em>Add Enum</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Add Enum</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Add Enum</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Add Enum</em>'.
+    * @generated
+    */
   AddEnum createAddEnum();
 
   /**
-   * Returns a new object of class '<em>Remove Enum</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Remove Enum</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Remove Enum</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Remove Enum</em>'.
+    * @generated
+    */
   RemoveEnum createRemoveEnum();
 
   /**
-   * Returns a new object of class '<em>XOsee Artifact Type Override</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XOsee Artifact Type Override</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XOsee Artifact Type Override</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XOsee Artifact Type Override</em>'.
+    * @generated
+    */
   XOseeArtifactTypeOverride createXOseeArtifactTypeOverride();
 
   /**
-   * Returns a new object of class '<em>Attribute Override Option</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Attribute Override Option</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Attribute Override Option</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Attribute Override Option</em>'.
+    * @generated
+    */
   AttributeOverrideOption createAttributeOverrideOption();
 
   /**
-   * Returns a new object of class '<em>Add Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Add Attribute</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Add Attribute</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Add Attribute</em>'.
+    * @generated
+    */
   AddAttribute createAddAttribute();
 
   /**
-   * Returns a new object of class '<em>Remove Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Remove Attribute</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Remove Attribute</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Remove Attribute</em>'.
+    * @generated
+    */
   RemoveAttribute createRemoveAttribute();
 
   /**
-   * Returns a new object of class '<em>Update Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Update Attribute</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Update Attribute</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Update Attribute</em>'.
+    * @generated
+    */
   UpdateAttribute createUpdateAttribute();
 
   /**
-   * Returns a new object of class '<em>XRelation Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XRelation Type</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XRelation Type</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XRelation Type</em>'.
+    * @generated
+    */
   XRelationType createXRelationType();
 
   /**
-   * Returns a new object of class '<em>Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Condition</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Condition</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Condition</em>'.
+    * @generated
+    */
   Condition createCondition();
 
   /**
-   * Returns a new object of class '<em>Simple Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Simple Condition</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Simple Condition</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Simple Condition</em>'.
+    * @generated
+    */
   SimpleCondition createSimpleCondition();
 
   /**
-   * Returns a new object of class '<em>Compound Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Compound Condition</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Compound Condition</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Compound Condition</em>'.
+    * @generated
+    */
   CompoundCondition createCompoundCondition();
 
   /**
-   * Returns a new object of class '<em>XArtifact Matcher</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>XArtifact Matcher</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>XArtifact Matcher</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>XArtifact Matcher</em>'.
+    * @generated
+    */
   XArtifactMatcher createXArtifactMatcher();
 
   /**
-   * Returns a new object of class '<em>Role</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Role</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Role</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Role</em>'.
+    * @generated
+    */
   Role createRole();
 
   /**
-   * Returns a new object of class '<em>Referenced Context</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Referenced Context</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Referenced Context</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Referenced Context</em>'.
+    * @generated
+    */
   ReferencedContext createReferencedContext();
 
   /**
-   * Returns a new object of class '<em>Users And Groups</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Users And Groups</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Users And Groups</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Users And Groups</em>'.
+    * @generated
+    */
   UsersAndGroups createUsersAndGroups();
 
   /**
-   * Returns a new object of class '<em>Access Context</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Access Context</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Access Context</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Access Context</em>'.
+    * @generated
+    */
   AccessContext createAccessContext();
 
   /**
-   * Returns a new object of class '<em>Hierarchy Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Hierarchy Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Hierarchy Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Hierarchy Restriction</em>'.
+    * @generated
+    */
   HierarchyRestriction createHierarchyRestriction();
 
   /**
-   * Returns a new object of class '<em>Relation Type Artifact Type Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Relation Type Artifact Type Predicate</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Relation Type Artifact Type Predicate</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Relation Type Artifact Type Predicate</em>'.
+    * @generated
+    */
   RelationTypeArtifactTypePredicate createRelationTypeArtifactTypePredicate();
 
   /**
-   * Returns a new object of class '<em>Relation Type Artifact Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Relation Type Artifact Predicate</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Relation Type Artifact Predicate</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Relation Type Artifact Predicate</em>'.
+    * @generated
+    */
   RelationTypeArtifactPredicate createRelationTypeArtifactPredicate();
 
   /**
-   * Returns a new object of class '<em>Relation Type Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Relation Type Predicate</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Relation Type Predicate</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Relation Type Predicate</em>'.
+    * @generated
+    */
   RelationTypePredicate createRelationTypePredicate();
 
   /**
-   * Returns a new object of class '<em>Object Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Object Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Object Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Object Restriction</em>'.
+    * @generated
+    */
   ObjectRestriction createObjectRestriction();
 
   /**
-   * Returns a new object of class '<em>Artifact Match Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Artifact Match Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Artifact Match Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Artifact Match Restriction</em>'.
+    * @generated
+    */
   ArtifactMatchRestriction createArtifactMatchRestriction();
 
   /**
-   * Returns a new object of class '<em>Artifact Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Artifact Type Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Artifact Type Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Artifact Type Restriction</em>'.
+    * @generated
+    */
   ArtifactTypeRestriction createArtifactTypeRestriction();
 
   /**
-   * Returns a new object of class '<em>Attribute Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Attribute Type Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Attribute Type Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Attribute Type Restriction</em>'.
+    * @generated
+    */
   AttributeTypeRestriction createAttributeTypeRestriction();
 
   /**
-   * Returns a new object of class '<em>Legacy Relation Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Legacy Relation Type Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Legacy Relation Type Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Legacy Relation Type Restriction</em>'.
+    * @generated
+    */
   LegacyRelationTypeRestriction createLegacyRelationTypeRestriction();
 
   /**
-   * Returns a new object of class '<em>Relation Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns a new object of class '<em>Relation Type Restriction</em>'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return a new object of class '<em>Relation Type Restriction</em>'.
-   * @generated
-   */
+    * @return a new object of class '<em>Relation Type Restriction</em>'.
+    * @generated
+    */
   RelationTypeRestriction createRelationTypeRestriction();
 
   /**
-   * Returns the package supported by this factory.
-   * <!-- begin-user-doc -->
+    * Returns the package supported by this factory.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the package supported by this factory.
-   * @generated
-   */
+    * @return the package supported by this factory.
+    * @generated
+    */
   OseeDslPackage getOseeDslPackage();
 
 } //OseeDslFactory
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslPackage.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslPackage.java
index f58e2e7..42c4d47 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslPackage.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeDslPackage.java
@@ -26,3226 +26,3226 @@
 public interface OseeDslPackage extends EPackage
 {
   /**
-   * The package name.
-   * <!-- begin-user-doc -->
+    * The package name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   String eNAME = "oseeDsl";
 
   /**
-   * The package namespace URI.
-   * <!-- begin-user-doc -->
+    * The package namespace URI.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   String eNS_URI = "http://www.eclipse.org/osee/framework/core/dsl/OseeDsl";
 
   /**
-   * The package namespace name.
-   * <!-- begin-user-doc -->
+    * The package namespace name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   String eNS_PREFIX = "oseeDsl";
 
   /**
-   * The singleton instance of the package.
-   * <!-- begin-user-doc -->
+    * The singleton instance of the package.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   OseeDslPackage eINSTANCE = org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl.init();
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl <em>Osee Dsl</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl <em>Osee Dsl</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeDsl()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeDsl()
+    * @generated
+    */
   int OSEE_DSL = 0;
 
   /**
-   * The feature id for the '<em><b>Imports</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Imports</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__IMPORTS = 0;
 
   /**
-   * The feature id for the '<em><b>Artifact Types</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Types</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ARTIFACT_TYPES = 1;
 
   /**
-   * The feature id for the '<em><b>Relation Types</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Relation Types</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__RELATION_TYPES = 2;
 
   /**
-   * The feature id for the '<em><b>Attribute Types</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Attribute Types</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ATTRIBUTE_TYPES = 3;
 
   /**
-   * The feature id for the '<em><b>Enum Types</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Types</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ENUM_TYPES = 4;
 
   /**
-   * The feature id for the '<em><b>Enum Overrides</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Overrides</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ENUM_OVERRIDES = 5;
 
   /**
-   * The feature id for the '<em><b>Artifact Type Overrides</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Type Overrides</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ARTIFACT_TYPE_OVERRIDES = 6;
 
   /**
-   * The feature id for the '<em><b>Artifact Match Refs</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Match Refs</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ARTIFACT_MATCH_REFS = 7;
 
   /**
-   * The feature id for the '<em><b>Access Declarations</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Access Declarations</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ACCESS_DECLARATIONS = 8;
 
   /**
-   * The feature id for the '<em><b>Role Declarations</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Role Declarations</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL__ROLE_DECLARATIONS = 9;
 
   /**
-   * The number of structural features of the '<em>Osee Dsl</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Osee Dsl</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_DSL_FEATURE_COUNT = 10;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl <em>Import</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl <em>Import</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getImport()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getImport()
+    * @generated
+    */
   int IMPORT = 1;
 
   /**
-   * The feature id for the '<em><b>Import URI</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Import URI</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int IMPORT__IMPORT_URI = 0;
 
   /**
-   * The number of structural features of the '<em>Import</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Import</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int IMPORT_FEATURE_COUNT = 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl <em>Osee Element</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl <em>Osee Element</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeElement()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeElement()
+    * @generated
+    */
   int OSEE_ELEMENT = 2;
 
   /**
-   * The number of structural features of the '<em>Osee Element</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Osee Element</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_ELEMENT_FEATURE_COUNT = 0;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl <em>Osee Type</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl <em>Osee Type</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeType()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeType()
+    * @generated
+    */
   int OSEE_TYPE = 3;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_TYPE__NAME = OSEE_ELEMENT_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_TYPE__TYPE_GUID = OSEE_ELEMENT_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_TYPE__UUID = OSEE_ELEMENT_FEATURE_COUNT + 2;
 
   /**
-   * The number of structural features of the '<em>Osee Type</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Osee Type</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OSEE_TYPE_FEATURE_COUNT = OSEE_ELEMENT_FEATURE_COUNT + 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl <em>XArtifact Type</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl <em>XArtifact Type</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactType()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactType()
+    * @generated
+    */
   int XARTIFACT_TYPE = 4;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__NAME = OSEE_TYPE__NAME;
 
   /**
-   * The feature id for the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__TYPE_GUID = OSEE_TYPE__TYPE_GUID;
 
   /**
-   * The feature id for the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__UUID = OSEE_TYPE__UUID;
 
   /**
-   * The feature id for the '<em><b>Abstract</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Abstract</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__ABSTRACT = OSEE_TYPE_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Super Artifact Types</b></em>' reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Super Artifact Types</b></em>' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES = OSEE_TYPE_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Valid Attribute Types</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Valid Attribute Types</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES = OSEE_TYPE_FEATURE_COUNT + 2;
 
   /**
-   * The number of structural features of the '<em>XArtifact Type</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XArtifact Type</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_TYPE_FEATURE_COUNT = OSEE_TYPE_FEATURE_COUNT + 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl <em>XAttribute Type Ref</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl <em>XAttribute Type Ref</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeTypeRef()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeTypeRef()
+    * @generated
+    */
   int XATTRIBUTE_TYPE_REF = 5;
 
   /**
-   * The feature id for the '<em><b>Valid Attribute Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Valid Attribute Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE = 0;
 
   /**
-   * The feature id for the '<em><b>Branch Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Branch Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE_REF__BRANCH_GUID = 1;
 
   /**
-   * The number of structural features of the '<em>XAttribute Type Ref</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XAttribute Type Ref</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE_REF_FEATURE_COUNT = 2;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl <em>XAttribute Type</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl <em>XAttribute Type</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeType()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeType()
+    * @generated
+    */
   int XATTRIBUTE_TYPE = 6;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__NAME = OSEE_TYPE__NAME;
 
   /**
-   * The feature id for the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__TYPE_GUID = OSEE_TYPE__TYPE_GUID;
 
   /**
-   * The feature id for the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__UUID = OSEE_TYPE__UUID;
 
   /**
-   * The feature id for the '<em><b>Base Attribute Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Base Attribute Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE = OSEE_TYPE_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Override</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Override</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__OVERRIDE = OSEE_TYPE_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Data Provider</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Data Provider</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__DATA_PROVIDER = OSEE_TYPE_FEATURE_COUNT + 2;
 
   /**
-   * The feature id for the '<em><b>Min</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Min</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__MIN = OSEE_TYPE_FEATURE_COUNT + 3;
 
   /**
-   * The feature id for the '<em><b>Max</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Max</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__MAX = OSEE_TYPE_FEATURE_COUNT + 4;
 
   /**
-   * The feature id for the '<em><b>Tagger Id</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Tagger Id</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__TAGGER_ID = OSEE_TYPE_FEATURE_COUNT + 5;
 
   /**
-   * The feature id for the '<em><b>Enum Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__ENUM_TYPE = OSEE_TYPE_FEATURE_COUNT + 6;
 
   /**
-   * The feature id for the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__DESCRIPTION = OSEE_TYPE_FEATURE_COUNT + 7;
 
   /**
-   * The feature id for the '<em><b>Default Value</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Default Value</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__DEFAULT_VALUE = OSEE_TYPE_FEATURE_COUNT + 8;
 
   /**
-   * The feature id for the '<em><b>File Extension</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>File Extension</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__FILE_EXTENSION = OSEE_TYPE_FEATURE_COUNT + 9;
 
   /**
-   * The feature id for the '<em><b>Media Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Media Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE__MEDIA_TYPE = OSEE_TYPE_FEATURE_COUNT + 10;
 
   /**
-   * The number of structural features of the '<em>XAttribute Type</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XAttribute Type</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XATTRIBUTE_TYPE_FEATURE_COUNT = OSEE_TYPE_FEATURE_COUNT + 11;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl <em>XOsee Enum Type</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl <em>XOsee Enum Type</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumType()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumType()
+    * @generated
+    */
   int XOSEE_ENUM_TYPE = 7;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_TYPE__NAME = OSEE_TYPE__NAME;
 
   /**
-   * The feature id for the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_TYPE__TYPE_GUID = OSEE_TYPE__TYPE_GUID;
 
   /**
-   * The feature id for the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_TYPE__UUID = OSEE_TYPE__UUID;
 
   /**
-   * The feature id for the '<em><b>Enum Entries</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Entries</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_TYPE__ENUM_ENTRIES = OSEE_TYPE_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>XOsee Enum Type</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XOsee Enum Type</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_TYPE_FEATURE_COUNT = OSEE_TYPE_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl <em>XOsee Enum Entry</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl <em>XOsee Enum Entry</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumEntry()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumEntry()
+    * @generated
+    */
   int XOSEE_ENUM_ENTRY = 8;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_ENTRY__NAME = 0;
 
   /**
-   * The feature id for the '<em><b>Ordinal</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Ordinal</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_ENTRY__ORDINAL = 1;
 
   /**
-   * The feature id for the '<em><b>Entry Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Entry Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_ENTRY__ENTRY_GUID = 2;
 
   /**
-   * The feature id for the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_ENTRY__DESCRIPTION = 3;
 
   /**
-   * The number of structural features of the '<em>XOsee Enum Entry</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XOsee Enum Entry</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_ENTRY_FEATURE_COUNT = 4;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl <em>XOsee Enum Override</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl <em>XOsee Enum Override</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumOverride()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumOverride()
+    * @generated
+    */
   int XOSEE_ENUM_OVERRIDE = 9;
 
   /**
-   * The feature id for the '<em><b>Overriden Enum Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Overriden Enum Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE = OSEE_ELEMENT_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Inherit All</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Inherit All</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_OVERRIDE__INHERIT_ALL = OSEE_ELEMENT_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Override Options</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Override Options</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS = OSEE_ELEMENT_FEATURE_COUNT + 2;
 
   /**
-   * The number of structural features of the '<em>XOsee Enum Override</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XOsee Enum Override</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ENUM_OVERRIDE_FEATURE_COUNT = OSEE_ELEMENT_FEATURE_COUNT + 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl <em>Override Option</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl <em>Override Option</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOverrideOption()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOverrideOption()
+    * @generated
+    */
   int OVERRIDE_OPTION = 10;
 
   /**
-   * The number of structural features of the '<em>Override Option</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Override Option</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OVERRIDE_OPTION_FEATURE_COUNT = 0;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl <em>Add Enum</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl <em>Add Enum</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddEnum()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddEnum()
+    * @generated
+    */
   int ADD_ENUM = 11;
 
   /**
-   * The feature id for the '<em><b>Enum Entry</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Entry</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ENUM__ENUM_ENTRY = OVERRIDE_OPTION_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Ordinal</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Ordinal</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ENUM__ORDINAL = OVERRIDE_OPTION_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Entry Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Entry Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ENUM__ENTRY_GUID = OVERRIDE_OPTION_FEATURE_COUNT + 2;
 
   /**
-   * The feature id for the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ENUM__DESCRIPTION = OVERRIDE_OPTION_FEATURE_COUNT + 3;
 
   /**
-   * The number of structural features of the '<em>Add Enum</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Add Enum</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ENUM_FEATURE_COUNT = OVERRIDE_OPTION_FEATURE_COUNT + 4;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl <em>Remove Enum</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl <em>Remove Enum</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveEnum()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveEnum()
+    * @generated
+    */
   int REMOVE_ENUM = 12;
 
   /**
-   * The feature id for the '<em><b>Enum Entry</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Enum Entry</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REMOVE_ENUM__ENUM_ENTRY = OVERRIDE_OPTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Remove Enum</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Remove Enum</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REMOVE_ENUM_FEATURE_COUNT = OVERRIDE_OPTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl <em>XOsee Artifact Type Override</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl <em>XOsee Artifact Type Override</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeArtifactTypeOverride()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeArtifactTypeOverride()
+    * @generated
+    */
   int XOSEE_ARTIFACT_TYPE_OVERRIDE = 13;
 
   /**
-   * The feature id for the '<em><b>Overriden Artifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Overriden Artifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE = 0;
 
   /**
-   * The feature id for the '<em><b>Inherit All</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Inherit All</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL = 1;
 
   /**
-   * The feature id for the '<em><b>Override Options</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Override Options</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS = 2;
 
   /**
-   * The number of structural features of the '<em>XOsee Artifact Type Override</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XOsee Artifact Type Override</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XOSEE_ARTIFACT_TYPE_OVERRIDE_FEATURE_COUNT = 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl <em>Attribute Override Option</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl <em>Attribute Override Option</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeOverrideOption()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeOverrideOption()
+    * @generated
+    */
   int ATTRIBUTE_OVERRIDE_OPTION = 14;
 
   /**
-   * The number of structural features of the '<em>Attribute Override Option</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Attribute Override Option</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT = 0;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl <em>Add Attribute</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl <em>Add Attribute</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddAttribute()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddAttribute()
+    * @generated
+    */
   int ADD_ATTRIBUTE = 15;
 
   /**
-   * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Attribute</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ATTRIBUTE__ATTRIBUTE = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Add Attribute</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Add Attribute</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ADD_ATTRIBUTE_FEATURE_COUNT = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl <em>Remove Attribute</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl <em>Remove Attribute</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveAttribute()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveAttribute()
+    * @generated
+    */
   int REMOVE_ATTRIBUTE = 16;
 
   /**
-   * The feature id for the '<em><b>Attribute</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Attribute</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REMOVE_ATTRIBUTE__ATTRIBUTE = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Remove Attribute</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Remove Attribute</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REMOVE_ATTRIBUTE_FEATURE_COUNT = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl <em>Update Attribute</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl <em>Update Attribute</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUpdateAttribute()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUpdateAttribute()
+    * @generated
+    */
   int UPDATE_ATTRIBUTE = 17;
 
   /**
-   * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Attribute</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int UPDATE_ATTRIBUTE__ATTRIBUTE = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Update Attribute</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Update Attribute</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int UPDATE_ATTRIBUTE_FEATURE_COUNT = ATTRIBUTE_OVERRIDE_OPTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl <em>XRelation Type</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl <em>XRelation Type</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationType()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationType()
+    * @generated
+    */
   int XRELATION_TYPE = 18;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__NAME = OSEE_TYPE__NAME;
 
   /**
-   * The feature id for the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__TYPE_GUID = OSEE_TYPE__TYPE_GUID;
 
   /**
-   * The feature id for the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__UUID = OSEE_TYPE__UUID;
 
   /**
-   * The feature id for the '<em><b>Side AName</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Side AName</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__SIDE_ANAME = OSEE_TYPE_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Side AArtifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Side AArtifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__SIDE_AARTIFACT_TYPE = OSEE_TYPE_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Side BName</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Side BName</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__SIDE_BNAME = OSEE_TYPE_FEATURE_COUNT + 2;
 
   /**
-   * The feature id for the '<em><b>Side BArtifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Side BArtifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__SIDE_BARTIFACT_TYPE = OSEE_TYPE_FEATURE_COUNT + 3;
 
   /**
-   * The feature id for the '<em><b>Default Order Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Default Order Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__DEFAULT_ORDER_TYPE = OSEE_TYPE_FEATURE_COUNT + 4;
 
   /**
-   * The feature id for the '<em><b>Multiplicity</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Multiplicity</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE__MULTIPLICITY = OSEE_TYPE_FEATURE_COUNT + 5;
 
   /**
-   * The number of structural features of the '<em>XRelation Type</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XRelation Type</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XRELATION_TYPE_FEATURE_COUNT = OSEE_TYPE_FEATURE_COUNT + 6;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl <em>Condition</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl <em>Condition</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCondition()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCondition()
+    * @generated
+    */
   int CONDITION = 19;
 
   /**
-   * The number of structural features of the '<em>Condition</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Condition</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int CONDITION_FEATURE_COUNT = 0;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl <em>Simple Condition</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl <em>Simple Condition</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getSimpleCondition()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getSimpleCondition()
+    * @generated
+    */
   int SIMPLE_CONDITION = 20;
 
   /**
-   * The feature id for the '<em><b>Field</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Field</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int SIMPLE_CONDITION__FIELD = CONDITION_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Op</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Op</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int SIMPLE_CONDITION__OP = CONDITION_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Expression</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Expression</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int SIMPLE_CONDITION__EXPRESSION = CONDITION_FEATURE_COUNT + 2;
 
   /**
-   * The number of structural features of the '<em>Simple Condition</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Simple Condition</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int SIMPLE_CONDITION_FEATURE_COUNT = CONDITION_FEATURE_COUNT + 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl <em>Compound Condition</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl <em>Compound Condition</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompoundCondition()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompoundCondition()
+    * @generated
+    */
   int COMPOUND_CONDITION = 21;
 
   /**
-   * The feature id for the '<em><b>Conditions</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Conditions</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int COMPOUND_CONDITION__CONDITIONS = CONDITION_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Operators</b></em>' attribute list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Operators</b></em>' attribute list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int COMPOUND_CONDITION__OPERATORS = CONDITION_FEATURE_COUNT + 1;
 
   /**
-   * The number of structural features of the '<em>Compound Condition</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Compound Condition</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int COMPOUND_CONDITION_FEATURE_COUNT = CONDITION_FEATURE_COUNT + 2;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl <em>XArtifact Matcher</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl <em>XArtifact Matcher</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactMatcher()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactMatcher()
+    * @generated
+    */
   int XARTIFACT_MATCHER = 22;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_MATCHER__NAME = 0;
 
   /**
-   * The feature id for the '<em><b>Conditions</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Conditions</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_MATCHER__CONDITIONS = 1;
 
   /**
-   * The feature id for the '<em><b>Operators</b></em>' attribute list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Operators</b></em>' attribute list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_MATCHER__OPERATORS = 2;
 
   /**
-   * The number of structural features of the '<em>XArtifact Matcher</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>XArtifact Matcher</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int XARTIFACT_MATCHER_FEATURE_COUNT = 3;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl <em>Role</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl <em>Role</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRole()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRole()
+    * @generated
+    */
   int ROLE = 23;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ROLE__NAME = 0;
 
   /**
-   * The feature id for the '<em><b>Super Roles</b></em>' reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Super Roles</b></em>' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ROLE__SUPER_ROLES = 1;
 
   /**
-   * The feature id for the '<em><b>Users And Groups</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Users And Groups</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ROLE__USERS_AND_GROUPS = 2;
 
   /**
-   * The feature id for the '<em><b>Referenced Contexts</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Referenced Contexts</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ROLE__REFERENCED_CONTEXTS = 3;
 
   /**
-   * The number of structural features of the '<em>Role</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Role</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ROLE_FEATURE_COUNT = 4;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl <em>Referenced Context</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl <em>Referenced Context</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getReferencedContext()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getReferencedContext()
+    * @generated
+    */
   int REFERENCED_CONTEXT = 24;
 
   /**
-   * The feature id for the '<em><b>Access Context Ref</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Access Context Ref</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REFERENCED_CONTEXT__ACCESS_CONTEXT_REF = 0;
 
   /**
-   * The number of structural features of the '<em>Referenced Context</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Referenced Context</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int REFERENCED_CONTEXT_FEATURE_COUNT = 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl <em>Users And Groups</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl <em>Users And Groups</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUsersAndGroups()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUsersAndGroups()
+    * @generated
+    */
   int USERS_AND_GROUPS = 25;
 
   /**
-   * The feature id for the '<em><b>User Or Group Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>User Or Group Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int USERS_AND_GROUPS__USER_OR_GROUP_GUID = 0;
 
   /**
-   * The number of structural features of the '<em>Users And Groups</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Users And Groups</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int USERS_AND_GROUPS_FEATURE_COUNT = 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl <em>Access Context</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl <em>Access Context</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessContext()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessContext()
+    * @generated
+    */
   int ACCESS_CONTEXT = 26;
 
   /**
-   * The feature id for the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT__NAME = 0;
 
   /**
-   * The feature id for the '<em><b>Super Access Contexts</b></em>' reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Super Access Contexts</b></em>' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS = 1;
 
   /**
-   * The feature id for the '<em><b>Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT__GUID = 2;
 
   /**
-   * The feature id for the '<em><b>Access Rules</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Access Rules</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT__ACCESS_RULES = 3;
 
   /**
-   * The feature id for the '<em><b>Hierarchy Restrictions</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Hierarchy Restrictions</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS = 4;
 
   /**
-   * The number of structural features of the '<em>Access Context</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Access Context</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ACCESS_CONTEXT_FEATURE_COUNT = 5;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl <em>Hierarchy Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl <em>Hierarchy Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getHierarchyRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getHierarchyRestriction()
+    * @generated
+    */
   int HIERARCHY_RESTRICTION = 27;
 
   /**
-   * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF = 0;
 
   /**
-   * The feature id for the '<em><b>Access Rules</b></em>' containment reference list.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Access Rules</b></em>' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int HIERARCHY_RESTRICTION__ACCESS_RULES = 1;
 
   /**
-   * The number of structural features of the '<em>Hierarchy Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Hierarchy Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int HIERARCHY_RESTRICTION_FEATURE_COUNT = 2;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl <em>Relation Type Predicate</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl <em>Relation Type Predicate</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypePredicate()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypePredicate()
+    * @generated
+    */
   int RELATION_TYPE_PREDICATE = 30;
 
   /**
-   * The number of structural features of the '<em>Relation Type Predicate</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Relation Type Predicate</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_PREDICATE_FEATURE_COUNT = 0;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl <em>Relation Type Artifact Type Predicate</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl <em>Relation Type Artifact Type Predicate</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactTypePredicate()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactTypePredicate()
+    * @generated
+    */
   int RELATION_TYPE_ARTIFACT_TYPE_PREDICATE = 28;
 
   /**
-   * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF = RELATION_TYPE_PREDICATE_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Relation Type Artifact Type Predicate</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Relation Type Artifact Type Predicate</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_ARTIFACT_TYPE_PREDICATE_FEATURE_COUNT = RELATION_TYPE_PREDICATE_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl <em>Relation Type Artifact Predicate</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl <em>Relation Type Artifact Predicate</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactPredicate()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactPredicate()
+    * @generated
+    */
   int RELATION_TYPE_ARTIFACT_PREDICATE = 29;
 
   /**
-   * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF = RELATION_TYPE_PREDICATE_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Relation Type Artifact Predicate</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Relation Type Artifact Predicate</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_ARTIFACT_PREDICATE_FEATURE_COUNT = RELATION_TYPE_PREDICATE_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl <em>Object Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl <em>Object Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getObjectRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getObjectRestriction()
+    * @generated
+    */
   int OBJECT_RESTRICTION = 31;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OBJECT_RESTRICTION__PERMISSION = 0;
 
   /**
-   * The number of structural features of the '<em>Object Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Object Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int OBJECT_RESTRICTION_FEATURE_COUNT = 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl <em>Artifact Match Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl <em>Artifact Match Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactMatchRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactMatchRestriction()
+    * @generated
+    */
   int ARTIFACT_MATCH_RESTRICTION = 32;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_MATCH_RESTRICTION__PERMISSION = OBJECT_RESTRICTION__PERMISSION;
 
   /**
-   * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF = OBJECT_RESTRICTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Artifact Match Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Artifact Match Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_MATCH_RESTRICTION_FEATURE_COUNT = OBJECT_RESTRICTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl <em>Artifact Type Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl <em>Artifact Type Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactTypeRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactTypeRestriction()
+    * @generated
+    */
   int ARTIFACT_TYPE_RESTRICTION = 33;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_TYPE_RESTRICTION__PERMISSION = OBJECT_RESTRICTION__PERMISSION;
 
   /**
-   * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF = OBJECT_RESTRICTION_FEATURE_COUNT + 0;
 
   /**
-   * The number of structural features of the '<em>Artifact Type Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Artifact Type Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ARTIFACT_TYPE_RESTRICTION_FEATURE_COUNT = OBJECT_RESTRICTION_FEATURE_COUNT + 1;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl <em>Attribute Type Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl <em>Attribute Type Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeTypeRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeTypeRestriction()
+    * @generated
+    */
   int ATTRIBUTE_TYPE_RESTRICTION = 34;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ATTRIBUTE_TYPE_RESTRICTION__PERMISSION = OBJECT_RESTRICTION__PERMISSION;
 
   /**
-   * The feature id for the '<em><b>Attribute Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Attribute Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF = OBJECT_RESTRICTION_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF = OBJECT_RESTRICTION_FEATURE_COUNT + 1;
 
   /**
-   * The number of structural features of the '<em>Attribute Type Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Attribute Type Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int ATTRIBUTE_TYPE_RESTRICTION_FEATURE_COUNT = OBJECT_RESTRICTION_FEATURE_COUNT + 2;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl <em>Legacy Relation Type Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl <em>Legacy Relation Type Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getLegacyRelationTypeRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getLegacyRelationTypeRestriction()
+    * @generated
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION = 35;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION = 0;
 
   /**
-   * The feature id for the '<em><b>Relation Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Relation Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF = 1;
 
   /**
-   * The feature id for the '<em><b>Restricted To Side</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Restricted To Side</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE = 2;
 
   /**
-   * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF = 3;
 
   /**
-   * The number of structural features of the '<em>Legacy Relation Type Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Legacy Relation Type Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int LEGACY_RELATION_TYPE_RESTRICTION_FEATURE_COUNT = 4;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl <em>Relation Type Restriction</em>}' class.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl <em>Relation Type Restriction</em>}' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeRestriction()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeRestriction()
+    * @generated
+    */
   int RELATION_TYPE_RESTRICTION = 36;
 
   /**
-   * The feature id for the '<em><b>Permission</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Permission</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION__PERMISSION = OBJECT_RESTRICTION__PERMISSION;
 
   /**
-   * The feature id for the '<em><b>Relation Type Match</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Relation Type Match</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH = OBJECT_RESTRICTION_FEATURE_COUNT + 0;
 
   /**
-   * The feature id for the '<em><b>Relation Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Relation Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF = OBJECT_RESTRICTION_FEATURE_COUNT + 1;
 
   /**
-   * The feature id for the '<em><b>Restricted To Side</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Restricted To Side</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE = OBJECT_RESTRICTION_FEATURE_COUNT + 2;
 
   /**
-   * The feature id for the '<em><b>Predicate</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * The feature id for the '<em><b>Predicate</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION__PREDICATE = OBJECT_RESTRICTION_FEATURE_COUNT + 3;
 
   /**
-   * The number of structural features of the '<em>Relation Type Restriction</em>' class.
-   * <!-- begin-user-doc -->
+    * The number of structural features of the '<em>Relation Type Restriction</em>' class.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   * @ordered
-   */
+    * @generated
+    * @ordered
+    */
   int RELATION_TYPE_RESTRICTION_FEATURE_COUNT = OBJECT_RESTRICTION_FEATURE_COUNT + 4;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationMultiplicityEnum()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationMultiplicityEnum()
+    * @generated
+    */
   int RELATION_MULTIPLICITY_ENUM = 37;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompareOp()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompareOp()
+    * @generated
+    */
   int COMPARE_OP = 38;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXLogicOperator()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXLogicOperator()
+    * @generated
+    */
   int XLOGIC_OPERATOR = 39;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getMatchField()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getMatchField()
+    * @generated
+    */
   int MATCH_FIELD = 40;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessPermissionEnum()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessPermissionEnum()
+    * @generated
+    */
   int ACCESS_PERMISSION_ENUM = 41;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeMatch()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeMatch()
+    * @generated
+    */
   int RELATION_TYPE_MATCH = 42;
 
   /**
-   * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}' enum.
-   * <!-- begin-user-doc -->
+    * The meta object id for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}' enum.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationSideEnum()
-   * @generated
-   */
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationSideEnum()
+    * @generated
+    */
   int XRELATION_SIDE_ENUM = 43;
 
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl <em>Osee Dsl</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl <em>Osee Dsl</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Osee Dsl</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl
-   * @generated
-   */
+    * @return the meta object for class '<em>Osee Dsl</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl
+    * @generated
+    */
   EClass getOseeDsl();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getImports <em>Imports</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getImports <em>Imports</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Imports</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getImports()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Imports</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getImports()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_Imports();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypes <em>Artifact Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypes <em>Artifact Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Artifact Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypes()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Artifact Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypes()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_ArtifactTypes();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRelationTypes <em>Relation Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRelationTypes <em>Relation Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Relation Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRelationTypes()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Relation Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRelationTypes()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_RelationTypes();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAttributeTypes <em>Attribute Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAttributeTypes <em>Attribute Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Attribute Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAttributeTypes()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Attribute Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAttributeTypes()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_AttributeTypes();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumTypes <em>Enum Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumTypes <em>Enum Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Enum Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumTypes()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Enum Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumTypes()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_EnumTypes();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumOverrides <em>Enum Overrides</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumOverrides <em>Enum Overrides</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Enum Overrides</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumOverrides()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Enum Overrides</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getEnumOverrides()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_EnumOverrides();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypeOverrides <em>Artifact Type Overrides</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypeOverrides <em>Artifact Type Overrides</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Artifact Type Overrides</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypeOverrides()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Artifact Type Overrides</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactTypeOverrides()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_ArtifactTypeOverrides();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactMatchRefs <em>Artifact Match Refs</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactMatchRefs <em>Artifact Match Refs</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Artifact Match Refs</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactMatchRefs()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Artifact Match Refs</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getArtifactMatchRefs()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_ArtifactMatchRefs();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAccessDeclarations <em>Access Declarations</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAccessDeclarations <em>Access Declarations</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Access Declarations</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAccessDeclarations()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Access Declarations</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getAccessDeclarations()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_AccessDeclarations();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRoleDeclarations <em>Role Declarations</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRoleDeclarations <em>Role Declarations</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Role Declarations</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRoleDeclarations()
-   * @see #getOseeDsl()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Role Declarations</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl#getRoleDeclarations()
+    * @see #getOseeDsl()
+    * @generated
+    */
   EReference getOseeDsl_RoleDeclarations();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import <em>Import</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import <em>Import</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Import</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Import
-   * @generated
-   */
+    * @return the meta object for class '<em>Import</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Import
+    * @generated
+    */
   EClass getImport();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI <em>Import URI</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI <em>Import URI</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Import URI</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI()
-   * @see #getImport()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Import URI</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Import#getImportURI()
+    * @see #getImport()
+    * @generated
+    */
   EAttribute getImport_ImportURI();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement <em>Osee Element</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement <em>Osee Element</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Osee Element</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement
-   * @generated
-   */
+    * @return the meta object for class '<em>Osee Element</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement
+    * @generated
+    */
   EClass getOseeElement();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType <em>Osee Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType <em>Osee Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Osee Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType
-   * @generated
-   */
+    * @return the meta object for class '<em>Osee Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType
+    * @generated
+    */
   EClass getOseeType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName <em>Name</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName <em>Name</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Name</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName()
-   * @see #getOseeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Name</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName()
+    * @see #getOseeType()
+    * @generated
+    */
   EAttribute getOseeType_Name();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid <em>Type Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid <em>Type Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Type Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid()
-   * @see #getOseeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Type Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid()
+    * @see #getOseeType()
+    * @generated
+    */
   EAttribute getOseeType_TypeGuid();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid <em>Uuid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid <em>Uuid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Uuid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid()
-   * @see #getOseeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Uuid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid()
+    * @see #getOseeType()
+    * @generated
+    */
   EAttribute getOseeType_Uuid();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType <em>XArtifact Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType <em>XArtifact Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XArtifact Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType
-   * @generated
-   */
+    * @return the meta object for class '<em>XArtifact Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType
+    * @generated
+    */
   EClass getXArtifactType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract <em>Abstract</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract <em>Abstract</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Abstract</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract()
-   * @see #getXArtifactType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Abstract</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract()
+    * @see #getXArtifactType()
+    * @generated
+    */
   EAttribute getXArtifactType_Abstract();
 
   /**
-   * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getSuperArtifactTypes <em>Super Artifact Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getSuperArtifactTypes <em>Super Artifact Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference list '<em>Super Artifact Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getSuperArtifactTypes()
-   * @see #getXArtifactType()
-   * @generated
-   */
+    * @return the meta object for the reference list '<em>Super Artifact Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getSuperArtifactTypes()
+    * @see #getXArtifactType()
+    * @generated
+    */
   EReference getXArtifactType_SuperArtifactTypes();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getValidAttributeTypes <em>Valid Attribute Types</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getValidAttributeTypes <em>Valid Attribute Types</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Valid Attribute Types</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getValidAttributeTypes()
-   * @see #getXArtifactType()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Valid Attribute Types</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#getValidAttributeTypes()
+    * @see #getXArtifactType()
+    * @generated
+    */
   EReference getXArtifactType_ValidAttributeTypes();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef <em>XAttribute Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef <em>XAttribute Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XAttribute Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef
-   * @generated
-   */
+    * @return the meta object for class '<em>XAttribute Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef
+    * @generated
+    */
   EClass getXAttributeTypeRef();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType <em>Valid Attribute Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType <em>Valid Attribute Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Valid Attribute Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType()
-   * @see #getXAttributeTypeRef()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Valid Attribute Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType()
+    * @see #getXAttributeTypeRef()
+    * @generated
+    */
   EReference getXAttributeTypeRef_ValidAttributeType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid <em>Branch Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid <em>Branch Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Branch Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid()
-   * @see #getXAttributeTypeRef()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Branch Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid()
+    * @see #getXAttributeTypeRef()
+    * @generated
+    */
   EAttribute getXAttributeTypeRef_BranchGuid();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType <em>XAttribute Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType <em>XAttribute Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XAttribute Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType
-   * @generated
-   */
+    * @return the meta object for class '<em>XAttribute Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType
+    * @generated
+    */
   EClass getXAttributeType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType <em>Base Attribute Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType <em>Base Attribute Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Base Attribute Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Base Attribute Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_BaseAttributeType();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride <em>Override</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride <em>Override</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Override</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Override</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EReference getXAttributeType_Override();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider <em>Data Provider</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider <em>Data Provider</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Data Provider</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Data Provider</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_DataProvider();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin <em>Min</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin <em>Min</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Min</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Min</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_Min();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax <em>Max</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax <em>Max</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Max</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Max</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_Max();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId <em>Tagger Id</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId <em>Tagger Id</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Tagger Id</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Tagger Id</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_TaggerId();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType <em>Enum Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType <em>Enum Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Enum Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Enum Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EReference getXAttributeType_EnumType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription <em>Description</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription <em>Description</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Description</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Description</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_Description();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue <em>Default Value</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue <em>Default Value</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Default Value</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Default Value</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_DefaultValue();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension <em>File Extension</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension <em>File Extension</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>File Extension</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>File Extension</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_FileExtension();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType <em>Media Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType <em>Media Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Media Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType()
-   * @see #getXAttributeType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Media Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType()
+    * @see #getXAttributeType()
+    * @generated
+    */
   EAttribute getXAttributeType_MediaType();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType <em>XOsee Enum Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType <em>XOsee Enum Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XOsee Enum Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType
-   * @generated
-   */
+    * @return the meta object for class '<em>XOsee Enum Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType
+    * @generated
+    */
   EClass getXOseeEnumType();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType#getEnumEntries <em>Enum Entries</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType#getEnumEntries <em>Enum Entries</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Enum Entries</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType#getEnumEntries()
-   * @see #getXOseeEnumType()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Enum Entries</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType#getEnumEntries()
+    * @see #getXOseeEnumType()
+    * @generated
+    */
   EReference getXOseeEnumType_EnumEntries();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry <em>XOsee Enum Entry</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry <em>XOsee Enum Entry</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XOsee Enum Entry</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry
-   * @generated
-   */
+    * @return the meta object for class '<em>XOsee Enum Entry</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry
+    * @generated
+    */
   EClass getXOseeEnumEntry();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName <em>Name</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName <em>Name</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Name</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName()
-   * @see #getXOseeEnumEntry()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Name</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName()
+    * @see #getXOseeEnumEntry()
+    * @generated
+    */
   EAttribute getXOseeEnumEntry_Name();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal <em>Ordinal</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal <em>Ordinal</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Ordinal</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal()
-   * @see #getXOseeEnumEntry()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Ordinal</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal()
+    * @see #getXOseeEnumEntry()
+    * @generated
+    */
   EAttribute getXOseeEnumEntry_Ordinal();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid <em>Entry Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid <em>Entry Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Entry Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid()
-   * @see #getXOseeEnumEntry()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Entry Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid()
+    * @see #getXOseeEnumEntry()
+    * @generated
+    */
   EAttribute getXOseeEnumEntry_EntryGuid();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription <em>Description</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription <em>Description</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Description</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription()
-   * @see #getXOseeEnumEntry()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Description</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription()
+    * @see #getXOseeEnumEntry()
+    * @generated
+    */
   EAttribute getXOseeEnumEntry_Description();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride <em>XOsee Enum Override</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride <em>XOsee Enum Override</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XOsee Enum Override</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride
-   * @generated
-   */
+    * @return the meta object for class '<em>XOsee Enum Override</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride
+    * @generated
+    */
   EClass getXOseeEnumOverride();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType <em>Overriden Enum Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType <em>Overriden Enum Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Overriden Enum Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType()
-   * @see #getXOseeEnumOverride()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Overriden Enum Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType()
+    * @see #getXOseeEnumOverride()
+    * @generated
+    */
   EReference getXOseeEnumOverride_OverridenEnumType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll <em>Inherit All</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll <em>Inherit All</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Inherit All</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll()
-   * @see #getXOseeEnumOverride()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Inherit All</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll()
+    * @see #getXOseeEnumOverride()
+    * @generated
+    */
   EAttribute getXOseeEnumOverride_InheritAll();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverrideOptions <em>Override Options</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverrideOptions <em>Override Options</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Override Options</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverrideOptions()
-   * @see #getXOseeEnumOverride()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Override Options</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverrideOptions()
+    * @see #getXOseeEnumOverride()
+    * @generated
+    */
   EReference getXOseeEnumOverride_OverrideOptions();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption <em>Override Option</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption <em>Override Option</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Override Option</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption
-   * @generated
-   */
+    * @return the meta object for class '<em>Override Option</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption
+    * @generated
+    */
   EClass getOverrideOption();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum <em>Add Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum <em>Add Enum</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Add Enum</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum
-   * @generated
-   */
+    * @return the meta object for class '<em>Add Enum</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum
+    * @generated
+    */
   EClass getAddEnum();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry <em>Enum Entry</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry <em>Enum Entry</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Enum Entry</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry()
-   * @see #getAddEnum()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Enum Entry</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEnumEntry()
+    * @see #getAddEnum()
+    * @generated
+    */
   EAttribute getAddEnum_EnumEntry();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal <em>Ordinal</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal <em>Ordinal</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Ordinal</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal()
-   * @see #getAddEnum()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Ordinal</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getOrdinal()
+    * @see #getAddEnum()
+    * @generated
+    */
   EAttribute getAddEnum_Ordinal();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid <em>Entry Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid <em>Entry Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Entry Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid()
-   * @see #getAddEnum()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Entry Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getEntryGuid()
+    * @see #getAddEnum()
+    * @generated
+    */
   EAttribute getAddEnum_EntryGuid();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription <em>Description</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription <em>Description</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Description</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription()
-   * @see #getAddEnum()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Description</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum#getDescription()
+    * @see #getAddEnum()
+    * @generated
+    */
   EAttribute getAddEnum_Description();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum <em>Remove Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum <em>Remove Enum</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Remove Enum</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum
-   * @generated
-   */
+    * @return the meta object for class '<em>Remove Enum</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum
+    * @generated
+    */
   EClass getRemoveEnum();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry <em>Enum Entry</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry <em>Enum Entry</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Enum Entry</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry()
-   * @see #getRemoveEnum()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Enum Entry</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry()
+    * @see #getRemoveEnum()
+    * @generated
+    */
   EReference getRemoveEnum_EnumEntry();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride <em>XOsee Artifact Type Override</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride <em>XOsee Artifact Type Override</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XOsee Artifact Type Override</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride
-   * @generated
-   */
+    * @return the meta object for class '<em>XOsee Artifact Type Override</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride
+    * @generated
+    */
   EClass getXOseeArtifactTypeOverride();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType <em>Overriden Artifact Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType <em>Overriden Artifact Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Overriden Artifact Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType()
-   * @see #getXOseeArtifactTypeOverride()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Overriden Artifact Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType()
+    * @see #getXOseeArtifactTypeOverride()
+    * @generated
+    */
   EReference getXOseeArtifactTypeOverride_OverridenArtifactType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll <em>Inherit All</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll <em>Inherit All</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Inherit All</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll()
-   * @see #getXOseeArtifactTypeOverride()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Inherit All</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll()
+    * @see #getXOseeArtifactTypeOverride()
+    * @generated
+    */
   EAttribute getXOseeArtifactTypeOverride_InheritAll();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverrideOptions <em>Override Options</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverrideOptions <em>Override Options</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Override Options</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverrideOptions()
-   * @see #getXOseeArtifactTypeOverride()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Override Options</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverrideOptions()
+    * @see #getXOseeArtifactTypeOverride()
+    * @generated
+    */
   EReference getXOseeArtifactTypeOverride_OverrideOptions();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption <em>Attribute Override Option</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption <em>Attribute Override Option</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Attribute Override Option</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption
-   * @generated
-   */
+    * @return the meta object for class '<em>Attribute Override Option</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption
+    * @generated
+    */
   EClass getAttributeOverrideOption();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute <em>Add Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute <em>Add Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Add Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute
-   * @generated
-   */
+    * @return the meta object for class '<em>Add Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute
+    * @generated
+    */
   EClass getAddAttribute();
 
   /**
-   * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute <em>Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute <em>Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference '<em>Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute()
-   * @see #getAddAttribute()
-   * @generated
-   */
+    * @return the meta object for the containment reference '<em>Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute#getAttribute()
+    * @see #getAddAttribute()
+    * @generated
+    */
   EReference getAddAttribute_Attribute();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute <em>Remove Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute <em>Remove Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Remove Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute
-   * @generated
-   */
+    * @return the meta object for class '<em>Remove Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute
+    * @generated
+    */
   EClass getRemoveAttribute();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute <em>Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute <em>Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute()
-   * @see #getRemoveAttribute()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute()
+    * @see #getRemoveAttribute()
+    * @generated
+    */
   EReference getRemoveAttribute_Attribute();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute <em>Update Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute <em>Update Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Update Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute
-   * @generated
-   */
+    * @return the meta object for class '<em>Update Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute
+    * @generated
+    */
   EClass getUpdateAttribute();
 
   /**
-   * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute <em>Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute <em>Attribute</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference '<em>Attribute</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute()
-   * @see #getUpdateAttribute()
-   * @generated
-   */
+    * @return the meta object for the containment reference '<em>Attribute</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute()
+    * @see #getUpdateAttribute()
+    * @generated
+    */
   EReference getUpdateAttribute_Attribute();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType <em>XRelation Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType <em>XRelation Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XRelation Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType
-   * @generated
-   */
+    * @return the meta object for class '<em>XRelation Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType
+    * @generated
+    */
   EClass getXRelationType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName <em>Side AName</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName <em>Side AName</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Side AName</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Side AName</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName()
+    * @see #getXRelationType()
+    * @generated
+    */
   EAttribute getXRelationType_SideAName();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType <em>Side AArtifact Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType <em>Side AArtifact Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Side AArtifact Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Side AArtifact Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType()
+    * @see #getXRelationType()
+    * @generated
+    */
   EReference getXRelationType_SideAArtifactType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName <em>Side BName</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName <em>Side BName</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Side BName</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Side BName</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName()
+    * @see #getXRelationType()
+    * @generated
+    */
   EAttribute getXRelationType_SideBName();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType <em>Side BArtifact Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType <em>Side BArtifact Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Side BArtifact Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Side BArtifact Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType()
+    * @see #getXRelationType()
+    * @generated
+    */
   EReference getXRelationType_SideBArtifactType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType <em>Default Order Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType <em>Default Order Type</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Default Order Type</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Default Order Type</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType()
+    * @see #getXRelationType()
+    * @generated
+    */
   EAttribute getXRelationType_DefaultOrderType();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity <em>Multiplicity</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity <em>Multiplicity</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Multiplicity</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity()
-   * @see #getXRelationType()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Multiplicity</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity()
+    * @see #getXRelationType()
+    * @generated
+    */
   EAttribute getXRelationType_Multiplicity();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition <em>Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition <em>Condition</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Condition</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Condition
-   * @generated
-   */
+    * @return the meta object for class '<em>Condition</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Condition
+    * @generated
+    */
   EClass getCondition();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition <em>Simple Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition <em>Simple Condition</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Simple Condition</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition
-   * @generated
-   */
+    * @return the meta object for class '<em>Simple Condition</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition
+    * @generated
+    */
   EClass getSimpleCondition();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField <em>Field</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField <em>Field</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Field</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField()
-   * @see #getSimpleCondition()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Field</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField()
+    * @see #getSimpleCondition()
+    * @generated
+    */
   EAttribute getSimpleCondition_Field();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp <em>Op</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp <em>Op</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Op</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp()
-   * @see #getSimpleCondition()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Op</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp()
+    * @see #getSimpleCondition()
+    * @generated
+    */
   EAttribute getSimpleCondition_Op();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression <em>Expression</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression <em>Expression</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Expression</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression()
-   * @see #getSimpleCondition()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Expression</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression()
+    * @see #getSimpleCondition()
+    * @generated
+    */
   EAttribute getSimpleCondition_Expression();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition <em>Compound Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition <em>Compound Condition</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Compound Condition</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition
-   * @generated
-   */
+    * @return the meta object for class '<em>Compound Condition</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition
+    * @generated
+    */
   EClass getCompoundCondition();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getConditions <em>Conditions</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getConditions <em>Conditions</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Conditions</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getConditions()
-   * @see #getCompoundCondition()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Conditions</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getConditions()
+    * @see #getCompoundCondition()
+    * @generated
+    */
   EReference getCompoundCondition_Conditions();
 
   /**
-   * Returns the meta object for the attribute list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getOperators <em>Operators</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getOperators <em>Operators</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute list '<em>Operators</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getOperators()
-   * @see #getCompoundCondition()
-   * @generated
-   */
+    * @return the meta object for the attribute list '<em>Operators</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition#getOperators()
+    * @see #getCompoundCondition()
+    * @generated
+    */
   EAttribute getCompoundCondition_Operators();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher <em>XArtifact Matcher</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher <em>XArtifact Matcher</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>XArtifact Matcher</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher
-   * @generated
-   */
+    * @return the meta object for class '<em>XArtifact Matcher</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher
+    * @generated
+    */
   EClass getXArtifactMatcher();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName <em>Name</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName <em>Name</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Name</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName()
-   * @see #getXArtifactMatcher()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Name</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName()
+    * @see #getXArtifactMatcher()
+    * @generated
+    */
   EAttribute getXArtifactMatcher_Name();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getConditions <em>Conditions</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getConditions <em>Conditions</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Conditions</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getConditions()
-   * @see #getXArtifactMatcher()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Conditions</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getConditions()
+    * @see #getXArtifactMatcher()
+    * @generated
+    */
   EReference getXArtifactMatcher_Conditions();
 
   /**
-   * Returns the meta object for the attribute list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getOperators <em>Operators</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getOperators <em>Operators</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute list '<em>Operators</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getOperators()
-   * @see #getXArtifactMatcher()
-   * @generated
-   */
+    * @return the meta object for the attribute list '<em>Operators</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getOperators()
+    * @see #getXArtifactMatcher()
+    * @generated
+    */
   EAttribute getXArtifactMatcher_Operators();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role <em>Role</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role <em>Role</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Role</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role
-   * @generated
-   */
+    * @return the meta object for class '<em>Role</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role
+    * @generated
+    */
   EClass getRole();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName <em>Name</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName <em>Name</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Name</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName()
-   * @see #getRole()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Name</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName()
+    * @see #getRole()
+    * @generated
+    */
   EAttribute getRole_Name();
 
   /**
-   * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getSuperRoles <em>Super Roles</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getSuperRoles <em>Super Roles</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference list '<em>Super Roles</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getSuperRoles()
-   * @see #getRole()
-   * @generated
-   */
+    * @return the meta object for the reference list '<em>Super Roles</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getSuperRoles()
+    * @see #getRole()
+    * @generated
+    */
   EReference getRole_SuperRoles();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getUsersAndGroups <em>Users And Groups</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getUsersAndGroups <em>Users And Groups</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Users And Groups</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getUsersAndGroups()
-   * @see #getRole()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Users And Groups</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getUsersAndGroups()
+    * @see #getRole()
+    * @generated
+    */
   EReference getRole_UsersAndGroups();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getReferencedContexts <em>Referenced Contexts</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getReferencedContexts <em>Referenced Contexts</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Referenced Contexts</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getReferencedContexts()
-   * @see #getRole()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Referenced Contexts</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getReferencedContexts()
+    * @see #getRole()
+    * @generated
+    */
   EReference getRole_ReferencedContexts();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext <em>Referenced Context</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext <em>Referenced Context</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Referenced Context</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext
-   * @generated
-   */
+    * @return the meta object for class '<em>Referenced Context</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext
+    * @generated
+    */
   EClass getReferencedContext();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef <em>Access Context Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef <em>Access Context Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Access Context Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef()
-   * @see #getReferencedContext()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Access Context Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef()
+    * @see #getReferencedContext()
+    * @generated
+    */
   EAttribute getReferencedContext_AccessContextRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups <em>Users And Groups</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups <em>Users And Groups</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Users And Groups</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups
-   * @generated
-   */
+    * @return the meta object for class '<em>Users And Groups</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups
+    * @generated
+    */
   EClass getUsersAndGroups();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid <em>User Or Group Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid <em>User Or Group Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>User Or Group Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid()
-   * @see #getUsersAndGroups()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>User Or Group Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid()
+    * @see #getUsersAndGroups()
+    * @generated
+    */
   EAttribute getUsersAndGroups_UserOrGroupGuid();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext <em>Access Context</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext <em>Access Context</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Access Context</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext
-   * @generated
-   */
+    * @return the meta object for class '<em>Access Context</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext
+    * @generated
+    */
   EClass getAccessContext();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName <em>Name</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName <em>Name</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Name</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName()
-   * @see #getAccessContext()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Name</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getName()
+    * @see #getAccessContext()
+    * @generated
+    */
   EAttribute getAccessContext_Name();
 
   /**
-   * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getSuperAccessContexts <em>Super Access Contexts</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getSuperAccessContexts <em>Super Access Contexts</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference list '<em>Super Access Contexts</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getSuperAccessContexts()
-   * @see #getAccessContext()
-   * @generated
-   */
+    * @return the meta object for the reference list '<em>Super Access Contexts</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getSuperAccessContexts()
+    * @see #getAccessContext()
+    * @generated
+    */
   EReference getAccessContext_SuperAccessContexts();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid <em>Guid</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid <em>Guid</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Guid</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid()
-   * @see #getAccessContext()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Guid</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getGuid()
+    * @see #getAccessContext()
+    * @generated
+    */
   EAttribute getAccessContext_Guid();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getAccessRules <em>Access Rules</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getAccessRules <em>Access Rules</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Access Rules</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getAccessRules()
-   * @see #getAccessContext()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Access Rules</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getAccessRules()
+    * @see #getAccessContext()
+    * @generated
+    */
   EReference getAccessContext_AccessRules();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getHierarchyRestrictions <em>Hierarchy Restrictions</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getHierarchyRestrictions <em>Hierarchy Restrictions</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Hierarchy Restrictions</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getHierarchyRestrictions()
-   * @see #getAccessContext()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Hierarchy Restrictions</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext#getHierarchyRestrictions()
+    * @see #getAccessContext()
+    * @generated
+    */
   EReference getAccessContext_HierarchyRestrictions();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction <em>Hierarchy Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction <em>Hierarchy Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Hierarchy Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Hierarchy Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction
+    * @generated
+    */
   EClass getHierarchyRestriction();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef()
-   * @see #getHierarchyRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getArtifactMatcherRef()
+    * @see #getHierarchyRestriction()
+    * @generated
+    */
   EReference getHierarchyRestriction_ArtifactMatcherRef();
 
   /**
-   * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getAccessRules <em>Access Rules</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference list '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getAccessRules <em>Access Rules</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference list '<em>Access Rules</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getAccessRules()
-   * @see #getHierarchyRestriction()
-   * @generated
-   */
+    * @return the meta object for the containment reference list '<em>Access Rules</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction#getAccessRules()
+    * @see #getHierarchyRestriction()
+    * @generated
+    */
   EReference getHierarchyRestriction_AccessRules();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate <em>Relation Type Artifact Type Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate <em>Relation Type Artifact Type Predicate</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Relation Type Artifact Type Predicate</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate
-   * @generated
-   */
+    * @return the meta object for class '<em>Relation Type Artifact Type Predicate</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate
+    * @generated
+    */
   EClass getRelationTypeArtifactTypePredicate();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef()
-   * @see #getRelationTypeArtifactTypePredicate()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef()
+    * @see #getRelationTypeArtifactTypePredicate()
+    * @generated
+    */
   EReference getRelationTypeArtifactTypePredicate_ArtifactTypeRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate <em>Relation Type Artifact Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate <em>Relation Type Artifact Predicate</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Relation Type Artifact Predicate</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate
-   * @generated
-   */
+    * @return the meta object for class '<em>Relation Type Artifact Predicate</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate
+    * @generated
+    */
   EClass getRelationTypeArtifactPredicate();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef()
-   * @see #getRelationTypeArtifactPredicate()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef()
+    * @see #getRelationTypeArtifactPredicate()
+    * @generated
+    */
   EReference getRelationTypeArtifactPredicate_ArtifactMatcherRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate <em>Relation Type Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate <em>Relation Type Predicate</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Relation Type Predicate</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate
-   * @generated
-   */
+    * @return the meta object for class '<em>Relation Type Predicate</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate
+    * @generated
+    */
   EClass getRelationTypePredicate();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction <em>Object Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction <em>Object Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Object Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Object Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction
+    * @generated
+    */
   EClass getObjectRestriction();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission <em>Permission</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission <em>Permission</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Permission</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission()
-   * @see #getObjectRestriction()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Permission</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction#getPermission()
+    * @see #getObjectRestriction()
+    * @generated
+    */
   EAttribute getObjectRestriction_Permission();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction <em>Artifact Match Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction <em>Artifact Match Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Artifact Match Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Artifact Match Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction
+    * @generated
+    */
   EClass getArtifactMatchRestriction();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef()
-   * @see #getArtifactMatchRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction#getArtifactMatcherRef()
+    * @see #getArtifactMatchRestriction()
+    * @generated
+    */
   EReference getArtifactMatchRestriction_ArtifactMatcherRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction <em>Artifact Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction <em>Artifact Type Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Artifact Type Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Artifact Type Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction
+    * @generated
+    */
   EClass getArtifactTypeRestriction();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef()
-   * @see #getArtifactTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction#getArtifactTypeRef()
+    * @see #getArtifactTypeRestriction()
+    * @generated
+    */
   EReference getArtifactTypeRestriction_ArtifactTypeRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction <em>Attribute Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction <em>Attribute Type Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Attribute Type Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Attribute Type Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction
+    * @generated
+    */
   EClass getAttributeTypeRestriction();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef <em>Attribute Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef <em>Attribute Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Attribute Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef()
-   * @see #getAttributeTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Attribute Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getAttributeTypeRef()
+    * @see #getAttributeTypeRestriction()
+    * @generated
+    */
   EReference getAttributeTypeRestriction_AttributeTypeRef();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef <em>Artifact Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef()
-   * @see #getAttributeTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction#getArtifactTypeRef()
+    * @see #getAttributeTypeRestriction()
+    * @generated
+    */
   EReference getAttributeTypeRestriction_ArtifactTypeRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction <em>Legacy Relation Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction <em>Legacy Relation Type Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Legacy Relation Type Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Legacy Relation Type Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction
+    * @generated
+    */
   EClass getLegacyRelationTypeRestriction();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission <em>Permission</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission <em>Permission</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Permission</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission()
-   * @see #getLegacyRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Permission</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getPermission()
+    * @see #getLegacyRelationTypeRestriction()
+    * @generated
+    */
   EAttribute getLegacyRelationTypeRestriction_Permission();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Relation Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef()
-   * @see #getLegacyRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Relation Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRelationTypeRef()
+    * @see #getLegacyRelationTypeRestriction()
+    * @generated
+    */
   EReference getLegacyRelationTypeRestriction_RelationTypeRef();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Restricted To Side</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide()
-   * @see #getLegacyRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Restricted To Side</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getRestrictedToSide()
+    * @see #getLegacyRelationTypeRestriction()
+    * @generated
+    */
   EAttribute getLegacyRelationTypeRestriction_RestrictedToSide();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef()
-   * @see #getLegacyRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Artifact Matcher Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction#getArtifactMatcherRef()
+    * @see #getLegacyRelationTypeRestriction()
+    * @generated
+    */
   EReference getLegacyRelationTypeRestriction_ArtifactMatcherRef();
 
   /**
-   * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction <em>Relation Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction <em>Relation Type Restriction</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for class '<em>Relation Type Restriction</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction
-   * @generated
-   */
+    * @return the meta object for class '<em>Relation Type Restriction</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction
+    * @generated
+    */
   EClass getRelationTypeRestriction();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch <em>Relation Type Match</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch <em>Relation Type Match</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Relation Type Match</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch()
-   * @see #getRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Relation Type Match</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch()
+    * @see #getRelationTypeRestriction()
+    * @generated
+    */
   EAttribute getRelationTypeRestriction_RelationTypeMatch();
 
   /**
-   * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the reference '<em>Relation Type Ref</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef()
-   * @see #getRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the reference '<em>Relation Type Ref</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef()
+    * @see #getRelationTypeRestriction()
+    * @generated
+    */
   EReference getRelationTypeRestriction_RelationTypeRef();
 
   /**
-   * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the attribute '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the attribute '<em>Restricted To Side</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide()
-   * @see #getRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the attribute '<em>Restricted To Side</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide()
+    * @see #getRelationTypeRestriction()
+    * @generated
+    */
   EAttribute getRelationTypeRestriction_RestrictedToSide();
 
   /**
-   * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate <em>Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for the containment reference '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate <em>Predicate</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for the containment reference '<em>Predicate</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate()
-   * @see #getRelationTypeRestriction()
-   * @generated
-   */
+    * @return the meta object for the containment reference '<em>Predicate</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate()
+    * @see #getRelationTypeRestriction()
+    * @generated
+    */
   EReference getRelationTypeRestriction_Predicate();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>Relation Multiplicity Enum</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
-   * @generated
-   */
+    * @return the meta object for enum '<em>Relation Multiplicity Enum</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
+    * @generated
+    */
   EEnum getRelationMultiplicityEnum();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>Compare Op</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
-   * @generated
-   */
+    * @return the meta object for enum '<em>Compare Op</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
+    * @generated
+    */
   EEnum getCompareOp();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>XLogic Operator</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
-   * @generated
-   */
+    * @return the meta object for enum '<em>XLogic Operator</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
+    * @generated
+    */
   EEnum getXLogicOperator();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>Match Field</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
-   * @generated
-   */
+    * @return the meta object for enum '<em>Match Field</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
+    * @generated
+    */
   EEnum getMatchField();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>Access Permission Enum</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-   * @generated
-   */
+    * @return the meta object for enum '<em>Access Permission Enum</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+    * @generated
+    */
   EEnum getAccessPermissionEnum();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>Relation Type Match</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
-   * @generated
-   */
+    * @return the meta object for enum '<em>Relation Type Match</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
+    * @generated
+    */
   EEnum getRelationTypeMatch();
 
   /**
-   * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Returns the meta object for enum '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}'.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @return the meta object for enum '<em>XRelation Side Enum</em>'.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @generated
-   */
+    * @return the meta object for enum '<em>XRelation Side Enum</em>'.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @generated
+    */
   EEnum getXRelationSideEnum();
 
   /**
-   * Returns the factory that creates the instances of the model.
-   * <!-- begin-user-doc -->
+    * 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
-   */
+    * @return the factory that creates the instances of the model.
+    * @generated
+    */
   OseeDslFactory getOseeDslFactory();
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * Defines literals for the meta objects that represent
    * <ul>
    *   <li>each class,</li>
@@ -3254,1176 +3254,1176 @@
    *   <li>and each data type</li>
    * </ul>
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   interface Literals
   {
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl <em>Osee Dsl</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl <em>Osee Dsl</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeDsl()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeDsl()
+       * @generated
+       */
     EClass OSEE_DSL = eINSTANCE.getOseeDsl();
 
     /**
-     * The meta object literal for the '<em><b>Imports</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Imports</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__IMPORTS = eINSTANCE.getOseeDsl_Imports();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Types</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Types</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ARTIFACT_TYPES = eINSTANCE.getOseeDsl_ArtifactTypes();
 
     /**
-     * The meta object literal for the '<em><b>Relation Types</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Relation Types</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__RELATION_TYPES = eINSTANCE.getOseeDsl_RelationTypes();
 
     /**
-     * The meta object literal for the '<em><b>Attribute Types</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Attribute Types</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ATTRIBUTE_TYPES = eINSTANCE.getOseeDsl_AttributeTypes();
 
     /**
-     * The meta object literal for the '<em><b>Enum Types</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Types</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ENUM_TYPES = eINSTANCE.getOseeDsl_EnumTypes();
 
     /**
-     * The meta object literal for the '<em><b>Enum Overrides</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Overrides</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ENUM_OVERRIDES = eINSTANCE.getOseeDsl_EnumOverrides();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Type Overrides</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Type Overrides</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ARTIFACT_TYPE_OVERRIDES = eINSTANCE.getOseeDsl_ArtifactTypeOverrides();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Match Refs</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Match Refs</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ARTIFACT_MATCH_REFS = eINSTANCE.getOseeDsl_ArtifactMatchRefs();
 
     /**
-     * The meta object literal for the '<em><b>Access Declarations</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Access Declarations</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ACCESS_DECLARATIONS = eINSTANCE.getOseeDsl_AccessDeclarations();
 
     /**
-     * The meta object literal for the '<em><b>Role Declarations</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Role Declarations</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference OSEE_DSL__ROLE_DECLARATIONS = eINSTANCE.getOseeDsl_RoleDeclarations();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl <em>Import</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl <em>Import</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getImport()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ImportImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getImport()
+       * @generated
+       */
     EClass IMPORT = eINSTANCE.getImport();
 
     /**
-     * The meta object literal for the '<em><b>Import URI</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Import URI</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute IMPORT__IMPORT_URI = eINSTANCE.getImport_ImportURI();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl <em>Osee Element</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl <em>Osee Element</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeElement()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeElementImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeElement()
+       * @generated
+       */
     EClass OSEE_ELEMENT = eINSTANCE.getOseeElement();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl <em>Osee Type</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl <em>Osee Type</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeType()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeTypeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOseeType()
+       * @generated
+       */
     EClass OSEE_TYPE = eINSTANCE.getOseeType();
 
     /**
-     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute OSEE_TYPE__NAME = eINSTANCE.getOseeType_Name();
 
     /**
-     * The meta object literal for the '<em><b>Type Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Type Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute OSEE_TYPE__TYPE_GUID = eINSTANCE.getOseeType_TypeGuid();
 
     /**
-     * The meta object literal for the '<em><b>Uuid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Uuid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute OSEE_TYPE__UUID = eINSTANCE.getOseeType_Uuid();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl <em>XArtifact Type</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl <em>XArtifact Type</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactType()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactTypeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactType()
+       * @generated
+       */
     EClass XARTIFACT_TYPE = eINSTANCE.getXArtifactType();
 
     /**
-     * The meta object literal for the '<em><b>Abstract</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Abstract</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XARTIFACT_TYPE__ABSTRACT = eINSTANCE.getXArtifactType_Abstract();
 
     /**
-     * The meta object literal for the '<em><b>Super Artifact Types</b></em>' reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Super Artifact Types</b></em>' reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES = eINSTANCE.getXArtifactType_SuperArtifactTypes();
 
     /**
-     * The meta object literal for the '<em><b>Valid Attribute Types</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Valid Attribute Types</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES = eINSTANCE.getXArtifactType_ValidAttributeTypes();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl <em>XAttribute Type Ref</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl <em>XAttribute Type Ref</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeTypeRef()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeRefImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeTypeRef()
+       * @generated
+       */
     EClass XATTRIBUTE_TYPE_REF = eINSTANCE.getXAttributeTypeRef();
 
     /**
-     * The meta object literal for the '<em><b>Valid Attribute Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Valid Attribute Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE = eINSTANCE.getXAttributeTypeRef_ValidAttributeType();
 
     /**
-     * The meta object literal for the '<em><b>Branch Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Branch Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE_REF__BRANCH_GUID = eINSTANCE.getXAttributeTypeRef_BranchGuid();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl <em>XAttribute Type</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl <em>XAttribute Type</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeType()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XAttributeTypeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXAttributeType()
+       * @generated
+       */
     EClass XATTRIBUTE_TYPE = eINSTANCE.getXAttributeType();
 
     /**
-     * The meta object literal for the '<em><b>Base Attribute Type</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Base Attribute Type</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE = eINSTANCE.getXAttributeType_BaseAttributeType();
 
     /**
-     * The meta object literal for the '<em><b>Override</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Override</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XATTRIBUTE_TYPE__OVERRIDE = eINSTANCE.getXAttributeType_Override();
 
     /**
-     * The meta object literal for the '<em><b>Data Provider</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Data Provider</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__DATA_PROVIDER = eINSTANCE.getXAttributeType_DataProvider();
 
     /**
-     * The meta object literal for the '<em><b>Min</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Min</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__MIN = eINSTANCE.getXAttributeType_Min();
 
     /**
-     * The meta object literal for the '<em><b>Max</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Max</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__MAX = eINSTANCE.getXAttributeType_Max();
 
     /**
-     * The meta object literal for the '<em><b>Tagger Id</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Tagger Id</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__TAGGER_ID = eINSTANCE.getXAttributeType_TaggerId();
 
     /**
-     * The meta object literal for the '<em><b>Enum Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XATTRIBUTE_TYPE__ENUM_TYPE = eINSTANCE.getXAttributeType_EnumType();
 
     /**
-     * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__DESCRIPTION = eINSTANCE.getXAttributeType_Description();
 
     /**
-     * The meta object literal for the '<em><b>Default Value</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Default Value</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__DEFAULT_VALUE = eINSTANCE.getXAttributeType_DefaultValue();
 
     /**
-     * The meta object literal for the '<em><b>File Extension</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>File Extension</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__FILE_EXTENSION = eINSTANCE.getXAttributeType_FileExtension();
 
     /**
-     * The meta object literal for the '<em><b>Media Type</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Media Type</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XATTRIBUTE_TYPE__MEDIA_TYPE = eINSTANCE.getXAttributeType_MediaType();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl <em>XOsee Enum Type</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl <em>XOsee Enum Type</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumType()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumTypeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumType()
+       * @generated
+       */
     EClass XOSEE_ENUM_TYPE = eINSTANCE.getXOseeEnumType();
 
     /**
-     * The meta object literal for the '<em><b>Enum Entries</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Entries</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XOSEE_ENUM_TYPE__ENUM_ENTRIES = eINSTANCE.getXOseeEnumType_EnumEntries();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl <em>XOsee Enum Entry</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl <em>XOsee Enum Entry</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumEntry()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumEntryImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumEntry()
+       * @generated
+       */
     EClass XOSEE_ENUM_ENTRY = eINSTANCE.getXOseeEnumEntry();
 
     /**
-     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ENUM_ENTRY__NAME = eINSTANCE.getXOseeEnumEntry_Name();
 
     /**
-     * The meta object literal for the '<em><b>Ordinal</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Ordinal</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ENUM_ENTRY__ORDINAL = eINSTANCE.getXOseeEnumEntry_Ordinal();
 
     /**
-     * The meta object literal for the '<em><b>Entry Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Entry Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ENUM_ENTRY__ENTRY_GUID = eINSTANCE.getXOseeEnumEntry_EntryGuid();
 
     /**
-     * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ENUM_ENTRY__DESCRIPTION = eINSTANCE.getXOseeEnumEntry_Description();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl <em>XOsee Enum Override</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl <em>XOsee Enum Override</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumOverride()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeEnumOverrideImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeEnumOverride()
+       * @generated
+       */
     EClass XOSEE_ENUM_OVERRIDE = eINSTANCE.getXOseeEnumOverride();
 
     /**
-     * The meta object literal for the '<em><b>Overriden Enum Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Overriden Enum Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE = eINSTANCE.getXOseeEnumOverride_OverridenEnumType();
 
     /**
-     * The meta object literal for the '<em><b>Inherit All</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Inherit All</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ENUM_OVERRIDE__INHERIT_ALL = eINSTANCE.getXOseeEnumOverride_InheritAll();
 
     /**
-     * The meta object literal for the '<em><b>Override Options</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Override Options</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS = eINSTANCE.getXOseeEnumOverride_OverrideOptions();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl <em>Override Option</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl <em>Override Option</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOverrideOption()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OverrideOptionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getOverrideOption()
+       * @generated
+       */
     EClass OVERRIDE_OPTION = eINSTANCE.getOverrideOption();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl <em>Add Enum</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl <em>Add Enum</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddEnum()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddEnumImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddEnum()
+       * @generated
+       */
     EClass ADD_ENUM = eINSTANCE.getAddEnum();
 
     /**
-     * The meta object literal for the '<em><b>Enum Entry</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Entry</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ADD_ENUM__ENUM_ENTRY = eINSTANCE.getAddEnum_EnumEntry();
 
     /**
-     * The meta object literal for the '<em><b>Ordinal</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Ordinal</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ADD_ENUM__ORDINAL = eINSTANCE.getAddEnum_Ordinal();
 
     /**
-     * The meta object literal for the '<em><b>Entry Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Entry Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ADD_ENUM__ENTRY_GUID = eINSTANCE.getAddEnum_EntryGuid();
 
     /**
-     * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ADD_ENUM__DESCRIPTION = eINSTANCE.getAddEnum_Description();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl <em>Remove Enum</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl <em>Remove Enum</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveEnum()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveEnumImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveEnum()
+       * @generated
+       */
     EClass REMOVE_ENUM = eINSTANCE.getRemoveEnum();
 
     /**
-     * The meta object literal for the '<em><b>Enum Entry</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Enum Entry</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference REMOVE_ENUM__ENUM_ENTRY = eINSTANCE.getRemoveEnum_EnumEntry();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl <em>XOsee Artifact Type Override</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl <em>XOsee Artifact Type Override</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeArtifactTypeOverride()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XOseeArtifactTypeOverrideImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXOseeArtifactTypeOverride()
+       * @generated
+       */
     EClass XOSEE_ARTIFACT_TYPE_OVERRIDE = eINSTANCE.getXOseeArtifactTypeOverride();
 
     /**
-     * The meta object literal for the '<em><b>Overriden Artifact Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Overriden Artifact Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE = eINSTANCE.getXOseeArtifactTypeOverride_OverridenArtifactType();
 
     /**
-     * The meta object literal for the '<em><b>Inherit All</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Inherit All</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL = eINSTANCE.getXOseeArtifactTypeOverride_InheritAll();
 
     /**
-     * The meta object literal for the '<em><b>Override Options</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Override Options</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS = eINSTANCE.getXOseeArtifactTypeOverride_OverrideOptions();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl <em>Attribute Override Option</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl <em>Attribute Override Option</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeOverrideOption()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeOverrideOptionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeOverrideOption()
+       * @generated
+       */
     EClass ATTRIBUTE_OVERRIDE_OPTION = eINSTANCE.getAttributeOverrideOption();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl <em>Add Attribute</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl <em>Add Attribute</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddAttribute()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AddAttributeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAddAttribute()
+       * @generated
+       */
     EClass ADD_ATTRIBUTE = eINSTANCE.getAddAttribute();
 
     /**
-     * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ADD_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getAddAttribute_Attribute();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl <em>Remove Attribute</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl <em>Remove Attribute</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveAttribute()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RemoveAttributeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRemoveAttribute()
+       * @generated
+       */
     EClass REMOVE_ATTRIBUTE = eINSTANCE.getRemoveAttribute();
 
     /**
-     * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference REMOVE_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getRemoveAttribute_Attribute();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl <em>Update Attribute</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl <em>Update Attribute</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUpdateAttribute()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UpdateAttributeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUpdateAttribute()
+       * @generated
+       */
     EClass UPDATE_ATTRIBUTE = eINSTANCE.getUpdateAttribute();
 
     /**
-     * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference UPDATE_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getUpdateAttribute_Attribute();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl <em>XRelation Type</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl <em>XRelation Type</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationType()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XRelationTypeImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationType()
+       * @generated
+       */
     EClass XRELATION_TYPE = eINSTANCE.getXRelationType();
 
     /**
-     * The meta object literal for the '<em><b>Side AName</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Side AName</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XRELATION_TYPE__SIDE_ANAME = eINSTANCE.getXRelationType_SideAName();
 
     /**
-     * The meta object literal for the '<em><b>Side AArtifact Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Side AArtifact Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XRELATION_TYPE__SIDE_AARTIFACT_TYPE = eINSTANCE.getXRelationType_SideAArtifactType();
 
     /**
-     * The meta object literal for the '<em><b>Side BName</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Side BName</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XRELATION_TYPE__SIDE_BNAME = eINSTANCE.getXRelationType_SideBName();
 
     /**
-     * The meta object literal for the '<em><b>Side BArtifact Type</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Side BArtifact Type</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XRELATION_TYPE__SIDE_BARTIFACT_TYPE = eINSTANCE.getXRelationType_SideBArtifactType();
 
     /**
-     * The meta object literal for the '<em><b>Default Order Type</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Default Order Type</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XRELATION_TYPE__DEFAULT_ORDER_TYPE = eINSTANCE.getXRelationType_DefaultOrderType();
 
     /**
-     * The meta object literal for the '<em><b>Multiplicity</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Multiplicity</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XRELATION_TYPE__MULTIPLICITY = eINSTANCE.getXRelationType_Multiplicity();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl <em>Condition</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl <em>Condition</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCondition()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ConditionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCondition()
+       * @generated
+       */
     EClass CONDITION = eINSTANCE.getCondition();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl <em>Simple Condition</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl <em>Simple Condition</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getSimpleCondition()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.SimpleConditionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getSimpleCondition()
+       * @generated
+       */
     EClass SIMPLE_CONDITION = eINSTANCE.getSimpleCondition();
 
     /**
-     * The meta object literal for the '<em><b>Field</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Field</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute SIMPLE_CONDITION__FIELD = eINSTANCE.getSimpleCondition_Field();
 
     /**
-     * The meta object literal for the '<em><b>Op</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Op</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute SIMPLE_CONDITION__OP = eINSTANCE.getSimpleCondition_Op();
 
     /**
-     * The meta object literal for the '<em><b>Expression</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Expression</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute SIMPLE_CONDITION__EXPRESSION = eINSTANCE.getSimpleCondition_Expression();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl <em>Compound Condition</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl <em>Compound Condition</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompoundCondition()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.CompoundConditionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompoundCondition()
+       * @generated
+       */
     EClass COMPOUND_CONDITION = eINSTANCE.getCompoundCondition();
 
     /**
-     * The meta object literal for the '<em><b>Conditions</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Conditions</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference COMPOUND_CONDITION__CONDITIONS = eINSTANCE.getCompoundCondition_Conditions();
 
     /**
-     * The meta object literal for the '<em><b>Operators</b></em>' attribute list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Operators</b></em>' attribute list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute COMPOUND_CONDITION__OPERATORS = eINSTANCE.getCompoundCondition_Operators();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl <em>XArtifact Matcher</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl <em>XArtifact Matcher</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactMatcher()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.XArtifactMatcherImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXArtifactMatcher()
+       * @generated
+       */
     EClass XARTIFACT_MATCHER = eINSTANCE.getXArtifactMatcher();
 
     /**
-     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XARTIFACT_MATCHER__NAME = eINSTANCE.getXArtifactMatcher_Name();
 
     /**
-     * The meta object literal for the '<em><b>Conditions</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Conditions</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference XARTIFACT_MATCHER__CONDITIONS = eINSTANCE.getXArtifactMatcher_Conditions();
 
     /**
-     * The meta object literal for the '<em><b>Operators</b></em>' attribute list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Operators</b></em>' attribute list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute XARTIFACT_MATCHER__OPERATORS = eINSTANCE.getXArtifactMatcher_Operators();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl <em>Role</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl <em>Role</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRole()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RoleImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRole()
+       * @generated
+       */
     EClass ROLE = eINSTANCE.getRole();
 
     /**
-     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ROLE__NAME = eINSTANCE.getRole_Name();
 
     /**
-     * The meta object literal for the '<em><b>Super Roles</b></em>' reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Super Roles</b></em>' reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ROLE__SUPER_ROLES = eINSTANCE.getRole_SuperRoles();
 
     /**
-     * The meta object literal for the '<em><b>Users And Groups</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Users And Groups</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ROLE__USERS_AND_GROUPS = eINSTANCE.getRole_UsersAndGroups();
 
     /**
-     * The meta object literal for the '<em><b>Referenced Contexts</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Referenced Contexts</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ROLE__REFERENCED_CONTEXTS = eINSTANCE.getRole_ReferencedContexts();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl <em>Referenced Context</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl <em>Referenced Context</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getReferencedContext()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ReferencedContextImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getReferencedContext()
+       * @generated
+       */
     EClass REFERENCED_CONTEXT = eINSTANCE.getReferencedContext();
 
     /**
-     * The meta object literal for the '<em><b>Access Context Ref</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Access Context Ref</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute REFERENCED_CONTEXT__ACCESS_CONTEXT_REF = eINSTANCE.getReferencedContext_AccessContextRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl <em>Users And Groups</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl <em>Users And Groups</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUsersAndGroups()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.UsersAndGroupsImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getUsersAndGroups()
+       * @generated
+       */
     EClass USERS_AND_GROUPS = eINSTANCE.getUsersAndGroups();
 
     /**
-     * The meta object literal for the '<em><b>User Or Group Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>User Or Group Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute USERS_AND_GROUPS__USER_OR_GROUP_GUID = eINSTANCE.getUsersAndGroups_UserOrGroupGuid();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl <em>Access Context</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl <em>Access Context</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessContext()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AccessContextImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessContext()
+       * @generated
+       */
     EClass ACCESS_CONTEXT = eINSTANCE.getAccessContext();
 
     /**
-     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ACCESS_CONTEXT__NAME = eINSTANCE.getAccessContext_Name();
 
     /**
-     * The meta object literal for the '<em><b>Super Access Contexts</b></em>' reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Super Access Contexts</b></em>' reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS = eINSTANCE.getAccessContext_SuperAccessContexts();
 
     /**
-     * The meta object literal for the '<em><b>Guid</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Guid</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute ACCESS_CONTEXT__GUID = eINSTANCE.getAccessContext_Guid();
 
     /**
-     * The meta object literal for the '<em><b>Access Rules</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Access Rules</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ACCESS_CONTEXT__ACCESS_RULES = eINSTANCE.getAccessContext_AccessRules();
 
     /**
-     * The meta object literal for the '<em><b>Hierarchy Restrictions</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Hierarchy Restrictions</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS = eINSTANCE.getAccessContext_HierarchyRestrictions();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl <em>Hierarchy Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl <em>Hierarchy Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getHierarchyRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.HierarchyRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getHierarchyRestriction()
+       * @generated
+       */
     EClass HIERARCHY_RESTRICTION = eINSTANCE.getHierarchyRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF = eINSTANCE.getHierarchyRestriction_ArtifactMatcherRef();
 
     /**
-     * The meta object literal for the '<em><b>Access Rules</b></em>' containment reference list feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Access Rules</b></em>' containment reference list feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference HIERARCHY_RESTRICTION__ACCESS_RULES = eINSTANCE.getHierarchyRestriction_AccessRules();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl <em>Relation Type Artifact Type Predicate</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl <em>Relation Type Artifact Type Predicate</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactTypePredicate()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactTypePredicateImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactTypePredicate()
+       * @generated
+       */
     EClass RELATION_TYPE_ARTIFACT_TYPE_PREDICATE = eINSTANCE.getRelationTypeArtifactTypePredicate();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF = eINSTANCE.getRelationTypeArtifactTypePredicate_ArtifactTypeRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl <em>Relation Type Artifact Predicate</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl <em>Relation Type Artifact Predicate</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactPredicate()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeArtifactPredicateImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeArtifactPredicate()
+       * @generated
+       */
     EClass RELATION_TYPE_ARTIFACT_PREDICATE = eINSTANCE.getRelationTypeArtifactPredicate();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF = eINSTANCE.getRelationTypeArtifactPredicate_ArtifactMatcherRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl <em>Relation Type Predicate</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl <em>Relation Type Predicate</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypePredicate()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypePredicateImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypePredicate()
+       * @generated
+       */
     EClass RELATION_TYPE_PREDICATE = eINSTANCE.getRelationTypePredicate();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl <em>Object Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl <em>Object Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getObjectRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ObjectRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getObjectRestriction()
+       * @generated
+       */
     EClass OBJECT_RESTRICTION = eINSTANCE.getObjectRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Permission</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Permission</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute OBJECT_RESTRICTION__PERMISSION = eINSTANCE.getObjectRestriction_Permission();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl <em>Artifact Match Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl <em>Artifact Match Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactMatchRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactMatchRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactMatchRestriction()
+       * @generated
+       */
     EClass ARTIFACT_MATCH_RESTRICTION = eINSTANCE.getArtifactMatchRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF = eINSTANCE.getArtifactMatchRestriction_ArtifactMatcherRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl <em>Artifact Type Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl <em>Artifact Type Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactTypeRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.ArtifactTypeRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getArtifactTypeRestriction()
+       * @generated
+       */
     EClass ARTIFACT_TYPE_RESTRICTION = eINSTANCE.getArtifactTypeRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF = eINSTANCE.getArtifactTypeRestriction_ArtifactTypeRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl <em>Attribute Type Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl <em>Attribute Type Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeTypeRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.AttributeTypeRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAttributeTypeRestriction()
+       * @generated
+       */
     EClass ATTRIBUTE_TYPE_RESTRICTION = eINSTANCE.getAttributeTypeRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Attribute Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Attribute Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF = eINSTANCE.getAttributeTypeRestriction_AttributeTypeRef();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF = eINSTANCE.getAttributeTypeRestriction_ArtifactTypeRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl <em>Legacy Relation Type Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl <em>Legacy Relation Type Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getLegacyRelationTypeRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.LegacyRelationTypeRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getLegacyRelationTypeRestriction()
+       * @generated
+       */
     EClass LEGACY_RELATION_TYPE_RESTRICTION = eINSTANCE.getLegacyRelationTypeRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Permission</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Permission</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION = eINSTANCE.getLegacyRelationTypeRestriction_Permission();
 
     /**
-     * The meta object literal for the '<em><b>Relation Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Relation Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF = eINSTANCE.getLegacyRelationTypeRestriction_RelationTypeRef();
 
     /**
-     * The meta object literal for the '<em><b>Restricted To Side</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Restricted To Side</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE = eINSTANCE.getLegacyRelationTypeRestriction_RestrictedToSide();
 
     /**
-     * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Artifact Matcher Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF = eINSTANCE.getLegacyRelationTypeRestriction_ArtifactMatcherRef();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl <em>Relation Type Restriction</em>}' class.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl <em>Relation Type Restriction</em>}' class.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeRestriction()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.RelationTypeRestrictionImpl
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeRestriction()
+       * @generated
+       */
     EClass RELATION_TYPE_RESTRICTION = eINSTANCE.getRelationTypeRestriction();
 
     /**
-     * The meta object literal for the '<em><b>Relation Type Match</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Relation Type Match</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH = eINSTANCE.getRelationTypeRestriction_RelationTypeMatch();
 
     /**
-     * The meta object literal for the '<em><b>Relation Type Ref</b></em>' reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Relation Type Ref</b></em>' reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF = eINSTANCE.getRelationTypeRestriction_RelationTypeRef();
 
     /**
-     * The meta object literal for the '<em><b>Restricted To Side</b></em>' attribute feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Restricted To Side</b></em>' attribute feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EAttribute RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE = eINSTANCE.getRelationTypeRestriction_RestrictedToSide();
 
     /**
-     * The meta object literal for the '<em><b>Predicate</b></em>' containment reference feature.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '<em><b>Predicate</b></em>' containment reference feature.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @generated
-     */
+       * @generated
+       */
     EReference RELATION_TYPE_RESTRICTION__PREDICATE = eINSTANCE.getRelationTypeRestriction_Predicate();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum <em>Relation Multiplicity Enum</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationMultiplicityEnum()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationMultiplicityEnum()
+       * @generated
+       */
     EEnum RELATION_MULTIPLICITY_ENUM = eINSTANCE.getRelationMultiplicityEnum();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp <em>Compare Op</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompareOp()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getCompareOp()
+       * @generated
+       */
     EEnum COMPARE_OP = eINSTANCE.getCompareOp();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator <em>XLogic Operator</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXLogicOperator()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXLogicOperator()
+       * @generated
+       */
     EEnum XLOGIC_OPERATOR = eINSTANCE.getXLogicOperator();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField <em>Match Field</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getMatchField()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getMatchField()
+       * @generated
+       */
     EEnum MATCH_FIELD = eINSTANCE.getMatchField();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum <em>Access Permission Enum</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessPermissionEnum()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessPermissionEnum
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getAccessPermissionEnum()
+       * @generated
+       */
     EEnum ACCESS_PERMISSION_ENUM = eINSTANCE.getAccessPermissionEnum();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch <em>Relation Type Match</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeMatch()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeMatch
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getRelationTypeMatch()
+       * @generated
+       */
     EEnum RELATION_TYPE_MATCH = eINSTANCE.getRelationTypeMatch();
 
     /**
-     * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}' enum.
-     * <!-- begin-user-doc -->
+       * The meta object literal for the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum <em>XRelation Side Enum</em>}' enum.
+       * <!-- begin-user-doc -->
      * <!-- end-user-doc -->
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-     * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationSideEnum()
-     * @generated
-     */
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+       * @see org.eclipse.osee.framework.core.dsl.oseeDsl.impl.OseeDslPackageImpl#getXRelationSideEnum()
+       * @generated
+       */
     EEnum XRELATION_SIDE_ENUM = eINSTANCE.getXRelationSideEnum();
 
   }
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeType.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeType.java
index f24787f..4c60254 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeType.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/OseeType.java
@@ -24,81 +24,81 @@
 public interface OseeType extends OseeElement
 {
   /**
-   * Returns the value of the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Name</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Name</em>' attribute.
-   * @see #setName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_Name()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Name</em>' attribute.
+    * @see #setName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_Name()
+    * @model
+    * @generated
+    */
   String getName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getName <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Name</em>' attribute.
-   * @see #getName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Name</em>' attribute.
+    * @see #getName()
+    * @generated
+    */
   void setName(String value);
 
   /**
-   * Returns the value of the '<em><b>Type Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Type Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Type Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Type Guid</em>' attribute.
-   * @see #setTypeGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_TypeGuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Type Guid</em>' attribute.
+    * @see #setTypeGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_TypeGuid()
+    * @model
+    * @generated
+    */
   String getTypeGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid <em>Type Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getTypeGuid <em>Type Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Type Guid</em>' attribute.
-   * @see #getTypeGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Type Guid</em>' attribute.
+    * @see #getTypeGuid()
+    * @generated
+    */
   void setTypeGuid(String value);
 
   /**
-   * Returns the value of the '<em><b>Uuid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Uuid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Uuid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Uuid</em>' attribute.
-   * @see #setUuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_Uuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Uuid</em>' attribute.
+    * @see #setUuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getOseeType_Uuid()
+    * @model
+    * @generated
+    */
   String getUuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid <em>Uuid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType#getUuid <em>Uuid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Uuid</em>' attribute.
-   * @see #getUuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Uuid</em>' attribute.
+    * @see #getUuid()
+    * @generated
+    */
   void setUuid(String value);
 
 } // OseeType
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ReferencedContext.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ReferencedContext.java
index 6c401de..346d855 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ReferencedContext.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/ReferencedContext.java
@@ -23,29 +23,29 @@
 public interface ReferencedContext extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Access Context Ref</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Access Context Ref</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Access Context Ref</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Access Context Ref</em>' attribute.
-   * @see #setAccessContextRef(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getReferencedContext_AccessContextRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Access Context Ref</em>' attribute.
+    * @see #setAccessContextRef(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getReferencedContext_AccessContextRef()
+    * @model
+    * @generated
+    */
   String getAccessContextRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef <em>Access Context Ref</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext#getAccessContextRef <em>Access Context Ref</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Access Context Ref</em>' attribute.
-   * @see #getAccessContextRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Access Context Ref</em>' attribute.
+    * @see #getAccessContextRef()
+    * @generated
+    */
   void setAccessContextRef(String value);
 
 } // ReferencedContext
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationMultiplicityEnum.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationMultiplicityEnum.java
index 41b438a..ffcbef4 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationMultiplicityEnum.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationMultiplicityEnum.java
@@ -20,258 +20,252 @@
 public enum RelationMultiplicityEnum implements Enumerator
 {
   /**
-   * The '<em><b>ONE TO ONE</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ONE TO ONE</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ONE_TO_ONE_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ONE_TO_ONE_VALUE
+    * @generated
+    * @ordered
+    */
   ONE_TO_ONE(0, "ONE_TO_ONE", "ONE_TO_ONE"),
 
   /**
-   * The '<em><b>ONE TO MANY</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ONE TO MANY</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ONE_TO_MANY_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ONE_TO_MANY_VALUE
+    * @generated
+    * @ordered
+    */
   ONE_TO_MANY(1, "ONE_TO_MANY", "ONE_TO_MANY"),
 
   /**
-   * The '<em><b>MANY TO ONE</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>MANY TO ONE</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #MANY_TO_ONE_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #MANY_TO_ONE_VALUE
+    * @generated
+    * @ordered
+    */
   MANY_TO_ONE(2, "MANY_TO_ONE", "MANY_TO_ONE"),
 
   /**
-   * The '<em><b>MANY TO MANY</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>MANY TO MANY</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #MANY_TO_MANY_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #MANY_TO_MANY_VALUE
+    * @generated
+    * @ordered
+    */
   MANY_TO_MANY(3, "MANY_TO_MANY", "MANY_TO_MANY");
 
   /**
-   * The '<em><b>ONE TO ONE</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ONE TO ONE</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>ONE TO ONE</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ONE_TO_ONE
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #ONE_TO_ONE
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int ONE_TO_ONE_VALUE = 0;
 
   /**
-   * The '<em><b>ONE TO MANY</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ONE TO MANY</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>ONE TO MANY</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ONE_TO_MANY
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #ONE_TO_MANY
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int ONE_TO_MANY_VALUE = 1;
 
   /**
-   * The '<em><b>MANY TO ONE</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>MANY TO ONE</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>MANY TO ONE</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #MANY_TO_ONE
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #MANY_TO_ONE
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int MANY_TO_ONE_VALUE = 2;
 
   /**
-   * The '<em><b>MANY TO MANY</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>MANY TO MANY</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>MANY TO MANY</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #MANY_TO_MANY
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #MANY_TO_MANY
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int MANY_TO_MANY_VALUE = 3;
 
   /**
-   * An array of all the '<em><b>Relation Multiplicity Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>Relation Multiplicity Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final RelationMultiplicityEnum[] VALUES_ARRAY =
-    new RelationMultiplicityEnum[]
-    {
-      ONE_TO_ONE,
-      ONE_TO_MANY,
-      MANY_TO_ONE,
-      MANY_TO_MANY,
-    };
+    new RelationMultiplicityEnum[] {
+         ONE_TO_ONE,
+         ONE_TO_MANY,
+         MANY_TO_ONE,
+         MANY_TO_MANY,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>Relation Multiplicity Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>Relation Multiplicity Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<RelationMultiplicityEnum> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationMultiplicityEnum get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      RelationMultiplicityEnum result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         RelationMultiplicityEnum result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationMultiplicityEnum getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      RelationMultiplicityEnum result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         RelationMultiplicityEnum result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Multiplicity Enum</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationMultiplicityEnum get(int value)
   {
-    switch (value)
-    {
-      case ONE_TO_ONE_VALUE: return ONE_TO_ONE;
-      case ONE_TO_MANY_VALUE: return ONE_TO_MANY;
-      case MANY_TO_ONE_VALUE: return MANY_TO_ONE;
-      case MANY_TO_MANY_VALUE: return MANY_TO_MANY;
-    }
-    return null;
-  }
+      switch (value) {
+         case ONE_TO_ONE_VALUE: return ONE_TO_ONE;
+         case ONE_TO_MANY_VALUE: return ONE_TO_MANY;
+         case MANY_TO_ONE_VALUE: return MANY_TO_ONE;
+         case MANY_TO_MANY_VALUE: return MANY_TO_MANY;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private RelationMultiplicityEnum(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //RelationMultiplicityEnum
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactPredicate.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactPredicate.java
index a96d573..ab02cf8 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactPredicate.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactPredicate.java
@@ -22,29 +22,29 @@
 public interface RelationTypeArtifactPredicate extends RelationTypePredicate
 {
   /**
-   * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Matcher Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Matcher Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #setArtifactMatcherRef(XArtifactMatcher)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeArtifactPredicate_ArtifactMatcherRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #setArtifactMatcherRef(XArtifactMatcher)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeArtifactPredicate_ArtifactMatcherRef()
+    * @model
+    * @generated
+    */
   XArtifactMatcher getArtifactMatcherRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate#getArtifactMatcherRef <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
-   * @see #getArtifactMatcherRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Matcher Ref</em>' reference.
+    * @see #getArtifactMatcherRef()
+    * @generated
+    */
   void setArtifactMatcherRef(XArtifactMatcher value);
 
 } // RelationTypeArtifactPredicate
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactTypePredicate.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactTypePredicate.java
index 04c6528..6827528 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactTypePredicate.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeArtifactTypePredicate.java
@@ -22,29 +22,29 @@
 public interface RelationTypeArtifactTypePredicate extends RelationTypePredicate
 {
   /**
-   * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Artifact Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Artifact Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #setArtifactTypeRef(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeArtifactTypePredicate_ArtifactTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #setArtifactTypeRef(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeArtifactTypePredicate_ArtifactTypeRef()
+    * @model
+    * @generated
+    */
   XArtifactType getArtifactTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate#getArtifactTypeRef <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
-   * @see #getArtifactTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Artifact Type Ref</em>' reference.
+    * @see #getArtifactTypeRef()
+    * @generated
+    */
   void setArtifactTypeRef(XArtifactType value);
 
 } // RelationTypeArtifactTypePredicate
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeMatch.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeMatch.java
index 6a0124d..2fa55f8 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeMatch.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeMatch.java
@@ -20,177 +20,171 @@
 public enum RelationTypeMatch implements Enumerator
 {
   /**
-   * The '<em><b>ALL</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ALL</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #ALL_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #ALL_VALUE
+    * @generated
+    * @ordered
+    */
   ALL(0, "ALL", "ALL");
 
   /**
-   * The '<em><b>ALL</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>ALL</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>ALL</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #ALL
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #ALL
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int ALL_VALUE = 0;
 
   /**
-   * An array of all the '<em><b>Relation Type Match</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>Relation Type Match</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final RelationTypeMatch[] VALUES_ARRAY =
-    new RelationTypeMatch[]
-    {
-      ALL,
-    };
+    new RelationTypeMatch[] {
+         ALL,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>Relation Type Match</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>Relation Type Match</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<RelationTypeMatch> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationTypeMatch get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      RelationTypeMatch result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         RelationTypeMatch result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationTypeMatch getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      RelationTypeMatch result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         RelationTypeMatch result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>Relation Type Match</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static RelationTypeMatch get(int value)
   {
-    switch (value)
-    {
-      case ALL_VALUE: return ALL;
-    }
-    return null;
-  }
+      switch (value) {
+         case ALL_VALUE: return ALL;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private RelationTypeMatch(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //RelationTypeMatch
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeRestriction.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeRestriction.java
index b606f43..1da4593 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeRestriction.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RelationTypeRestriction.java
@@ -25,110 +25,110 @@
 public interface RelationTypeRestriction extends ObjectRestriction
 {
   /**
-   * Returns the value of the '<em><b>Relation Type Match</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Relation Type Match</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Relation Type Match</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Relation Type Match</em>' attribute.
-   * @see #setRelationTypeMatch(boolean)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RelationTypeMatch()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Relation Type Match</em>' attribute.
+    * @see #setRelationTypeMatch(boolean)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RelationTypeMatch()
+    * @model
+    * @generated
+    */
   boolean isRelationTypeMatch();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch <em>Relation Type Match</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#isRelationTypeMatch <em>Relation Type Match</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Relation Type Match</em>' attribute.
-   * @see #isRelationTypeMatch()
-   * @generated
-   */
+    * @param value the new value of the '<em>Relation Type Match</em>' attribute.
+    * @see #isRelationTypeMatch()
+    * @generated
+    */
   void setRelationTypeMatch(boolean value);
 
   /**
-   * Returns the value of the '<em><b>Relation Type Ref</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Relation Type Ref</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Relation Type Ref</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Relation Type Ref</em>' reference.
-   * @see #setRelationTypeRef(XRelationType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RelationTypeRef()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Relation Type Ref</em>' reference.
+    * @see #setRelationTypeRef(XRelationType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RelationTypeRef()
+    * @model
+    * @generated
+    */
   XRelationType getRelationTypeRef();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRelationTypeRef <em>Relation Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Relation Type Ref</em>' reference.
-   * @see #getRelationTypeRef()
-   * @generated
-   */
+    * @param value the new value of the '<em>Relation Type Ref</em>' reference.
+    * @see #getRelationTypeRef()
+    * @generated
+    */
   void setRelationTypeRef(XRelationType value);
 
   /**
-   * Returns the value of the '<em><b>Restricted To Side</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Restricted To Side</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Restricted To Side</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Restricted To Side</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @see #setRestrictedToSide(XRelationSideEnum)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RestrictedToSide()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Restricted To Side</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @see #setRestrictedToSide(XRelationSideEnum)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_RestrictedToSide()
+    * @model
+    * @generated
+    */
   XRelationSideEnum getRestrictedToSide();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getRestrictedToSide <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Restricted To Side</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
-   * @see #getRestrictedToSide()
-   * @generated
-   */
+    * @param value the new value of the '<em>Restricted To Side</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationSideEnum
+    * @see #getRestrictedToSide()
+    * @generated
+    */
   void setRestrictedToSide(XRelationSideEnum value);
 
   /**
-   * Returns the value of the '<em><b>Predicate</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Predicate</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Predicate</em>' containment reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Predicate</em>' containment reference.
-   * @see #setPredicate(RelationTypePredicate)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_Predicate()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Predicate</em>' containment reference.
+    * @see #setPredicate(RelationTypePredicate)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRelationTypeRestriction_Predicate()
+    * @model containment="true"
+    * @generated
+    */
   RelationTypePredicate getPredicate();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate <em>Predicate</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction#getPredicate <em>Predicate</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Predicate</em>' containment reference.
-   * @see #getPredicate()
-   * @generated
-   */
+    * @param value the new value of the '<em>Predicate</em>' containment reference.
+    * @see #getPredicate()
+    * @generated
+    */
   void setPredicate(RelationTypePredicate value);
 
 } // RelationTypeRestriction
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveAttribute.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveAttribute.java
index 6232b5a..6868293 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveAttribute.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveAttribute.java
@@ -22,29 +22,29 @@
 public interface RemoveAttribute extends AttributeOverrideOption
 {
   /**
-   * Returns the value of the '<em><b>Attribute</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Attribute</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Attribute</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Attribute</em>' reference.
-   * @see #setAttribute(XAttributeType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRemoveAttribute_Attribute()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Attribute</em>' reference.
+    * @see #setAttribute(XAttributeType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRemoveAttribute_Attribute()
+    * @model
+    * @generated
+    */
   XAttributeType getAttribute();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute <em>Attribute</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute#getAttribute <em>Attribute</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Attribute</em>' reference.
-   * @see #getAttribute()
-   * @generated
-   */
+    * @param value the new value of the '<em>Attribute</em>' reference.
+    * @see #getAttribute()
+    * @generated
+    */
   void setAttribute(XAttributeType value);
 
 } // RemoveAttribute
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveEnum.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveEnum.java
index 7408884..86be5d6 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveEnum.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/RemoveEnum.java
@@ -22,29 +22,29 @@
 public interface RemoveEnum extends OverrideOption
 {
   /**
-   * Returns the value of the '<em><b>Enum Entry</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Entry</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Entry</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Entry</em>' reference.
-   * @see #setEnumEntry(XOseeEnumEntry)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRemoveEnum_EnumEntry()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Enum Entry</em>' reference.
+    * @see #setEnumEntry(XOseeEnumEntry)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRemoveEnum_EnumEntry()
+    * @model
+    * @generated
+    */
   XOseeEnumEntry getEnumEntry();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry <em>Enum Entry</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum#getEnumEntry <em>Enum Entry</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Enum Entry</em>' reference.
-   * @see #getEnumEntry()
-   * @generated
-   */
+    * @param value the new value of the '<em>Enum Entry</em>' reference.
+    * @see #getEnumEntry()
+    * @generated
+    */
   void setEnumEntry(XOseeEnumEntry value);
 
 } // RemoveEnum
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Role.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Role.java
index 19f40b4..d74a5da 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Role.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/Role.java
@@ -28,77 +28,77 @@
 public interface Role extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Name</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Name</em>' attribute.
-   * @see #setName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_Name()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Name</em>' attribute.
+    * @see #setName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_Name()
+    * @model
+    * @generated
+    */
   String getName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role#getName <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Name</em>' attribute.
-   * @see #getName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Name</em>' attribute.
+    * @see #getName()
+    * @generated
+    */
   void setName(String value);
 
   /**
-   * Returns the value of the '<em><b>Super Roles</b></em>' reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Super Roles</b></em>' reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Super Roles</em>' reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Super Roles</em>' reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_SuperRoles()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Super Roles</em>' reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_SuperRoles()
+    * @model
+    * @generated
+    */
   EList<Role> getSuperRoles();
 
   /**
-   * Returns the value of the '<em><b>Users And Groups</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Users And Groups</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Users And Groups</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Users And Groups</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_UsersAndGroups()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Users And Groups</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_UsersAndGroups()
+    * @model containment="true"
+    * @generated
+    */
   EList<UsersAndGroups> getUsersAndGroups();
 
   /**
-   * Returns the value of the '<em><b>Referenced Contexts</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Referenced Contexts</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Referenced Contexts</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Referenced Contexts</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_ReferencedContexts()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Referenced Contexts</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getRole_ReferencedContexts()
+    * @model containment="true"
+    * @generated
+    */
   EList<ReferencedContext> getReferencedContexts();
 
 } // Role
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/SimpleCondition.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/SimpleCondition.java
index 63e3b2d..41714ff 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/SimpleCondition.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/SimpleCondition.java
@@ -24,87 +24,87 @@
 public interface SimpleCondition extends Condition
 {
   /**
-   * Returns the value of the '<em><b>Field</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Field</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Field</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Field</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
-   * @see #setField(MatchField)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Field()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Field</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
+    * @see #setField(MatchField)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Field()
+    * @model
+    * @generated
+    */
   MatchField getField();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField <em>Field</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getField <em>Field</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Field</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
-   * @see #getField()
-   * @generated
-   */
+    * @param value the new value of the '<em>Field</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.MatchField
+    * @see #getField()
+    * @generated
+    */
   void setField(MatchField value);
 
   /**
-   * Returns the value of the '<em><b>Op</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Op</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Op</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Op</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
-   * @see #setOp(CompareOp)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Op()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Op</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
+    * @see #setOp(CompareOp)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Op()
+    * @model
+    * @generated
+    */
   CompareOp getOp();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp <em>Op</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getOp <em>Op</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Op</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
-   * @see #getOp()
-   * @generated
-   */
+    * @param value the new value of the '<em>Op</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompareOp
+    * @see #getOp()
+    * @generated
+    */
   void setOp(CompareOp value);
 
   /**
-   * Returns the value of the '<em><b>Expression</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Expression</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Expression</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Expression</em>' attribute.
-   * @see #setExpression(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Expression()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Expression</em>' attribute.
+    * @see #setExpression(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getSimpleCondition_Expression()
+    * @model
+    * @generated
+    */
   String getExpression();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression <em>Expression</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition#getExpression <em>Expression</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Expression</em>' attribute.
-   * @see #getExpression()
-   * @generated
-   */
+    * @param value the new value of the '<em>Expression</em>' attribute.
+    * @see #getExpression()
+    * @generated
+    */
   void setExpression(String value);
 
 } // SimpleCondition
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UpdateAttribute.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UpdateAttribute.java
index e7160c1..49d37cf 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UpdateAttribute.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UpdateAttribute.java
@@ -22,29 +22,29 @@
 public interface UpdateAttribute extends AttributeOverrideOption
 {
   /**
-   * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Attribute</em>' containment reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Attribute</em>' containment reference.
-   * @see #setAttribute(XAttributeTypeRef)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getUpdateAttribute_Attribute()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Attribute</em>' containment reference.
+    * @see #setAttribute(XAttributeTypeRef)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getUpdateAttribute_Attribute()
+    * @model containment="true"
+    * @generated
+    */
   XAttributeTypeRef getAttribute();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute <em>Attribute</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute#getAttribute <em>Attribute</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Attribute</em>' containment reference.
-   * @see #getAttribute()
-   * @generated
-   */
+    * @param value the new value of the '<em>Attribute</em>' containment reference.
+    * @see #getAttribute()
+    * @generated
+    */
   void setAttribute(XAttributeTypeRef value);
 
 } // UpdateAttribute
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UsersAndGroups.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UsersAndGroups.java
index e9c0ed9..76205ae 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UsersAndGroups.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/UsersAndGroups.java
@@ -23,29 +23,29 @@
 public interface UsersAndGroups extends EObject
 {
   /**
-   * Returns the value of the '<em><b>User Or Group Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>User Or Group Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>User Or Group Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>User Or Group Guid</em>' attribute.
-   * @see #setUserOrGroupGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getUsersAndGroups_UserOrGroupGuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>User Or Group Guid</em>' attribute.
+    * @see #setUserOrGroupGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getUsersAndGroups_UserOrGroupGuid()
+    * @model
+    * @generated
+    */
   String getUserOrGroupGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid <em>User Or Group Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups#getUserOrGroupGuid <em>User Or Group Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>User Or Group Guid</em>' attribute.
-   * @see #getUserOrGroupGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>User Or Group Guid</em>' attribute.
+    * @see #getUserOrGroupGuid()
+    * @generated
+    */
   void setUserOrGroupGuid(String value);
 
 } // UsersAndGroups
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactMatcher.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactMatcher.java
index e95919b..910f486 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactMatcher.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactMatcher.java
@@ -27,63 +27,63 @@
 public interface XArtifactMatcher extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Name</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Name</em>' attribute.
-   * @see #setName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Name()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Name</em>' attribute.
+    * @see #setName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Name()
+    * @model
+    * @generated
+    */
   String getName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher#getName <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Name</em>' attribute.
-   * @see #getName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Name</em>' attribute.
+    * @see #getName()
+    * @generated
+    */
   void setName(String value);
 
   /**
-   * Returns the value of the '<em><b>Conditions</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Conditions</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Conditions</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Conditions</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Conditions()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Conditions</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Conditions()
+    * @model containment="true"
+    * @generated
+    */
   EList<Condition> getConditions();
 
   /**
-   * Returns the value of the '<em><b>Operators</b></em>' attribute list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Operators</b></em>' attribute list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Operators</em>' attribute list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Operators</em>' attribute list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Operators()
-   * @model unique="false"
-   * @generated
-   */
+    * @return the value of the '<em>Operators</em>' attribute list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XLogicOperator
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactMatcher_Operators()
+    * @model unique="false"
+    * @generated
+    */
   EList<XLogicOperator> getOperators();
 
 } // XArtifactMatcher
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactType.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactType.java
index 1870e7d..d70ee3d 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactType.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XArtifactType.java
@@ -25,61 +25,61 @@
 public interface XArtifactType extends OseeType
 {
   /**
-   * Returns the value of the '<em><b>Abstract</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Abstract</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Abstract</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Abstract</em>' attribute.
-   * @see #setAbstract(boolean)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_Abstract()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Abstract</em>' attribute.
+    * @see #setAbstract(boolean)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_Abstract()
+    * @model
+    * @generated
+    */
   boolean isAbstract();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract <em>Abstract</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType#isAbstract <em>Abstract</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Abstract</em>' attribute.
-   * @see #isAbstract()
-   * @generated
-   */
+    * @param value the new value of the '<em>Abstract</em>' attribute.
+    * @see #isAbstract()
+    * @generated
+    */
   void setAbstract(boolean value);
 
   /**
-   * Returns the value of the '<em><b>Super Artifact Types</b></em>' reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Super Artifact Types</b></em>' reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Super Artifact Types</em>' reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Super Artifact Types</em>' reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_SuperArtifactTypes()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Super Artifact Types</em>' reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_SuperArtifactTypes()
+    * @model
+    * @generated
+    */
   EList<XArtifactType> getSuperArtifactTypes();
 
   /**
-   * Returns the value of the '<em><b>Valid Attribute Types</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Valid Attribute Types</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Valid Attribute Types</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Valid Attribute Types</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_ValidAttributeTypes()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Valid Attribute Types</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXArtifactType_ValidAttributeTypes()
+    * @model containment="true"
+    * @generated
+    */
   EList<XAttributeTypeRef> getValidAttributeTypes();
 
 } // XArtifactType
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeType.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeType.java
index 1411e78..2321b27 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeType.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeType.java
@@ -32,289 +32,289 @@
 public interface XAttributeType extends OseeType
 {
   /**
-   * Returns the value of the '<em><b>Base Attribute Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Base Attribute Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Base Attribute Type</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Base Attribute Type</em>' attribute.
-   * @see #setBaseAttributeType(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_BaseAttributeType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Base Attribute Type</em>' attribute.
+    * @see #setBaseAttributeType(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_BaseAttributeType()
+    * @model
+    * @generated
+    */
   String getBaseAttributeType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType <em>Base Attribute Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getBaseAttributeType <em>Base Attribute Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Base Attribute Type</em>' attribute.
-   * @see #getBaseAttributeType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Base Attribute Type</em>' attribute.
+    * @see #getBaseAttributeType()
+    * @generated
+    */
   void setBaseAttributeType(String value);
 
   /**
-   * Returns the value of the '<em><b>Override</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Override</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Override</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Override</em>' reference.
-   * @see #setOverride(XAttributeType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Override()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Override</em>' reference.
+    * @see #setOverride(XAttributeType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Override()
+    * @model
+    * @generated
+    */
   XAttributeType getOverride();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride <em>Override</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getOverride <em>Override</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Override</em>' reference.
-   * @see #getOverride()
-   * @generated
-   */
+    * @param value the new value of the '<em>Override</em>' reference.
+    * @see #getOverride()
+    * @generated
+    */
   void setOverride(XAttributeType value);
 
   /**
-   * Returns the value of the '<em><b>Data Provider</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Data Provider</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Data Provider</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Data Provider</em>' attribute.
-   * @see #setDataProvider(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_DataProvider()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Data Provider</em>' attribute.
+    * @see #setDataProvider(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_DataProvider()
+    * @model
+    * @generated
+    */
   String getDataProvider();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider <em>Data Provider</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDataProvider <em>Data Provider</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Data Provider</em>' attribute.
-   * @see #getDataProvider()
-   * @generated
-   */
+    * @param value the new value of the '<em>Data Provider</em>' attribute.
+    * @see #getDataProvider()
+    * @generated
+    */
   void setDataProvider(String value);
 
   /**
-   * Returns the value of the '<em><b>Min</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Min</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Min</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Min</em>' attribute.
-   * @see #setMin(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Min()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Min</em>' attribute.
+    * @see #setMin(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Min()
+    * @model
+    * @generated
+    */
   String getMin();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin <em>Min</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMin <em>Min</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Min</em>' attribute.
-   * @see #getMin()
-   * @generated
-   */
+    * @param value the new value of the '<em>Min</em>' attribute.
+    * @see #getMin()
+    * @generated
+    */
   void setMin(String value);
 
   /**
-   * Returns the value of the '<em><b>Max</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Max</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Max</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Max</em>' attribute.
-   * @see #setMax(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Max()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Max</em>' attribute.
+    * @see #setMax(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Max()
+    * @model
+    * @generated
+    */
   String getMax();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax <em>Max</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMax <em>Max</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Max</em>' attribute.
-   * @see #getMax()
-   * @generated
-   */
+    * @param value the new value of the '<em>Max</em>' attribute.
+    * @see #getMax()
+    * @generated
+    */
   void setMax(String value);
 
   /**
-   * Returns the value of the '<em><b>Tagger Id</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Tagger Id</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Tagger Id</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Tagger Id</em>' attribute.
-   * @see #setTaggerId(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_TaggerId()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Tagger Id</em>' attribute.
+    * @see #setTaggerId(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_TaggerId()
+    * @model
+    * @generated
+    */
   String getTaggerId();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId <em>Tagger Id</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getTaggerId <em>Tagger Id</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Tagger Id</em>' attribute.
-   * @see #getTaggerId()
-   * @generated
-   */
+    * @param value the new value of the '<em>Tagger Id</em>' attribute.
+    * @see #getTaggerId()
+    * @generated
+    */
   void setTaggerId(String value);
 
   /**
-   * Returns the value of the '<em><b>Enum Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Type</em>' reference.
-   * @see #setEnumType(XOseeEnumType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_EnumType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Enum Type</em>' reference.
+    * @see #setEnumType(XOseeEnumType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_EnumType()
+    * @model
+    * @generated
+    */
   XOseeEnumType getEnumType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType <em>Enum Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getEnumType <em>Enum Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Enum Type</em>' reference.
-   * @see #getEnumType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Enum Type</em>' reference.
+    * @see #getEnumType()
+    * @generated
+    */
   void setEnumType(XOseeEnumType value);
 
   /**
-   * Returns the value of the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Description</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Description</em>' attribute.
-   * @see #setDescription(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Description()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Description</em>' attribute.
+    * @see #setDescription(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_Description()
+    * @model
+    * @generated
+    */
   String getDescription();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDescription <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Description</em>' attribute.
-   * @see #getDescription()
-   * @generated
-   */
+    * @param value the new value of the '<em>Description</em>' attribute.
+    * @see #getDescription()
+    * @generated
+    */
   void setDescription(String value);
 
   /**
-   * Returns the value of the '<em><b>Default Value</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Default Value</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Default Value</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Default Value</em>' attribute.
-   * @see #setDefaultValue(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_DefaultValue()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Default Value</em>' attribute.
+    * @see #setDefaultValue(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_DefaultValue()
+    * @model
+    * @generated
+    */
   String getDefaultValue();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue <em>Default Value</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getDefaultValue <em>Default Value</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Default Value</em>' attribute.
-   * @see #getDefaultValue()
-   * @generated
-   */
+    * @param value the new value of the '<em>Default Value</em>' attribute.
+    * @see #getDefaultValue()
+    * @generated
+    */
   void setDefaultValue(String value);
 
   /**
-   * Returns the value of the '<em><b>File Extension</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>File Extension</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>File Extension</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>File Extension</em>' attribute.
-   * @see #setFileExtension(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_FileExtension()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>File Extension</em>' attribute.
+    * @see #setFileExtension(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_FileExtension()
+    * @model
+    * @generated
+    */
   String getFileExtension();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension <em>File Extension</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getFileExtension <em>File Extension</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>File Extension</em>' attribute.
-   * @see #getFileExtension()
-   * @generated
-   */
+    * @param value the new value of the '<em>File Extension</em>' attribute.
+    * @see #getFileExtension()
+    * @generated
+    */
   void setFileExtension(String value);
 
   /**
-   * Returns the value of the '<em><b>Media Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Media Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Media Type</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Media Type</em>' attribute.
-   * @see #setMediaType(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_MediaType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Media Type</em>' attribute.
+    * @see #setMediaType(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeType_MediaType()
+    * @model
+    * @generated
+    */
   String getMediaType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType <em>Media Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType#getMediaType <em>Media Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Media Type</em>' attribute.
-   * @see #getMediaType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Media Type</em>' attribute.
+    * @see #getMediaType()
+    * @generated
+    */
   void setMediaType(String value);
 
 } // XAttributeType
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeTypeRef.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeTypeRef.java
index 90934b1..3c2cbed 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeTypeRef.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XAttributeTypeRef.java
@@ -24,55 +24,55 @@
 public interface XAttributeTypeRef extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Valid Attribute Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Valid Attribute Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Valid Attribute Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Valid Attribute Type</em>' reference.
-   * @see #setValidAttributeType(XAttributeType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeTypeRef_ValidAttributeType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Valid Attribute Type</em>' reference.
+    * @see #setValidAttributeType(XAttributeType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeTypeRef_ValidAttributeType()
+    * @model
+    * @generated
+    */
   XAttributeType getValidAttributeType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType <em>Valid Attribute Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getValidAttributeType <em>Valid Attribute Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Valid Attribute Type</em>' reference.
-   * @see #getValidAttributeType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Valid Attribute Type</em>' reference.
+    * @see #getValidAttributeType()
+    * @generated
+    */
   void setValidAttributeType(XAttributeType value);
 
   /**
-   * Returns the value of the '<em><b>Branch Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Branch Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Branch Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Branch Guid</em>' attribute.
-   * @see #setBranchGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeTypeRef_BranchGuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Branch Guid</em>' attribute.
+    * @see #setBranchGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXAttributeTypeRef_BranchGuid()
+    * @model
+    * @generated
+    */
   String getBranchGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid <em>Branch Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef#getBranchGuid <em>Branch Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Branch Guid</em>' attribute.
-   * @see #getBranchGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Branch Guid</em>' attribute.
+    * @see #getBranchGuid()
+    * @generated
+    */
   void setBranchGuid(String value);
 
 } // XAttributeTypeRef
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XLogicOperator.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XLogicOperator.java
index a95fb26..4cf874c 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XLogicOperator.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XLogicOperator.java
@@ -20,204 +20,198 @@
 public enum XLogicOperator implements Enumerator
 {
   /**
-   * The '<em><b>AND</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>AND</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #AND_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #AND_VALUE
+    * @generated
+    * @ordered
+    */
   AND(0, "AND", "AND"),
 
   /**
-   * The '<em><b>OR</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>OR</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #OR_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #OR_VALUE
+    * @generated
+    * @ordered
+    */
   OR(1, "OR", "OR");
 
   /**
-   * The '<em><b>AND</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>AND</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>AND</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #AND
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #AND
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int AND_VALUE = 0;
 
   /**
-   * The '<em><b>OR</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>OR</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>OR</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #OR
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #OR
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int OR_VALUE = 1;
 
   /**
-   * An array of all the '<em><b>XLogic Operator</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>XLogic Operator</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final XLogicOperator[] VALUES_ARRAY =
-    new XLogicOperator[]
-    {
-      AND,
-      OR,
-    };
+    new XLogicOperator[] {
+         AND,
+         OR,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>XLogic Operator</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>XLogic Operator</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<XLogicOperator> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XLogicOperator get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      XLogicOperator result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         XLogicOperator result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XLogicOperator getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      XLogicOperator result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         XLogicOperator result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XLogic Operator</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XLogicOperator get(int value)
   {
-    switch (value)
-    {
-      case AND_VALUE: return AND;
-      case OR_VALUE: return OR;
-    }
-    return null;
-  }
+      switch (value) {
+         case AND_VALUE: return AND;
+         case OR_VALUE: return OR;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private XLogicOperator(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //XLogicOperator
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeArtifactTypeOverride.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeArtifactTypeOverride.java
index 4b63d41..f474ec3 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeArtifactTypeOverride.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeArtifactTypeOverride.java
@@ -27,71 +27,71 @@
 public interface XOseeArtifactTypeOverride extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Overriden Artifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Overriden Artifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Overriden Artifact Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Overriden Artifact Type</em>' reference.
-   * @see #setOverridenArtifactType(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_OverridenArtifactType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Overriden Artifact Type</em>' reference.
+    * @see #setOverridenArtifactType(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_OverridenArtifactType()
+    * @model
+    * @generated
+    */
   XArtifactType getOverridenArtifactType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType <em>Overriden Artifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#getOverridenArtifactType <em>Overriden Artifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Overriden Artifact Type</em>' reference.
-   * @see #getOverridenArtifactType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Overriden Artifact Type</em>' reference.
+    * @see #getOverridenArtifactType()
+    * @generated
+    */
   void setOverridenArtifactType(XArtifactType value);
 
   /**
-   * Returns the value of the '<em><b>Inherit All</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Inherit All</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Inherit All</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Inherit All</em>' attribute.
-   * @see #setInheritAll(boolean)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_InheritAll()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Inherit All</em>' attribute.
+    * @see #setInheritAll(boolean)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_InheritAll()
+    * @model
+    * @generated
+    */
   boolean isInheritAll();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride#isInheritAll <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Inherit All</em>' attribute.
-   * @see #isInheritAll()
-   * @generated
-   */
+    * @param value the new value of the '<em>Inherit All</em>' attribute.
+    * @see #isInheritAll()
+    * @generated
+    */
   void setInheritAll(boolean value);
 
   /**
-   * Returns the value of the '<em><b>Override Options</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Override Options</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Override Options</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Override Options</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_OverrideOptions()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Override Options</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeArtifactTypeOverride_OverrideOptions()
+    * @model containment="true"
+    * @generated
+    */
   EList<AttributeOverrideOption> getOverrideOptions();
 
 } // XOseeArtifactTypeOverride
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumEntry.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumEntry.java
index 34952cb..0fb68c5 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumEntry.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumEntry.java
@@ -26,107 +26,107 @@
 public interface XOseeEnumEntry extends EObject
 {
   /**
-   * Returns the value of the '<em><b>Name</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Name</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Name</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Name</em>' attribute.
-   * @see #setName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Name()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Name</em>' attribute.
+    * @see #setName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Name()
+    * @model
+    * @generated
+    */
   String getName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getName <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Name</em>' attribute.
-   * @see #getName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Name</em>' attribute.
+    * @see #getName()
+    * @generated
+    */
   void setName(String value);
 
   /**
-   * Returns the value of the '<em><b>Ordinal</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Ordinal</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Ordinal</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Ordinal</em>' attribute.
-   * @see #setOrdinal(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Ordinal()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Ordinal</em>' attribute.
+    * @see #setOrdinal(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Ordinal()
+    * @model
+    * @generated
+    */
   String getOrdinal();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getOrdinal <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Ordinal</em>' attribute.
-   * @see #getOrdinal()
-   * @generated
-   */
+    * @param value the new value of the '<em>Ordinal</em>' attribute.
+    * @see #getOrdinal()
+    * @generated
+    */
   void setOrdinal(String value);
 
   /**
-   * Returns the value of the '<em><b>Entry Guid</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Entry Guid</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Entry Guid</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Entry Guid</em>' attribute.
-   * @see #setEntryGuid(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_EntryGuid()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Entry Guid</em>' attribute.
+    * @see #setEntryGuid(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_EntryGuid()
+    * @model
+    * @generated
+    */
   String getEntryGuid();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getEntryGuid <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Entry Guid</em>' attribute.
-   * @see #getEntryGuid()
-   * @generated
-   */
+    * @param value the new value of the '<em>Entry Guid</em>' attribute.
+    * @see #getEntryGuid()
+    * @generated
+    */
   void setEntryGuid(String value);
 
   /**
-   * Returns the value of the '<em><b>Description</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Description</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Description</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Description</em>' attribute.
-   * @see #setDescription(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Description()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Description</em>' attribute.
+    * @see #setDescription(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumEntry_Description()
+    * @model
+    * @generated
+    */
   String getDescription();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry#getDescription <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Description</em>' attribute.
-   * @see #getDescription()
-   * @generated
-   */
+    * @param value the new value of the '<em>Description</em>' attribute.
+    * @see #getDescription()
+    * @generated
+    */
   void setDescription(String value);
 
 } // XOseeEnumEntry
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumOverride.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumOverride.java
index b788c93..bfbf272 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumOverride.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumOverride.java
@@ -25,71 +25,71 @@
 public interface XOseeEnumOverride extends OseeElement
 {
   /**
-   * Returns the value of the '<em><b>Overriden Enum Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Overriden Enum Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Overriden Enum Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Overriden Enum Type</em>' reference.
-   * @see #setOverridenEnumType(XOseeEnumType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_OverridenEnumType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Overriden Enum Type</em>' reference.
+    * @see #setOverridenEnumType(XOseeEnumType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_OverridenEnumType()
+    * @model
+    * @generated
+    */
   XOseeEnumType getOverridenEnumType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType <em>Overriden Enum Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#getOverridenEnumType <em>Overriden Enum Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Overriden Enum Type</em>' reference.
-   * @see #getOverridenEnumType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Overriden Enum Type</em>' reference.
+    * @see #getOverridenEnumType()
+    * @generated
+    */
   void setOverridenEnumType(XOseeEnumType value);
 
   /**
-   * Returns the value of the '<em><b>Inherit All</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Inherit All</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Inherit All</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Inherit All</em>' attribute.
-   * @see #setInheritAll(boolean)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_InheritAll()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Inherit All</em>' attribute.
+    * @see #setInheritAll(boolean)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_InheritAll()
+    * @model
+    * @generated
+    */
   boolean isInheritAll();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride#isInheritAll <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Inherit All</em>' attribute.
-   * @see #isInheritAll()
-   * @generated
-   */
+    * @param value the new value of the '<em>Inherit All</em>' attribute.
+    * @see #isInheritAll()
+    * @generated
+    */
   void setInheritAll(boolean value);
 
   /**
-   * Returns the value of the '<em><b>Override Options</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Override Options</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Override Options</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Override Options</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_OverrideOptions()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Override Options</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumOverride_OverrideOptions()
+    * @model containment="true"
+    * @generated
+    */
   EList<OverrideOption> getOverrideOptions();
 
 } // XOseeEnumOverride
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumType.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumType.java
index 2edc531..4261ab4 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumType.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XOseeEnumType.java
@@ -23,19 +23,19 @@
 public interface XOseeEnumType extends OseeType
 {
   /**
-   * Returns the value of the '<em><b>Enum Entries</b></em>' containment reference list.
-   * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Enum Entries</b></em>' containment reference list.
+    * The list contents are of type {@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Enum Entries</em>' containment reference list isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Enum Entries</em>' containment reference list.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumType_EnumEntries()
-   * @model containment="true"
-   * @generated
-   */
+    * @return the value of the '<em>Enum Entries</em>' containment reference list.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXOseeEnumType_EnumEntries()
+    * @model containment="true"
+    * @generated
+    */
   EList<XOseeEnumEntry> getEnumEntries();
 
 } // XOseeEnumType
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationSideEnum.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationSideEnum.java
index f2da3eb..f10b46c 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationSideEnum.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationSideEnum.java
@@ -20,231 +20,225 @@
 public enum XRelationSideEnum implements Enumerator
 {
   /**
-   * The '<em><b>SIDE A</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>SIDE A</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #SIDE_A_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #SIDE_A_VALUE
+    * @generated
+    * @ordered
+    */
   SIDE_A(0, "SIDE_A", "SIDE_A"),
 
   /**
-   * The '<em><b>SIDE B</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>SIDE B</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #SIDE_B_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #SIDE_B_VALUE
+    * @generated
+    * @ordered
+    */
   SIDE_B(1, "SIDE_B", "SIDE_B"),
 
   /**
-   * The '<em><b>BOTH</b></em>' literal object.
-   * <!-- begin-user-doc -->
+    * The '<em><b>BOTH</b></em>' literal object.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #BOTH_VALUE
-   * @generated
-   * @ordered
-   */
+    * @see #BOTH_VALUE
+    * @generated
+    * @ordered
+    */
   BOTH(2, "BOTH", "BOTH");
 
   /**
-   * The '<em><b>SIDE A</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>SIDE A</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>SIDE A</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #SIDE_A
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #SIDE_A
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int SIDE_A_VALUE = 0;
 
   /**
-   * The '<em><b>SIDE B</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>SIDE B</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>SIDE B</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #SIDE_B
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #SIDE_B
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int SIDE_B_VALUE = 1;
 
   /**
-   * The '<em><b>BOTH</b></em>' literal value.
-   * <!-- begin-user-doc -->
+    * The '<em><b>BOTH</b></em>' literal value.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of '<em><b>BOTH</b></em>' literal object isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @see #BOTH
-   * @model
-   * @generated
-   * @ordered
-   */
+    * @see #BOTH
+    * @model
+    * @generated
+    * @ordered
+    */
   public static final int BOTH_VALUE = 2;
 
   /**
-   * An array of all the '<em><b>XRelation Side Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * An array of all the '<em><b>XRelation Side Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private static final XRelationSideEnum[] VALUES_ARRAY =
-    new XRelationSideEnum[]
-    {
-      SIDE_A,
-      SIDE_B,
-      BOTH,
-    };
+    new XRelationSideEnum[] {
+         SIDE_A,
+         SIDE_B,
+         BOTH,
+      };
 
   /**
-   * A public read-only list of all the '<em><b>XRelation Side Enum</b></em>' enumerators.
-   * <!-- begin-user-doc -->
+    * A public read-only list of all the '<em><b>XRelation Side Enum</b></em>' enumerators.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static final List<XRelationSideEnum> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
   /**
-   * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified literal value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified literal value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XRelationSideEnum get(String literal)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      XRelationSideEnum result = VALUES_ARRAY[i];
-      if (result.toString().equals(literal))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         XRelationSideEnum result = VALUES_ARRAY[i];
+         if (result.toString().equals(literal)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified name.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified name.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XRelationSideEnum getByName(String name)
   {
-    for (int i = 0; i < VALUES_ARRAY.length; ++i)
-    {
-      XRelationSideEnum result = VALUES_ARRAY[i];
-      if (result.getName().equals(name))
-      {
-        return result;
+      for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+         XRelationSideEnum result = VALUES_ARRAY[i];
+         if (result.getName().equals(name)) {
+            return result;
+         }
       }
-    }
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified integer value.
-   * <!-- begin-user-doc -->
+    * Returns the '<em><b>XRelation Side Enum</b></em>' literal with the specified integer value.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static XRelationSideEnum get(int value)
   {
-    switch (value)
-    {
-      case SIDE_A_VALUE: return SIDE_A;
-      case SIDE_B_VALUE: return SIDE_B;
-      case BOTH_VALUE: return BOTH;
-    }
-    return null;
-  }
+      switch (value) {
+         case SIDE_A_VALUE: return SIDE_A;
+         case SIDE_B_VALUE: return SIDE_B;
+         case BOTH_VALUE: return BOTH;
+      }
+      return null;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final int value;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String name;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private final String literal;
 
   /**
-   * Only this class can construct instances.
-   * <!-- begin-user-doc -->
+    * Only this class can construct instances.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private XRelationSideEnum(int value, String name, String literal)
   {
-    this.value = value;
-    this.name = name;
-    this.literal = literal;
-  }
+      this.value = value;
+      this.name = name;
+      this.literal = literal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public int getValue()
   {
-    return value;
-  }
+     return value;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+     return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getLiteral()
   {
-    return literal;
-  }
+     return literal;
+   }
 
   /**
-   * Returns the literal value of the enumerator, which is its string representation.
-   * <!-- begin-user-doc -->
+    * Returns the literal value of the enumerator, which is its string representation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    return literal;
-  }
+      return literal;
+   }
   
 } //XRelationSideEnum
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationType.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationType.java
index 18fa9c7..acfb9b0 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationType.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/XRelationType.java
@@ -27,162 +27,162 @@
 public interface XRelationType extends OseeType
 {
   /**
-   * Returns the value of the '<em><b>Side AName</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Side AName</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Side AName</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Side AName</em>' attribute.
-   * @see #setSideAName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideAName()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Side AName</em>' attribute.
+    * @see #setSideAName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideAName()
+    * @model
+    * @generated
+    */
   String getSideAName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName <em>Side AName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAName <em>Side AName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Side AName</em>' attribute.
-   * @see #getSideAName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Side AName</em>' attribute.
+    * @see #getSideAName()
+    * @generated
+    */
   void setSideAName(String value);
 
   /**
-   * Returns the value of the '<em><b>Side AArtifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Side AArtifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Side AArtifact Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Side AArtifact Type</em>' reference.
-   * @see #setSideAArtifactType(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideAArtifactType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Side AArtifact Type</em>' reference.
+    * @see #setSideAArtifactType(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideAArtifactType()
+    * @model
+    * @generated
+    */
   XArtifactType getSideAArtifactType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType <em>Side AArtifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideAArtifactType <em>Side AArtifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Side AArtifact Type</em>' reference.
-   * @see #getSideAArtifactType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Side AArtifact Type</em>' reference.
+    * @see #getSideAArtifactType()
+    * @generated
+    */
   void setSideAArtifactType(XArtifactType value);
 
   /**
-   * Returns the value of the '<em><b>Side BName</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Side BName</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Side BName</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Side BName</em>' attribute.
-   * @see #setSideBName(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideBName()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Side BName</em>' attribute.
+    * @see #setSideBName(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideBName()
+    * @model
+    * @generated
+    */
   String getSideBName();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName <em>Side BName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBName <em>Side BName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Side BName</em>' attribute.
-   * @see #getSideBName()
-   * @generated
-   */
+    * @param value the new value of the '<em>Side BName</em>' attribute.
+    * @see #getSideBName()
+    * @generated
+    */
   void setSideBName(String value);
 
   /**
-   * Returns the value of the '<em><b>Side BArtifact Type</b></em>' reference.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Side BArtifact Type</b></em>' reference.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Side BArtifact Type</em>' reference isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Side BArtifact Type</em>' reference.
-   * @see #setSideBArtifactType(XArtifactType)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideBArtifactType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Side BArtifact Type</em>' reference.
+    * @see #setSideBArtifactType(XArtifactType)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_SideBArtifactType()
+    * @model
+    * @generated
+    */
   XArtifactType getSideBArtifactType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType <em>Side BArtifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getSideBArtifactType <em>Side BArtifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Side BArtifact Type</em>' reference.
-   * @see #getSideBArtifactType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Side BArtifact Type</em>' reference.
+    * @see #getSideBArtifactType()
+    * @generated
+    */
   void setSideBArtifactType(XArtifactType value);
 
   /**
-   * Returns the value of the '<em><b>Default Order Type</b></em>' attribute.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Default Order Type</b></em>' attribute.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Default Order Type</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Default Order Type</em>' attribute.
-   * @see #setDefaultOrderType(String)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_DefaultOrderType()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Default Order Type</em>' attribute.
+    * @see #setDefaultOrderType(String)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_DefaultOrderType()
+    * @model
+    * @generated
+    */
   String getDefaultOrderType();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType <em>Default Order Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getDefaultOrderType <em>Default Order Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Default Order Type</em>' attribute.
-   * @see #getDefaultOrderType()
-   * @generated
-   */
+    * @param value the new value of the '<em>Default Order Type</em>' attribute.
+    * @see #getDefaultOrderType()
+    * @generated
+    */
   void setDefaultOrderType(String value);
 
   /**
-   * Returns the value of the '<em><b>Multiplicity</b></em>' attribute.
-   * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum}.
-   * <!-- begin-user-doc -->
+    * Returns the value of the '<em><b>Multiplicity</b></em>' attribute.
+    * The literals are from the enumeration {@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum}.
+    * <!-- begin-user-doc -->
    * <p>
    * If the meaning of the '<em>Multiplicity</em>' attribute isn't clear,
    * there really should be more of a description here...
    * </p>
    * <!-- end-user-doc -->
-   * @return the value of the '<em>Multiplicity</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
-   * @see #setMultiplicity(RelationMultiplicityEnum)
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_Multiplicity()
-   * @model
-   * @generated
-   */
+    * @return the value of the '<em>Multiplicity</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
+    * @see #setMultiplicity(RelationMultiplicityEnum)
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#getXRelationType_Multiplicity()
+    * @model
+    * @generated
+    */
   RelationMultiplicityEnum getMultiplicity();
 
   /**
-   * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity <em>Multiplicity</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * Sets the value of the '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType#getMultiplicity <em>Multiplicity</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @param value the new value of the '<em>Multiplicity</em>' attribute.
-   * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
-   * @see #getMultiplicity()
-   * @generated
-   */
+    * @param value the new value of the '<em>Multiplicity</em>' attribute.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationMultiplicityEnum
+    * @see #getMultiplicity()
+    * @generated
+    */
   void setMultiplicity(RelationMultiplicityEnum value);
 
 } // XRelationType
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AccessContextImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AccessContextImpl.java
index 5437f38..fe37db3 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AccessContextImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AccessContextImpl.java
@@ -44,329 +44,321 @@
 public class AccessContextImpl extends MinimalEObjectImpl.Container implements AccessContext
 {
   /**
-   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected static final String NAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected String name = NAME_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getSuperAccessContexts() <em>Super Access Contexts</em>}' reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSuperAccessContexts() <em>Super Access Contexts</em>}' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSuperAccessContexts()
-   * @generated
-   * @ordered
-   */
+    * @see #getSuperAccessContexts()
+    * @generated
+    * @ordered
+    */
   protected EList<AccessContext> superAccessContexts;
 
   /**
-   * The default value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getGuid() <em>Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getGuid() <em>Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getGuid()
+    * @generated
+    * @ordered
+    */
   protected String guid = GUID_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getAccessRules() <em>Access Rules</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAccessRules() <em>Access Rules</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAccessRules()
-   * @generated
-   * @ordered
-   */
+    * @see #getAccessRules()
+    * @generated
+    * @ordered
+    */
   protected EList<ObjectRestriction> accessRules;
 
   /**
-   * The cached value of the '{@link #getHierarchyRestrictions() <em>Hierarchy Restrictions</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getHierarchyRestrictions() <em>Hierarchy Restrictions</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getHierarchyRestrictions()
-   * @generated
-   * @ordered
-   */
+    * @see #getHierarchyRestrictions()
+    * @generated
+    * @ordered
+    */
   protected EList<HierarchyRestriction> hierarchyRestrictions;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected AccessContextImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ACCESS_CONTEXT;
-  }
+      return OseeDslPackage.Literals.ACCESS_CONTEXT;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+      return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setName(String newName)
   {
-    String oldName = name;
-    name = newName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ACCESS_CONTEXT__NAME, oldName, name));
-  }
+      String oldName = name;
+      name = newName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ACCESS_CONTEXT__NAME, oldName, name));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<AccessContext> getSuperAccessContexts()
   {
-    if (superAccessContexts == null)
-    {
-      superAccessContexts = new EObjectResolvingEList<AccessContext>(AccessContext.class, this, OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS);
-    }
-    return superAccessContexts;
-  }
+      if (superAccessContexts == null) {
+         superAccessContexts = new EObjectResolvingEList<AccessContext>(AccessContext.class, this, OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS);
+      }
+      return superAccessContexts;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getGuid()
   {
-    return guid;
-  }
+      return guid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setGuid(String newGuid)
   {
-    String oldGuid = guid;
-    guid = newGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ACCESS_CONTEXT__GUID, oldGuid, guid));
-  }
+      String oldGuid = guid;
+      guid = newGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ACCESS_CONTEXT__GUID, oldGuid, guid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<ObjectRestriction> getAccessRules()
   {
-    if (accessRules == null)
-    {
-      accessRules = new EObjectContainmentEList<ObjectRestriction>(ObjectRestriction.class, this, OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES);
-    }
-    return accessRules;
-  }
+      if (accessRules == null) {
+         accessRules = new EObjectContainmentEList<ObjectRestriction>(ObjectRestriction.class, this, OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES);
+      }
+      return accessRules;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<HierarchyRestriction> getHierarchyRestrictions()
   {
-    if (hierarchyRestrictions == null)
-    {
-      hierarchyRestrictions = new EObjectContainmentEList<HierarchyRestriction>(HierarchyRestriction.class, this, OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS);
-    }
-    return hierarchyRestrictions;
-  }
+      if (hierarchyRestrictions == null) {
+         hierarchyRestrictions = new EObjectContainmentEList<HierarchyRestriction>(HierarchyRestriction.class, this, OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS);
+      }
+      return hierarchyRestrictions;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
-        return ((InternalEList<?>)getAccessRules()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
-        return ((InternalEList<?>)getHierarchyRestrictions()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
+            return ((InternalEList<?>)getAccessRules()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
+            return ((InternalEList<?>)getHierarchyRestrictions()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ACCESS_CONTEXT__NAME:
-        return getName();
-      case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
-        return getSuperAccessContexts();
-      case OseeDslPackage.ACCESS_CONTEXT__GUID:
-        return getGuid();
-      case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
-        return getAccessRules();
-      case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
-        return getHierarchyRestrictions();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ACCESS_CONTEXT__NAME:
+            return getName();
+         case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
+            return getSuperAccessContexts();
+         case OseeDslPackage.ACCESS_CONTEXT__GUID:
+            return getGuid();
+         case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
+            return getAccessRules();
+         case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
+            return getHierarchyRestrictions();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ACCESS_CONTEXT__NAME:
-        setName((String)newValue);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
-        getSuperAccessContexts().clear();
-        getSuperAccessContexts().addAll((Collection<? extends AccessContext>)newValue);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__GUID:
-        setGuid((String)newValue);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
-        getAccessRules().clear();
-        getAccessRules().addAll((Collection<? extends ObjectRestriction>)newValue);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
-        getHierarchyRestrictions().clear();
-        getHierarchyRestrictions().addAll((Collection<? extends HierarchyRestriction>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ACCESS_CONTEXT__NAME:
+            setName((String)newValue);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
+            getSuperAccessContexts().clear();
+            getSuperAccessContexts().addAll((Collection<? extends AccessContext>)newValue);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__GUID:
+            setGuid((String)newValue);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
+            getAccessRules().clear();
+            getAccessRules().addAll((Collection<? extends ObjectRestriction>)newValue);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
+            getHierarchyRestrictions().clear();
+            getHierarchyRestrictions().addAll((Collection<? extends HierarchyRestriction>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ACCESS_CONTEXT__NAME:
-        setName(NAME_EDEFAULT);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
-        getSuperAccessContexts().clear();
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__GUID:
-        setGuid(GUID_EDEFAULT);
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
-        getAccessRules().clear();
-        return;
-      case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
-        getHierarchyRestrictions().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ACCESS_CONTEXT__NAME:
+            setName(NAME_EDEFAULT);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
+            getSuperAccessContexts().clear();
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__GUID:
+            setGuid(GUID_EDEFAULT);
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
+            getAccessRules().clear();
+            return;
+         case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
+            getHierarchyRestrictions().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ACCESS_CONTEXT__NAME:
-        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-      case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
-        return superAccessContexts != null && !superAccessContexts.isEmpty();
-      case OseeDslPackage.ACCESS_CONTEXT__GUID:
-        return GUID_EDEFAULT == null ? guid != null : !GUID_EDEFAULT.equals(guid);
-      case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
-        return accessRules != null && !accessRules.isEmpty();
-      case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
-        return hierarchyRestrictions != null && !hierarchyRestrictions.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ACCESS_CONTEXT__NAME:
+            return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+         case OseeDslPackage.ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS:
+            return superAccessContexts != null && !superAccessContexts.isEmpty();
+         case OseeDslPackage.ACCESS_CONTEXT__GUID:
+            return GUID_EDEFAULT == null ? guid != null : !GUID_EDEFAULT.equals(guid);
+         case OseeDslPackage.ACCESS_CONTEXT__ACCESS_RULES:
+            return accessRules != null && !accessRules.isEmpty();
+         case OseeDslPackage.ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS:
+            return hierarchyRestrictions != null && !hierarchyRestrictions.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (name: ");
-    result.append(name);
-    result.append(", guid: ");
-    result.append(guid);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (name: ");
+      result.append(name);
+      result.append(", guid: ");
+      result.append(guid);
+      result.append(')');
+      return result.toString();
+   }
 
 } //AccessContextImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddAttributeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddAttributeImpl.java
index 75eb5cc..1a868d9 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddAttributeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddAttributeImpl.java
@@ -30,164 +30,157 @@
 public class AddAttributeImpl extends AttributeOverrideOptionImpl implements AddAttribute
 {
   /**
-   * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAttribute()
-   * @generated
-   * @ordered
-   */
+    * @see #getAttribute()
+    * @generated
+    * @ordered
+    */
   protected XAttributeTypeRef attribute;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected AddAttributeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ADD_ATTRIBUTE;
-  }
+      return OseeDslPackage.Literals.ADD_ATTRIBUTE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeTypeRef getAttribute()
   {
-    return attribute;
-  }
+      return attribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public NotificationChain basicSetAttribute(XAttributeTypeRef newAttribute, NotificationChain msgs)
   {
-    XAttributeTypeRef oldAttribute = attribute;
-    attribute = newAttribute;
-    if (eNotificationRequired())
-    {
-      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, oldAttribute, newAttribute);
-      if (msgs == null) msgs = notification; else msgs.add(notification);
-    }
-    return msgs;
-  }
+      XAttributeTypeRef oldAttribute = attribute;
+      attribute = newAttribute;
+      if (eNotificationRequired()) {
+         ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, oldAttribute, newAttribute);
+         if (msgs == null) msgs = notification; else msgs.add(notification);
+      }
+      return msgs;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAttribute(XAttributeTypeRef newAttribute)
   {
-    if (newAttribute != attribute)
-    {
-      NotificationChain msgs = null;
-      if (attribute != null)
-        msgs = ((InternalEObject)attribute).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, null, msgs);
-      if (newAttribute != null)
-        msgs = ((InternalEObject)newAttribute).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, null, msgs);
-      msgs = basicSetAttribute(newAttribute, msgs);
-      if (msgs != null) msgs.dispatch();
-    }
-    else if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, newAttribute, newAttribute));
-  }
+      if (newAttribute != attribute) {
+         NotificationChain msgs = null;
+         if (attribute != null)
+            msgs = ((InternalEObject)attribute).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, null, msgs);
+         if (newAttribute != null)
+            msgs = ((InternalEObject)newAttribute).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, null, msgs);
+         msgs = basicSetAttribute(newAttribute, msgs);
+         if (msgs != null) msgs.dispatch();
+      }
+      else if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE, newAttribute, newAttribute));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
-        return basicSetAttribute(null, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
+            return basicSetAttribute(null, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
-        return getAttribute();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
+            return getAttribute();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeTypeRef)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeTypeRef)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeTypeRef)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeTypeRef)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
-        return attribute != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ATTRIBUTE__ATTRIBUTE:
+            return attribute != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //AddAttributeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddEnumImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddEnumImpl.java
index 05819a8..c536f33 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddEnumImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AddEnumImpl.java
@@ -30,315 +30,311 @@
 public class AddEnumImpl extends OverrideOptionImpl implements AddEnum
 {
   /**
-   * The default value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumEntry()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumEntry()
+    * @generated
+    * @ordered
+    */
   protected static final String ENUM_ENTRY_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumEntry()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumEntry()
+    * @generated
+    * @ordered
+    */
   protected String enumEntry = ENUM_ENTRY_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOrdinal()
-   * @generated
-   * @ordered
-   */
+    * @see #getOrdinal()
+    * @generated
+    * @ordered
+    */
   protected static final String ORDINAL_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOrdinal()
-   * @generated
-   * @ordered
-   */
+    * @see #getOrdinal()
+    * @generated
+    * @ordered
+    */
   protected String ordinal = ORDINAL_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEntryGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getEntryGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String ENTRY_GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEntryGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getEntryGuid()
+    * @generated
+    * @ordered
+    */
   protected String entryGuid = ENTRY_GUID_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected static final String DESCRIPTION_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected String description = DESCRIPTION_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected AddEnumImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ADD_ENUM;
-  }
+      return OseeDslPackage.Literals.ADD_ENUM;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getEnumEntry()
   {
-    return enumEntry;
-  }
+      return enumEntry;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setEnumEntry(String newEnumEntry)
   {
-    String oldEnumEntry = enumEntry;
-    enumEntry = newEnumEntry;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
-  }
+      String oldEnumEntry = enumEntry;
+      enumEntry = newEnumEntry;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getOrdinal()
   {
-    return ordinal;
-  }
+      return ordinal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOrdinal(String newOrdinal)
   {
-    String oldOrdinal = ordinal;
-    ordinal = newOrdinal;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ORDINAL, oldOrdinal, ordinal));
-  }
+      String oldOrdinal = ordinal;
+      ordinal = newOrdinal;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ORDINAL, oldOrdinal, ordinal));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getEntryGuid()
   {
-    return entryGuid;
-  }
+      return entryGuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setEntryGuid(String newEntryGuid)
   {
-    String oldEntryGuid = entryGuid;
-    entryGuid = newEntryGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ENTRY_GUID, oldEntryGuid, entryGuid));
-  }
+      String oldEntryGuid = entryGuid;
+      entryGuid = newEntryGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__ENTRY_GUID, oldEntryGuid, entryGuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDescription()
   {
-    return description;
-  }
+      return description;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDescription(String newDescription)
   {
-    String oldDescription = description;
-    description = newDescription;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__DESCRIPTION, oldDescription, description));
-  }
+      String oldDescription = description;
+      description = newDescription;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ADD_ENUM__DESCRIPTION, oldDescription, description));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
-        return getEnumEntry();
-      case OseeDslPackage.ADD_ENUM__ORDINAL:
-        return getOrdinal();
-      case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
-        return getEntryGuid();
-      case OseeDslPackage.ADD_ENUM__DESCRIPTION:
-        return getDescription();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
+            return getEnumEntry();
+         case OseeDslPackage.ADD_ENUM__ORDINAL:
+            return getOrdinal();
+         case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
+            return getEntryGuid();
+         case OseeDslPackage.ADD_ENUM__DESCRIPTION:
+            return getDescription();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
-        setEnumEntry((String)newValue);
-        return;
-      case OseeDslPackage.ADD_ENUM__ORDINAL:
-        setOrdinal((String)newValue);
-        return;
-      case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
-        setEntryGuid((String)newValue);
-        return;
-      case OseeDslPackage.ADD_ENUM__DESCRIPTION:
-        setDescription((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
+            setEnumEntry((String)newValue);
+            return;
+         case OseeDslPackage.ADD_ENUM__ORDINAL:
+            setOrdinal((String)newValue);
+            return;
+         case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
+            setEntryGuid((String)newValue);
+            return;
+         case OseeDslPackage.ADD_ENUM__DESCRIPTION:
+            setDescription((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
-        setEnumEntry(ENUM_ENTRY_EDEFAULT);
-        return;
-      case OseeDslPackage.ADD_ENUM__ORDINAL:
-        setOrdinal(ORDINAL_EDEFAULT);
-        return;
-      case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
-        setEntryGuid(ENTRY_GUID_EDEFAULT);
-        return;
-      case OseeDslPackage.ADD_ENUM__DESCRIPTION:
-        setDescription(DESCRIPTION_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
+            setEnumEntry(ENUM_ENTRY_EDEFAULT);
+            return;
+         case OseeDslPackage.ADD_ENUM__ORDINAL:
+            setOrdinal(ORDINAL_EDEFAULT);
+            return;
+         case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
+            setEntryGuid(ENTRY_GUID_EDEFAULT);
+            return;
+         case OseeDslPackage.ADD_ENUM__DESCRIPTION:
+            setDescription(DESCRIPTION_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
-        return ENUM_ENTRY_EDEFAULT == null ? enumEntry != null : !ENUM_ENTRY_EDEFAULT.equals(enumEntry);
-      case OseeDslPackage.ADD_ENUM__ORDINAL:
-        return ORDINAL_EDEFAULT == null ? ordinal != null : !ORDINAL_EDEFAULT.equals(ordinal);
-      case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
-        return ENTRY_GUID_EDEFAULT == null ? entryGuid != null : !ENTRY_GUID_EDEFAULT.equals(entryGuid);
-      case OseeDslPackage.ADD_ENUM__DESCRIPTION:
-        return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ADD_ENUM__ENUM_ENTRY:
+            return ENUM_ENTRY_EDEFAULT == null ? enumEntry != null : !ENUM_ENTRY_EDEFAULT.equals(enumEntry);
+         case OseeDslPackage.ADD_ENUM__ORDINAL:
+            return ORDINAL_EDEFAULT == null ? ordinal != null : !ORDINAL_EDEFAULT.equals(ordinal);
+         case OseeDslPackage.ADD_ENUM__ENTRY_GUID:
+            return ENTRY_GUID_EDEFAULT == null ? entryGuid != null : !ENTRY_GUID_EDEFAULT.equals(entryGuid);
+         case OseeDslPackage.ADD_ENUM__DESCRIPTION:
+            return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (enumEntry: ");
-    result.append(enumEntry);
-    result.append(", ordinal: ");
-    result.append(ordinal);
-    result.append(", entryGuid: ");
-    result.append(entryGuid);
-    result.append(", description: ");
-    result.append(description);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (enumEntry: ");
+      result.append(enumEntry);
+      result.append(", ordinal: ");
+      result.append(ordinal);
+      result.append(", entryGuid: ");
+      result.append(entryGuid);
+      result.append(", description: ");
+      result.append(description);
+      result.append(')');
+      return result.toString();
+   }
 
 } //AddEnumImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactMatchRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactMatchRestrictionImpl.java
index 2ebd938..73fbb54 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactMatchRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactMatchRestrictionImpl.java
@@ -29,144 +29,138 @@
 public class ArtifactMatchRestrictionImpl extends ObjectRestrictionImpl implements ArtifactMatchRestriction
 {
   /**
-   * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactMatcherRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactMatcherRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactMatcher artifactMatcherRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ArtifactMatchRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ARTIFACT_MATCH_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.ARTIFACT_MATCH_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher getArtifactMatcherRef()
   {
-    if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy())
-    {
-      InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
-      artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
-      if (artifactMatcherRef != oldArtifactMatcherRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+      if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy()) {
+         InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
+         artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
+         if (artifactMatcherRef != oldArtifactMatcherRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+         }
       }
-    }
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher basicGetArtifactMatcherRef()
   {
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactMatcherRef(XArtifactMatcher newArtifactMatcherRef)
   {
-    XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
-    artifactMatcherRef = newArtifactMatcherRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
-  }
+      XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
+      artifactMatcherRef = newArtifactMatcherRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
-        if (resolve) return getArtifactMatcherRef();
-        return basicGetArtifactMatcherRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
+            if (resolve) return getArtifactMatcherRef();
+            return basicGetArtifactMatcherRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
-        return artifactMatcherRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF:
+            return artifactMatcherRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //ArtifactMatchRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactTypeRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactTypeRestrictionImpl.java
index 9f6ea26..f957b12 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactTypeRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ArtifactTypeRestrictionImpl.java
@@ -29,144 +29,138 @@
 public class ArtifactTypeRestrictionImpl extends ObjectRestrictionImpl implements ArtifactTypeRestriction
 {
   /**
-   * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType artifactTypeRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ArtifactTypeRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ARTIFACT_TYPE_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.ARTIFACT_TYPE_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getArtifactTypeRef()
   {
-    if (artifactTypeRef != null && artifactTypeRef.eIsProxy())
-    {
-      InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
-      artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
-      if (artifactTypeRef != oldArtifactTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+      if (artifactTypeRef != null && artifactTypeRef.eIsProxy()) {
+         InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
+         artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
+         if (artifactTypeRef != oldArtifactTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+         }
       }
-    }
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetArtifactTypeRef()
   {
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactTypeRef(XArtifactType newArtifactTypeRef)
   {
-    XArtifactType oldArtifactTypeRef = artifactTypeRef;
-    artifactTypeRef = newArtifactTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
-  }
+      XArtifactType oldArtifactTypeRef = artifactTypeRef;
+      artifactTypeRef = newArtifactTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        if (resolve) return getArtifactTypeRef();
-        return basicGetArtifactTypeRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            if (resolve) return getArtifactTypeRef();
+            return basicGetArtifactTypeRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        return artifactTypeRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            return artifactTypeRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //ArtifactTypeRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeOverrideOptionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeOverrideOptionImpl.java
index a231e4b..4168367 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeOverrideOptionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeOverrideOptionImpl.java
@@ -21,24 +21,24 @@
 public class AttributeOverrideOptionImpl extends MinimalEObjectImpl.Container implements AttributeOverrideOption
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected AttributeOverrideOptionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ATTRIBUTE_OVERRIDE_OPTION;
-  }
+      return OseeDslPackage.Literals.ATTRIBUTE_OVERRIDE_OPTION;
+   }
 
 } //AttributeOverrideOptionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeTypeRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeTypeRestrictionImpl.java
index b7bb355..103687f 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeTypeRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/AttributeTypeRestrictionImpl.java
@@ -31,208 +31,200 @@
 public class AttributeTypeRestrictionImpl extends ObjectRestrictionImpl implements AttributeTypeRestriction
 {
   /**
-   * The cached value of the '{@link #getAttributeTypeRef() <em>Attribute Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAttributeTypeRef() <em>Attribute Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAttributeTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getAttributeTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XAttributeType attributeTypeRef;
 
   /**
-   * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType artifactTypeRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected AttributeTypeRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ATTRIBUTE_TYPE_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.ATTRIBUTE_TYPE_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType getAttributeTypeRef()
   {
-    if (attributeTypeRef != null && attributeTypeRef.eIsProxy())
-    {
-      InternalEObject oldAttributeTypeRef = (InternalEObject)attributeTypeRef;
-      attributeTypeRef = (XAttributeType)eResolveProxy(oldAttributeTypeRef);
-      if (attributeTypeRef != oldAttributeTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF, oldAttributeTypeRef, attributeTypeRef));
+      if (attributeTypeRef != null && attributeTypeRef.eIsProxy()) {
+         InternalEObject oldAttributeTypeRef = (InternalEObject)attributeTypeRef;
+         attributeTypeRef = (XAttributeType)eResolveProxy(oldAttributeTypeRef);
+         if (attributeTypeRef != oldAttributeTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF, oldAttributeTypeRef, attributeTypeRef));
+         }
       }
-    }
-    return attributeTypeRef;
-  }
+      return attributeTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType basicGetAttributeTypeRef()
   {
-    return attributeTypeRef;
-  }
+      return attributeTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAttributeTypeRef(XAttributeType newAttributeTypeRef)
   {
-    XAttributeType oldAttributeTypeRef = attributeTypeRef;
-    attributeTypeRef = newAttributeTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF, oldAttributeTypeRef, attributeTypeRef));
-  }
+      XAttributeType oldAttributeTypeRef = attributeTypeRef;
+      attributeTypeRef = newAttributeTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF, oldAttributeTypeRef, attributeTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getArtifactTypeRef()
   {
-    if (artifactTypeRef != null && artifactTypeRef.eIsProxy())
-    {
-      InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
-      artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
-      if (artifactTypeRef != oldArtifactTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+      if (artifactTypeRef != null && artifactTypeRef.eIsProxy()) {
+         InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
+         artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
+         if (artifactTypeRef != oldArtifactTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+         }
       }
-    }
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetArtifactTypeRef()
   {
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactTypeRef(XArtifactType newArtifactTypeRef)
   {
-    XArtifactType oldArtifactTypeRef = artifactTypeRef;
-    artifactTypeRef = newArtifactTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
-  }
+      XArtifactType oldArtifactTypeRef = artifactTypeRef;
+      artifactTypeRef = newArtifactTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
-        if (resolve) return getAttributeTypeRef();
-        return basicGetAttributeTypeRef();
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        if (resolve) return getArtifactTypeRef();
-        return basicGetArtifactTypeRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
+            if (resolve) return getAttributeTypeRef();
+            return basicGetAttributeTypeRef();
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            if (resolve) return getArtifactTypeRef();
+            return basicGetArtifactTypeRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
-        setAttributeTypeRef((XAttributeType)newValue);
-        return;
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
+            setAttributeTypeRef((XAttributeType)newValue);
+            return;
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
-        setAttributeTypeRef((XAttributeType)null);
-        return;
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
+            setAttributeTypeRef((XAttributeType)null);
+            return;
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
-        return attributeTypeRef != null;
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
-        return artifactTypeRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF:
+            return attributeTypeRef != null;
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF:
+            return artifactTypeRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //AttributeTypeRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/CompoundConditionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/CompoundConditionImpl.java
index 59471e5..5b7cecb 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/CompoundConditionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/CompoundConditionImpl.java
@@ -37,184 +37,177 @@
 public class CompoundConditionImpl extends ConditionImpl implements CompoundCondition
 {
   /**
-   * The cached value of the '{@link #getConditions() <em>Conditions</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getConditions() <em>Conditions</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getConditions()
-   * @generated
-   * @ordered
-   */
+    * @see #getConditions()
+    * @generated
+    * @ordered
+    */
   protected EList<SimpleCondition> conditions;
 
   /**
-   * The cached value of the '{@link #getOperators() <em>Operators</em>}' attribute list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOperators() <em>Operators</em>}' attribute list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOperators()
-   * @generated
-   * @ordered
-   */
+    * @see #getOperators()
+    * @generated
+    * @ordered
+    */
   protected EList<XLogicOperator> operators;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected CompoundConditionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.COMPOUND_CONDITION;
-  }
+      return OseeDslPackage.Literals.COMPOUND_CONDITION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<SimpleCondition> getConditions()
   {
-    if (conditions == null)
-    {
-      conditions = new EObjectContainmentEList<SimpleCondition>(SimpleCondition.class, this, OseeDslPackage.COMPOUND_CONDITION__CONDITIONS);
-    }
-    return conditions;
-  }
+      if (conditions == null) {
+         conditions = new EObjectContainmentEList<SimpleCondition>(SimpleCondition.class, this, OseeDslPackage.COMPOUND_CONDITION__CONDITIONS);
+      }
+      return conditions;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XLogicOperator> getOperators()
   {
-    if (operators == null)
-    {
-      operators = new EDataTypeEList<XLogicOperator>(XLogicOperator.class, this, OseeDslPackage.COMPOUND_CONDITION__OPERATORS);
-    }
-    return operators;
-  }
+      if (operators == null) {
+         operators = new EDataTypeEList<XLogicOperator>(XLogicOperator.class, this, OseeDslPackage.COMPOUND_CONDITION__OPERATORS);
+      }
+      return operators;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
-        return ((InternalEList<?>)getConditions()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
+            return ((InternalEList<?>)getConditions()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
-        return getConditions();
-      case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
-        return getOperators();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
+            return getConditions();
+         case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
+            return getOperators();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
-        getConditions().clear();
-        getConditions().addAll((Collection<? extends SimpleCondition>)newValue);
-        return;
-      case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
-        getOperators().clear();
-        getOperators().addAll((Collection<? extends XLogicOperator>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
+            getConditions().clear();
+            getConditions().addAll((Collection<? extends SimpleCondition>)newValue);
+            return;
+         case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
+            getOperators().clear();
+            getOperators().addAll((Collection<? extends XLogicOperator>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
-        getConditions().clear();
-        return;
-      case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
-        getOperators().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
+            getConditions().clear();
+            return;
+         case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
+            getOperators().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
-        return conditions != null && !conditions.isEmpty();
-      case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
-        return operators != null && !operators.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.COMPOUND_CONDITION__CONDITIONS:
+            return conditions != null && !conditions.isEmpty();
+         case OseeDslPackage.COMPOUND_CONDITION__OPERATORS:
+            return operators != null && !operators.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (operators: ");
-    result.append(operators);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (operators: ");
+      result.append(operators);
+      result.append(')');
+      return result.toString();
+   }
 
 } //CompoundConditionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ConditionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ConditionImpl.java
index 1fb89af..72d6f3a 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ConditionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ConditionImpl.java
@@ -21,24 +21,24 @@
 public class ConditionImpl extends MinimalEObjectImpl.Container implements Condition
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ConditionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.CONDITION;
-  }
+      return OseeDslPackage.Literals.CONDITION;
+   }
 
 } //ConditionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/HierarchyRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/HierarchyRestrictionImpl.java
index 20d6bbb..7185b66 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/HierarchyRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/HierarchyRestrictionImpl.java
@@ -40,196 +40,188 @@
 public class HierarchyRestrictionImpl extends MinimalEObjectImpl.Container implements HierarchyRestriction
 {
   /**
-   * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactMatcherRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactMatcherRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactMatcher artifactMatcherRef;
 
   /**
-   * The cached value of the '{@link #getAccessRules() <em>Access Rules</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAccessRules() <em>Access Rules</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAccessRules()
-   * @generated
-   * @ordered
-   */
+    * @see #getAccessRules()
+    * @generated
+    * @ordered
+    */
   protected EList<ObjectRestriction> accessRules;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected HierarchyRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.HIERARCHY_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.HIERARCHY_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher getArtifactMatcherRef()
   {
-    if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy())
-    {
-      InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
-      artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
-      if (artifactMatcherRef != oldArtifactMatcherRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+      if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy()) {
+         InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
+         artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
+         if (artifactMatcherRef != oldArtifactMatcherRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+         }
       }
-    }
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher basicGetArtifactMatcherRef()
   {
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactMatcherRef(XArtifactMatcher newArtifactMatcherRef)
   {
-    XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
-    artifactMatcherRef = newArtifactMatcherRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
-  }
+      XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
+      artifactMatcherRef = newArtifactMatcherRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<ObjectRestriction> getAccessRules()
   {
-    if (accessRules == null)
-    {
-      accessRules = new EObjectContainmentEList<ObjectRestriction>(ObjectRestriction.class, this, OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES);
-    }
-    return accessRules;
-  }
+      if (accessRules == null) {
+         accessRules = new EObjectContainmentEList<ObjectRestriction>(ObjectRestriction.class, this, OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES);
+      }
+      return accessRules;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
-        return ((InternalEList<?>)getAccessRules()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
+            return ((InternalEList<?>)getAccessRules()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
-        if (resolve) return getArtifactMatcherRef();
-        return basicGetArtifactMatcherRef();
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
-        return getAccessRules();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
+            if (resolve) return getArtifactMatcherRef();
+            return basicGetArtifactMatcherRef();
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
+            return getAccessRules();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)newValue);
-        return;
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
-        getAccessRules().clear();
-        getAccessRules().addAll((Collection<? extends ObjectRestriction>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)newValue);
+            return;
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
+            getAccessRules().clear();
+            getAccessRules().addAll((Collection<? extends ObjectRestriction>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)null);
-        return;
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
-        getAccessRules().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)null);
+            return;
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
+            getAccessRules().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
-        return artifactMatcherRef != null;
-      case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
-        return accessRules != null && !accessRules.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF:
+            return artifactMatcherRef != null;
+         case OseeDslPackage.HIERARCHY_RESTRICTION__ACCESS_RULES:
+            return accessRules != null && !accessRules.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //HierarchyRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ImportImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ImportImpl.java
index d991b9d..300df73 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ImportImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ImportImpl.java
@@ -28,150 +28,146 @@
 public class ImportImpl extends MinimalEObjectImpl.Container implements Import
 {
   /**
-   * The default value of the '{@link #getImportURI() <em>Import URI</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getImportURI() <em>Import URI</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getImportURI()
-   * @generated
-   * @ordered
-   */
+    * @see #getImportURI()
+    * @generated
+    * @ordered
+    */
   protected static final String IMPORT_URI_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getImportURI() <em>Import URI</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getImportURI() <em>Import URI</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getImportURI()
-   * @generated
-   * @ordered
-   */
+    * @see #getImportURI()
+    * @generated
+    * @ordered
+    */
   protected String importURI = IMPORT_URI_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ImportImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.IMPORT;
-  }
+      return OseeDslPackage.Literals.IMPORT;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getImportURI()
   {
-    return importURI;
-  }
+      return importURI;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setImportURI(String newImportURI)
   {
-    String oldImportURI = importURI;
-    importURI = newImportURI;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.IMPORT__IMPORT_URI, oldImportURI, importURI));
-  }
+      String oldImportURI = importURI;
+      importURI = newImportURI;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.IMPORT__IMPORT_URI, oldImportURI, importURI));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.IMPORT__IMPORT_URI:
-        return getImportURI();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.IMPORT__IMPORT_URI:
+            return getImportURI();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.IMPORT__IMPORT_URI:
-        setImportURI((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.IMPORT__IMPORT_URI:
+            setImportURI((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.IMPORT__IMPORT_URI:
-        setImportURI(IMPORT_URI_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.IMPORT__IMPORT_URI:
+            setImportURI(IMPORT_URI_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.IMPORT__IMPORT_URI:
-        return IMPORT_URI_EDEFAULT == null ? importURI != null : !IMPORT_URI_EDEFAULT.equals(importURI);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.IMPORT__IMPORT_URI:
+            return IMPORT_URI_EDEFAULT == null ? importURI != null : !IMPORT_URI_EDEFAULT.equals(importURI);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (importURI: ");
-    result.append(importURI);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (importURI: ");
+      result.append(importURI);
+      result.append(')');
+      return result.toString();
+   }
 
 } //ImportImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/LegacyRelationTypeRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/LegacyRelationTypeRestrictionImpl.java
index 7d31ac8..bf613ab 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/LegacyRelationTypeRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/LegacyRelationTypeRestrictionImpl.java
@@ -36,333 +36,325 @@
 public class LegacyRelationTypeRestrictionImpl extends MinimalEObjectImpl.Container implements LegacyRelationTypeRestriction
 {
   /**
-   * The default value of the '{@link #getPermission() <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getPermission() <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getPermission()
-   * @generated
-   * @ordered
-   */
+    * @see #getPermission()
+    * @generated
+    * @ordered
+    */
   protected static final AccessPermissionEnum PERMISSION_EDEFAULT = AccessPermissionEnum.ALLOW;
 
   /**
-   * The cached value of the '{@link #getPermission() <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getPermission() <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getPermission()
-   * @generated
-   * @ordered
-   */
+    * @see #getPermission()
+    * @generated
+    * @ordered
+    */
   protected AccessPermissionEnum permission = PERMISSION_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getRelationTypeRef() <em>Relation Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRelationTypeRef() <em>Relation Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRelationTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getRelationTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XRelationType relationTypeRef;
 
   /**
-   * The default value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRestrictedToSide()
-   * @generated
-   * @ordered
-   */
+    * @see #getRestrictedToSide()
+    * @generated
+    * @ordered
+    */
   protected static final XRelationSideEnum RESTRICTED_TO_SIDE_EDEFAULT = XRelationSideEnum.SIDE_A;
 
   /**
-   * The cached value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRestrictedToSide()
-   * @generated
-   * @ordered
-   */
+    * @see #getRestrictedToSide()
+    * @generated
+    * @ordered
+    */
   protected XRelationSideEnum restrictedToSide = RESTRICTED_TO_SIDE_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactMatcherRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactMatcherRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactMatcher artifactMatcherRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected LegacyRelationTypeRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.LEGACY_RELATION_TYPE_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.LEGACY_RELATION_TYPE_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AccessPermissionEnum getPermission()
   {
-    return permission;
-  }
+      return permission;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setPermission(AccessPermissionEnum newPermission)
   {
-    AccessPermissionEnum oldPermission = permission;
-    permission = newPermission == null ? PERMISSION_EDEFAULT : newPermission;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION, oldPermission, permission));
-  }
+      AccessPermissionEnum oldPermission = permission;
+      permission = newPermission == null ? PERMISSION_EDEFAULT : newPermission;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION, oldPermission, permission));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationType getRelationTypeRef()
   {
-    if (relationTypeRef != null && relationTypeRef.eIsProxy())
-    {
-      InternalEObject oldRelationTypeRef = (InternalEObject)relationTypeRef;
-      relationTypeRef = (XRelationType)eResolveProxy(oldRelationTypeRef);
-      if (relationTypeRef != oldRelationTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+      if (relationTypeRef != null && relationTypeRef.eIsProxy()) {
+         InternalEObject oldRelationTypeRef = (InternalEObject)relationTypeRef;
+         relationTypeRef = (XRelationType)eResolveProxy(oldRelationTypeRef);
+         if (relationTypeRef != oldRelationTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+         }
       }
-    }
-    return relationTypeRef;
-  }
+      return relationTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationType basicGetRelationTypeRef()
   {
-    return relationTypeRef;
-  }
+      return relationTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setRelationTypeRef(XRelationType newRelationTypeRef)
   {
-    XRelationType oldRelationTypeRef = relationTypeRef;
-    relationTypeRef = newRelationTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
-  }
+      XRelationType oldRelationTypeRef = relationTypeRef;
+      relationTypeRef = newRelationTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationSideEnum getRestrictedToSide()
   {
-    return restrictedToSide;
-  }
+      return restrictedToSide;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setRestrictedToSide(XRelationSideEnum newRestrictedToSide)
   {
-    XRelationSideEnum oldRestrictedToSide = restrictedToSide;
-    restrictedToSide = newRestrictedToSide == null ? RESTRICTED_TO_SIDE_EDEFAULT : newRestrictedToSide;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE, oldRestrictedToSide, restrictedToSide));
-  }
+      XRelationSideEnum oldRestrictedToSide = restrictedToSide;
+      restrictedToSide = newRestrictedToSide == null ? RESTRICTED_TO_SIDE_EDEFAULT : newRestrictedToSide;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE, oldRestrictedToSide, restrictedToSide));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher getArtifactMatcherRef()
   {
-    if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy())
-    {
-      InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
-      artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
-      if (artifactMatcherRef != oldArtifactMatcherRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+      if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy()) {
+         InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
+         artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
+         if (artifactMatcherRef != oldArtifactMatcherRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+         }
       }
-    }
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher basicGetArtifactMatcherRef()
   {
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactMatcherRef(XArtifactMatcher newArtifactMatcherRef)
   {
-    XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
-    artifactMatcherRef = newArtifactMatcherRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
-  }
+      XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
+      artifactMatcherRef = newArtifactMatcherRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
-        return getPermission();
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        if (resolve) return getRelationTypeRef();
-        return basicGetRelationTypeRef();
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        return getRestrictedToSide();
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
-        if (resolve) return getArtifactMatcherRef();
-        return basicGetArtifactMatcherRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
+            return getPermission();
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            if (resolve) return getRelationTypeRef();
+            return basicGetRelationTypeRef();
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            return getRestrictedToSide();
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
+            if (resolve) return getArtifactMatcherRef();
+            return basicGetArtifactMatcherRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
-        setPermission((AccessPermissionEnum)newValue);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        setRelationTypeRef((XRelationType)newValue);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        setRestrictedToSide((XRelationSideEnum)newValue);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
+            setPermission((AccessPermissionEnum)newValue);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            setRelationTypeRef((XRelationType)newValue);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            setRestrictedToSide((XRelationSideEnum)newValue);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
-        setPermission(PERMISSION_EDEFAULT);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        setRelationTypeRef((XRelationType)null);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        setRestrictedToSide(RESTRICTED_TO_SIDE_EDEFAULT);
-        return;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
+            setPermission(PERMISSION_EDEFAULT);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            setRelationTypeRef((XRelationType)null);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            setRestrictedToSide(RESTRICTED_TO_SIDE_EDEFAULT);
+            return;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
-        return permission != PERMISSION_EDEFAULT;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        return relationTypeRef != null;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        return restrictedToSide != RESTRICTED_TO_SIDE_EDEFAULT;
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
-        return artifactMatcherRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION:
+            return permission != PERMISSION_EDEFAULT;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            return relationTypeRef != null;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            return restrictedToSide != RESTRICTED_TO_SIDE_EDEFAULT;
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF:
+            return artifactMatcherRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (permission: ");
-    result.append(permission);
-    result.append(", restrictedToSide: ");
-    result.append(restrictedToSide);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (permission: ");
+      result.append(permission);
+      result.append(", restrictedToSide: ");
+      result.append(restrictedToSide);
+      result.append(')');
+      return result.toString();
+   }
 
 } //LegacyRelationTypeRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ObjectRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ObjectRestrictionImpl.java
index 16fdd43..fea0943 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ObjectRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ObjectRestrictionImpl.java
@@ -29,150 +29,146 @@
 public class ObjectRestrictionImpl extends MinimalEObjectImpl.Container implements ObjectRestriction
 {
   /**
-   * The default value of the '{@link #getPermission() <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getPermission() <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getPermission()
-   * @generated
-   * @ordered
-   */
+    * @see #getPermission()
+    * @generated
+    * @ordered
+    */
   protected static final AccessPermissionEnum PERMISSION_EDEFAULT = AccessPermissionEnum.ALLOW;
 
   /**
-   * The cached value of the '{@link #getPermission() <em>Permission</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getPermission() <em>Permission</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getPermission()
-   * @generated
-   * @ordered
-   */
+    * @see #getPermission()
+    * @generated
+    * @ordered
+    */
   protected AccessPermissionEnum permission = PERMISSION_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ObjectRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.OBJECT_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.OBJECT_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AccessPermissionEnum getPermission()
   {
-    return permission;
-  }
+      return permission;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setPermission(AccessPermissionEnum newPermission)
   {
-    AccessPermissionEnum oldPermission = permission;
-    permission = newPermission == null ? PERMISSION_EDEFAULT : newPermission;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OBJECT_RESTRICTION__PERMISSION, oldPermission, permission));
-  }
+      AccessPermissionEnum oldPermission = permission;
+      permission = newPermission == null ? PERMISSION_EDEFAULT : newPermission;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OBJECT_RESTRICTION__PERMISSION, oldPermission, permission));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
-        return getPermission();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
+            return getPermission();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
-        setPermission((AccessPermissionEnum)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
+            setPermission((AccessPermissionEnum)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
-        setPermission(PERMISSION_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
+            setPermission(PERMISSION_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
-        return permission != PERMISSION_EDEFAULT;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OBJECT_RESTRICTION__PERMISSION:
+            return permission != PERMISSION_EDEFAULT;
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (permission: ");
-    result.append(permission);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (permission: ");
+      result.append(permission);
+      result.append(')');
+      return result.toString();
+   }
 
 } //ObjectRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslFactoryImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslFactoryImpl.java
index 51d1ab2..1756208 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslFactoryImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslFactoryImpl.java
@@ -22,730 +22,724 @@
 public class OseeDslFactoryImpl extends EFactoryImpl implements OseeDslFactory
 {
   /**
-   * Creates the default factory implementation.
-   * <!-- begin-user-doc -->
+    * Creates the default factory implementation.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public static OseeDslFactory init()
   {
-    try
-    {
-      OseeDslFactory theOseeDslFactory = (OseeDslFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/osee/framework/core/dsl/OseeDsl"); 
-      if (theOseeDslFactory != null)
-      {
-        return theOseeDslFactory;
+      try {
+         OseeDslFactory theOseeDslFactory = (OseeDslFactory)EPackage.Registry.INSTANCE.getEFactory(OseeDslPackage.eNS_URI);
+         if (theOseeDslFactory != null) {
+            return theOseeDslFactory;
+         }
       }
-    }
-    catch (Exception exception)
-    {
-      EcorePlugin.INSTANCE.log(exception);
-    }
-    return new OseeDslFactoryImpl();
-  }
+      catch (Exception exception) {
+         EcorePlugin.INSTANCE.log(exception);
+      }
+      return new OseeDslFactoryImpl();
+   }
 
   /**
-   * Creates an instance of the factory.
-   * <!-- begin-user-doc -->
+    * Creates an instance of the factory.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDslFactoryImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public EObject create(EClass eClass)
   {
-    switch (eClass.getClassifierID())
-    {
-      case OseeDslPackage.OSEE_DSL: return createOseeDsl();
-      case OseeDslPackage.IMPORT: return createImport();
-      case OseeDslPackage.OSEE_ELEMENT: return createOseeElement();
-      case OseeDslPackage.OSEE_TYPE: return createOseeType();
-      case OseeDslPackage.XARTIFACT_TYPE: return createXArtifactType();
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF: return createXAttributeTypeRef();
-      case OseeDslPackage.XATTRIBUTE_TYPE: return createXAttributeType();
-      case OseeDslPackage.XOSEE_ENUM_TYPE: return createXOseeEnumType();
-      case OseeDslPackage.XOSEE_ENUM_ENTRY: return createXOseeEnumEntry();
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE: return createXOseeEnumOverride();
-      case OseeDslPackage.OVERRIDE_OPTION: return createOverrideOption();
-      case OseeDslPackage.ADD_ENUM: return createAddEnum();
-      case OseeDslPackage.REMOVE_ENUM: return createRemoveEnum();
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE: return createXOseeArtifactTypeOverride();
-      case OseeDslPackage.ATTRIBUTE_OVERRIDE_OPTION: return createAttributeOverrideOption();
-      case OseeDslPackage.ADD_ATTRIBUTE: return createAddAttribute();
-      case OseeDslPackage.REMOVE_ATTRIBUTE: return createRemoveAttribute();
-      case OseeDslPackage.UPDATE_ATTRIBUTE: return createUpdateAttribute();
-      case OseeDslPackage.XRELATION_TYPE: return createXRelationType();
-      case OseeDslPackage.CONDITION: return createCondition();
-      case OseeDslPackage.SIMPLE_CONDITION: return createSimpleCondition();
-      case OseeDslPackage.COMPOUND_CONDITION: return createCompoundCondition();
-      case OseeDslPackage.XARTIFACT_MATCHER: return createXArtifactMatcher();
-      case OseeDslPackage.ROLE: return createRole();
-      case OseeDslPackage.REFERENCED_CONTEXT: return createReferencedContext();
-      case OseeDslPackage.USERS_AND_GROUPS: return createUsersAndGroups();
-      case OseeDslPackage.ACCESS_CONTEXT: return createAccessContext();
-      case OseeDslPackage.HIERARCHY_RESTRICTION: return createHierarchyRestriction();
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE: return createRelationTypeArtifactTypePredicate();
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE: return createRelationTypeArtifactPredicate();
-      case OseeDslPackage.RELATION_TYPE_PREDICATE: return createRelationTypePredicate();
-      case OseeDslPackage.OBJECT_RESTRICTION: return createObjectRestriction();
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION: return createArtifactMatchRestriction();
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION: return createArtifactTypeRestriction();
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION: return createAttributeTypeRestriction();
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION: return createLegacyRelationTypeRestriction();
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION: return createRelationTypeRestriction();
-      default:
-        throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-    }
-  }
+      switch (eClass.getClassifierID()) {
+         case OseeDslPackage.OSEE_DSL: return createOseeDsl();
+         case OseeDslPackage.IMPORT: return createImport();
+         case OseeDslPackage.OSEE_ELEMENT: return createOseeElement();
+         case OseeDslPackage.OSEE_TYPE: return createOseeType();
+         case OseeDslPackage.XARTIFACT_TYPE: return createXArtifactType();
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF: return createXAttributeTypeRef();
+         case OseeDslPackage.XATTRIBUTE_TYPE: return createXAttributeType();
+         case OseeDslPackage.XOSEE_ENUM_TYPE: return createXOseeEnumType();
+         case OseeDslPackage.XOSEE_ENUM_ENTRY: return createXOseeEnumEntry();
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE: return createXOseeEnumOverride();
+         case OseeDslPackage.OVERRIDE_OPTION: return createOverrideOption();
+         case OseeDslPackage.ADD_ENUM: return createAddEnum();
+         case OseeDslPackage.REMOVE_ENUM: return createRemoveEnum();
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE: return createXOseeArtifactTypeOverride();
+         case OseeDslPackage.ATTRIBUTE_OVERRIDE_OPTION: return createAttributeOverrideOption();
+         case OseeDslPackage.ADD_ATTRIBUTE: return createAddAttribute();
+         case OseeDslPackage.REMOVE_ATTRIBUTE: return createRemoveAttribute();
+         case OseeDslPackage.UPDATE_ATTRIBUTE: return createUpdateAttribute();
+         case OseeDslPackage.XRELATION_TYPE: return createXRelationType();
+         case OseeDslPackage.CONDITION: return createCondition();
+         case OseeDslPackage.SIMPLE_CONDITION: return createSimpleCondition();
+         case OseeDslPackage.COMPOUND_CONDITION: return createCompoundCondition();
+         case OseeDslPackage.XARTIFACT_MATCHER: return createXArtifactMatcher();
+         case OseeDslPackage.ROLE: return createRole();
+         case OseeDslPackage.REFERENCED_CONTEXT: return createReferencedContext();
+         case OseeDslPackage.USERS_AND_GROUPS: return createUsersAndGroups();
+         case OseeDslPackage.ACCESS_CONTEXT: return createAccessContext();
+         case OseeDslPackage.HIERARCHY_RESTRICTION: return createHierarchyRestriction();
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE: return createRelationTypeArtifactTypePredicate();
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE: return createRelationTypeArtifactPredicate();
+         case OseeDslPackage.RELATION_TYPE_PREDICATE: return createRelationTypePredicate();
+         case OseeDslPackage.OBJECT_RESTRICTION: return createObjectRestriction();
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION: return createArtifactMatchRestriction();
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION: return createArtifactTypeRestriction();
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION: return createAttributeTypeRestriction();
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION: return createLegacyRelationTypeRestriction();
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION: return createRelationTypeRestriction();
+         default:
+            throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+      }
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object createFromString(EDataType eDataType, String initialValue)
   {
-    switch (eDataType.getClassifierID())
-    {
-      case OseeDslPackage.RELATION_MULTIPLICITY_ENUM:
-        return createRelationMultiplicityEnumFromString(eDataType, initialValue);
-      case OseeDslPackage.COMPARE_OP:
-        return createCompareOpFromString(eDataType, initialValue);
-      case OseeDslPackage.XLOGIC_OPERATOR:
-        return createXLogicOperatorFromString(eDataType, initialValue);
-      case OseeDslPackage.MATCH_FIELD:
-        return createMatchFieldFromString(eDataType, initialValue);
-      case OseeDslPackage.ACCESS_PERMISSION_ENUM:
-        return createAccessPermissionEnumFromString(eDataType, initialValue);
-      case OseeDslPackage.RELATION_TYPE_MATCH:
-        return createRelationTypeMatchFromString(eDataType, initialValue);
-      case OseeDslPackage.XRELATION_SIDE_ENUM:
-        return createXRelationSideEnumFromString(eDataType, initialValue);
-      default:
-        throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-    }
-  }
+      switch (eDataType.getClassifierID()) {
+         case OseeDslPackage.RELATION_MULTIPLICITY_ENUM:
+            return createRelationMultiplicityEnumFromString(eDataType, initialValue);
+         case OseeDslPackage.COMPARE_OP:
+            return createCompareOpFromString(eDataType, initialValue);
+         case OseeDslPackage.XLOGIC_OPERATOR:
+            return createXLogicOperatorFromString(eDataType, initialValue);
+         case OseeDslPackage.MATCH_FIELD:
+            return createMatchFieldFromString(eDataType, initialValue);
+         case OseeDslPackage.ACCESS_PERMISSION_ENUM:
+            return createAccessPermissionEnumFromString(eDataType, initialValue);
+         case OseeDslPackage.RELATION_TYPE_MATCH:
+            return createRelationTypeMatchFromString(eDataType, initialValue);
+         case OseeDslPackage.XRELATION_SIDE_ENUM:
+            return createXRelationSideEnumFromString(eDataType, initialValue);
+         default:
+            throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+      }
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String convertToString(EDataType eDataType, Object instanceValue)
   {
-    switch (eDataType.getClassifierID())
-    {
-      case OseeDslPackage.RELATION_MULTIPLICITY_ENUM:
-        return convertRelationMultiplicityEnumToString(eDataType, instanceValue);
-      case OseeDslPackage.COMPARE_OP:
-        return convertCompareOpToString(eDataType, instanceValue);
-      case OseeDslPackage.XLOGIC_OPERATOR:
-        return convertXLogicOperatorToString(eDataType, instanceValue);
-      case OseeDslPackage.MATCH_FIELD:
-        return convertMatchFieldToString(eDataType, instanceValue);
-      case OseeDslPackage.ACCESS_PERMISSION_ENUM:
-        return convertAccessPermissionEnumToString(eDataType, instanceValue);
-      case OseeDslPackage.RELATION_TYPE_MATCH:
-        return convertRelationTypeMatchToString(eDataType, instanceValue);
-      case OseeDslPackage.XRELATION_SIDE_ENUM:
-        return convertXRelationSideEnumToString(eDataType, instanceValue);
-      default:
-        throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-    }
-  }
+      switch (eDataType.getClassifierID()) {
+         case OseeDslPackage.RELATION_MULTIPLICITY_ENUM:
+            return convertRelationMultiplicityEnumToString(eDataType, instanceValue);
+         case OseeDslPackage.COMPARE_OP:
+            return convertCompareOpToString(eDataType, instanceValue);
+         case OseeDslPackage.XLOGIC_OPERATOR:
+            return convertXLogicOperatorToString(eDataType, instanceValue);
+         case OseeDslPackage.MATCH_FIELD:
+            return convertMatchFieldToString(eDataType, instanceValue);
+         case OseeDslPackage.ACCESS_PERMISSION_ENUM:
+            return convertAccessPermissionEnumToString(eDataType, instanceValue);
+         case OseeDslPackage.RELATION_TYPE_MATCH:
+            return convertRelationTypeMatchToString(eDataType, instanceValue);
+         case OseeDslPackage.XRELATION_SIDE_ENUM:
+            return convertXRelationSideEnumToString(eDataType, instanceValue);
+         default:
+            throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+      }
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDsl createOseeDsl()
   {
-    OseeDslImpl oseeDsl = new OseeDslImpl();
-    return oseeDsl;
-  }
+      OseeDslImpl oseeDsl = new OseeDslImpl();
+      return oseeDsl;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public Import createImport()
   {
-    ImportImpl import_ = new ImportImpl();
-    return import_;
-  }
+      ImportImpl import_ = new ImportImpl();
+      return import_;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeElement createOseeElement()
   {
-    OseeElementImpl oseeElement = new OseeElementImpl();
-    return oseeElement;
-  }
+      OseeElementImpl oseeElement = new OseeElementImpl();
+      return oseeElement;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeType createOseeType()
   {
-    OseeTypeImpl oseeType = new OseeTypeImpl();
-    return oseeType;
-  }
+      OseeTypeImpl oseeType = new OseeTypeImpl();
+      return oseeType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType createXArtifactType()
   {
-    XArtifactTypeImpl xArtifactType = new XArtifactTypeImpl();
-    return xArtifactType;
-  }
+      XArtifactTypeImpl xArtifactType = new XArtifactTypeImpl();
+      return xArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeTypeRef createXAttributeTypeRef()
   {
-    XAttributeTypeRefImpl xAttributeTypeRef = new XAttributeTypeRefImpl();
-    return xAttributeTypeRef;
-  }
+      XAttributeTypeRefImpl xAttributeTypeRef = new XAttributeTypeRefImpl();
+      return xAttributeTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType createXAttributeType()
   {
-    XAttributeTypeImpl xAttributeType = new XAttributeTypeImpl();
-    return xAttributeType;
-  }
+      XAttributeTypeImpl xAttributeType = new XAttributeTypeImpl();
+      return xAttributeType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumType createXOseeEnumType()
   {
-    XOseeEnumTypeImpl xOseeEnumType = new XOseeEnumTypeImpl();
-    return xOseeEnumType;
-  }
+      XOseeEnumTypeImpl xOseeEnumType = new XOseeEnumTypeImpl();
+      return xOseeEnumType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumEntry createXOseeEnumEntry()
   {
-    XOseeEnumEntryImpl xOseeEnumEntry = new XOseeEnumEntryImpl();
-    return xOseeEnumEntry;
-  }
+      XOseeEnumEntryImpl xOseeEnumEntry = new XOseeEnumEntryImpl();
+      return xOseeEnumEntry;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumOverride createXOseeEnumOverride()
   {
-    XOseeEnumOverrideImpl xOseeEnumOverride = new XOseeEnumOverrideImpl();
-    return xOseeEnumOverride;
-  }
+      XOseeEnumOverrideImpl xOseeEnumOverride = new XOseeEnumOverrideImpl();
+      return xOseeEnumOverride;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OverrideOption createOverrideOption()
   {
-    OverrideOptionImpl overrideOption = new OverrideOptionImpl();
-    return overrideOption;
-  }
+      OverrideOptionImpl overrideOption = new OverrideOptionImpl();
+      return overrideOption;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AddEnum createAddEnum()
   {
-    AddEnumImpl addEnum = new AddEnumImpl();
-    return addEnum;
-  }
+      AddEnumImpl addEnum = new AddEnumImpl();
+      return addEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RemoveEnum createRemoveEnum()
   {
-    RemoveEnumImpl removeEnum = new RemoveEnumImpl();
-    return removeEnum;
-  }
+      RemoveEnumImpl removeEnum = new RemoveEnumImpl();
+      return removeEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeArtifactTypeOverride createXOseeArtifactTypeOverride()
   {
-    XOseeArtifactTypeOverrideImpl xOseeArtifactTypeOverride = new XOseeArtifactTypeOverrideImpl();
-    return xOseeArtifactTypeOverride;
-  }
+      XOseeArtifactTypeOverrideImpl xOseeArtifactTypeOverride = new XOseeArtifactTypeOverrideImpl();
+      return xOseeArtifactTypeOverride;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AttributeOverrideOption createAttributeOverrideOption()
   {
-    AttributeOverrideOptionImpl attributeOverrideOption = new AttributeOverrideOptionImpl();
-    return attributeOverrideOption;
-  }
+      AttributeOverrideOptionImpl attributeOverrideOption = new AttributeOverrideOptionImpl();
+      return attributeOverrideOption;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AddAttribute createAddAttribute()
   {
-    AddAttributeImpl addAttribute = new AddAttributeImpl();
-    return addAttribute;
-  }
+      AddAttributeImpl addAttribute = new AddAttributeImpl();
+      return addAttribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RemoveAttribute createRemoveAttribute()
   {
-    RemoveAttributeImpl removeAttribute = new RemoveAttributeImpl();
-    return removeAttribute;
-  }
+      RemoveAttributeImpl removeAttribute = new RemoveAttributeImpl();
+      return removeAttribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public UpdateAttribute createUpdateAttribute()
   {
-    UpdateAttributeImpl updateAttribute = new UpdateAttributeImpl();
-    return updateAttribute;
-  }
+      UpdateAttributeImpl updateAttribute = new UpdateAttributeImpl();
+      return updateAttribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationType createXRelationType()
   {
-    XRelationTypeImpl xRelationType = new XRelationTypeImpl();
-    return xRelationType;
-  }
+      XRelationTypeImpl xRelationType = new XRelationTypeImpl();
+      return xRelationType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public Condition createCondition()
   {
-    ConditionImpl condition = new ConditionImpl();
-    return condition;
-  }
+      ConditionImpl condition = new ConditionImpl();
+      return condition;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public SimpleCondition createSimpleCondition()
   {
-    SimpleConditionImpl simpleCondition = new SimpleConditionImpl();
-    return simpleCondition;
-  }
+      SimpleConditionImpl simpleCondition = new SimpleConditionImpl();
+      return simpleCondition;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public CompoundCondition createCompoundCondition()
   {
-    CompoundConditionImpl compoundCondition = new CompoundConditionImpl();
-    return compoundCondition;
-  }
+      CompoundConditionImpl compoundCondition = new CompoundConditionImpl();
+      return compoundCondition;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher createXArtifactMatcher()
   {
-    XArtifactMatcherImpl xArtifactMatcher = new XArtifactMatcherImpl();
-    return xArtifactMatcher;
-  }
+      XArtifactMatcherImpl xArtifactMatcher = new XArtifactMatcherImpl();
+      return xArtifactMatcher;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public Role createRole()
   {
-    RoleImpl role = new RoleImpl();
-    return role;
-  }
+      RoleImpl role = new RoleImpl();
+      return role;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public ReferencedContext createReferencedContext()
   {
-    ReferencedContextImpl referencedContext = new ReferencedContextImpl();
-    return referencedContext;
-  }
+      ReferencedContextImpl referencedContext = new ReferencedContextImpl();
+      return referencedContext;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public UsersAndGroups createUsersAndGroups()
   {
-    UsersAndGroupsImpl usersAndGroups = new UsersAndGroupsImpl();
-    return usersAndGroups;
-  }
+      UsersAndGroupsImpl usersAndGroups = new UsersAndGroupsImpl();
+      return usersAndGroups;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AccessContext createAccessContext()
   {
-    AccessContextImpl accessContext = new AccessContextImpl();
-    return accessContext;
-  }
+      AccessContextImpl accessContext = new AccessContextImpl();
+      return accessContext;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public HierarchyRestriction createHierarchyRestriction()
   {
-    HierarchyRestrictionImpl hierarchyRestriction = new HierarchyRestrictionImpl();
-    return hierarchyRestriction;
-  }
+      HierarchyRestrictionImpl hierarchyRestriction = new HierarchyRestrictionImpl();
+      return hierarchyRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypeArtifactTypePredicate createRelationTypeArtifactTypePredicate()
   {
-    RelationTypeArtifactTypePredicateImpl relationTypeArtifactTypePredicate = new RelationTypeArtifactTypePredicateImpl();
-    return relationTypeArtifactTypePredicate;
-  }
+      RelationTypeArtifactTypePredicateImpl relationTypeArtifactTypePredicate = new RelationTypeArtifactTypePredicateImpl();
+      return relationTypeArtifactTypePredicate;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypeArtifactPredicate createRelationTypeArtifactPredicate()
   {
-    RelationTypeArtifactPredicateImpl relationTypeArtifactPredicate = new RelationTypeArtifactPredicateImpl();
-    return relationTypeArtifactPredicate;
-  }
+      RelationTypeArtifactPredicateImpl relationTypeArtifactPredicate = new RelationTypeArtifactPredicateImpl();
+      return relationTypeArtifactPredicate;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypePredicate createRelationTypePredicate()
   {
-    RelationTypePredicateImpl relationTypePredicate = new RelationTypePredicateImpl();
-    return relationTypePredicate;
-  }
+      RelationTypePredicateImpl relationTypePredicate = new RelationTypePredicateImpl();
+      return relationTypePredicate;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public ObjectRestriction createObjectRestriction()
   {
-    ObjectRestrictionImpl objectRestriction = new ObjectRestrictionImpl();
-    return objectRestriction;
-  }
+      ObjectRestrictionImpl objectRestriction = new ObjectRestrictionImpl();
+      return objectRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public ArtifactMatchRestriction createArtifactMatchRestriction()
   {
-    ArtifactMatchRestrictionImpl artifactMatchRestriction = new ArtifactMatchRestrictionImpl();
-    return artifactMatchRestriction;
-  }
+      ArtifactMatchRestrictionImpl artifactMatchRestriction = new ArtifactMatchRestrictionImpl();
+      return artifactMatchRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public ArtifactTypeRestriction createArtifactTypeRestriction()
   {
-    ArtifactTypeRestrictionImpl artifactTypeRestriction = new ArtifactTypeRestrictionImpl();
-    return artifactTypeRestriction;
-  }
+      ArtifactTypeRestrictionImpl artifactTypeRestriction = new ArtifactTypeRestrictionImpl();
+      return artifactTypeRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AttributeTypeRestriction createAttributeTypeRestriction()
   {
-    AttributeTypeRestrictionImpl attributeTypeRestriction = new AttributeTypeRestrictionImpl();
-    return attributeTypeRestriction;
-  }
+      AttributeTypeRestrictionImpl attributeTypeRestriction = new AttributeTypeRestrictionImpl();
+      return attributeTypeRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public LegacyRelationTypeRestriction createLegacyRelationTypeRestriction()
   {
-    LegacyRelationTypeRestrictionImpl legacyRelationTypeRestriction = new LegacyRelationTypeRestrictionImpl();
-    return legacyRelationTypeRestriction;
-  }
+      LegacyRelationTypeRestrictionImpl legacyRelationTypeRestriction = new LegacyRelationTypeRestrictionImpl();
+      return legacyRelationTypeRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypeRestriction createRelationTypeRestriction()
   {
-    RelationTypeRestrictionImpl relationTypeRestriction = new RelationTypeRestrictionImpl();
-    return relationTypeRestriction;
-  }
+      RelationTypeRestrictionImpl relationTypeRestriction = new RelationTypeRestrictionImpl();
+      return relationTypeRestriction;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationMultiplicityEnum createRelationMultiplicityEnumFromString(EDataType eDataType, String initialValue)
   {
-    RelationMultiplicityEnum result = RelationMultiplicityEnum.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      RelationMultiplicityEnum result = RelationMultiplicityEnum.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertRelationMultiplicityEnumToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public CompareOp createCompareOpFromString(EDataType eDataType, String initialValue)
   {
-    CompareOp result = CompareOp.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      CompareOp result = CompareOp.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertCompareOpToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XLogicOperator createXLogicOperatorFromString(EDataType eDataType, String initialValue)
   {
-    XLogicOperator result = XLogicOperator.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      XLogicOperator result = XLogicOperator.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertXLogicOperatorToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public MatchField createMatchFieldFromString(EDataType eDataType, String initialValue)
   {
-    MatchField result = MatchField.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      MatchField result = MatchField.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertMatchFieldToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public AccessPermissionEnum createAccessPermissionEnumFromString(EDataType eDataType, String initialValue)
   {
-    AccessPermissionEnum result = AccessPermissionEnum.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      AccessPermissionEnum result = AccessPermissionEnum.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertAccessPermissionEnumToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypeMatch createRelationTypeMatchFromString(EDataType eDataType, String initialValue)
   {
-    RelationTypeMatch result = RelationTypeMatch.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      RelationTypeMatch result = RelationTypeMatch.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertRelationTypeMatchToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationSideEnum createXRelationSideEnumFromString(EDataType eDataType, String initialValue)
   {
-    XRelationSideEnum result = XRelationSideEnum.get(initialValue);
-    if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-    return result;
-  }
+      XRelationSideEnum result = XRelationSideEnum.get(initialValue);
+      if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+      return result;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String convertXRelationSideEnumToString(EDataType eDataType, Object instanceValue)
   {
-    return instanceValue == null ? null : instanceValue.toString();
-  }
+      return instanceValue == null ? null : instanceValue.toString();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDslPackage getOseeDslPackage()
   {
-    return (OseeDslPackage)getEPackage();
-  }
+      return (OseeDslPackage)getEPackage();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @deprecated
-   * @generated
-   */
+    * @deprecated
+    * @generated
+    */
   @Deprecated
   public static OseeDslPackage getPackage()
   {
-    return OseeDslPackage.eINSTANCE;
-  }
+      return OseeDslPackage.eINSTANCE;
+   }
 
 } //OseeDslFactoryImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslImpl.java
index b29569f..6ad8ba4 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslImpl.java
@@ -54,465 +54,450 @@
 public class OseeDslImpl extends MinimalEObjectImpl.Container implements OseeDsl
 {
   /**
-   * The cached value of the '{@link #getImports() <em>Imports</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getImports() <em>Imports</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getImports()
-   * @generated
-   * @ordered
-   */
+    * @see #getImports()
+    * @generated
+    * @ordered
+    */
   protected EList<Import> imports;
 
   /**
-   * The cached value of the '{@link #getArtifactTypes() <em>Artifact Types</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactTypes() <em>Artifact Types</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XArtifactType> artifactTypes;
 
   /**
-   * The cached value of the '{@link #getRelationTypes() <em>Relation Types</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRelationTypes() <em>Relation Types</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRelationTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getRelationTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XRelationType> relationTypes;
 
   /**
-   * The cached value of the '{@link #getAttributeTypes() <em>Attribute Types</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAttributeTypes() <em>Attribute Types</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAttributeTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getAttributeTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XAttributeType> attributeTypes;
 
   /**
-   * The cached value of the '{@link #getEnumTypes() <em>Enum Types</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumTypes() <em>Enum Types</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XOseeEnumType> enumTypes;
 
   /**
-   * The cached value of the '{@link #getEnumOverrides() <em>Enum Overrides</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumOverrides() <em>Enum Overrides</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumOverrides()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumOverrides()
+    * @generated
+    * @ordered
+    */
   protected EList<XOseeEnumOverride> enumOverrides;
 
   /**
-   * The cached value of the '{@link #getArtifactTypeOverrides() <em>Artifact Type Overrides</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactTypeOverrides() <em>Artifact Type Overrides</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactTypeOverrides()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactTypeOverrides()
+    * @generated
+    * @ordered
+    */
   protected EList<XOseeArtifactTypeOverride> artifactTypeOverrides;
 
   /**
-   * The cached value of the '{@link #getArtifactMatchRefs() <em>Artifact Match Refs</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactMatchRefs() <em>Artifact Match Refs</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactMatchRefs()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactMatchRefs()
+    * @generated
+    * @ordered
+    */
   protected EList<XArtifactMatcher> artifactMatchRefs;
 
   /**
-   * The cached value of the '{@link #getAccessDeclarations() <em>Access Declarations</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAccessDeclarations() <em>Access Declarations</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAccessDeclarations()
-   * @generated
-   * @ordered
-   */
+    * @see #getAccessDeclarations()
+    * @generated
+    * @ordered
+    */
   protected EList<AccessContext> accessDeclarations;
 
   /**
-   * The cached value of the '{@link #getRoleDeclarations() <em>Role Declarations</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRoleDeclarations() <em>Role Declarations</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRoleDeclarations()
-   * @generated
-   * @ordered
-   */
+    * @see #getRoleDeclarations()
+    * @generated
+    * @ordered
+    */
   protected EList<Role> roleDeclarations;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected OseeDslImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.OSEE_DSL;
-  }
+      return OseeDslPackage.Literals.OSEE_DSL;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<Import> getImports()
   {
-    if (imports == null)
-    {
-      imports = new EObjectContainmentEList<Import>(Import.class, this, OseeDslPackage.OSEE_DSL__IMPORTS);
-    }
-    return imports;
-  }
+      if (imports == null) {
+         imports = new EObjectContainmentEList<Import>(Import.class, this, OseeDslPackage.OSEE_DSL__IMPORTS);
+      }
+      return imports;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XArtifactType> getArtifactTypes()
   {
-    if (artifactTypes == null)
-    {
-      artifactTypes = new EObjectContainmentEList<XArtifactType>(XArtifactType.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES);
-    }
-    return artifactTypes;
-  }
+      if (artifactTypes == null) {
+         artifactTypes = new EObjectContainmentEList<XArtifactType>(XArtifactType.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES);
+      }
+      return artifactTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XRelationType> getRelationTypes()
   {
-    if (relationTypes == null)
-    {
-      relationTypes = new EObjectContainmentEList<XRelationType>(XRelationType.class, this, OseeDslPackage.OSEE_DSL__RELATION_TYPES);
-    }
-    return relationTypes;
-  }
+      if (relationTypes == null) {
+         relationTypes = new EObjectContainmentEList<XRelationType>(XRelationType.class, this, OseeDslPackage.OSEE_DSL__RELATION_TYPES);
+      }
+      return relationTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XAttributeType> getAttributeTypes()
   {
-    if (attributeTypes == null)
-    {
-      attributeTypes = new EObjectContainmentEList<XAttributeType>(XAttributeType.class, this, OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES);
-    }
-    return attributeTypes;
-  }
+      if (attributeTypes == null) {
+         attributeTypes = new EObjectContainmentEList<XAttributeType>(XAttributeType.class, this, OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES);
+      }
+      return attributeTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XOseeEnumType> getEnumTypes()
   {
-    if (enumTypes == null)
-    {
-      enumTypes = new EObjectContainmentEList<XOseeEnumType>(XOseeEnumType.class, this, OseeDslPackage.OSEE_DSL__ENUM_TYPES);
-    }
-    return enumTypes;
-  }
+      if (enumTypes == null) {
+         enumTypes = new EObjectContainmentEList<XOseeEnumType>(XOseeEnumType.class, this, OseeDslPackage.OSEE_DSL__ENUM_TYPES);
+      }
+      return enumTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XOseeEnumOverride> getEnumOverrides()
   {
-    if (enumOverrides == null)
-    {
-      enumOverrides = new EObjectContainmentEList<XOseeEnumOverride>(XOseeEnumOverride.class, this, OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES);
-    }
-    return enumOverrides;
-  }
+      if (enumOverrides == null) {
+         enumOverrides = new EObjectContainmentEList<XOseeEnumOverride>(XOseeEnumOverride.class, this, OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES);
+      }
+      return enumOverrides;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XOseeArtifactTypeOverride> getArtifactTypeOverrides()
   {
-    if (artifactTypeOverrides == null)
-    {
-      artifactTypeOverrides = new EObjectContainmentEList<XOseeArtifactTypeOverride>(XOseeArtifactTypeOverride.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES);
-    }
-    return artifactTypeOverrides;
-  }
+      if (artifactTypeOverrides == null) {
+         artifactTypeOverrides = new EObjectContainmentEList<XOseeArtifactTypeOverride>(XOseeArtifactTypeOverride.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES);
+      }
+      return artifactTypeOverrides;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XArtifactMatcher> getArtifactMatchRefs()
   {
-    if (artifactMatchRefs == null)
-    {
-      artifactMatchRefs = new EObjectContainmentEList<XArtifactMatcher>(XArtifactMatcher.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS);
-    }
-    return artifactMatchRefs;
-  }
+      if (artifactMatchRefs == null) {
+         artifactMatchRefs = new EObjectContainmentEList<XArtifactMatcher>(XArtifactMatcher.class, this, OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS);
+      }
+      return artifactMatchRefs;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<AccessContext> getAccessDeclarations()
   {
-    if (accessDeclarations == null)
-    {
-      accessDeclarations = new EObjectContainmentEList<AccessContext>(AccessContext.class, this, OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS);
-    }
-    return accessDeclarations;
-  }
+      if (accessDeclarations == null) {
+         accessDeclarations = new EObjectContainmentEList<AccessContext>(AccessContext.class, this, OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS);
+      }
+      return accessDeclarations;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<Role> getRoleDeclarations()
   {
-    if (roleDeclarations == null)
-    {
-      roleDeclarations = new EObjectContainmentEList<Role>(Role.class, this, OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS);
-    }
-    return roleDeclarations;
-  }
+      if (roleDeclarations == null) {
+         roleDeclarations = new EObjectContainmentEList<Role>(Role.class, this, OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS);
+      }
+      return roleDeclarations;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_DSL__IMPORTS:
-        return ((InternalEList<?>)getImports()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
-        return ((InternalEList<?>)getArtifactTypes()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
-        return ((InternalEList<?>)getRelationTypes()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
-        return ((InternalEList<?>)getAttributeTypes()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
-        return ((InternalEList<?>)getEnumTypes()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
-        return ((InternalEList<?>)getEnumOverrides()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
-        return ((InternalEList<?>)getArtifactTypeOverrides()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
-        return ((InternalEList<?>)getArtifactMatchRefs()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
-        return ((InternalEList<?>)getAccessDeclarations()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
-        return ((InternalEList<?>)getRoleDeclarations()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_DSL__IMPORTS:
+            return ((InternalEList<?>)getImports()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
+            return ((InternalEList<?>)getArtifactTypes()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
+            return ((InternalEList<?>)getRelationTypes()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
+            return ((InternalEList<?>)getAttributeTypes()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
+            return ((InternalEList<?>)getEnumTypes()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
+            return ((InternalEList<?>)getEnumOverrides()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
+            return ((InternalEList<?>)getArtifactTypeOverrides()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
+            return ((InternalEList<?>)getArtifactMatchRefs()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
+            return ((InternalEList<?>)getAccessDeclarations()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
+            return ((InternalEList<?>)getRoleDeclarations()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_DSL__IMPORTS:
-        return getImports();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
-        return getArtifactTypes();
-      case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
-        return getRelationTypes();
-      case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
-        return getAttributeTypes();
-      case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
-        return getEnumTypes();
-      case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
-        return getEnumOverrides();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
-        return getArtifactTypeOverrides();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
-        return getArtifactMatchRefs();
-      case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
-        return getAccessDeclarations();
-      case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
-        return getRoleDeclarations();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_DSL__IMPORTS:
+            return getImports();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
+            return getArtifactTypes();
+         case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
+            return getRelationTypes();
+         case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
+            return getAttributeTypes();
+         case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
+            return getEnumTypes();
+         case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
+            return getEnumOverrides();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
+            return getArtifactTypeOverrides();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
+            return getArtifactMatchRefs();
+         case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
+            return getAccessDeclarations();
+         case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
+            return getRoleDeclarations();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_DSL__IMPORTS:
-        getImports().clear();
-        getImports().addAll((Collection<? extends Import>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
-        getArtifactTypes().clear();
-        getArtifactTypes().addAll((Collection<? extends XArtifactType>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
-        getRelationTypes().clear();
-        getRelationTypes().addAll((Collection<? extends XRelationType>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
-        getAttributeTypes().clear();
-        getAttributeTypes().addAll((Collection<? extends XAttributeType>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
-        getEnumTypes().clear();
-        getEnumTypes().addAll((Collection<? extends XOseeEnumType>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
-        getEnumOverrides().clear();
-        getEnumOverrides().addAll((Collection<? extends XOseeEnumOverride>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
-        getArtifactTypeOverrides().clear();
-        getArtifactTypeOverrides().addAll((Collection<? extends XOseeArtifactTypeOverride>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
-        getArtifactMatchRefs().clear();
-        getArtifactMatchRefs().addAll((Collection<? extends XArtifactMatcher>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
-        getAccessDeclarations().clear();
-        getAccessDeclarations().addAll((Collection<? extends AccessContext>)newValue);
-        return;
-      case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
-        getRoleDeclarations().clear();
-        getRoleDeclarations().addAll((Collection<? extends Role>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_DSL__IMPORTS:
+            getImports().clear();
+            getImports().addAll((Collection<? extends Import>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
+            getArtifactTypes().clear();
+            getArtifactTypes().addAll((Collection<? extends XArtifactType>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
+            getRelationTypes().clear();
+            getRelationTypes().addAll((Collection<? extends XRelationType>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
+            getAttributeTypes().clear();
+            getAttributeTypes().addAll((Collection<? extends XAttributeType>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
+            getEnumTypes().clear();
+            getEnumTypes().addAll((Collection<? extends XOseeEnumType>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
+            getEnumOverrides().clear();
+            getEnumOverrides().addAll((Collection<? extends XOseeEnumOverride>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
+            getArtifactTypeOverrides().clear();
+            getArtifactTypeOverrides().addAll((Collection<? extends XOseeArtifactTypeOverride>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
+            getArtifactMatchRefs().clear();
+            getArtifactMatchRefs().addAll((Collection<? extends XArtifactMatcher>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
+            getAccessDeclarations().clear();
+            getAccessDeclarations().addAll((Collection<? extends AccessContext>)newValue);
+            return;
+         case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
+            getRoleDeclarations().clear();
+            getRoleDeclarations().addAll((Collection<? extends Role>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_DSL__IMPORTS:
-        getImports().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
-        getArtifactTypes().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
-        getRelationTypes().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
-        getAttributeTypes().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
-        getEnumTypes().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
-        getEnumOverrides().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
-        getArtifactTypeOverrides().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
-        getArtifactMatchRefs().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
-        getAccessDeclarations().clear();
-        return;
-      case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
-        getRoleDeclarations().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_DSL__IMPORTS:
+            getImports().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
+            getArtifactTypes().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
+            getRelationTypes().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
+            getAttributeTypes().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
+            getEnumTypes().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
+            getEnumOverrides().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
+            getArtifactTypeOverrides().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
+            getArtifactMatchRefs().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
+            getAccessDeclarations().clear();
+            return;
+         case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
+            getRoleDeclarations().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_DSL__IMPORTS:
-        return imports != null && !imports.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
-        return artifactTypes != null && !artifactTypes.isEmpty();
-      case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
-        return relationTypes != null && !relationTypes.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
-        return attributeTypes != null && !attributeTypes.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
-        return enumTypes != null && !enumTypes.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
-        return enumOverrides != null && !enumOverrides.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
-        return artifactTypeOverrides != null && !artifactTypeOverrides.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
-        return artifactMatchRefs != null && !artifactMatchRefs.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
-        return accessDeclarations != null && !accessDeclarations.isEmpty();
-      case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
-        return roleDeclarations != null && !roleDeclarations.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_DSL__IMPORTS:
+            return imports != null && !imports.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPES:
+            return artifactTypes != null && !artifactTypes.isEmpty();
+         case OseeDslPackage.OSEE_DSL__RELATION_TYPES:
+            return relationTypes != null && !relationTypes.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ATTRIBUTE_TYPES:
+            return attributeTypes != null && !attributeTypes.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ENUM_TYPES:
+            return enumTypes != null && !enumTypes.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ENUM_OVERRIDES:
+            return enumOverrides != null && !enumOverrides.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_TYPE_OVERRIDES:
+            return artifactTypeOverrides != null && !artifactTypeOverrides.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ARTIFACT_MATCH_REFS:
+            return artifactMatchRefs != null && !artifactMatchRefs.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ACCESS_DECLARATIONS:
+            return accessDeclarations != null && !accessDeclarations.isEmpty();
+         case OseeDslPackage.OSEE_DSL__ROLE_DECLARATIONS:
+            return roleDeclarations != null && !roleDeclarations.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //OseeDslImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslPackageImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslPackageImpl.java
index 63319f2..19e7f42 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslPackageImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeDslPackageImpl.java
@@ -66,2181 +66,2181 @@
 public class OseeDslPackageImpl extends EPackageImpl implements OseeDslPackage
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass oseeDslEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass importEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass oseeElementEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass oseeTypeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xArtifactTypeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xAttributeTypeRefEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xAttributeTypeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xOseeEnumTypeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xOseeEnumEntryEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xOseeEnumOverrideEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass overrideOptionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass addEnumEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass removeEnumEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xOseeArtifactTypeOverrideEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass attributeOverrideOptionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass addAttributeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass removeAttributeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass updateAttributeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xRelationTypeEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass conditionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass simpleConditionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass compoundConditionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass xArtifactMatcherEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass roleEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass referencedContextEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass usersAndGroupsEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass accessContextEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass hierarchyRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass relationTypeArtifactTypePredicateEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass relationTypeArtifactPredicateEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass relationTypePredicateEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass objectRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass artifactMatchRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass artifactTypeRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass attributeTypeRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass legacyRelationTypeRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EClass relationTypeRestrictionEClass = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum relationMultiplicityEnumEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum compareOpEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum xLogicOperatorEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum matchFieldEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum accessPermissionEnumEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum relationTypeMatchEEnum = null;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   private EEnum xRelationSideEnumEEnum = 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 -->
+    * 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.osee.framework.core.dsl.oseeDsl.OseeDslPackage#eNS_URI
-   * @see #init()
-   * @generated
-   */
+    * @see org.eclipse.emf.ecore.EPackage.Registry
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDslPackage#eNS_URI
+    * @see #init()
+    * @generated
+    */
   private OseeDslPackageImpl()
   {
-    super(eNS_URI, OseeDslFactory.eINSTANCE);
-  }
+      super(eNS_URI, OseeDslFactory.eINSTANCE);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @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 OseeDslPackage#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 -->
+    * 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 OseeDslPackage#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
-   */
+    * @see #eNS_URI
+    * @see #createPackageContents()
+    * @see #initializePackageContents()
+    * @generated
+    */
   public static OseeDslPackage init()
   {
-    if (isInited) return (OseeDslPackage)EPackage.Registry.INSTANCE.getEPackage(OseeDslPackage.eNS_URI);
+      if (isInited) return (OseeDslPackage)EPackage.Registry.INSTANCE.getEPackage(OseeDslPackage.eNS_URI);
 
-    // Obtain or create and register package
-    OseeDslPackageImpl theOseeDslPackage = (OseeDslPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof OseeDslPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new OseeDslPackageImpl());
+      // Obtain or create and register package
+      OseeDslPackageImpl theOseeDslPackage = (OseeDslPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof OseeDslPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new OseeDslPackageImpl());
 
-    isInited = true;
+      isInited = true;
 
-    // Create package meta-data objects
-    theOseeDslPackage.createPackageContents();
+      // Create package meta-data objects
+      theOseeDslPackage.createPackageContents();
 
-    // Initialize created meta-data
-    theOseeDslPackage.initializePackageContents();
+      // Initialize created meta-data
+      theOseeDslPackage.initializePackageContents();
 
-    // Mark meta-data to indicate it can't be changed
-    theOseeDslPackage.freeze();
+      // Mark meta-data to indicate it can't be changed
+      theOseeDslPackage.freeze();
 
   
-    // Update the registry and return the package
-    EPackage.Registry.INSTANCE.put(OseeDslPackage.eNS_URI, theOseeDslPackage);
-    return theOseeDslPackage;
-  }
+      // Update the registry and return the package
+      EPackage.Registry.INSTANCE.put(OseeDslPackage.eNS_URI, theOseeDslPackage);
+      return theOseeDslPackage;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getOseeDsl()
   {
-    return oseeDslEClass;
-  }
+      return oseeDslEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_Imports()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_ArtifactTypes()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_RelationTypes()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(2);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_AttributeTypes()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_EnumTypes()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(4);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(4);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_EnumOverrides()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(5);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(5);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_ArtifactTypeOverrides()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(6);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(6);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_ArtifactMatchRefs()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(7);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(7);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_AccessDeclarations()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(8);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(8);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getOseeDsl_RoleDeclarations()
   {
-    return (EReference)oseeDslEClass.getEStructuralFeatures().get(9);
-  }
+      return (EReference)oseeDslEClass.getEStructuralFeatures().get(9);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getImport()
   {
-    return importEClass;
-  }
+      return importEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getImport_ImportURI()
   {
-    return (EAttribute)importEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)importEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getOseeElement()
   {
-    return oseeElementEClass;
-  }
+      return oseeElementEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getOseeType()
   {
-    return oseeTypeEClass;
-  }
+      return oseeTypeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getOseeType_Name()
   {
-    return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getOseeType_TypeGuid()
   {
-    return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getOseeType_Uuid()
   {
-    return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)oseeTypeEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXArtifactType()
   {
-    return xArtifactTypeEClass;
-  }
+      return xArtifactTypeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXArtifactType_Abstract()
   {
-    return (EAttribute)xArtifactTypeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)xArtifactTypeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXArtifactType_SuperArtifactTypes()
   {
-    return (EReference)xArtifactTypeEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)xArtifactTypeEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXArtifactType_ValidAttributeTypes()
   {
-    return (EReference)xArtifactTypeEClass.getEStructuralFeatures().get(2);
-  }
+      return (EReference)xArtifactTypeEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXAttributeTypeRef()
   {
-    return xAttributeTypeRefEClass;
-  }
+      return xAttributeTypeRefEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXAttributeTypeRef_ValidAttributeType()
   {
-    return (EReference)xAttributeTypeRefEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)xAttributeTypeRefEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeTypeRef_BranchGuid()
   {
-    return (EAttribute)xAttributeTypeRefEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)xAttributeTypeRefEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXAttributeType()
   {
-    return xAttributeTypeEClass;
-  }
+      return xAttributeTypeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_BaseAttributeType()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXAttributeType_Override()
   {
-    return (EReference)xAttributeTypeEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)xAttributeTypeEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_DataProvider()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_Min()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(3);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_Max()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(4);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(4);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_TaggerId()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(5);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(5);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXAttributeType_EnumType()
   {
-    return (EReference)xAttributeTypeEClass.getEStructuralFeatures().get(6);
-  }
+      return (EReference)xAttributeTypeEClass.getEStructuralFeatures().get(6);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_Description()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(7);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(7);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_DefaultValue()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(8);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(8);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_FileExtension()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(9);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(9);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXAttributeType_MediaType()
   {
-    return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(10);
-  }
+      return (EAttribute)xAttributeTypeEClass.getEStructuralFeatures().get(10);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXOseeEnumType()
   {
-    return xOseeEnumTypeEClass;
-  }
+      return xOseeEnumTypeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXOseeEnumType_EnumEntries()
   {
-    return (EReference)xOseeEnumTypeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)xOseeEnumTypeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXOseeEnumEntry()
   {
-    return xOseeEnumEntryEClass;
-  }
+      return xOseeEnumEntryEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeEnumEntry_Name()
   {
-    return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeEnumEntry_Ordinal()
   {
-    return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeEnumEntry_EntryGuid()
   {
-    return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeEnumEntry_Description()
   {
-    return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(3);
-  }
+      return (EAttribute)xOseeEnumEntryEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXOseeEnumOverride()
   {
-    return xOseeEnumOverrideEClass;
-  }
+      return xOseeEnumOverrideEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXOseeEnumOverride_OverridenEnumType()
   {
-    return (EReference)xOseeEnumOverrideEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)xOseeEnumOverrideEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeEnumOverride_InheritAll()
   {
-    return (EAttribute)xOseeEnumOverrideEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)xOseeEnumOverrideEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXOseeEnumOverride_OverrideOptions()
   {
-    return (EReference)xOseeEnumOverrideEClass.getEStructuralFeatures().get(2);
-  }
+      return (EReference)xOseeEnumOverrideEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getOverrideOption()
   {
-    return overrideOptionEClass;
-  }
+      return overrideOptionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getAddEnum()
   {
-    return addEnumEClass;
-  }
+      return addEnumEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAddEnum_EnumEntry()
   {
-    return (EAttribute)addEnumEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)addEnumEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAddEnum_Ordinal()
   {
-    return (EAttribute)addEnumEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)addEnumEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAddEnum_EntryGuid()
   {
-    return (EAttribute)addEnumEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)addEnumEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAddEnum_Description()
   {
-    return (EAttribute)addEnumEClass.getEStructuralFeatures().get(3);
-  }
+      return (EAttribute)addEnumEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRemoveEnum()
   {
-    return removeEnumEClass;
-  }
+      return removeEnumEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRemoveEnum_EnumEntry()
   {
-    return (EReference)removeEnumEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)removeEnumEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXOseeArtifactTypeOverride()
   {
-    return xOseeArtifactTypeOverrideEClass;
-  }
+      return xOseeArtifactTypeOverrideEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXOseeArtifactTypeOverride_OverridenArtifactType()
   {
-    return (EReference)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXOseeArtifactTypeOverride_InheritAll()
   {
-    return (EAttribute)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXOseeArtifactTypeOverride_OverrideOptions()
   {
-    return (EReference)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(2);
-  }
+      return (EReference)xOseeArtifactTypeOverrideEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getAttributeOverrideOption()
   {
-    return attributeOverrideOptionEClass;
-  }
+      return attributeOverrideOptionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getAddAttribute()
   {
-    return addAttributeEClass;
-  }
+      return addAttributeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAddAttribute_Attribute()
   {
-    return (EReference)addAttributeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)addAttributeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRemoveAttribute()
   {
-    return removeAttributeEClass;
-  }
+      return removeAttributeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRemoveAttribute_Attribute()
   {
-    return (EReference)removeAttributeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)removeAttributeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getUpdateAttribute()
   {
-    return updateAttributeEClass;
-  }
+      return updateAttributeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getUpdateAttribute_Attribute()
   {
-    return (EReference)updateAttributeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)updateAttributeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXRelationType()
   {
-    return xRelationTypeEClass;
-  }
+      return xRelationTypeEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXRelationType_SideAName()
   {
-    return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXRelationType_SideAArtifactType()
   {
-    return (EReference)xRelationTypeEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)xRelationTypeEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXRelationType_SideBName()
   {
-    return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXRelationType_SideBArtifactType()
   {
-    return (EReference)xRelationTypeEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)xRelationTypeEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXRelationType_DefaultOrderType()
   {
-    return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(4);
-  }
+      return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(4);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXRelationType_Multiplicity()
   {
-    return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(5);
-  }
+      return (EAttribute)xRelationTypeEClass.getEStructuralFeatures().get(5);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getCondition()
   {
-    return conditionEClass;
-  }
+      return conditionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getSimpleCondition()
   {
-    return simpleConditionEClass;
-  }
+      return simpleConditionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getSimpleCondition_Field()
   {
-    return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getSimpleCondition_Op()
   {
-    return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getSimpleCondition_Expression()
   {
-    return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)simpleConditionEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getCompoundCondition()
   {
-    return compoundConditionEClass;
-  }
+      return compoundConditionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getCompoundCondition_Conditions()
   {
-    return (EReference)compoundConditionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)compoundConditionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getCompoundCondition_Operators()
   {
-    return (EAttribute)compoundConditionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EAttribute)compoundConditionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getXArtifactMatcher()
   {
-    return xArtifactMatcherEClass;
-  }
+      return xArtifactMatcherEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXArtifactMatcher_Name()
   {
-    return (EAttribute)xArtifactMatcherEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)xArtifactMatcherEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getXArtifactMatcher_Conditions()
   {
-    return (EReference)xArtifactMatcherEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)xArtifactMatcherEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getXArtifactMatcher_Operators()
   {
-    return (EAttribute)xArtifactMatcherEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)xArtifactMatcherEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRole()
   {
-    return roleEClass;
-  }
+      return roleEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getRole_Name()
   {
-    return (EAttribute)roleEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)roleEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRole_SuperRoles()
   {
-    return (EReference)roleEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)roleEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRole_UsersAndGroups()
   {
-    return (EReference)roleEClass.getEStructuralFeatures().get(2);
-  }
+      return (EReference)roleEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRole_ReferencedContexts()
   {
-    return (EReference)roleEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)roleEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getReferencedContext()
   {
-    return referencedContextEClass;
-  }
+      return referencedContextEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getReferencedContext_AccessContextRef()
   {
-    return (EAttribute)referencedContextEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)referencedContextEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getUsersAndGroups()
   {
-    return usersAndGroupsEClass;
-  }
+      return usersAndGroupsEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getUsersAndGroups_UserOrGroupGuid()
   {
-    return (EAttribute)usersAndGroupsEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)usersAndGroupsEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getAccessContext()
   {
-    return accessContextEClass;
-  }
+      return accessContextEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAccessContext_Name()
   {
-    return (EAttribute)accessContextEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)accessContextEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAccessContext_SuperAccessContexts()
   {
-    return (EReference)accessContextEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)accessContextEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getAccessContext_Guid()
   {
-    return (EAttribute)accessContextEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)accessContextEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAccessContext_AccessRules()
   {
-    return (EReference)accessContextEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)accessContextEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAccessContext_HierarchyRestrictions()
   {
-    return (EReference)accessContextEClass.getEStructuralFeatures().get(4);
-  }
+      return (EReference)accessContextEClass.getEStructuralFeatures().get(4);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getHierarchyRestriction()
   {
-    return hierarchyRestrictionEClass;
-  }
+      return hierarchyRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getHierarchyRestriction_ArtifactMatcherRef()
   {
-    return (EReference)hierarchyRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)hierarchyRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getHierarchyRestriction_AccessRules()
   {
-    return (EReference)hierarchyRestrictionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)hierarchyRestrictionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRelationTypeArtifactTypePredicate()
   {
-    return relationTypeArtifactTypePredicateEClass;
-  }
+      return relationTypeArtifactTypePredicateEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRelationTypeArtifactTypePredicate_ArtifactTypeRef()
   {
-    return (EReference)relationTypeArtifactTypePredicateEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)relationTypeArtifactTypePredicateEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRelationTypeArtifactPredicate()
   {
-    return relationTypeArtifactPredicateEClass;
-  }
+      return relationTypeArtifactPredicateEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRelationTypeArtifactPredicate_ArtifactMatcherRef()
   {
-    return (EReference)relationTypeArtifactPredicateEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)relationTypeArtifactPredicateEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRelationTypePredicate()
   {
-    return relationTypePredicateEClass;
-  }
+      return relationTypePredicateEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getObjectRestriction()
   {
-    return objectRestrictionEClass;
-  }
+      return objectRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getObjectRestriction_Permission()
   {
-    return (EAttribute)objectRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)objectRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getArtifactMatchRestriction()
   {
-    return artifactMatchRestrictionEClass;
-  }
+      return artifactMatchRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getArtifactMatchRestriction_ArtifactMatcherRef()
   {
-    return (EReference)artifactMatchRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)artifactMatchRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getArtifactTypeRestriction()
   {
-    return artifactTypeRestrictionEClass;
-  }
+      return artifactTypeRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getArtifactTypeRestriction_ArtifactTypeRef()
   {
-    return (EReference)artifactTypeRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)artifactTypeRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getAttributeTypeRestriction()
   {
-    return attributeTypeRestrictionEClass;
-  }
+      return attributeTypeRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAttributeTypeRestriction_AttributeTypeRef()
   {
-    return (EReference)attributeTypeRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EReference)attributeTypeRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getAttributeTypeRestriction_ArtifactTypeRef()
   {
-    return (EReference)attributeTypeRestrictionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)attributeTypeRestrictionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getLegacyRelationTypeRestriction()
   {
-    return legacyRelationTypeRestrictionEClass;
-  }
+      return legacyRelationTypeRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getLegacyRelationTypeRestriction_Permission()
   {
-    return (EAttribute)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getLegacyRelationTypeRestriction_RelationTypeRef()
   {
-    return (EReference)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getLegacyRelationTypeRestriction_RestrictedToSide()
   {
-    return (EAttribute)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getLegacyRelationTypeRestriction_ArtifactMatcherRef()
   {
-    return (EReference)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)legacyRelationTypeRestrictionEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EClass getRelationTypeRestriction()
   {
-    return relationTypeRestrictionEClass;
-  }
+      return relationTypeRestrictionEClass;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getRelationTypeRestriction_RelationTypeMatch()
   {
-    return (EAttribute)relationTypeRestrictionEClass.getEStructuralFeatures().get(0);
-  }
+      return (EAttribute)relationTypeRestrictionEClass.getEStructuralFeatures().get(0);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRelationTypeRestriction_RelationTypeRef()
   {
-    return (EReference)relationTypeRestrictionEClass.getEStructuralFeatures().get(1);
-  }
+      return (EReference)relationTypeRestrictionEClass.getEStructuralFeatures().get(1);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EAttribute getRelationTypeRestriction_RestrictedToSide()
   {
-    return (EAttribute)relationTypeRestrictionEClass.getEStructuralFeatures().get(2);
-  }
+      return (EAttribute)relationTypeRestrictionEClass.getEStructuralFeatures().get(2);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EReference getRelationTypeRestriction_Predicate()
   {
-    return (EReference)relationTypeRestrictionEClass.getEStructuralFeatures().get(3);
-  }
+      return (EReference)relationTypeRestrictionEClass.getEStructuralFeatures().get(3);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getRelationMultiplicityEnum()
   {
-    return relationMultiplicityEnumEEnum;
-  }
+      return relationMultiplicityEnumEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getCompareOp()
   {
-    return compareOpEEnum;
-  }
+      return compareOpEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getXLogicOperator()
   {
-    return xLogicOperatorEEnum;
-  }
+      return xLogicOperatorEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getMatchField()
   {
-    return matchFieldEEnum;
-  }
+      return matchFieldEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getAccessPermissionEnum()
   {
-    return accessPermissionEnumEEnum;
-  }
+      return accessPermissionEnumEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getRelationTypeMatch()
   {
-    return relationTypeMatchEEnum;
-  }
+      return relationTypeMatchEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EEnum getXRelationSideEnum()
   {
-    return xRelationSideEnumEEnum;
-  }
+      return xRelationSideEnumEEnum;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDslFactory getOseeDslFactory()
   {
-    return (OseeDslFactory)getEFactoryInstance();
-  }
+      return (OseeDslFactory)getEFactoryInstance();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @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 -->
+    * 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
-   */
+    * @generated
+    */
   public void createPackageContents()
   {
-    if (isCreated) return;
-    isCreated = true;
+      if (isCreated) return;
+      isCreated = true;
 
-    // Create classes and their features
-    oseeDslEClass = createEClass(OSEE_DSL);
-    createEReference(oseeDslEClass, OSEE_DSL__IMPORTS);
-    createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_TYPES);
-    createEReference(oseeDslEClass, OSEE_DSL__RELATION_TYPES);
-    createEReference(oseeDslEClass, OSEE_DSL__ATTRIBUTE_TYPES);
-    createEReference(oseeDslEClass, OSEE_DSL__ENUM_TYPES);
-    createEReference(oseeDslEClass, OSEE_DSL__ENUM_OVERRIDES);
-    createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_TYPE_OVERRIDES);
-    createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_MATCH_REFS);
-    createEReference(oseeDslEClass, OSEE_DSL__ACCESS_DECLARATIONS);
-    createEReference(oseeDslEClass, OSEE_DSL__ROLE_DECLARATIONS);
+      // Create classes and their features
+      oseeDslEClass = createEClass(OSEE_DSL);
+      createEReference(oseeDslEClass, OSEE_DSL__IMPORTS);
+      createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_TYPES);
+      createEReference(oseeDslEClass, OSEE_DSL__RELATION_TYPES);
+      createEReference(oseeDslEClass, OSEE_DSL__ATTRIBUTE_TYPES);
+      createEReference(oseeDslEClass, OSEE_DSL__ENUM_TYPES);
+      createEReference(oseeDslEClass, OSEE_DSL__ENUM_OVERRIDES);
+      createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_TYPE_OVERRIDES);
+      createEReference(oseeDslEClass, OSEE_DSL__ARTIFACT_MATCH_REFS);
+      createEReference(oseeDslEClass, OSEE_DSL__ACCESS_DECLARATIONS);
+      createEReference(oseeDslEClass, OSEE_DSL__ROLE_DECLARATIONS);
 
-    importEClass = createEClass(IMPORT);
-    createEAttribute(importEClass, IMPORT__IMPORT_URI);
+      importEClass = createEClass(IMPORT);
+      createEAttribute(importEClass, IMPORT__IMPORT_URI);
 
-    oseeElementEClass = createEClass(OSEE_ELEMENT);
+      oseeElementEClass = createEClass(OSEE_ELEMENT);
 
-    oseeTypeEClass = createEClass(OSEE_TYPE);
-    createEAttribute(oseeTypeEClass, OSEE_TYPE__NAME);
-    createEAttribute(oseeTypeEClass, OSEE_TYPE__TYPE_GUID);
-    createEAttribute(oseeTypeEClass, OSEE_TYPE__UUID);
+      oseeTypeEClass = createEClass(OSEE_TYPE);
+      createEAttribute(oseeTypeEClass, OSEE_TYPE__NAME);
+      createEAttribute(oseeTypeEClass, OSEE_TYPE__TYPE_GUID);
+      createEAttribute(oseeTypeEClass, OSEE_TYPE__UUID);
 
-    xArtifactTypeEClass = createEClass(XARTIFACT_TYPE);
-    createEAttribute(xArtifactTypeEClass, XARTIFACT_TYPE__ABSTRACT);
-    createEReference(xArtifactTypeEClass, XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES);
-    createEReference(xArtifactTypeEClass, XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES);
+      xArtifactTypeEClass = createEClass(XARTIFACT_TYPE);
+      createEAttribute(xArtifactTypeEClass, XARTIFACT_TYPE__ABSTRACT);
+      createEReference(xArtifactTypeEClass, XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES);
+      createEReference(xArtifactTypeEClass, XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES);
 
-    xAttributeTypeRefEClass = createEClass(XATTRIBUTE_TYPE_REF);
-    createEReference(xAttributeTypeRefEClass, XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE);
-    createEAttribute(xAttributeTypeRefEClass, XATTRIBUTE_TYPE_REF__BRANCH_GUID);
+      xAttributeTypeRefEClass = createEClass(XATTRIBUTE_TYPE_REF);
+      createEReference(xAttributeTypeRefEClass, XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE);
+      createEAttribute(xAttributeTypeRefEClass, XATTRIBUTE_TYPE_REF__BRANCH_GUID);
 
-    xAttributeTypeEClass = createEClass(XATTRIBUTE_TYPE);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE);
-    createEReference(xAttributeTypeEClass, XATTRIBUTE_TYPE__OVERRIDE);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DATA_PROVIDER);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MIN);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MAX);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__TAGGER_ID);
-    createEReference(xAttributeTypeEClass, XATTRIBUTE_TYPE__ENUM_TYPE);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DESCRIPTION);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DEFAULT_VALUE);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__FILE_EXTENSION);
-    createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MEDIA_TYPE);
+      xAttributeTypeEClass = createEClass(XATTRIBUTE_TYPE);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE);
+      createEReference(xAttributeTypeEClass, XATTRIBUTE_TYPE__OVERRIDE);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DATA_PROVIDER);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MIN);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MAX);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__TAGGER_ID);
+      createEReference(xAttributeTypeEClass, XATTRIBUTE_TYPE__ENUM_TYPE);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DESCRIPTION);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__DEFAULT_VALUE);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__FILE_EXTENSION);
+      createEAttribute(xAttributeTypeEClass, XATTRIBUTE_TYPE__MEDIA_TYPE);
 
-    xOseeEnumTypeEClass = createEClass(XOSEE_ENUM_TYPE);
-    createEReference(xOseeEnumTypeEClass, XOSEE_ENUM_TYPE__ENUM_ENTRIES);
+      xOseeEnumTypeEClass = createEClass(XOSEE_ENUM_TYPE);
+      createEReference(xOseeEnumTypeEClass, XOSEE_ENUM_TYPE__ENUM_ENTRIES);
 
-    xOseeEnumEntryEClass = createEClass(XOSEE_ENUM_ENTRY);
-    createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__NAME);
-    createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__ORDINAL);
-    createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__ENTRY_GUID);
-    createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__DESCRIPTION);
+      xOseeEnumEntryEClass = createEClass(XOSEE_ENUM_ENTRY);
+      createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__NAME);
+      createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__ORDINAL);
+      createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__ENTRY_GUID);
+      createEAttribute(xOseeEnumEntryEClass, XOSEE_ENUM_ENTRY__DESCRIPTION);
 
-    xOseeEnumOverrideEClass = createEClass(XOSEE_ENUM_OVERRIDE);
-    createEReference(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE);
-    createEAttribute(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__INHERIT_ALL);
-    createEReference(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS);
+      xOseeEnumOverrideEClass = createEClass(XOSEE_ENUM_OVERRIDE);
+      createEReference(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE);
+      createEAttribute(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__INHERIT_ALL);
+      createEReference(xOseeEnumOverrideEClass, XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS);
 
-    overrideOptionEClass = createEClass(OVERRIDE_OPTION);
+      overrideOptionEClass = createEClass(OVERRIDE_OPTION);
 
-    addEnumEClass = createEClass(ADD_ENUM);
-    createEAttribute(addEnumEClass, ADD_ENUM__ENUM_ENTRY);
-    createEAttribute(addEnumEClass, ADD_ENUM__ORDINAL);
-    createEAttribute(addEnumEClass, ADD_ENUM__ENTRY_GUID);
-    createEAttribute(addEnumEClass, ADD_ENUM__DESCRIPTION);
+      addEnumEClass = createEClass(ADD_ENUM);
+      createEAttribute(addEnumEClass, ADD_ENUM__ENUM_ENTRY);
+      createEAttribute(addEnumEClass, ADD_ENUM__ORDINAL);
+      createEAttribute(addEnumEClass, ADD_ENUM__ENTRY_GUID);
+      createEAttribute(addEnumEClass, ADD_ENUM__DESCRIPTION);
 
-    removeEnumEClass = createEClass(REMOVE_ENUM);
-    createEReference(removeEnumEClass, REMOVE_ENUM__ENUM_ENTRY);
+      removeEnumEClass = createEClass(REMOVE_ENUM);
+      createEReference(removeEnumEClass, REMOVE_ENUM__ENUM_ENTRY);
 
-    xOseeArtifactTypeOverrideEClass = createEClass(XOSEE_ARTIFACT_TYPE_OVERRIDE);
-    createEReference(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE);
-    createEAttribute(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL);
-    createEReference(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS);
+      xOseeArtifactTypeOverrideEClass = createEClass(XOSEE_ARTIFACT_TYPE_OVERRIDE);
+      createEReference(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE);
+      createEAttribute(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL);
+      createEReference(xOseeArtifactTypeOverrideEClass, XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS);
 
-    attributeOverrideOptionEClass = createEClass(ATTRIBUTE_OVERRIDE_OPTION);
+      attributeOverrideOptionEClass = createEClass(ATTRIBUTE_OVERRIDE_OPTION);
 
-    addAttributeEClass = createEClass(ADD_ATTRIBUTE);
-    createEReference(addAttributeEClass, ADD_ATTRIBUTE__ATTRIBUTE);
+      addAttributeEClass = createEClass(ADD_ATTRIBUTE);
+      createEReference(addAttributeEClass, ADD_ATTRIBUTE__ATTRIBUTE);
 
-    removeAttributeEClass = createEClass(REMOVE_ATTRIBUTE);
-    createEReference(removeAttributeEClass, REMOVE_ATTRIBUTE__ATTRIBUTE);
+      removeAttributeEClass = createEClass(REMOVE_ATTRIBUTE);
+      createEReference(removeAttributeEClass, REMOVE_ATTRIBUTE__ATTRIBUTE);
 
-    updateAttributeEClass = createEClass(UPDATE_ATTRIBUTE);
-    createEReference(updateAttributeEClass, UPDATE_ATTRIBUTE__ATTRIBUTE);
+      updateAttributeEClass = createEClass(UPDATE_ATTRIBUTE);
+      createEReference(updateAttributeEClass, UPDATE_ATTRIBUTE__ATTRIBUTE);
 
-    xRelationTypeEClass = createEClass(XRELATION_TYPE);
-    createEAttribute(xRelationTypeEClass, XRELATION_TYPE__SIDE_ANAME);
-    createEReference(xRelationTypeEClass, XRELATION_TYPE__SIDE_AARTIFACT_TYPE);
-    createEAttribute(xRelationTypeEClass, XRELATION_TYPE__SIDE_BNAME);
-    createEReference(xRelationTypeEClass, XRELATION_TYPE__SIDE_BARTIFACT_TYPE);
-    createEAttribute(xRelationTypeEClass, XRELATION_TYPE__DEFAULT_ORDER_TYPE);
-    createEAttribute(xRelationTypeEClass, XRELATION_TYPE__MULTIPLICITY);
+      xRelationTypeEClass = createEClass(XRELATION_TYPE);
+      createEAttribute(xRelationTypeEClass, XRELATION_TYPE__SIDE_ANAME);
+      createEReference(xRelationTypeEClass, XRELATION_TYPE__SIDE_AARTIFACT_TYPE);
+      createEAttribute(xRelationTypeEClass, XRELATION_TYPE__SIDE_BNAME);
+      createEReference(xRelationTypeEClass, XRELATION_TYPE__SIDE_BARTIFACT_TYPE);
+      createEAttribute(xRelationTypeEClass, XRELATION_TYPE__DEFAULT_ORDER_TYPE);
+      createEAttribute(xRelationTypeEClass, XRELATION_TYPE__MULTIPLICITY);
 
-    conditionEClass = createEClass(CONDITION);
+      conditionEClass = createEClass(CONDITION);
 
-    simpleConditionEClass = createEClass(SIMPLE_CONDITION);
-    createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__FIELD);
-    createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__OP);
-    createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__EXPRESSION);
+      simpleConditionEClass = createEClass(SIMPLE_CONDITION);
+      createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__FIELD);
+      createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__OP);
+      createEAttribute(simpleConditionEClass, SIMPLE_CONDITION__EXPRESSION);
 
-    compoundConditionEClass = createEClass(COMPOUND_CONDITION);
-    createEReference(compoundConditionEClass, COMPOUND_CONDITION__CONDITIONS);
-    createEAttribute(compoundConditionEClass, COMPOUND_CONDITION__OPERATORS);
+      compoundConditionEClass = createEClass(COMPOUND_CONDITION);
+      createEReference(compoundConditionEClass, COMPOUND_CONDITION__CONDITIONS);
+      createEAttribute(compoundConditionEClass, COMPOUND_CONDITION__OPERATORS);
 
-    xArtifactMatcherEClass = createEClass(XARTIFACT_MATCHER);
-    createEAttribute(xArtifactMatcherEClass, XARTIFACT_MATCHER__NAME);
-    createEReference(xArtifactMatcherEClass, XARTIFACT_MATCHER__CONDITIONS);
-    createEAttribute(xArtifactMatcherEClass, XARTIFACT_MATCHER__OPERATORS);
+      xArtifactMatcherEClass = createEClass(XARTIFACT_MATCHER);
+      createEAttribute(xArtifactMatcherEClass, XARTIFACT_MATCHER__NAME);
+      createEReference(xArtifactMatcherEClass, XARTIFACT_MATCHER__CONDITIONS);
+      createEAttribute(xArtifactMatcherEClass, XARTIFACT_MATCHER__OPERATORS);
 
-    roleEClass = createEClass(ROLE);
-    createEAttribute(roleEClass, ROLE__NAME);
-    createEReference(roleEClass, ROLE__SUPER_ROLES);
-    createEReference(roleEClass, ROLE__USERS_AND_GROUPS);
-    createEReference(roleEClass, ROLE__REFERENCED_CONTEXTS);
+      roleEClass = createEClass(ROLE);
+      createEAttribute(roleEClass, ROLE__NAME);
+      createEReference(roleEClass, ROLE__SUPER_ROLES);
+      createEReference(roleEClass, ROLE__USERS_AND_GROUPS);
+      createEReference(roleEClass, ROLE__REFERENCED_CONTEXTS);
 
-    referencedContextEClass = createEClass(REFERENCED_CONTEXT);
-    createEAttribute(referencedContextEClass, REFERENCED_CONTEXT__ACCESS_CONTEXT_REF);
+      referencedContextEClass = createEClass(REFERENCED_CONTEXT);
+      createEAttribute(referencedContextEClass, REFERENCED_CONTEXT__ACCESS_CONTEXT_REF);
 
-    usersAndGroupsEClass = createEClass(USERS_AND_GROUPS);
-    createEAttribute(usersAndGroupsEClass, USERS_AND_GROUPS__USER_OR_GROUP_GUID);
+      usersAndGroupsEClass = createEClass(USERS_AND_GROUPS);
+      createEAttribute(usersAndGroupsEClass, USERS_AND_GROUPS__USER_OR_GROUP_GUID);
 
-    accessContextEClass = createEClass(ACCESS_CONTEXT);
-    createEAttribute(accessContextEClass, ACCESS_CONTEXT__NAME);
-    createEReference(accessContextEClass, ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS);
-    createEAttribute(accessContextEClass, ACCESS_CONTEXT__GUID);
-    createEReference(accessContextEClass, ACCESS_CONTEXT__ACCESS_RULES);
-    createEReference(accessContextEClass, ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS);
+      accessContextEClass = createEClass(ACCESS_CONTEXT);
+      createEAttribute(accessContextEClass, ACCESS_CONTEXT__NAME);
+      createEReference(accessContextEClass, ACCESS_CONTEXT__SUPER_ACCESS_CONTEXTS);
+      createEAttribute(accessContextEClass, ACCESS_CONTEXT__GUID);
+      createEReference(accessContextEClass, ACCESS_CONTEXT__ACCESS_RULES);
+      createEReference(accessContextEClass, ACCESS_CONTEXT__HIERARCHY_RESTRICTIONS);
 
-    hierarchyRestrictionEClass = createEClass(HIERARCHY_RESTRICTION);
-    createEReference(hierarchyRestrictionEClass, HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF);
-    createEReference(hierarchyRestrictionEClass, HIERARCHY_RESTRICTION__ACCESS_RULES);
+      hierarchyRestrictionEClass = createEClass(HIERARCHY_RESTRICTION);
+      createEReference(hierarchyRestrictionEClass, HIERARCHY_RESTRICTION__ARTIFACT_MATCHER_REF);
+      createEReference(hierarchyRestrictionEClass, HIERARCHY_RESTRICTION__ACCESS_RULES);
 
-    relationTypeArtifactTypePredicateEClass = createEClass(RELATION_TYPE_ARTIFACT_TYPE_PREDICATE);
-    createEReference(relationTypeArtifactTypePredicateEClass, RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF);
+      relationTypeArtifactTypePredicateEClass = createEClass(RELATION_TYPE_ARTIFACT_TYPE_PREDICATE);
+      createEReference(relationTypeArtifactTypePredicateEClass, RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF);
 
-    relationTypeArtifactPredicateEClass = createEClass(RELATION_TYPE_ARTIFACT_PREDICATE);
-    createEReference(relationTypeArtifactPredicateEClass, RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF);
+      relationTypeArtifactPredicateEClass = createEClass(RELATION_TYPE_ARTIFACT_PREDICATE);
+      createEReference(relationTypeArtifactPredicateEClass, RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF);
 
-    relationTypePredicateEClass = createEClass(RELATION_TYPE_PREDICATE);
+      relationTypePredicateEClass = createEClass(RELATION_TYPE_PREDICATE);
 
-    objectRestrictionEClass = createEClass(OBJECT_RESTRICTION);
-    createEAttribute(objectRestrictionEClass, OBJECT_RESTRICTION__PERMISSION);
+      objectRestrictionEClass = createEClass(OBJECT_RESTRICTION);
+      createEAttribute(objectRestrictionEClass, OBJECT_RESTRICTION__PERMISSION);
 
-    artifactMatchRestrictionEClass = createEClass(ARTIFACT_MATCH_RESTRICTION);
-    createEReference(artifactMatchRestrictionEClass, ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF);
+      artifactMatchRestrictionEClass = createEClass(ARTIFACT_MATCH_RESTRICTION);
+      createEReference(artifactMatchRestrictionEClass, ARTIFACT_MATCH_RESTRICTION__ARTIFACT_MATCHER_REF);
 
-    artifactTypeRestrictionEClass = createEClass(ARTIFACT_TYPE_RESTRICTION);
-    createEReference(artifactTypeRestrictionEClass, ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF);
+      artifactTypeRestrictionEClass = createEClass(ARTIFACT_TYPE_RESTRICTION);
+      createEReference(artifactTypeRestrictionEClass, ARTIFACT_TYPE_RESTRICTION__ARTIFACT_TYPE_REF);
 
-    attributeTypeRestrictionEClass = createEClass(ATTRIBUTE_TYPE_RESTRICTION);
-    createEReference(attributeTypeRestrictionEClass, ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF);
-    createEReference(attributeTypeRestrictionEClass, ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF);
+      attributeTypeRestrictionEClass = createEClass(ATTRIBUTE_TYPE_RESTRICTION);
+      createEReference(attributeTypeRestrictionEClass, ATTRIBUTE_TYPE_RESTRICTION__ATTRIBUTE_TYPE_REF);
+      createEReference(attributeTypeRestrictionEClass, ATTRIBUTE_TYPE_RESTRICTION__ARTIFACT_TYPE_REF);
 
-    legacyRelationTypeRestrictionEClass = createEClass(LEGACY_RELATION_TYPE_RESTRICTION);
-    createEAttribute(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION);
-    createEReference(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF);
-    createEAttribute(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE);
-    createEReference(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF);
+      legacyRelationTypeRestrictionEClass = createEClass(LEGACY_RELATION_TYPE_RESTRICTION);
+      createEAttribute(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__PERMISSION);
+      createEReference(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF);
+      createEAttribute(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE);
+      createEReference(legacyRelationTypeRestrictionEClass, LEGACY_RELATION_TYPE_RESTRICTION__ARTIFACT_MATCHER_REF);
 
-    relationTypeRestrictionEClass = createEClass(RELATION_TYPE_RESTRICTION);
-    createEAttribute(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH);
-    createEReference(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF);
-    createEAttribute(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE);
-    createEReference(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__PREDICATE);
+      relationTypeRestrictionEClass = createEClass(RELATION_TYPE_RESTRICTION);
+      createEAttribute(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH);
+      createEReference(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF);
+      createEAttribute(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE);
+      createEReference(relationTypeRestrictionEClass, RELATION_TYPE_RESTRICTION__PREDICATE);
 
-    // Create enums
-    relationMultiplicityEnumEEnum = createEEnum(RELATION_MULTIPLICITY_ENUM);
-    compareOpEEnum = createEEnum(COMPARE_OP);
-    xLogicOperatorEEnum = createEEnum(XLOGIC_OPERATOR);
-    matchFieldEEnum = createEEnum(MATCH_FIELD);
-    accessPermissionEnumEEnum = createEEnum(ACCESS_PERMISSION_ENUM);
-    relationTypeMatchEEnum = createEEnum(RELATION_TYPE_MATCH);
-    xRelationSideEnumEEnum = createEEnum(XRELATION_SIDE_ENUM);
-  }
+      // Create enums
+      relationMultiplicityEnumEEnum = createEEnum(RELATION_MULTIPLICITY_ENUM);
+      compareOpEEnum = createEEnum(COMPARE_OP);
+      xLogicOperatorEEnum = createEEnum(XLOGIC_OPERATOR);
+      matchFieldEEnum = createEEnum(MATCH_FIELD);
+      accessPermissionEnumEEnum = createEEnum(ACCESS_PERMISSION_ENUM);
+      relationTypeMatchEEnum = createEEnum(RELATION_TYPE_MATCH);
+      xRelationSideEnumEEnum = createEEnum(XRELATION_SIDE_ENUM);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @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 -->
+    * 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
-   */
+    * @generated
+    */
   public void initializePackageContents()
   {
-    if (isInitialized) return;
-    isInitialized = true;
+      if (isInitialized) return;
+      isInitialized = true;
 
-    // Initialize package
-    setName(eNAME);
-    setNsPrefix(eNS_PREFIX);
-    setNsURI(eNS_URI);
+      // Initialize package
+      setName(eNAME);
+      setNsPrefix(eNS_PREFIX);
+      setNsURI(eNS_URI);
 
-    // Create type parameters
+      // Create type parameters
 
-    // Set bounds for type parameters
+      // Set bounds for type parameters
 
-    // Add supertypes to classes
-    oseeTypeEClass.getESuperTypes().add(this.getOseeElement());
-    xArtifactTypeEClass.getESuperTypes().add(this.getOseeType());
-    xAttributeTypeEClass.getESuperTypes().add(this.getOseeType());
-    xOseeEnumTypeEClass.getESuperTypes().add(this.getOseeType());
-    xOseeEnumOverrideEClass.getESuperTypes().add(this.getOseeElement());
-    addEnumEClass.getESuperTypes().add(this.getOverrideOption());
-    removeEnumEClass.getESuperTypes().add(this.getOverrideOption());
-    addAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
-    removeAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
-    updateAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
-    xRelationTypeEClass.getESuperTypes().add(this.getOseeType());
-    simpleConditionEClass.getESuperTypes().add(this.getCondition());
-    compoundConditionEClass.getESuperTypes().add(this.getCondition());
-    relationTypeArtifactTypePredicateEClass.getESuperTypes().add(this.getRelationTypePredicate());
-    relationTypeArtifactPredicateEClass.getESuperTypes().add(this.getRelationTypePredicate());
-    artifactMatchRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
-    artifactTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
-    attributeTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
-    relationTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
+      // Add supertypes to classes
+      oseeTypeEClass.getESuperTypes().add(this.getOseeElement());
+      xArtifactTypeEClass.getESuperTypes().add(this.getOseeType());
+      xAttributeTypeEClass.getESuperTypes().add(this.getOseeType());
+      xOseeEnumTypeEClass.getESuperTypes().add(this.getOseeType());
+      xOseeEnumOverrideEClass.getESuperTypes().add(this.getOseeElement());
+      addEnumEClass.getESuperTypes().add(this.getOverrideOption());
+      removeEnumEClass.getESuperTypes().add(this.getOverrideOption());
+      addAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
+      removeAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
+      updateAttributeEClass.getESuperTypes().add(this.getAttributeOverrideOption());
+      xRelationTypeEClass.getESuperTypes().add(this.getOseeType());
+      simpleConditionEClass.getESuperTypes().add(this.getCondition());
+      compoundConditionEClass.getESuperTypes().add(this.getCondition());
+      relationTypeArtifactTypePredicateEClass.getESuperTypes().add(this.getRelationTypePredicate());
+      relationTypeArtifactPredicateEClass.getESuperTypes().add(this.getRelationTypePredicate());
+      artifactMatchRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
+      artifactTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
+      attributeTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
+      relationTypeRestrictionEClass.getESuperTypes().add(this.getObjectRestriction());
 
-    // Initialize classes and features; add operations and parameters
-    initEClass(oseeDslEClass, OseeDsl.class, "OseeDsl", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getOseeDsl_Imports(), this.getImport(), null, "imports", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_ArtifactTypes(), this.getXArtifactType(), null, "artifactTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_RelationTypes(), this.getXRelationType(), null, "relationTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_AttributeTypes(), this.getXAttributeType(), null, "attributeTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_EnumTypes(), this.getXOseeEnumType(), null, "enumTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_EnumOverrides(), this.getXOseeEnumOverride(), null, "enumOverrides", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_ArtifactTypeOverrides(), this.getXOseeArtifactTypeOverride(), null, "artifactTypeOverrides", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_ArtifactMatchRefs(), this.getXArtifactMatcher(), null, "artifactMatchRefs", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_AccessDeclarations(), this.getAccessContext(), null, "accessDeclarations", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getOseeDsl_RoleDeclarations(), this.getRole(), null, "roleDeclarations", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      // Initialize classes and features; add operations and parameters
+      initEClass(oseeDslEClass, OseeDsl.class, "OseeDsl", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getOseeDsl_Imports(), this.getImport(), null, "imports", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_ArtifactTypes(), this.getXArtifactType(), null, "artifactTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_RelationTypes(), this.getXRelationType(), null, "relationTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_AttributeTypes(), this.getXAttributeType(), null, "attributeTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_EnumTypes(), this.getXOseeEnumType(), null, "enumTypes", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_EnumOverrides(), this.getXOseeEnumOverride(), null, "enumOverrides", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_ArtifactTypeOverrides(), this.getXOseeArtifactTypeOverride(), null, "artifactTypeOverrides", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_ArtifactMatchRefs(), this.getXArtifactMatcher(), null, "artifactMatchRefs", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_AccessDeclarations(), this.getAccessContext(), null, "accessDeclarations", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getOseeDsl_RoleDeclarations(), this.getRole(), null, "roleDeclarations", null, 0, -1, OseeDsl.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(importEClass, Import.class, "Import", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getImport_ImportURI(), ecorePackage.getEString(), "importURI", null, 0, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(importEClass, Import.class, "Import", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getImport_ImportURI(), ecorePackage.getEString(), "importURI", null, 0, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(oseeElementEClass, OseeElement.class, "OseeElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEClass(oseeElementEClass, OseeElement.class, "OseeElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
-    initEClass(oseeTypeEClass, OseeType.class, "OseeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getOseeType_Name(), ecorePackage.getEString(), "name", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getOseeType_TypeGuid(), ecorePackage.getEString(), "typeGuid", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getOseeType_Uuid(), ecorePackage.getEString(), "uuid", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(oseeTypeEClass, OseeType.class, "OseeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getOseeType_Name(), ecorePackage.getEString(), "name", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getOseeType_TypeGuid(), ecorePackage.getEString(), "typeGuid", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getOseeType_Uuid(), ecorePackage.getEString(), "uuid", null, 0, 1, OseeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xArtifactTypeEClass, XArtifactType.class, "XArtifactType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getXArtifactType_Abstract(), ecorePackage.getEBoolean(), "abstract", null, 0, 1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXArtifactType_SuperArtifactTypes(), this.getXArtifactType(), null, "superArtifactTypes", null, 0, -1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXArtifactType_ValidAttributeTypes(), this.getXAttributeTypeRef(), null, "validAttributeTypes", null, 0, -1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xArtifactTypeEClass, XArtifactType.class, "XArtifactType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getXArtifactType_Abstract(), ecorePackage.getEBoolean(), "abstract", null, 0, 1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXArtifactType_SuperArtifactTypes(), this.getXArtifactType(), null, "superArtifactTypes", null, 0, -1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXArtifactType_ValidAttributeTypes(), this.getXAttributeTypeRef(), null, "validAttributeTypes", null, 0, -1, XArtifactType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xAttributeTypeRefEClass, XAttributeTypeRef.class, "XAttributeTypeRef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getXAttributeTypeRef_ValidAttributeType(), this.getXAttributeType(), null, "validAttributeType", null, 0, 1, XAttributeTypeRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeTypeRef_BranchGuid(), ecorePackage.getEString(), "branchGuid", null, 0, 1, XAttributeTypeRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xAttributeTypeRefEClass, XAttributeTypeRef.class, "XAttributeTypeRef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getXAttributeTypeRef_ValidAttributeType(), this.getXAttributeType(), null, "validAttributeType", null, 0, 1, XAttributeTypeRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeTypeRef_BranchGuid(), ecorePackage.getEString(), "branchGuid", null, 0, 1, XAttributeTypeRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xAttributeTypeEClass, XAttributeType.class, "XAttributeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getXAttributeType_BaseAttributeType(), ecorePackage.getEString(), "baseAttributeType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXAttributeType_Override(), this.getXAttributeType(), null, "override", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_DataProvider(), ecorePackage.getEString(), "dataProvider", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_Min(), ecorePackage.getEString(), "min", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_Max(), ecorePackage.getEString(), "max", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_TaggerId(), ecorePackage.getEString(), "taggerId", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXAttributeType_EnumType(), this.getXOseeEnumType(), null, "enumType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_Description(), ecorePackage.getEString(), "description", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_DefaultValue(), ecorePackage.getEString(), "defaultValue", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_FileExtension(), ecorePackage.getEString(), "fileExtension", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXAttributeType_MediaType(), ecorePackage.getEString(), "mediaType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xAttributeTypeEClass, XAttributeType.class, "XAttributeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getXAttributeType_BaseAttributeType(), ecorePackage.getEString(), "baseAttributeType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXAttributeType_Override(), this.getXAttributeType(), null, "override", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_DataProvider(), ecorePackage.getEString(), "dataProvider", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_Min(), ecorePackage.getEString(), "min", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_Max(), ecorePackage.getEString(), "max", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_TaggerId(), ecorePackage.getEString(), "taggerId", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXAttributeType_EnumType(), this.getXOseeEnumType(), null, "enumType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_Description(), ecorePackage.getEString(), "description", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_DefaultValue(), ecorePackage.getEString(), "defaultValue", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_FileExtension(), ecorePackage.getEString(), "fileExtension", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXAttributeType_MediaType(), ecorePackage.getEString(), "mediaType", null, 0, 1, XAttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xOseeEnumTypeEClass, XOseeEnumType.class, "XOseeEnumType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getXOseeEnumType_EnumEntries(), this.getXOseeEnumEntry(), null, "enumEntries", null, 0, -1, XOseeEnumType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xOseeEnumTypeEClass, XOseeEnumType.class, "XOseeEnumType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getXOseeEnumType_EnumEntries(), this.getXOseeEnumEntry(), null, "enumEntries", null, 0, -1, XOseeEnumType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xOseeEnumEntryEClass, XOseeEnumEntry.class, "XOseeEnumEntry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getXOseeEnumEntry_Name(), ecorePackage.getEString(), "name", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXOseeEnumEntry_Ordinal(), ecorePackage.getEString(), "ordinal", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXOseeEnumEntry_EntryGuid(), ecorePackage.getEString(), "entryGuid", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXOseeEnumEntry_Description(), ecorePackage.getEString(), "description", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xOseeEnumEntryEClass, XOseeEnumEntry.class, "XOseeEnumEntry", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getXOseeEnumEntry_Name(), ecorePackage.getEString(), "name", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXOseeEnumEntry_Ordinal(), ecorePackage.getEString(), "ordinal", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXOseeEnumEntry_EntryGuid(), ecorePackage.getEString(), "entryGuid", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXOseeEnumEntry_Description(), ecorePackage.getEString(), "description", null, 0, 1, XOseeEnumEntry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xOseeEnumOverrideEClass, XOseeEnumOverride.class, "XOseeEnumOverride", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getXOseeEnumOverride_OverridenEnumType(), this.getXOseeEnumType(), null, "overridenEnumType", null, 0, 1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXOseeEnumOverride_InheritAll(), ecorePackage.getEBoolean(), "inheritAll", null, 0, 1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXOseeEnumOverride_OverrideOptions(), this.getOverrideOption(), null, "overrideOptions", null, 0, -1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xOseeEnumOverrideEClass, XOseeEnumOverride.class, "XOseeEnumOverride", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getXOseeEnumOverride_OverridenEnumType(), this.getXOseeEnumType(), null, "overridenEnumType", null, 0, 1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXOseeEnumOverride_InheritAll(), ecorePackage.getEBoolean(), "inheritAll", null, 0, 1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXOseeEnumOverride_OverrideOptions(), this.getOverrideOption(), null, "overrideOptions", null, 0, -1, XOseeEnumOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(overrideOptionEClass, OverrideOption.class, "OverrideOption", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEClass(overrideOptionEClass, OverrideOption.class, "OverrideOption", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
-    initEClass(addEnumEClass, AddEnum.class, "AddEnum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getAddEnum_EnumEntry(), ecorePackage.getEString(), "enumEntry", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getAddEnum_Ordinal(), ecorePackage.getEString(), "ordinal", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getAddEnum_EntryGuid(), ecorePackage.getEString(), "entryGuid", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getAddEnum_Description(), ecorePackage.getEString(), "description", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(addEnumEClass, AddEnum.class, "AddEnum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getAddEnum_EnumEntry(), ecorePackage.getEString(), "enumEntry", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getAddEnum_Ordinal(), ecorePackage.getEString(), "ordinal", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getAddEnum_EntryGuid(), ecorePackage.getEString(), "entryGuid", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getAddEnum_Description(), ecorePackage.getEString(), "description", null, 0, 1, AddEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(removeEnumEClass, RemoveEnum.class, "RemoveEnum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getRemoveEnum_EnumEntry(), this.getXOseeEnumEntry(), null, "enumEntry", null, 0, 1, RemoveEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(removeEnumEClass, RemoveEnum.class, "RemoveEnum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getRemoveEnum_EnumEntry(), this.getXOseeEnumEntry(), null, "enumEntry", null, 0, 1, RemoveEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xOseeArtifactTypeOverrideEClass, XOseeArtifactTypeOverride.class, "XOseeArtifactTypeOverride", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getXOseeArtifactTypeOverride_OverridenArtifactType(), this.getXArtifactType(), null, "overridenArtifactType", null, 0, 1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXOseeArtifactTypeOverride_InheritAll(), ecorePackage.getEBoolean(), "inheritAll", null, 0, 1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXOseeArtifactTypeOverride_OverrideOptions(), this.getAttributeOverrideOption(), null, "overrideOptions", null, 0, -1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xOseeArtifactTypeOverrideEClass, XOseeArtifactTypeOverride.class, "XOseeArtifactTypeOverride", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getXOseeArtifactTypeOverride_OverridenArtifactType(), this.getXArtifactType(), null, "overridenArtifactType", null, 0, 1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXOseeArtifactTypeOverride_InheritAll(), ecorePackage.getEBoolean(), "inheritAll", null, 0, 1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXOseeArtifactTypeOverride_OverrideOptions(), this.getAttributeOverrideOption(), null, "overrideOptions", null, 0, -1, XOseeArtifactTypeOverride.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(attributeOverrideOptionEClass, AttributeOverrideOption.class, "AttributeOverrideOption", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEClass(attributeOverrideOptionEClass, AttributeOverrideOption.class, "AttributeOverrideOption", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
-    initEClass(addAttributeEClass, AddAttribute.class, "AddAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getAddAttribute_Attribute(), this.getXAttributeTypeRef(), null, "attribute", null, 0, 1, AddAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(addAttributeEClass, AddAttribute.class, "AddAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getAddAttribute_Attribute(), this.getXAttributeTypeRef(), null, "attribute", null, 0, 1, AddAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(removeAttributeEClass, RemoveAttribute.class, "RemoveAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getRemoveAttribute_Attribute(), this.getXAttributeType(), null, "attribute", null, 0, 1, RemoveAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(removeAttributeEClass, RemoveAttribute.class, "RemoveAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getRemoveAttribute_Attribute(), this.getXAttributeType(), null, "attribute", null, 0, 1, RemoveAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(updateAttributeEClass, UpdateAttribute.class, "UpdateAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getUpdateAttribute_Attribute(), this.getXAttributeTypeRef(), null, "attribute", null, 0, 1, UpdateAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(updateAttributeEClass, UpdateAttribute.class, "UpdateAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getUpdateAttribute_Attribute(), this.getXAttributeTypeRef(), null, "attribute", null, 0, 1, UpdateAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xRelationTypeEClass, XRelationType.class, "XRelationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getXRelationType_SideAName(), ecorePackage.getEString(), "sideAName", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXRelationType_SideAArtifactType(), this.getXArtifactType(), null, "sideAArtifactType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXRelationType_SideBName(), ecorePackage.getEString(), "sideBName", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXRelationType_SideBArtifactType(), this.getXArtifactType(), null, "sideBArtifactType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXRelationType_DefaultOrderType(), ecorePackage.getEString(), "defaultOrderType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXRelationType_Multiplicity(), this.getRelationMultiplicityEnum(), "multiplicity", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xRelationTypeEClass, XRelationType.class, "XRelationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getXRelationType_SideAName(), ecorePackage.getEString(), "sideAName", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXRelationType_SideAArtifactType(), this.getXArtifactType(), null, "sideAArtifactType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXRelationType_SideBName(), ecorePackage.getEString(), "sideBName", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXRelationType_SideBArtifactType(), this.getXArtifactType(), null, "sideBArtifactType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXRelationType_DefaultOrderType(), ecorePackage.getEString(), "defaultOrderType", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXRelationType_Multiplicity(), this.getRelationMultiplicityEnum(), "multiplicity", null, 0, 1, XRelationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(conditionEClass, Condition.class, "Condition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEClass(conditionEClass, Condition.class, "Condition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
-    initEClass(simpleConditionEClass, SimpleCondition.class, "SimpleCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getSimpleCondition_Field(), this.getMatchField(), "field", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getSimpleCondition_Op(), this.getCompareOp(), "op", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getSimpleCondition_Expression(), ecorePackage.getEString(), "expression", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(simpleConditionEClass, SimpleCondition.class, "SimpleCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getSimpleCondition_Field(), this.getMatchField(), "field", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getSimpleCondition_Op(), this.getCompareOp(), "op", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getSimpleCondition_Expression(), ecorePackage.getEString(), "expression", null, 0, 1, SimpleCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(compoundConditionEClass, CompoundCondition.class, "CompoundCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getCompoundCondition_Conditions(), this.getSimpleCondition(), null, "conditions", null, 0, -1, CompoundCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getCompoundCondition_Operators(), this.getXLogicOperator(), "operators", null, 0, -1, CompoundCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(compoundConditionEClass, CompoundCondition.class, "CompoundCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getCompoundCondition_Conditions(), this.getSimpleCondition(), null, "conditions", null, 0, -1, CompoundCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getCompoundCondition_Operators(), this.getXLogicOperator(), "operators", null, 0, -1, CompoundCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(xArtifactMatcherEClass, XArtifactMatcher.class, "XArtifactMatcher", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getXArtifactMatcher_Name(), ecorePackage.getEString(), "name", null, 0, 1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getXArtifactMatcher_Conditions(), this.getCondition(), null, "conditions", null, 0, -1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getXArtifactMatcher_Operators(), this.getXLogicOperator(), "operators", null, 0, -1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(xArtifactMatcherEClass, XArtifactMatcher.class, "XArtifactMatcher", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getXArtifactMatcher_Name(), ecorePackage.getEString(), "name", null, 0, 1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getXArtifactMatcher_Conditions(), this.getCondition(), null, "conditions", null, 0, -1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getXArtifactMatcher_Operators(), this.getXLogicOperator(), "operators", null, 0, -1, XArtifactMatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(roleEClass, Role.class, "Role", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getRole_Name(), ecorePackage.getEString(), "name", null, 0, 1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getRole_SuperRoles(), this.getRole(), null, "superRoles", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getRole_UsersAndGroups(), this.getUsersAndGroups(), null, "usersAndGroups", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getRole_ReferencedContexts(), this.getReferencedContext(), null, "referencedContexts", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(roleEClass, Role.class, "Role", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getRole_Name(), ecorePackage.getEString(), "name", null, 0, 1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getRole_SuperRoles(), this.getRole(), null, "superRoles", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getRole_UsersAndGroups(), this.getUsersAndGroups(), null, "usersAndGroups", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getRole_ReferencedContexts(), this.getReferencedContext(), null, "referencedContexts", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(referencedContextEClass, ReferencedContext.class, "ReferencedContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getReferencedContext_AccessContextRef(), ecorePackage.getEString(), "accessContextRef", null, 0, 1, ReferencedContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(referencedContextEClass, ReferencedContext.class, "ReferencedContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getReferencedContext_AccessContextRef(), ecorePackage.getEString(), "accessContextRef", null, 0, 1, ReferencedContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(usersAndGroupsEClass, UsersAndGroups.class, "UsersAndGroups", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getUsersAndGroups_UserOrGroupGuid(), ecorePackage.getEString(), "userOrGroupGuid", null, 0, 1, UsersAndGroups.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(usersAndGroupsEClass, UsersAndGroups.class, "UsersAndGroups", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getUsersAndGroups_UserOrGroupGuid(), ecorePackage.getEString(), "userOrGroupGuid", null, 0, 1, UsersAndGroups.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(accessContextEClass, AccessContext.class, "AccessContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getAccessContext_Name(), ecorePackage.getEString(), "name", null, 0, 1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getAccessContext_SuperAccessContexts(), this.getAccessContext(), null, "superAccessContexts", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getAccessContext_Guid(), ecorePackage.getEString(), "guid", null, 0, 1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getAccessContext_AccessRules(), this.getObjectRestriction(), null, "accessRules", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getAccessContext_HierarchyRestrictions(), this.getHierarchyRestriction(), null, "hierarchyRestrictions", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(accessContextEClass, AccessContext.class, "AccessContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getAccessContext_Name(), ecorePackage.getEString(), "name", null, 0, 1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getAccessContext_SuperAccessContexts(), this.getAccessContext(), null, "superAccessContexts", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getAccessContext_Guid(), ecorePackage.getEString(), "guid", null, 0, 1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getAccessContext_AccessRules(), this.getObjectRestriction(), null, "accessRules", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getAccessContext_HierarchyRestrictions(), this.getHierarchyRestriction(), null, "hierarchyRestrictions", null, 0, -1, AccessContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(hierarchyRestrictionEClass, HierarchyRestriction.class, "HierarchyRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getHierarchyRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, HierarchyRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getHierarchyRestriction_AccessRules(), this.getObjectRestriction(), null, "accessRules", null, 0, -1, HierarchyRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(hierarchyRestrictionEClass, HierarchyRestriction.class, "HierarchyRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getHierarchyRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, HierarchyRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getHierarchyRestriction_AccessRules(), this.getObjectRestriction(), null, "accessRules", null, 0, -1, HierarchyRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(relationTypeArtifactTypePredicateEClass, RelationTypeArtifactTypePredicate.class, "RelationTypeArtifactTypePredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getRelationTypeArtifactTypePredicate_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, RelationTypeArtifactTypePredicate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(relationTypeArtifactTypePredicateEClass, RelationTypeArtifactTypePredicate.class, "RelationTypeArtifactTypePredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getRelationTypeArtifactTypePredicate_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, RelationTypeArtifactTypePredicate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(relationTypeArtifactPredicateEClass, RelationTypeArtifactPredicate.class, "RelationTypeArtifactPredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getRelationTypeArtifactPredicate_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, RelationTypeArtifactPredicate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(relationTypeArtifactPredicateEClass, RelationTypeArtifactPredicate.class, "RelationTypeArtifactPredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getRelationTypeArtifactPredicate_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, RelationTypeArtifactPredicate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(relationTypePredicateEClass, RelationTypePredicate.class, "RelationTypePredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEClass(relationTypePredicateEClass, RelationTypePredicate.class, "RelationTypePredicate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
-    initEClass(objectRestrictionEClass, ObjectRestriction.class, "ObjectRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getObjectRestriction_Permission(), this.getAccessPermissionEnum(), "permission", null, 0, 1, ObjectRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(objectRestrictionEClass, ObjectRestriction.class, "ObjectRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getObjectRestriction_Permission(), this.getAccessPermissionEnum(), "permission", null, 0, 1, ObjectRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(artifactMatchRestrictionEClass, ArtifactMatchRestriction.class, "ArtifactMatchRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getArtifactMatchRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, ArtifactMatchRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(artifactMatchRestrictionEClass, ArtifactMatchRestriction.class, "ArtifactMatchRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getArtifactMatchRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, ArtifactMatchRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(artifactTypeRestrictionEClass, ArtifactTypeRestriction.class, "ArtifactTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getArtifactTypeRestriction_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, ArtifactTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(artifactTypeRestrictionEClass, ArtifactTypeRestriction.class, "ArtifactTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getArtifactTypeRestriction_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, ArtifactTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(attributeTypeRestrictionEClass, AttributeTypeRestriction.class, "AttributeTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEReference(getAttributeTypeRestriction_AttributeTypeRef(), this.getXAttributeType(), null, "attributeTypeRef", null, 0, 1, AttributeTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getAttributeTypeRestriction_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, AttributeTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(attributeTypeRestrictionEClass, AttributeTypeRestriction.class, "AttributeTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEReference(getAttributeTypeRestriction_AttributeTypeRef(), this.getXAttributeType(), null, "attributeTypeRef", null, 0, 1, AttributeTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getAttributeTypeRestriction_ArtifactTypeRef(), this.getXArtifactType(), null, "artifactTypeRef", null, 0, 1, AttributeTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(legacyRelationTypeRestrictionEClass, LegacyRelationTypeRestriction.class, "LegacyRelationTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getLegacyRelationTypeRestriction_Permission(), this.getAccessPermissionEnum(), "permission", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getLegacyRelationTypeRestriction_RelationTypeRef(), this.getXRelationType(), null, "relationTypeRef", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getLegacyRelationTypeRestriction_RestrictedToSide(), this.getXRelationSideEnum(), "restrictedToSide", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getLegacyRelationTypeRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(legacyRelationTypeRestrictionEClass, LegacyRelationTypeRestriction.class, "LegacyRelationTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getLegacyRelationTypeRestriction_Permission(), this.getAccessPermissionEnum(), "permission", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getLegacyRelationTypeRestriction_RelationTypeRef(), this.getXRelationType(), null, "relationTypeRef", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getLegacyRelationTypeRestriction_RestrictedToSide(), this.getXRelationSideEnum(), "restrictedToSide", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getLegacyRelationTypeRestriction_ArtifactMatcherRef(), this.getXArtifactMatcher(), null, "artifactMatcherRef", null, 0, 1, LegacyRelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    initEClass(relationTypeRestrictionEClass, RelationTypeRestriction.class, "RelationTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-    initEAttribute(getRelationTypeRestriction_RelationTypeMatch(), ecorePackage.getEBoolean(), "relationTypeMatch", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getRelationTypeRestriction_RelationTypeRef(), this.getXRelationType(), null, "relationTypeRef", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEAttribute(getRelationTypeRestriction_RestrictedToSide(), this.getXRelationSideEnum(), "restrictedToSide", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-    initEReference(getRelationTypeRestriction_Predicate(), this.getRelationTypePredicate(), null, "predicate", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEClass(relationTypeRestrictionEClass, RelationTypeRestriction.class, "RelationTypeRestriction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+      initEAttribute(getRelationTypeRestriction_RelationTypeMatch(), ecorePackage.getEBoolean(), "relationTypeMatch", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getRelationTypeRestriction_RelationTypeRef(), this.getXRelationType(), null, "relationTypeRef", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEAttribute(getRelationTypeRestriction_RestrictedToSide(), this.getXRelationSideEnum(), "restrictedToSide", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+      initEReference(getRelationTypeRestriction_Predicate(), this.getRelationTypePredicate(), null, "predicate", null, 0, 1, RelationTypeRestriction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-    // Initialize enums and add enum literals
-    initEEnum(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.class, "RelationMultiplicityEnum");
-    addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.ONE_TO_ONE);
-    addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.ONE_TO_MANY);
-    addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.MANY_TO_ONE);
-    addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.MANY_TO_MANY);
+      // Initialize enums and add enum literals
+      initEEnum(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.class, "RelationMultiplicityEnum");
+      addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.ONE_TO_ONE);
+      addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.ONE_TO_MANY);
+      addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.MANY_TO_ONE);
+      addEEnumLiteral(relationMultiplicityEnumEEnum, RelationMultiplicityEnum.MANY_TO_MANY);
 
-    initEEnum(compareOpEEnum, CompareOp.class, "CompareOp");
-    addEEnumLiteral(compareOpEEnum, CompareOp.EQ);
-    addEEnumLiteral(compareOpEEnum, CompareOp.LIKE);
+      initEEnum(compareOpEEnum, CompareOp.class, "CompareOp");
+      addEEnumLiteral(compareOpEEnum, CompareOp.EQ);
+      addEEnumLiteral(compareOpEEnum, CompareOp.LIKE);
 
-    initEEnum(xLogicOperatorEEnum, XLogicOperator.class, "XLogicOperator");
-    addEEnumLiteral(xLogicOperatorEEnum, XLogicOperator.AND);
-    addEEnumLiteral(xLogicOperatorEEnum, XLogicOperator.OR);
+      initEEnum(xLogicOperatorEEnum, XLogicOperator.class, "XLogicOperator");
+      addEEnumLiteral(xLogicOperatorEEnum, XLogicOperator.AND);
+      addEEnumLiteral(xLogicOperatorEEnum, XLogicOperator.OR);
 
-    initEEnum(matchFieldEEnum, MatchField.class, "MatchField");
-    addEEnumLiteral(matchFieldEEnum, MatchField.ARTIFACT_NAME);
-    addEEnumLiteral(matchFieldEEnum, MatchField.ARTIFACT_GUID);
-    addEEnumLiteral(matchFieldEEnum, MatchField.BRANCH_NAME);
-    addEEnumLiteral(matchFieldEEnum, MatchField.BRANCH_GUID);
+      initEEnum(matchFieldEEnum, MatchField.class, "MatchField");
+      addEEnumLiteral(matchFieldEEnum, MatchField.ARTIFACT_NAME);
+      addEEnumLiteral(matchFieldEEnum, MatchField.ARTIFACT_GUID);
+      addEEnumLiteral(matchFieldEEnum, MatchField.BRANCH_NAME);
+      addEEnumLiteral(matchFieldEEnum, MatchField.BRANCH_GUID);
 
-    initEEnum(accessPermissionEnumEEnum, AccessPermissionEnum.class, "AccessPermissionEnum");
-    addEEnumLiteral(accessPermissionEnumEEnum, AccessPermissionEnum.ALLOW);
-    addEEnumLiteral(accessPermissionEnumEEnum, AccessPermissionEnum.DENY);
+      initEEnum(accessPermissionEnumEEnum, AccessPermissionEnum.class, "AccessPermissionEnum");
+      addEEnumLiteral(accessPermissionEnumEEnum, AccessPermissionEnum.ALLOW);
+      addEEnumLiteral(accessPermissionEnumEEnum, AccessPermissionEnum.DENY);
 
-    initEEnum(relationTypeMatchEEnum, RelationTypeMatch.class, "RelationTypeMatch");
-    addEEnumLiteral(relationTypeMatchEEnum, RelationTypeMatch.ALL);
+      initEEnum(relationTypeMatchEEnum, RelationTypeMatch.class, "RelationTypeMatch");
+      addEEnumLiteral(relationTypeMatchEEnum, RelationTypeMatch.ALL);
 
-    initEEnum(xRelationSideEnumEEnum, XRelationSideEnum.class, "XRelationSideEnum");
-    addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.SIDE_A);
-    addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.SIDE_B);
-    addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.BOTH);
+      initEEnum(xRelationSideEnumEEnum, XRelationSideEnum.class, "XRelationSideEnum");
+      addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.SIDE_A);
+      addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.SIDE_B);
+      addEEnumLiteral(xRelationSideEnumEEnum, XRelationSideEnum.BOTH);
 
-    // Create resource
-    createResource(eNS_URI);
-  }
+      // Create resource
+      createResource(eNS_URI);
+   }
 
 } //OseeDslPackageImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeElementImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeElementImpl.java
index cbe8b2a..c6e73db 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeElementImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeElementImpl.java
@@ -21,24 +21,24 @@
 public class OseeElementImpl extends MinimalEObjectImpl.Container implements OseeElement
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected OseeElementImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.OSEE_ELEMENT;
-  }
+      return OseeDslPackage.Literals.OSEE_ELEMENT;
+   }
 
 } //OseeElementImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeTypeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeTypeImpl.java
index f2a3c0a..2a3a0d2 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeTypeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OseeTypeImpl.java
@@ -29,260 +29,256 @@
 public class OseeTypeImpl extends OseeElementImpl implements OseeType
 {
   /**
-   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected static final String NAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected String name = NAME_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getTypeGuid() <em>Type Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getTypeGuid() <em>Type Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getTypeGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getTypeGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String TYPE_GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getTypeGuid() <em>Type Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getTypeGuid() <em>Type Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getTypeGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getTypeGuid()
+    * @generated
+    * @ordered
+    */
   protected String typeGuid = TYPE_GUID_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getUuid() <em>Uuid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getUuid() <em>Uuid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getUuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getUuid()
+    * @generated
+    * @ordered
+    */
   protected static final String UUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getUuid() <em>Uuid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getUuid() <em>Uuid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getUuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getUuid()
+    * @generated
+    * @ordered
+    */
   protected String uuid = UUID_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected OseeTypeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.OSEE_TYPE;
-  }
+      return OseeDslPackage.Literals.OSEE_TYPE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+      return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setName(String newName)
   {
-    String oldName = name;
-    name = newName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__NAME, oldName, name));
-  }
+      String oldName = name;
+      name = newName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__NAME, oldName, name));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getTypeGuid()
   {
-    return typeGuid;
-  }
+      return typeGuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setTypeGuid(String newTypeGuid)
   {
-    String oldTypeGuid = typeGuid;
-    typeGuid = newTypeGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__TYPE_GUID, oldTypeGuid, typeGuid));
-  }
+      String oldTypeGuid = typeGuid;
+      typeGuid = newTypeGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__TYPE_GUID, oldTypeGuid, typeGuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getUuid()
   {
-    return uuid;
-  }
+      return uuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setUuid(String newUuid)
   {
-    String oldUuid = uuid;
-    uuid = newUuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__UUID, oldUuid, uuid));
-  }
+      String oldUuid = uuid;
+      uuid = newUuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.OSEE_TYPE__UUID, oldUuid, uuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_TYPE__NAME:
-        return getName();
-      case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
-        return getTypeGuid();
-      case OseeDslPackage.OSEE_TYPE__UUID:
-        return getUuid();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_TYPE__NAME:
+            return getName();
+         case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
+            return getTypeGuid();
+         case OseeDslPackage.OSEE_TYPE__UUID:
+            return getUuid();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_TYPE__NAME:
-        setName((String)newValue);
-        return;
-      case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
-        setTypeGuid((String)newValue);
-        return;
-      case OseeDslPackage.OSEE_TYPE__UUID:
-        setUuid((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_TYPE__NAME:
+            setName((String)newValue);
+            return;
+         case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
+            setTypeGuid((String)newValue);
+            return;
+         case OseeDslPackage.OSEE_TYPE__UUID:
+            setUuid((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_TYPE__NAME:
-        setName(NAME_EDEFAULT);
-        return;
-      case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
-        setTypeGuid(TYPE_GUID_EDEFAULT);
-        return;
-      case OseeDslPackage.OSEE_TYPE__UUID:
-        setUuid(UUID_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_TYPE__NAME:
+            setName(NAME_EDEFAULT);
+            return;
+         case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
+            setTypeGuid(TYPE_GUID_EDEFAULT);
+            return;
+         case OseeDslPackage.OSEE_TYPE__UUID:
+            setUuid(UUID_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.OSEE_TYPE__NAME:
-        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-      case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
-        return TYPE_GUID_EDEFAULT == null ? typeGuid != null : !TYPE_GUID_EDEFAULT.equals(typeGuid);
-      case OseeDslPackage.OSEE_TYPE__UUID:
-        return UUID_EDEFAULT == null ? uuid != null : !UUID_EDEFAULT.equals(uuid);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.OSEE_TYPE__NAME:
+            return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+         case OseeDslPackage.OSEE_TYPE__TYPE_GUID:
+            return TYPE_GUID_EDEFAULT == null ? typeGuid != null : !TYPE_GUID_EDEFAULT.equals(typeGuid);
+         case OseeDslPackage.OSEE_TYPE__UUID:
+            return UUID_EDEFAULT == null ? uuid != null : !UUID_EDEFAULT.equals(uuid);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (name: ");
-    result.append(name);
-    result.append(", typeGuid: ");
-    result.append(typeGuid);
-    result.append(", uuid: ");
-    result.append(uuid);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (name: ");
+      result.append(name);
+      result.append(", typeGuid: ");
+      result.append(typeGuid);
+      result.append(", uuid: ");
+      result.append(uuid);
+      result.append(')');
+      return result.toString();
+   }
 
 } //OseeTypeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OverrideOptionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OverrideOptionImpl.java
index 8d9429b..a692c21 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OverrideOptionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/OverrideOptionImpl.java
@@ -21,24 +21,24 @@
 public class OverrideOptionImpl extends MinimalEObjectImpl.Container implements OverrideOption
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected OverrideOptionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.OVERRIDE_OPTION;
-  }
+      return OseeDslPackage.Literals.OVERRIDE_OPTION;
+   }
 
 } //OverrideOptionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ReferencedContextImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ReferencedContextImpl.java
index 8e71411..cf685f3 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ReferencedContextImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/ReferencedContextImpl.java
@@ -28,150 +28,146 @@
 public class ReferencedContextImpl extends MinimalEObjectImpl.Container implements ReferencedContext
 {
   /**
-   * The default value of the '{@link #getAccessContextRef() <em>Access Context Ref</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getAccessContextRef() <em>Access Context Ref</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAccessContextRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getAccessContextRef()
+    * @generated
+    * @ordered
+    */
   protected static final String ACCESS_CONTEXT_REF_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getAccessContextRef() <em>Access Context Ref</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAccessContextRef() <em>Access Context Ref</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAccessContextRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getAccessContextRef()
+    * @generated
+    * @ordered
+    */
   protected String accessContextRef = ACCESS_CONTEXT_REF_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected ReferencedContextImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.REFERENCED_CONTEXT;
-  }
+      return OseeDslPackage.Literals.REFERENCED_CONTEXT;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getAccessContextRef()
   {
-    return accessContextRef;
-  }
+      return accessContextRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAccessContextRef(String newAccessContextRef)
   {
-    String oldAccessContextRef = accessContextRef;
-    accessContextRef = newAccessContextRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF, oldAccessContextRef, accessContextRef));
-  }
+      String oldAccessContextRef = accessContextRef;
+      accessContextRef = newAccessContextRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF, oldAccessContextRef, accessContextRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
-        return getAccessContextRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
+            return getAccessContextRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
-        setAccessContextRef((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
+            setAccessContextRef((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
-        setAccessContextRef(ACCESS_CONTEXT_REF_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
+            setAccessContextRef(ACCESS_CONTEXT_REF_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
-        return ACCESS_CONTEXT_REF_EDEFAULT == null ? accessContextRef != null : !ACCESS_CONTEXT_REF_EDEFAULT.equals(accessContextRef);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REFERENCED_CONTEXT__ACCESS_CONTEXT_REF:
+            return ACCESS_CONTEXT_REF_EDEFAULT == null ? accessContextRef != null : !ACCESS_CONTEXT_REF_EDEFAULT.equals(accessContextRef);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (accessContextRef: ");
-    result.append(accessContextRef);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (accessContextRef: ");
+      result.append(accessContextRef);
+      result.append(')');
+      return result.toString();
+   }
 
 } //ReferencedContextImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactPredicateImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactPredicateImpl.java
index 3231f5d..8f913b6 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactPredicateImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactPredicateImpl.java
@@ -29,144 +29,138 @@
 public class RelationTypeArtifactPredicateImpl extends RelationTypePredicateImpl implements RelationTypeArtifactPredicate
 {
   /**
-   * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactMatcherRef() <em>Artifact Matcher Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactMatcherRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactMatcherRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactMatcher artifactMatcherRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RelationTypeArtifactPredicateImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.RELATION_TYPE_ARTIFACT_PREDICATE;
-  }
+      return OseeDslPackage.Literals.RELATION_TYPE_ARTIFACT_PREDICATE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher getArtifactMatcherRef()
   {
-    if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy())
-    {
-      InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
-      artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
-      if (artifactMatcherRef != oldArtifactMatcherRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+      if (artifactMatcherRef != null && artifactMatcherRef.eIsProxy()) {
+         InternalEObject oldArtifactMatcherRef = (InternalEObject)artifactMatcherRef;
+         artifactMatcherRef = (XArtifactMatcher)eResolveProxy(oldArtifactMatcherRef);
+         if (artifactMatcherRef != oldArtifactMatcherRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+         }
       }
-    }
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactMatcher basicGetArtifactMatcherRef()
   {
-    return artifactMatcherRef;
-  }
+      return artifactMatcherRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactMatcherRef(XArtifactMatcher newArtifactMatcherRef)
   {
-    XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
-    artifactMatcherRef = newArtifactMatcherRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
-  }
+      XArtifactMatcher oldArtifactMatcherRef = artifactMatcherRef;
+      artifactMatcherRef = newArtifactMatcherRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF, oldArtifactMatcherRef, artifactMatcherRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
-        if (resolve) return getArtifactMatcherRef();
-        return basicGetArtifactMatcherRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
+            if (resolve) return getArtifactMatcherRef();
+            return basicGetArtifactMatcherRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
-        setArtifactMatcherRef((XArtifactMatcher)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
+            setArtifactMatcherRef((XArtifactMatcher)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
-        return artifactMatcherRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE__ARTIFACT_MATCHER_REF:
+            return artifactMatcherRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //RelationTypeArtifactPredicateImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactTypePredicateImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactTypePredicateImpl.java
index 5a6ed45..876adc0 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactTypePredicateImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeArtifactTypePredicateImpl.java
@@ -29,144 +29,138 @@
 public class RelationTypeArtifactTypePredicateImpl extends RelationTypePredicateImpl implements RelationTypeArtifactTypePredicate
 {
   /**
-   * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getArtifactTypeRef() <em>Artifact Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getArtifactTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getArtifactTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType artifactTypeRef;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RelationTypeArtifactTypePredicateImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE;
-  }
+      return OseeDslPackage.Literals.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getArtifactTypeRef()
   {
-    if (artifactTypeRef != null && artifactTypeRef.eIsProxy())
-    {
-      InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
-      artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
-      if (artifactTypeRef != oldArtifactTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+      if (artifactTypeRef != null && artifactTypeRef.eIsProxy()) {
+         InternalEObject oldArtifactTypeRef = (InternalEObject)artifactTypeRef;
+         artifactTypeRef = (XArtifactType)eResolveProxy(oldArtifactTypeRef);
+         if (artifactTypeRef != oldArtifactTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+         }
       }
-    }
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetArtifactTypeRef()
   {
-    return artifactTypeRef;
-  }
+      return artifactTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setArtifactTypeRef(XArtifactType newArtifactTypeRef)
   {
-    XArtifactType oldArtifactTypeRef = artifactTypeRef;
-    artifactTypeRef = newArtifactTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
-  }
+      XArtifactType oldArtifactTypeRef = artifactTypeRef;
+      artifactTypeRef = newArtifactTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF, oldArtifactTypeRef, artifactTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
-        if (resolve) return getArtifactTypeRef();
-        return basicGetArtifactTypeRef();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
+            if (resolve) return getArtifactTypeRef();
+            return basicGetArtifactTypeRef();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
-        setArtifactTypeRef((XArtifactType)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
+            setArtifactTypeRef((XArtifactType)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
-        return artifactTypeRef != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE__ARTIFACT_TYPE_REF:
+            return artifactTypeRef != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //RelationTypeArtifactTypePredicateImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypePredicateImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypePredicateImpl.java
index b8bfe7f..29f2e48 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypePredicateImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypePredicateImpl.java
@@ -21,24 +21,24 @@
 public class RelationTypePredicateImpl extends MinimalEObjectImpl.Container implements RelationTypePredicate
 {
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RelationTypePredicateImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.RELATION_TYPE_PREDICATE;
-  }
+      return OseeDslPackage.Literals.RELATION_TYPE_PREDICATE;
+   }
 
 } //RelationTypePredicateImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeRestrictionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeRestrictionImpl.java
index 06cb65b..f57a0fc 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeRestrictionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RelationTypeRestrictionImpl.java
@@ -35,353 +35,344 @@
 public class RelationTypeRestrictionImpl extends ObjectRestrictionImpl implements RelationTypeRestriction
 {
   /**
-   * The default value of the '{@link #isRelationTypeMatch() <em>Relation Type Match</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #isRelationTypeMatch() <em>Relation Type Match</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isRelationTypeMatch()
-   * @generated
-   * @ordered
-   */
+    * @see #isRelationTypeMatch()
+    * @generated
+    * @ordered
+    */
   protected static final boolean RELATION_TYPE_MATCH_EDEFAULT = false;
 
   /**
-   * The cached value of the '{@link #isRelationTypeMatch() <em>Relation Type Match</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #isRelationTypeMatch() <em>Relation Type Match</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isRelationTypeMatch()
-   * @generated
-   * @ordered
-   */
+    * @see #isRelationTypeMatch()
+    * @generated
+    * @ordered
+    */
   protected boolean relationTypeMatch = RELATION_TYPE_MATCH_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getRelationTypeRef() <em>Relation Type Ref</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRelationTypeRef() <em>Relation Type Ref</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRelationTypeRef()
-   * @generated
-   * @ordered
-   */
+    * @see #getRelationTypeRef()
+    * @generated
+    * @ordered
+    */
   protected XRelationType relationTypeRef;
 
   /**
-   * The default value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRestrictedToSide()
-   * @generated
-   * @ordered
-   */
+    * @see #getRestrictedToSide()
+    * @generated
+    * @ordered
+    */
   protected static final XRelationSideEnum RESTRICTED_TO_SIDE_EDEFAULT = XRelationSideEnum.SIDE_A;
 
   /**
-   * The cached value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getRestrictedToSide() <em>Restricted To Side</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getRestrictedToSide()
-   * @generated
-   * @ordered
-   */
+    * @see #getRestrictedToSide()
+    * @generated
+    * @ordered
+    */
   protected XRelationSideEnum restrictedToSide = RESTRICTED_TO_SIDE_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getPredicate() <em>Predicate</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getPredicate() <em>Predicate</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getPredicate()
-   * @generated
-   * @ordered
-   */
+    * @see #getPredicate()
+    * @generated
+    * @ordered
+    */
   protected RelationTypePredicate predicate;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RelationTypeRestrictionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.RELATION_TYPE_RESTRICTION;
-  }
+      return OseeDslPackage.Literals.RELATION_TYPE_RESTRICTION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public boolean isRelationTypeMatch()
   {
-    return relationTypeMatch;
-  }
+      return relationTypeMatch;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setRelationTypeMatch(boolean newRelationTypeMatch)
   {
-    boolean oldRelationTypeMatch = relationTypeMatch;
-    relationTypeMatch = newRelationTypeMatch;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH, oldRelationTypeMatch, relationTypeMatch));
-  }
+      boolean oldRelationTypeMatch = relationTypeMatch;
+      relationTypeMatch = newRelationTypeMatch;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH, oldRelationTypeMatch, relationTypeMatch));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationType getRelationTypeRef()
   {
-    if (relationTypeRef != null && relationTypeRef.eIsProxy())
-    {
-      InternalEObject oldRelationTypeRef = (InternalEObject)relationTypeRef;
-      relationTypeRef = (XRelationType)eResolveProxy(oldRelationTypeRef);
-      if (relationTypeRef != oldRelationTypeRef)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+      if (relationTypeRef != null && relationTypeRef.eIsProxy()) {
+         InternalEObject oldRelationTypeRef = (InternalEObject)relationTypeRef;
+         relationTypeRef = (XRelationType)eResolveProxy(oldRelationTypeRef);
+         if (relationTypeRef != oldRelationTypeRef) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+         }
       }
-    }
-    return relationTypeRef;
-  }
+      return relationTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationType basicGetRelationTypeRef()
   {
-    return relationTypeRef;
-  }
+      return relationTypeRef;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setRelationTypeRef(XRelationType newRelationTypeRef)
   {
-    XRelationType oldRelationTypeRef = relationTypeRef;
-    relationTypeRef = newRelationTypeRef;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
-  }
+      XRelationType oldRelationTypeRef = relationTypeRef;
+      relationTypeRef = newRelationTypeRef;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF, oldRelationTypeRef, relationTypeRef));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XRelationSideEnum getRestrictedToSide()
   {
-    return restrictedToSide;
-  }
+      return restrictedToSide;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setRestrictedToSide(XRelationSideEnum newRestrictedToSide)
   {
-    XRelationSideEnum oldRestrictedToSide = restrictedToSide;
-    restrictedToSide = newRestrictedToSide == null ? RESTRICTED_TO_SIDE_EDEFAULT : newRestrictedToSide;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE, oldRestrictedToSide, restrictedToSide));
-  }
+      XRelationSideEnum oldRestrictedToSide = restrictedToSide;
+      restrictedToSide = newRestrictedToSide == null ? RESTRICTED_TO_SIDE_EDEFAULT : newRestrictedToSide;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE, oldRestrictedToSide, restrictedToSide));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationTypePredicate getPredicate()
   {
-    return predicate;
-  }
+      return predicate;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public NotificationChain basicSetPredicate(RelationTypePredicate newPredicate, NotificationChain msgs)
   {
-    RelationTypePredicate oldPredicate = predicate;
-    predicate = newPredicate;
-    if (eNotificationRequired())
-    {
-      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, oldPredicate, newPredicate);
-      if (msgs == null) msgs = notification; else msgs.add(notification);
-    }
-    return msgs;
-  }
+      RelationTypePredicate oldPredicate = predicate;
+      predicate = newPredicate;
+      if (eNotificationRequired()) {
+         ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, oldPredicate, newPredicate);
+         if (msgs == null) msgs = notification; else msgs.add(notification);
+      }
+      return msgs;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setPredicate(RelationTypePredicate newPredicate)
   {
-    if (newPredicate != predicate)
-    {
-      NotificationChain msgs = null;
-      if (predicate != null)
-        msgs = ((InternalEObject)predicate).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, null, msgs);
-      if (newPredicate != null)
-        msgs = ((InternalEObject)newPredicate).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, null, msgs);
-      msgs = basicSetPredicate(newPredicate, msgs);
-      if (msgs != null) msgs.dispatch();
-    }
-    else if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, newPredicate, newPredicate));
-  }
+      if (newPredicate != predicate) {
+         NotificationChain msgs = null;
+         if (predicate != null)
+            msgs = ((InternalEObject)predicate).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, null, msgs);
+         if (newPredicate != null)
+            msgs = ((InternalEObject)newPredicate).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, null, msgs);
+         msgs = basicSetPredicate(newPredicate, msgs);
+         if (msgs != null) msgs.dispatch();
+      }
+      else if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE, newPredicate, newPredicate));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
-        return basicSetPredicate(null, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
+            return basicSetPredicate(null, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
-        return isRelationTypeMatch();
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        if (resolve) return getRelationTypeRef();
-        return basicGetRelationTypeRef();
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        return getRestrictedToSide();
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
-        return getPredicate();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
+            return isRelationTypeMatch();
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            if (resolve) return getRelationTypeRef();
+            return basicGetRelationTypeRef();
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            return getRestrictedToSide();
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
+            return getPredicate();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
-        setRelationTypeMatch((Boolean)newValue);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        setRelationTypeRef((XRelationType)newValue);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        setRestrictedToSide((XRelationSideEnum)newValue);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
-        setPredicate((RelationTypePredicate)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
+            setRelationTypeMatch((Boolean)newValue);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            setRelationTypeRef((XRelationType)newValue);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            setRestrictedToSide((XRelationSideEnum)newValue);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
+            setPredicate((RelationTypePredicate)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
-        setRelationTypeMatch(RELATION_TYPE_MATCH_EDEFAULT);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        setRelationTypeRef((XRelationType)null);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        setRestrictedToSide(RESTRICTED_TO_SIDE_EDEFAULT);
-        return;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
-        setPredicate((RelationTypePredicate)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
+            setRelationTypeMatch(RELATION_TYPE_MATCH_EDEFAULT);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            setRelationTypeRef((XRelationType)null);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            setRestrictedToSide(RESTRICTED_TO_SIDE_EDEFAULT);
+            return;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
+            setPredicate((RelationTypePredicate)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
-        return relationTypeMatch != RELATION_TYPE_MATCH_EDEFAULT;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
-        return relationTypeRef != null;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
-        return restrictedToSide != RESTRICTED_TO_SIDE_EDEFAULT;
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
-        return predicate != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_MATCH:
+            return relationTypeMatch != RELATION_TYPE_MATCH_EDEFAULT;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RELATION_TYPE_REF:
+            return relationTypeRef != null;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__RESTRICTED_TO_SIDE:
+            return restrictedToSide != RESTRICTED_TO_SIDE_EDEFAULT;
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION__PREDICATE:
+            return predicate != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (relationTypeMatch: ");
-    result.append(relationTypeMatch);
-    result.append(", restrictedToSide: ");
-    result.append(restrictedToSide);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (relationTypeMatch: ");
+      result.append(relationTypeMatch);
+      result.append(", restrictedToSide: ");
+      result.append(restrictedToSide);
+      result.append(')');
+      return result.toString();
+   }
 
 } //RelationTypeRestrictionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveAttributeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveAttributeImpl.java
index 31c8baa..af61686 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveAttributeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveAttributeImpl.java
@@ -29,144 +29,138 @@
 public class RemoveAttributeImpl extends AttributeOverrideOptionImpl implements RemoveAttribute
 {
   /**
-   * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAttribute()
-   * @generated
-   * @ordered
-   */
+    * @see #getAttribute()
+    * @generated
+    * @ordered
+    */
   protected XAttributeType attribute;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RemoveAttributeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.REMOVE_ATTRIBUTE;
-  }
+      return OseeDslPackage.Literals.REMOVE_ATTRIBUTE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType getAttribute()
   {
-    if (attribute != null && attribute.eIsProxy())
-    {
-      InternalEObject oldAttribute = (InternalEObject)attribute;
-      attribute = (XAttributeType)eResolveProxy(oldAttribute);
-      if (attribute != oldAttribute)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+      if (attribute != null && attribute.eIsProxy()) {
+         InternalEObject oldAttribute = (InternalEObject)attribute;
+         attribute = (XAttributeType)eResolveProxy(oldAttribute);
+         if (attribute != oldAttribute) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+         }
       }
-    }
-    return attribute;
-  }
+      return attribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType basicGetAttribute()
   {
-    return attribute;
-  }
+      return attribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAttribute(XAttributeType newAttribute)
   {
-    XAttributeType oldAttribute = attribute;
-    attribute = newAttribute;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
-  }
+      XAttributeType oldAttribute = attribute;
+      attribute = newAttribute;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE, oldAttribute, attribute));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
-        if (resolve) return getAttribute();
-        return basicGetAttribute();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
+            if (resolve) return getAttribute();
+            return basicGetAttribute();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeType)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeType)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeType)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeType)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
-        return attribute != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ATTRIBUTE__ATTRIBUTE:
+            return attribute != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //RemoveAttributeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveEnumImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveEnumImpl.java
index eb1091e..0089cf7 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveEnumImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RemoveEnumImpl.java
@@ -29,144 +29,138 @@
 public class RemoveEnumImpl extends OverrideOptionImpl implements RemoveEnum
 {
   /**
-   * The cached value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumEntry() <em>Enum Entry</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumEntry()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumEntry()
+    * @generated
+    * @ordered
+    */
   protected XOseeEnumEntry enumEntry;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RemoveEnumImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.REMOVE_ENUM;
-  }
+      return OseeDslPackage.Literals.REMOVE_ENUM;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumEntry getEnumEntry()
   {
-    if (enumEntry != null && enumEntry.eIsProxy())
-    {
-      InternalEObject oldEnumEntry = (InternalEObject)enumEntry;
-      enumEntry = (XOseeEnumEntry)eResolveProxy(oldEnumEntry);
-      if (enumEntry != oldEnumEntry)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
+      if (enumEntry != null && enumEntry.eIsProxy()) {
+         InternalEObject oldEnumEntry = (InternalEObject)enumEntry;
+         enumEntry = (XOseeEnumEntry)eResolveProxy(oldEnumEntry);
+         if (enumEntry != oldEnumEntry) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
+         }
       }
-    }
-    return enumEntry;
-  }
+      return enumEntry;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumEntry basicGetEnumEntry()
   {
-    return enumEntry;
-  }
+      return enumEntry;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setEnumEntry(XOseeEnumEntry newEnumEntry)
   {
-    XOseeEnumEntry oldEnumEntry = enumEntry;
-    enumEntry = newEnumEntry;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
-  }
+      XOseeEnumEntry oldEnumEntry = enumEntry;
+      enumEntry = newEnumEntry;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY, oldEnumEntry, enumEntry));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
-        if (resolve) return getEnumEntry();
-        return basicGetEnumEntry();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
+            if (resolve) return getEnumEntry();
+            return basicGetEnumEntry();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
-        setEnumEntry((XOseeEnumEntry)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
+            setEnumEntry((XOseeEnumEntry)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
-        setEnumEntry((XOseeEnumEntry)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
+            setEnumEntry((XOseeEnumEntry)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
-        return enumEntry != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.REMOVE_ENUM__ENUM_ENTRY:
+            return enumEntry != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //RemoveEnumImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RoleImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RoleImpl.java
index 990bcd1..99ea292 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RoleImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/RoleImpl.java
@@ -43,274 +43,266 @@
 public class RoleImpl extends MinimalEObjectImpl.Container implements Role
 {
   /**
-   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected static final String NAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected String name = NAME_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getSuperRoles() <em>Super Roles</em>}' reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSuperRoles() <em>Super Roles</em>}' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSuperRoles()
-   * @generated
-   * @ordered
-   */
+    * @see #getSuperRoles()
+    * @generated
+    * @ordered
+    */
   protected EList<Role> superRoles;
 
   /**
-   * The cached value of the '{@link #getUsersAndGroups() <em>Users And Groups</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getUsersAndGroups() <em>Users And Groups</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getUsersAndGroups()
-   * @generated
-   * @ordered
-   */
+    * @see #getUsersAndGroups()
+    * @generated
+    * @ordered
+    */
   protected EList<UsersAndGroups> usersAndGroups;
 
   /**
-   * The cached value of the '{@link #getReferencedContexts() <em>Referenced Contexts</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getReferencedContexts() <em>Referenced Contexts</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getReferencedContexts()
-   * @generated
-   * @ordered
-   */
+    * @see #getReferencedContexts()
+    * @generated
+    * @ordered
+    */
   protected EList<ReferencedContext> referencedContexts;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected RoleImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.ROLE;
-  }
+      return OseeDslPackage.Literals.ROLE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+      return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setName(String newName)
   {
-    String oldName = name;
-    name = newName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ROLE__NAME, oldName, name));
-  }
+      String oldName = name;
+      name = newName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.ROLE__NAME, oldName, name));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<Role> getSuperRoles()
   {
-    if (superRoles == null)
-    {
-      superRoles = new EObjectResolvingEList<Role>(Role.class, this, OseeDslPackage.ROLE__SUPER_ROLES);
-    }
-    return superRoles;
-  }
+      if (superRoles == null) {
+         superRoles = new EObjectResolvingEList<Role>(Role.class, this, OseeDslPackage.ROLE__SUPER_ROLES);
+      }
+      return superRoles;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<UsersAndGroups> getUsersAndGroups()
   {
-    if (usersAndGroups == null)
-    {
-      usersAndGroups = new EObjectContainmentEList<UsersAndGroups>(UsersAndGroups.class, this, OseeDslPackage.ROLE__USERS_AND_GROUPS);
-    }
-    return usersAndGroups;
-  }
+      if (usersAndGroups == null) {
+         usersAndGroups = new EObjectContainmentEList<UsersAndGroups>(UsersAndGroups.class, this, OseeDslPackage.ROLE__USERS_AND_GROUPS);
+      }
+      return usersAndGroups;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<ReferencedContext> getReferencedContexts()
   {
-    if (referencedContexts == null)
-    {
-      referencedContexts = new EObjectContainmentEList<ReferencedContext>(ReferencedContext.class, this, OseeDslPackage.ROLE__REFERENCED_CONTEXTS);
-    }
-    return referencedContexts;
-  }
+      if (referencedContexts == null) {
+         referencedContexts = new EObjectContainmentEList<ReferencedContext>(ReferencedContext.class, this, OseeDslPackage.ROLE__REFERENCED_CONTEXTS);
+      }
+      return referencedContexts;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ROLE__USERS_AND_GROUPS:
-        return ((InternalEList<?>)getUsersAndGroups()).basicRemove(otherEnd, msgs);
-      case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
-        return ((InternalEList<?>)getReferencedContexts()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ROLE__USERS_AND_GROUPS:
+            return ((InternalEList<?>)getUsersAndGroups()).basicRemove(otherEnd, msgs);
+         case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
+            return ((InternalEList<?>)getReferencedContexts()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ROLE__NAME:
-        return getName();
-      case OseeDslPackage.ROLE__SUPER_ROLES:
-        return getSuperRoles();
-      case OseeDslPackage.ROLE__USERS_AND_GROUPS:
-        return getUsersAndGroups();
-      case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
-        return getReferencedContexts();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ROLE__NAME:
+            return getName();
+         case OseeDslPackage.ROLE__SUPER_ROLES:
+            return getSuperRoles();
+         case OseeDslPackage.ROLE__USERS_AND_GROUPS:
+            return getUsersAndGroups();
+         case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
+            return getReferencedContexts();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ROLE__NAME:
-        setName((String)newValue);
-        return;
-      case OseeDslPackage.ROLE__SUPER_ROLES:
-        getSuperRoles().clear();
-        getSuperRoles().addAll((Collection<? extends Role>)newValue);
-        return;
-      case OseeDslPackage.ROLE__USERS_AND_GROUPS:
-        getUsersAndGroups().clear();
-        getUsersAndGroups().addAll((Collection<? extends UsersAndGroups>)newValue);
-        return;
-      case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
-        getReferencedContexts().clear();
-        getReferencedContexts().addAll((Collection<? extends ReferencedContext>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ROLE__NAME:
+            setName((String)newValue);
+            return;
+         case OseeDslPackage.ROLE__SUPER_ROLES:
+            getSuperRoles().clear();
+            getSuperRoles().addAll((Collection<? extends Role>)newValue);
+            return;
+         case OseeDslPackage.ROLE__USERS_AND_GROUPS:
+            getUsersAndGroups().clear();
+            getUsersAndGroups().addAll((Collection<? extends UsersAndGroups>)newValue);
+            return;
+         case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
+            getReferencedContexts().clear();
+            getReferencedContexts().addAll((Collection<? extends ReferencedContext>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ROLE__NAME:
-        setName(NAME_EDEFAULT);
-        return;
-      case OseeDslPackage.ROLE__SUPER_ROLES:
-        getSuperRoles().clear();
-        return;
-      case OseeDslPackage.ROLE__USERS_AND_GROUPS:
-        getUsersAndGroups().clear();
-        return;
-      case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
-        getReferencedContexts().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ROLE__NAME:
+            setName(NAME_EDEFAULT);
+            return;
+         case OseeDslPackage.ROLE__SUPER_ROLES:
+            getSuperRoles().clear();
+            return;
+         case OseeDslPackage.ROLE__USERS_AND_GROUPS:
+            getUsersAndGroups().clear();
+            return;
+         case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
+            getReferencedContexts().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.ROLE__NAME:
-        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-      case OseeDslPackage.ROLE__SUPER_ROLES:
-        return superRoles != null && !superRoles.isEmpty();
-      case OseeDslPackage.ROLE__USERS_AND_GROUPS:
-        return usersAndGroups != null && !usersAndGroups.isEmpty();
-      case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
-        return referencedContexts != null && !referencedContexts.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.ROLE__NAME:
+            return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+         case OseeDslPackage.ROLE__SUPER_ROLES:
+            return superRoles != null && !superRoles.isEmpty();
+         case OseeDslPackage.ROLE__USERS_AND_GROUPS:
+            return usersAndGroups != null && !usersAndGroups.isEmpty();
+         case OseeDslPackage.ROLE__REFERENCED_CONTEXTS:
+            return referencedContexts != null && !referencedContexts.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (name: ");
-    result.append(name);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (name: ");
+      result.append(name);
+      result.append(')');
+      return result.toString();
+   }
 
 } //RoleImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/SimpleConditionImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/SimpleConditionImpl.java
index 3c7d032..d27d720 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/SimpleConditionImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/SimpleConditionImpl.java
@@ -31,260 +31,256 @@
 public class SimpleConditionImpl extends ConditionImpl implements SimpleCondition
 {
   /**
-   * The default value of the '{@link #getField() <em>Field</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getField() <em>Field</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getField()
-   * @generated
-   * @ordered
-   */
+    * @see #getField()
+    * @generated
+    * @ordered
+    */
   protected static final MatchField FIELD_EDEFAULT = MatchField.ARTIFACT_NAME;
 
   /**
-   * The cached value of the '{@link #getField() <em>Field</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getField() <em>Field</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getField()
-   * @generated
-   * @ordered
-   */
+    * @see #getField()
+    * @generated
+    * @ordered
+    */
   protected MatchField field = FIELD_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getOp() <em>Op</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getOp() <em>Op</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOp()
-   * @generated
-   * @ordered
-   */
+    * @see #getOp()
+    * @generated
+    * @ordered
+    */
   protected static final CompareOp OP_EDEFAULT = CompareOp.EQ;
 
   /**
-   * The cached value of the '{@link #getOp() <em>Op</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOp() <em>Op</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOp()
-   * @generated
-   * @ordered
-   */
+    * @see #getOp()
+    * @generated
+    * @ordered
+    */
   protected CompareOp op = OP_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getExpression() <em>Expression</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getExpression()
-   * @generated
-   * @ordered
-   */
+    * @see #getExpression()
+    * @generated
+    * @ordered
+    */
   protected static final String EXPRESSION_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getExpression() <em>Expression</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getExpression() <em>Expression</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getExpression()
-   * @generated
-   * @ordered
-   */
+    * @see #getExpression()
+    * @generated
+    * @ordered
+    */
   protected String expression = EXPRESSION_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected SimpleConditionImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.SIMPLE_CONDITION;
-  }
+      return OseeDslPackage.Literals.SIMPLE_CONDITION;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public MatchField getField()
   {
-    return field;
-  }
+      return field;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setField(MatchField newField)
   {
-    MatchField oldField = field;
-    field = newField == null ? FIELD_EDEFAULT : newField;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__FIELD, oldField, field));
-  }
+      MatchField oldField = field;
+      field = newField == null ? FIELD_EDEFAULT : newField;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__FIELD, oldField, field));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public CompareOp getOp()
   {
-    return op;
-  }
+      return op;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOp(CompareOp newOp)
   {
-    CompareOp oldOp = op;
-    op = newOp == null ? OP_EDEFAULT : newOp;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__OP, oldOp, op));
-  }
+      CompareOp oldOp = op;
+      op = newOp == null ? OP_EDEFAULT : newOp;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__OP, oldOp, op));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getExpression()
   {
-    return expression;
-  }
+      return expression;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setExpression(String newExpression)
   {
-    String oldExpression = expression;
-    expression = newExpression;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__EXPRESSION, oldExpression, expression));
-  }
+      String oldExpression = expression;
+      expression = newExpression;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.SIMPLE_CONDITION__EXPRESSION, oldExpression, expression));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.SIMPLE_CONDITION__FIELD:
-        return getField();
-      case OseeDslPackage.SIMPLE_CONDITION__OP:
-        return getOp();
-      case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
-        return getExpression();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.SIMPLE_CONDITION__FIELD:
+            return getField();
+         case OseeDslPackage.SIMPLE_CONDITION__OP:
+            return getOp();
+         case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
+            return getExpression();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.SIMPLE_CONDITION__FIELD:
-        setField((MatchField)newValue);
-        return;
-      case OseeDslPackage.SIMPLE_CONDITION__OP:
-        setOp((CompareOp)newValue);
-        return;
-      case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
-        setExpression((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.SIMPLE_CONDITION__FIELD:
+            setField((MatchField)newValue);
+            return;
+         case OseeDslPackage.SIMPLE_CONDITION__OP:
+            setOp((CompareOp)newValue);
+            return;
+         case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
+            setExpression((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.SIMPLE_CONDITION__FIELD:
-        setField(FIELD_EDEFAULT);
-        return;
-      case OseeDslPackage.SIMPLE_CONDITION__OP:
-        setOp(OP_EDEFAULT);
-        return;
-      case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
-        setExpression(EXPRESSION_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.SIMPLE_CONDITION__FIELD:
+            setField(FIELD_EDEFAULT);
+            return;
+         case OseeDslPackage.SIMPLE_CONDITION__OP:
+            setOp(OP_EDEFAULT);
+            return;
+         case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
+            setExpression(EXPRESSION_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.SIMPLE_CONDITION__FIELD:
-        return field != FIELD_EDEFAULT;
-      case OseeDslPackage.SIMPLE_CONDITION__OP:
-        return op != OP_EDEFAULT;
-      case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
-        return EXPRESSION_EDEFAULT == null ? expression != null : !EXPRESSION_EDEFAULT.equals(expression);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.SIMPLE_CONDITION__FIELD:
+            return field != FIELD_EDEFAULT;
+         case OseeDslPackage.SIMPLE_CONDITION__OP:
+            return op != OP_EDEFAULT;
+         case OseeDslPackage.SIMPLE_CONDITION__EXPRESSION:
+            return EXPRESSION_EDEFAULT == null ? expression != null : !EXPRESSION_EDEFAULT.equals(expression);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (field: ");
-    result.append(field);
-    result.append(", op: ");
-    result.append(op);
-    result.append(", expression: ");
-    result.append(expression);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (field: ");
+      result.append(field);
+      result.append(", op: ");
+      result.append(op);
+      result.append(", expression: ");
+      result.append(expression);
+      result.append(')');
+      return result.toString();
+   }
 
 } //SimpleConditionImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UpdateAttributeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UpdateAttributeImpl.java
index 7a1e5b9..e562694b 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UpdateAttributeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UpdateAttributeImpl.java
@@ -30,164 +30,157 @@
 public class UpdateAttributeImpl extends AttributeOverrideOptionImpl implements UpdateAttribute
 {
   /**
-   * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getAttribute()
-   * @generated
-   * @ordered
-   */
+    * @see #getAttribute()
+    * @generated
+    * @ordered
+    */
   protected XAttributeTypeRef attribute;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected UpdateAttributeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.UPDATE_ATTRIBUTE;
-  }
+      return OseeDslPackage.Literals.UPDATE_ATTRIBUTE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeTypeRef getAttribute()
   {
-    return attribute;
-  }
+      return attribute;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public NotificationChain basicSetAttribute(XAttributeTypeRef newAttribute, NotificationChain msgs)
   {
-    XAttributeTypeRef oldAttribute = attribute;
-    attribute = newAttribute;
-    if (eNotificationRequired())
-    {
-      ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, oldAttribute, newAttribute);
-      if (msgs == null) msgs = notification; else msgs.add(notification);
-    }
-    return msgs;
-  }
+      XAttributeTypeRef oldAttribute = attribute;
+      attribute = newAttribute;
+      if (eNotificationRequired()) {
+         ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, oldAttribute, newAttribute);
+         if (msgs == null) msgs = notification; else msgs.add(notification);
+      }
+      return msgs;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAttribute(XAttributeTypeRef newAttribute)
   {
-    if (newAttribute != attribute)
-    {
-      NotificationChain msgs = null;
-      if (attribute != null)
-        msgs = ((InternalEObject)attribute).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, null, msgs);
-      if (newAttribute != null)
-        msgs = ((InternalEObject)newAttribute).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, null, msgs);
-      msgs = basicSetAttribute(newAttribute, msgs);
-      if (msgs != null) msgs.dispatch();
-    }
-    else if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, newAttribute, newAttribute));
-  }
+      if (newAttribute != attribute) {
+         NotificationChain msgs = null;
+         if (attribute != null)
+            msgs = ((InternalEObject)attribute).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, null, msgs);
+         if (newAttribute != null)
+            msgs = ((InternalEObject)newAttribute).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, null, msgs);
+         msgs = basicSetAttribute(newAttribute, msgs);
+         if (msgs != null) msgs.dispatch();
+      }
+      else if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE, newAttribute, newAttribute));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
-        return basicSetAttribute(null, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
+            return basicSetAttribute(null, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
-        return getAttribute();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
+            return getAttribute();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeTypeRef)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeTypeRef)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
-        setAttribute((XAttributeTypeRef)null);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
+            setAttribute((XAttributeTypeRef)null);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
-        return attribute != null;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.UPDATE_ATTRIBUTE__ATTRIBUTE:
+            return attribute != null;
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //UpdateAttributeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UsersAndGroupsImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UsersAndGroupsImpl.java
index 573e85d..173d657 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UsersAndGroupsImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/UsersAndGroupsImpl.java
@@ -28,150 +28,146 @@
 public class UsersAndGroupsImpl extends MinimalEObjectImpl.Container implements UsersAndGroups
 {
   /**
-   * The default value of the '{@link #getUserOrGroupGuid() <em>User Or Group Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getUserOrGroupGuid() <em>User Or Group Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getUserOrGroupGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getUserOrGroupGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String USER_OR_GROUP_GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getUserOrGroupGuid() <em>User Or Group Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getUserOrGroupGuid() <em>User Or Group Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getUserOrGroupGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getUserOrGroupGuid()
+    * @generated
+    * @ordered
+    */
   protected String userOrGroupGuid = USER_OR_GROUP_GUID_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected UsersAndGroupsImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.USERS_AND_GROUPS;
-  }
+      return OseeDslPackage.Literals.USERS_AND_GROUPS;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getUserOrGroupGuid()
   {
-    return userOrGroupGuid;
-  }
+      return userOrGroupGuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setUserOrGroupGuid(String newUserOrGroupGuid)
   {
-    String oldUserOrGroupGuid = userOrGroupGuid;
-    userOrGroupGuid = newUserOrGroupGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID, oldUserOrGroupGuid, userOrGroupGuid));
-  }
+      String oldUserOrGroupGuid = userOrGroupGuid;
+      userOrGroupGuid = newUserOrGroupGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID, oldUserOrGroupGuid, userOrGroupGuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
-        return getUserOrGroupGuid();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
+            return getUserOrGroupGuid();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
-        setUserOrGroupGuid((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
+            setUserOrGroupGuid((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
-        setUserOrGroupGuid(USER_OR_GROUP_GUID_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
+            setUserOrGroupGuid(USER_OR_GROUP_GUID_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
-        return USER_OR_GROUP_GUID_EDEFAULT == null ? userOrGroupGuid != null : !USER_OR_GROUP_GUID_EDEFAULT.equals(userOrGroupGuid);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.USERS_AND_GROUPS__USER_OR_GROUP_GUID:
+            return USER_OR_GROUP_GUID_EDEFAULT == null ? userOrGroupGuid != null : !USER_OR_GROUP_GUID_EDEFAULT.equals(userOrGroupGuid);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (userOrGroupGuid: ");
-    result.append(userOrGroupGuid);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (userOrGroupGuid: ");
+      result.append(userOrGroupGuid);
+      result.append(')');
+      return result.toString();
+   }
 
 } //UsersAndGroupsImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactMatcherImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactMatcherImpl.java
index c0f0966..e8a80f6 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactMatcherImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactMatcherImpl.java
@@ -42,239 +42,232 @@
 public class XArtifactMatcherImpl extends MinimalEObjectImpl.Container implements XArtifactMatcher
 {
   /**
-   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected static final String NAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected String name = NAME_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getConditions() <em>Conditions</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getConditions() <em>Conditions</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getConditions()
-   * @generated
-   * @ordered
-   */
+    * @see #getConditions()
+    * @generated
+    * @ordered
+    */
   protected EList<Condition> conditions;
 
   /**
-   * The cached value of the '{@link #getOperators() <em>Operators</em>}' attribute list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOperators() <em>Operators</em>}' attribute list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOperators()
-   * @generated
-   * @ordered
-   */
+    * @see #getOperators()
+    * @generated
+    * @ordered
+    */
   protected EList<XLogicOperator> operators;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XArtifactMatcherImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XARTIFACT_MATCHER;
-  }
+      return OseeDslPackage.Literals.XARTIFACT_MATCHER;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+      return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setName(String newName)
   {
-    String oldName = name;
-    name = newName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XARTIFACT_MATCHER__NAME, oldName, name));
-  }
+      String oldName = name;
+      name = newName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XARTIFACT_MATCHER__NAME, oldName, name));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<Condition> getConditions()
   {
-    if (conditions == null)
-    {
-      conditions = new EObjectContainmentEList<Condition>(Condition.class, this, OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS);
-    }
-    return conditions;
-  }
+      if (conditions == null) {
+         conditions = new EObjectContainmentEList<Condition>(Condition.class, this, OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS);
+      }
+      return conditions;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XLogicOperator> getOperators()
   {
-    if (operators == null)
-    {
-      operators = new EDataTypeEList<XLogicOperator>(XLogicOperator.class, this, OseeDslPackage.XARTIFACT_MATCHER__OPERATORS);
-    }
-    return operators;
-  }
+      if (operators == null) {
+         operators = new EDataTypeEList<XLogicOperator>(XLogicOperator.class, this, OseeDslPackage.XARTIFACT_MATCHER__OPERATORS);
+      }
+      return operators;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
-        return ((InternalEList<?>)getConditions()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
+            return ((InternalEList<?>)getConditions()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_MATCHER__NAME:
-        return getName();
-      case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
-        return getConditions();
-      case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
-        return getOperators();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_MATCHER__NAME:
+            return getName();
+         case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
+            return getConditions();
+         case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
+            return getOperators();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_MATCHER__NAME:
-        setName((String)newValue);
-        return;
-      case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
-        getConditions().clear();
-        getConditions().addAll((Collection<? extends Condition>)newValue);
-        return;
-      case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
-        getOperators().clear();
-        getOperators().addAll((Collection<? extends XLogicOperator>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_MATCHER__NAME:
+            setName((String)newValue);
+            return;
+         case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
+            getConditions().clear();
+            getConditions().addAll((Collection<? extends Condition>)newValue);
+            return;
+         case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
+            getOperators().clear();
+            getOperators().addAll((Collection<? extends XLogicOperator>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_MATCHER__NAME:
-        setName(NAME_EDEFAULT);
-        return;
-      case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
-        getConditions().clear();
-        return;
-      case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
-        getOperators().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_MATCHER__NAME:
+            setName(NAME_EDEFAULT);
+            return;
+         case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
+            getConditions().clear();
+            return;
+         case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
+            getOperators().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_MATCHER__NAME:
-        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-      case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
-        return conditions != null && !conditions.isEmpty();
-      case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
-        return operators != null && !operators.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_MATCHER__NAME:
+            return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+         case OseeDslPackage.XARTIFACT_MATCHER__CONDITIONS:
+            return conditions != null && !conditions.isEmpty();
+         case OseeDslPackage.XARTIFACT_MATCHER__OPERATORS:
+            return operators != null && !operators.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (name: ");
-    result.append(name);
-    result.append(", operators: ");
-    result.append(operators);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (name: ");
+      result.append(name);
+      result.append(", operators: ");
+      result.append(operators);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XArtifactMatcherImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactTypeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactTypeImpl.java
index 7fc4a14..6afca4a 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactTypeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XArtifactTypeImpl.java
@@ -40,237 +40,230 @@
 public class XArtifactTypeImpl extends OseeTypeImpl implements XArtifactType
 {
   /**
-   * The default value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isAbstract()
-   * @generated
-   * @ordered
-   */
+    * @see #isAbstract()
+    * @generated
+    * @ordered
+    */
   protected static final boolean ABSTRACT_EDEFAULT = false;
 
   /**
-   * The cached value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #isAbstract() <em>Abstract</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isAbstract()
-   * @generated
-   * @ordered
-   */
+    * @see #isAbstract()
+    * @generated
+    * @ordered
+    */
   protected boolean abstract_ = ABSTRACT_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getSuperArtifactTypes() <em>Super Artifact Types</em>}' reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSuperArtifactTypes() <em>Super Artifact Types</em>}' reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSuperArtifactTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getSuperArtifactTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XArtifactType> superArtifactTypes;
 
   /**
-   * The cached value of the '{@link #getValidAttributeTypes() <em>Valid Attribute Types</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getValidAttributeTypes() <em>Valid Attribute Types</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getValidAttributeTypes()
-   * @generated
-   * @ordered
-   */
+    * @see #getValidAttributeTypes()
+    * @generated
+    * @ordered
+    */
   protected EList<XAttributeTypeRef> validAttributeTypes;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XArtifactTypeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XARTIFACT_TYPE;
-  }
+      return OseeDslPackage.Literals.XARTIFACT_TYPE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public boolean isAbstract()
   {
-    return abstract_;
-  }
+      return abstract_;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setAbstract(boolean newAbstract)
   {
-    boolean oldAbstract = abstract_;
-    abstract_ = newAbstract;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XARTIFACT_TYPE__ABSTRACT, oldAbstract, abstract_));
-  }
+      boolean oldAbstract = abstract_;
+      abstract_ = newAbstract;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XARTIFACT_TYPE__ABSTRACT, oldAbstract, abstract_));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XArtifactType> getSuperArtifactTypes()
   {
-    if (superArtifactTypes == null)
-    {
-      superArtifactTypes = new EObjectResolvingEList<XArtifactType>(XArtifactType.class, this, OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES);
-    }
-    return superArtifactTypes;
-  }
+      if (superArtifactTypes == null) {
+         superArtifactTypes = new EObjectResolvingEList<XArtifactType>(XArtifactType.class, this, OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES);
+      }
+      return superArtifactTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XAttributeTypeRef> getValidAttributeTypes()
   {
-    if (validAttributeTypes == null)
-    {
-      validAttributeTypes = new EObjectContainmentEList<XAttributeTypeRef>(XAttributeTypeRef.class, this, OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES);
-    }
-    return validAttributeTypes;
-  }
+      if (validAttributeTypes == null) {
+         validAttributeTypes = new EObjectContainmentEList<XAttributeTypeRef>(XAttributeTypeRef.class, this, OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES);
+      }
+      return validAttributeTypes;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
-        return ((InternalEList<?>)getValidAttributeTypes()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
+            return ((InternalEList<?>)getValidAttributeTypes()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
-        return isAbstract();
-      case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
-        return getSuperArtifactTypes();
-      case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
-        return getValidAttributeTypes();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
+            return isAbstract();
+         case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
+            return getSuperArtifactTypes();
+         case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
+            return getValidAttributeTypes();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
-        setAbstract((Boolean)newValue);
-        return;
-      case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
-        getSuperArtifactTypes().clear();
-        getSuperArtifactTypes().addAll((Collection<? extends XArtifactType>)newValue);
-        return;
-      case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
-        getValidAttributeTypes().clear();
-        getValidAttributeTypes().addAll((Collection<? extends XAttributeTypeRef>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
+            setAbstract((Boolean)newValue);
+            return;
+         case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
+            getSuperArtifactTypes().clear();
+            getSuperArtifactTypes().addAll((Collection<? extends XArtifactType>)newValue);
+            return;
+         case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
+            getValidAttributeTypes().clear();
+            getValidAttributeTypes().addAll((Collection<? extends XAttributeTypeRef>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
-        setAbstract(ABSTRACT_EDEFAULT);
-        return;
-      case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
-        getSuperArtifactTypes().clear();
-        return;
-      case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
-        getValidAttributeTypes().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
+            setAbstract(ABSTRACT_EDEFAULT);
+            return;
+         case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
+            getSuperArtifactTypes().clear();
+            return;
+         case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
+            getValidAttributeTypes().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
-        return abstract_ != ABSTRACT_EDEFAULT;
-      case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
-        return superArtifactTypes != null && !superArtifactTypes.isEmpty();
-      case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
-        return validAttributeTypes != null && !validAttributeTypes.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XARTIFACT_TYPE__ABSTRACT:
+            return abstract_ != ABSTRACT_EDEFAULT;
+         case OseeDslPackage.XARTIFACT_TYPE__SUPER_ARTIFACT_TYPES:
+            return superArtifactTypes != null && !superArtifactTypes.isEmpty();
+         case OseeDslPackage.XARTIFACT_TYPE__VALID_ATTRIBUTE_TYPES:
+            return validAttributeTypes != null && !validAttributeTypes.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (abstract: ");
-    result.append(abstract_);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (abstract: ");
+      result.append(abstract_);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XArtifactTypeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeImpl.java
index 0647e4f..5d7a970 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeImpl.java
@@ -39,718 +39,710 @@
 public class XAttributeTypeImpl extends OseeTypeImpl implements XAttributeType
 {
   /**
-   * The default value of the '{@link #getBaseAttributeType() <em>Base Attribute Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getBaseAttributeType() <em>Base Attribute Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getBaseAttributeType()
-   * @generated
-   * @ordered
-   */
+    * @see #getBaseAttributeType()
+    * @generated
+    * @ordered
+    */
   protected static final String BASE_ATTRIBUTE_TYPE_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getBaseAttributeType() <em>Base Attribute Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getBaseAttributeType() <em>Base Attribute Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getBaseAttributeType()
-   * @generated
-   * @ordered
-   */
+    * @see #getBaseAttributeType()
+    * @generated
+    * @ordered
+    */
   protected String baseAttributeType = BASE_ATTRIBUTE_TYPE_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getOverride() <em>Override</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOverride() <em>Override</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOverride()
-   * @generated
-   * @ordered
-   */
+    * @see #getOverride()
+    * @generated
+    * @ordered
+    */
   protected XAttributeType override;
 
   /**
-   * The default value of the '{@link #getDataProvider() <em>Data Provider</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDataProvider() <em>Data Provider</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDataProvider()
-   * @generated
-   * @ordered
-   */
+    * @see #getDataProvider()
+    * @generated
+    * @ordered
+    */
   protected static final String DATA_PROVIDER_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDataProvider() <em>Data Provider</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDataProvider() <em>Data Provider</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDataProvider()
-   * @generated
-   * @ordered
-   */
+    * @see #getDataProvider()
+    * @generated
+    * @ordered
+    */
   protected String dataProvider = DATA_PROVIDER_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getMin() <em>Min</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getMin() <em>Min</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMin()
-   * @generated
-   * @ordered
-   */
+    * @see #getMin()
+    * @generated
+    * @ordered
+    */
   protected static final String MIN_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getMin() <em>Min</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getMin() <em>Min</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMin()
-   * @generated
-   * @ordered
-   */
+    * @see #getMin()
+    * @generated
+    * @ordered
+    */
   protected String min = MIN_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getMax() <em>Max</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getMax() <em>Max</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMax()
-   * @generated
-   * @ordered
-   */
+    * @see #getMax()
+    * @generated
+    * @ordered
+    */
   protected static final String MAX_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getMax() <em>Max</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getMax() <em>Max</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMax()
-   * @generated
-   * @ordered
-   */
+    * @see #getMax()
+    * @generated
+    * @ordered
+    */
   protected String max = MAX_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getTaggerId() <em>Tagger Id</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getTaggerId() <em>Tagger Id</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getTaggerId()
-   * @generated
-   * @ordered
-   */
+    * @see #getTaggerId()
+    * @generated
+    * @ordered
+    */
   protected static final String TAGGER_ID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getTaggerId() <em>Tagger Id</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getTaggerId() <em>Tagger Id</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getTaggerId()
-   * @generated
-   * @ordered
-   */
+    * @see #getTaggerId()
+    * @generated
+    * @ordered
+    */
   protected String taggerId = TAGGER_ID_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getEnumType() <em>Enum Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumType() <em>Enum Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumType()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumType()
+    * @generated
+    * @ordered
+    */
   protected XOseeEnumType enumType;
 
   /**
-   * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected static final String DESCRIPTION_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected String description = DESCRIPTION_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getDefaultValue() <em>Default Value</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDefaultValue() <em>Default Value</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDefaultValue()
-   * @generated
-   * @ordered
-   */
+    * @see #getDefaultValue()
+    * @generated
+    * @ordered
+    */
   protected static final String DEFAULT_VALUE_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDefaultValue()
-   * @generated
-   * @ordered
-   */
+    * @see #getDefaultValue()
+    * @generated
+    * @ordered
+    */
   protected String defaultValue = DEFAULT_VALUE_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getFileExtension() <em>File Extension</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getFileExtension() <em>File Extension</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getFileExtension()
-   * @generated
-   * @ordered
-   */
+    * @see #getFileExtension()
+    * @generated
+    * @ordered
+    */
   protected static final String FILE_EXTENSION_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getFileExtension() <em>File Extension</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getFileExtension() <em>File Extension</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getFileExtension()
-   * @generated
-   * @ordered
-   */
+    * @see #getFileExtension()
+    * @generated
+    * @ordered
+    */
   protected String fileExtension = FILE_EXTENSION_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getMediaType() <em>Media Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getMediaType() <em>Media Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMediaType()
-   * @generated
-   * @ordered
-   */
+    * @see #getMediaType()
+    * @generated
+    * @ordered
+    */
   protected static final String MEDIA_TYPE_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getMediaType() <em>Media Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getMediaType() <em>Media Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMediaType()
-   * @generated
-   * @ordered
-   */
+    * @see #getMediaType()
+    * @generated
+    * @ordered
+    */
   protected String mediaType = MEDIA_TYPE_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XAttributeTypeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XATTRIBUTE_TYPE;
-  }
+      return OseeDslPackage.Literals.XATTRIBUTE_TYPE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getBaseAttributeType()
   {
-    return baseAttributeType;
-  }
+      return baseAttributeType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setBaseAttributeType(String newBaseAttributeType)
   {
-    String oldBaseAttributeType = baseAttributeType;
-    baseAttributeType = newBaseAttributeType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE, oldBaseAttributeType, baseAttributeType));
-  }
+      String oldBaseAttributeType = baseAttributeType;
+      baseAttributeType = newBaseAttributeType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE, oldBaseAttributeType, baseAttributeType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType getOverride()
   {
-    if (override != null && override.eIsProxy())
-    {
-      InternalEObject oldOverride = (InternalEObject)override;
-      override = (XAttributeType)eResolveProxy(oldOverride);
-      if (override != oldOverride)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE, oldOverride, override));
+      if (override != null && override.eIsProxy()) {
+         InternalEObject oldOverride = (InternalEObject)override;
+         override = (XAttributeType)eResolveProxy(oldOverride);
+         if (override != oldOverride) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE, oldOverride, override));
+         }
       }
-    }
-    return override;
-  }
+      return override;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType basicGetOverride()
   {
-    return override;
-  }
+      return override;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOverride(XAttributeType newOverride)
   {
-    XAttributeType oldOverride = override;
-    override = newOverride;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE, oldOverride, override));
-  }
+      XAttributeType oldOverride = override;
+      override = newOverride;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE, oldOverride, override));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDataProvider()
   {
-    return dataProvider;
-  }
+      return dataProvider;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDataProvider(String newDataProvider)
   {
-    String oldDataProvider = dataProvider;
-    dataProvider = newDataProvider;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER, oldDataProvider, dataProvider));
-  }
+      String oldDataProvider = dataProvider;
+      dataProvider = newDataProvider;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER, oldDataProvider, dataProvider));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getMin()
   {
-    return min;
-  }
+      return min;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setMin(String newMin)
   {
-    String oldMin = min;
-    min = newMin;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MIN, oldMin, min));
-  }
+      String oldMin = min;
+      min = newMin;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MIN, oldMin, min));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getMax()
   {
-    return max;
-  }
+      return max;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setMax(String newMax)
   {
-    String oldMax = max;
-    max = newMax;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MAX, oldMax, max));
-  }
+      String oldMax = max;
+      max = newMax;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MAX, oldMax, max));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getTaggerId()
   {
-    return taggerId;
-  }
+      return taggerId;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setTaggerId(String newTaggerId)
   {
-    String oldTaggerId = taggerId;
-    taggerId = newTaggerId;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID, oldTaggerId, taggerId));
-  }
+      String oldTaggerId = taggerId;
+      taggerId = newTaggerId;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID, oldTaggerId, taggerId));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumType getEnumType()
   {
-    if (enumType != null && enumType.eIsProxy())
-    {
-      InternalEObject oldEnumType = (InternalEObject)enumType;
-      enumType = (XOseeEnumType)eResolveProxy(oldEnumType);
-      if (enumType != oldEnumType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE, oldEnumType, enumType));
+      if (enumType != null && enumType.eIsProxy()) {
+         InternalEObject oldEnumType = (InternalEObject)enumType;
+         enumType = (XOseeEnumType)eResolveProxy(oldEnumType);
+         if (enumType != oldEnumType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE, oldEnumType, enumType));
+         }
       }
-    }
-    return enumType;
-  }
+      return enumType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumType basicGetEnumType()
   {
-    return enumType;
-  }
+      return enumType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setEnumType(XOseeEnumType newEnumType)
   {
-    XOseeEnumType oldEnumType = enumType;
-    enumType = newEnumType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE, oldEnumType, enumType));
-  }
+      XOseeEnumType oldEnumType = enumType;
+      enumType = newEnumType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE, oldEnumType, enumType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDescription()
   {
-    return description;
-  }
+      return description;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDescription(String newDescription)
   {
-    String oldDescription = description;
-    description = newDescription;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION, oldDescription, description));
-  }
+      String oldDescription = description;
+      description = newDescription;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION, oldDescription, description));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDefaultValue()
   {
-    return defaultValue;
-  }
+      return defaultValue;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDefaultValue(String newDefaultValue)
   {
-    String oldDefaultValue = defaultValue;
-    defaultValue = newDefaultValue;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE, oldDefaultValue, defaultValue));
-  }
+      String oldDefaultValue = defaultValue;
+      defaultValue = newDefaultValue;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE, oldDefaultValue, defaultValue));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getFileExtension()
   {
-    return fileExtension;
-  }
+      return fileExtension;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setFileExtension(String newFileExtension)
   {
-    String oldFileExtension = fileExtension;
-    fileExtension = newFileExtension;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION, oldFileExtension, fileExtension));
-  }
+      String oldFileExtension = fileExtension;
+      fileExtension = newFileExtension;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION, oldFileExtension, fileExtension));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getMediaType()
   {
-    return mediaType;
-  }
+      return mediaType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setMediaType(String newMediaType)
   {
-    String oldMediaType = mediaType;
-    mediaType = newMediaType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE, oldMediaType, mediaType));
-  }
+      String oldMediaType = mediaType;
+      mediaType = newMediaType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE, oldMediaType, mediaType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
-        return getBaseAttributeType();
-      case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
-        if (resolve) return getOverride();
-        return basicGetOverride();
-      case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
-        return getDataProvider();
-      case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
-        return getMin();
-      case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
-        return getMax();
-      case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
-        return getTaggerId();
-      case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
-        if (resolve) return getEnumType();
-        return basicGetEnumType();
-      case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
-        return getDescription();
-      case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
-        return getDefaultValue();
-      case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
-        return getFileExtension();
-      case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
-        return getMediaType();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
+            return getBaseAttributeType();
+         case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
+            if (resolve) return getOverride();
+            return basicGetOverride();
+         case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
+            return getDataProvider();
+         case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
+            return getMin();
+         case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
+            return getMax();
+         case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
+            return getTaggerId();
+         case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
+            if (resolve) return getEnumType();
+            return basicGetEnumType();
+         case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
+            return getDescription();
+         case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
+            return getDefaultValue();
+         case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
+            return getFileExtension();
+         case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
+            return getMediaType();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
-        setBaseAttributeType((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
-        setOverride((XAttributeType)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
-        setDataProvider((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
-        setMin((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
-        setMax((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
-        setTaggerId((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
-        setEnumType((XOseeEnumType)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
-        setDescription((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
-        setDefaultValue((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
-        setFileExtension((String)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
-        setMediaType((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
+            setBaseAttributeType((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
+            setOverride((XAttributeType)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
+            setDataProvider((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
+            setMin((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
+            setMax((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
+            setTaggerId((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
+            setEnumType((XOseeEnumType)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
+            setDescription((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
+            setDefaultValue((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
+            setFileExtension((String)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
+            setMediaType((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
-        setBaseAttributeType(BASE_ATTRIBUTE_TYPE_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
-        setOverride((XAttributeType)null);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
-        setDataProvider(DATA_PROVIDER_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
-        setMin(MIN_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
-        setMax(MAX_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
-        setTaggerId(TAGGER_ID_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
-        setEnumType((XOseeEnumType)null);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
-        setDescription(DESCRIPTION_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
-        setDefaultValue(DEFAULT_VALUE_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
-        setFileExtension(FILE_EXTENSION_EDEFAULT);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
-        setMediaType(MEDIA_TYPE_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
+            setBaseAttributeType(BASE_ATTRIBUTE_TYPE_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
+            setOverride((XAttributeType)null);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
+            setDataProvider(DATA_PROVIDER_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
+            setMin(MIN_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
+            setMax(MAX_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
+            setTaggerId(TAGGER_ID_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
+            setEnumType((XOseeEnumType)null);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
+            setDescription(DESCRIPTION_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
+            setDefaultValue(DEFAULT_VALUE_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
+            setFileExtension(FILE_EXTENSION_EDEFAULT);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
+            setMediaType(MEDIA_TYPE_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
-        return BASE_ATTRIBUTE_TYPE_EDEFAULT == null ? baseAttributeType != null : !BASE_ATTRIBUTE_TYPE_EDEFAULT.equals(baseAttributeType);
-      case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
-        return override != null;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
-        return DATA_PROVIDER_EDEFAULT == null ? dataProvider != null : !DATA_PROVIDER_EDEFAULT.equals(dataProvider);
-      case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
-        return MIN_EDEFAULT == null ? min != null : !MIN_EDEFAULT.equals(min);
-      case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
-        return MAX_EDEFAULT == null ? max != null : !MAX_EDEFAULT.equals(max);
-      case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
-        return TAGGER_ID_EDEFAULT == null ? taggerId != null : !TAGGER_ID_EDEFAULT.equals(taggerId);
-      case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
-        return enumType != null;
-      case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
-        return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-      case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
-        return DEFAULT_VALUE_EDEFAULT == null ? defaultValue != null : !DEFAULT_VALUE_EDEFAULT.equals(defaultValue);
-      case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
-        return FILE_EXTENSION_EDEFAULT == null ? fileExtension != null : !FILE_EXTENSION_EDEFAULT.equals(fileExtension);
-      case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
-        return MEDIA_TYPE_EDEFAULT == null ? mediaType != null : !MEDIA_TYPE_EDEFAULT.equals(mediaType);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE__BASE_ATTRIBUTE_TYPE:
+            return BASE_ATTRIBUTE_TYPE_EDEFAULT == null ? baseAttributeType != null : !BASE_ATTRIBUTE_TYPE_EDEFAULT.equals(baseAttributeType);
+         case OseeDslPackage.XATTRIBUTE_TYPE__OVERRIDE:
+            return override != null;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DATA_PROVIDER:
+            return DATA_PROVIDER_EDEFAULT == null ? dataProvider != null : !DATA_PROVIDER_EDEFAULT.equals(dataProvider);
+         case OseeDslPackage.XATTRIBUTE_TYPE__MIN:
+            return MIN_EDEFAULT == null ? min != null : !MIN_EDEFAULT.equals(min);
+         case OseeDslPackage.XATTRIBUTE_TYPE__MAX:
+            return MAX_EDEFAULT == null ? max != null : !MAX_EDEFAULT.equals(max);
+         case OseeDslPackage.XATTRIBUTE_TYPE__TAGGER_ID:
+            return TAGGER_ID_EDEFAULT == null ? taggerId != null : !TAGGER_ID_EDEFAULT.equals(taggerId);
+         case OseeDslPackage.XATTRIBUTE_TYPE__ENUM_TYPE:
+            return enumType != null;
+         case OseeDslPackage.XATTRIBUTE_TYPE__DESCRIPTION:
+            return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+         case OseeDslPackage.XATTRIBUTE_TYPE__DEFAULT_VALUE:
+            return DEFAULT_VALUE_EDEFAULT == null ? defaultValue != null : !DEFAULT_VALUE_EDEFAULT.equals(defaultValue);
+         case OseeDslPackage.XATTRIBUTE_TYPE__FILE_EXTENSION:
+            return FILE_EXTENSION_EDEFAULT == null ? fileExtension != null : !FILE_EXTENSION_EDEFAULT.equals(fileExtension);
+         case OseeDslPackage.XATTRIBUTE_TYPE__MEDIA_TYPE:
+            return MEDIA_TYPE_EDEFAULT == null ? mediaType != null : !MEDIA_TYPE_EDEFAULT.equals(mediaType);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (baseAttributeType: ");
-    result.append(baseAttributeType);
-    result.append(", dataProvider: ");
-    result.append(dataProvider);
-    result.append(", min: ");
-    result.append(min);
-    result.append(", max: ");
-    result.append(max);
-    result.append(", taggerId: ");
-    result.append(taggerId);
-    result.append(", description: ");
-    result.append(description);
-    result.append(", defaultValue: ");
-    result.append(defaultValue);
-    result.append(", fileExtension: ");
-    result.append(fileExtension);
-    result.append(", mediaType: ");
-    result.append(mediaType);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (baseAttributeType: ");
+      result.append(baseAttributeType);
+      result.append(", dataProvider: ");
+      result.append(dataProvider);
+      result.append(", min: ");
+      result.append(min);
+      result.append(", max: ");
+      result.append(max);
+      result.append(", taggerId: ");
+      result.append(taggerId);
+      result.append(", description: ");
+      result.append(description);
+      result.append(", defaultValue: ");
+      result.append(defaultValue);
+      result.append(", fileExtension: ");
+      result.append(fileExtension);
+      result.append(", mediaType: ");
+      result.append(mediaType);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XAttributeTypeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeRefImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeRefImpl.java
index 915ec4d..5a293f5 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeRefImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XAttributeTypeRefImpl.java
@@ -31,214 +31,208 @@
 public class XAttributeTypeRefImpl extends MinimalEObjectImpl.Container implements XAttributeTypeRef
 {
   /**
-   * The cached value of the '{@link #getValidAttributeType() <em>Valid Attribute Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getValidAttributeType() <em>Valid Attribute Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getValidAttributeType()
-   * @generated
-   * @ordered
-   */
+    * @see #getValidAttributeType()
+    * @generated
+    * @ordered
+    */
   protected XAttributeType validAttributeType;
 
   /**
-   * The default value of the '{@link #getBranchGuid() <em>Branch Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getBranchGuid() <em>Branch Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getBranchGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getBranchGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String BRANCH_GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getBranchGuid() <em>Branch Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getBranchGuid() <em>Branch Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getBranchGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getBranchGuid()
+    * @generated
+    * @ordered
+    */
   protected String branchGuid = BRANCH_GUID_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XAttributeTypeRefImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XATTRIBUTE_TYPE_REF;
-  }
+      return OseeDslPackage.Literals.XATTRIBUTE_TYPE_REF;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType getValidAttributeType()
   {
-    if (validAttributeType != null && validAttributeType.eIsProxy())
-    {
-      InternalEObject oldValidAttributeType = (InternalEObject)validAttributeType;
-      validAttributeType = (XAttributeType)eResolveProxy(oldValidAttributeType);
-      if (validAttributeType != oldValidAttributeType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE, oldValidAttributeType, validAttributeType));
+      if (validAttributeType != null && validAttributeType.eIsProxy()) {
+         InternalEObject oldValidAttributeType = (InternalEObject)validAttributeType;
+         validAttributeType = (XAttributeType)eResolveProxy(oldValidAttributeType);
+         if (validAttributeType != oldValidAttributeType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE, oldValidAttributeType, validAttributeType));
+         }
       }
-    }
-    return validAttributeType;
-  }
+      return validAttributeType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XAttributeType basicGetValidAttributeType()
   {
-    return validAttributeType;
-  }
+      return validAttributeType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setValidAttributeType(XAttributeType newValidAttributeType)
   {
-    XAttributeType oldValidAttributeType = validAttributeType;
-    validAttributeType = newValidAttributeType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE, oldValidAttributeType, validAttributeType));
-  }
+      XAttributeType oldValidAttributeType = validAttributeType;
+      validAttributeType = newValidAttributeType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE, oldValidAttributeType, validAttributeType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getBranchGuid()
   {
-    return branchGuid;
-  }
+      return branchGuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setBranchGuid(String newBranchGuid)
   {
-    String oldBranchGuid = branchGuid;
-    branchGuid = newBranchGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID, oldBranchGuid, branchGuid));
-  }
+      String oldBranchGuid = branchGuid;
+      branchGuid = newBranchGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID, oldBranchGuid, branchGuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
-        if (resolve) return getValidAttributeType();
-        return basicGetValidAttributeType();
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
-        return getBranchGuid();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
+            if (resolve) return getValidAttributeType();
+            return basicGetValidAttributeType();
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
+            return getBranchGuid();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
-        setValidAttributeType((XAttributeType)newValue);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
-        setBranchGuid((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
+            setValidAttributeType((XAttributeType)newValue);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
+            setBranchGuid((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
-        setValidAttributeType((XAttributeType)null);
-        return;
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
-        setBranchGuid(BRANCH_GUID_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
+            setValidAttributeType((XAttributeType)null);
+            return;
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
+            setBranchGuid(BRANCH_GUID_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
-        return validAttributeType != null;
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
-        return BRANCH_GUID_EDEFAULT == null ? branchGuid != null : !BRANCH_GUID_EDEFAULT.equals(branchGuid);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__VALID_ATTRIBUTE_TYPE:
+            return validAttributeType != null;
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF__BRANCH_GUID:
+            return BRANCH_GUID_EDEFAULT == null ? branchGuid != null : !BRANCH_GUID_EDEFAULT.equals(branchGuid);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (branchGuid: ");
-    result.append(branchGuid);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (branchGuid: ");
+      result.append(branchGuid);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XAttributeTypeRefImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeArtifactTypeOverrideImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeArtifactTypeOverrideImpl.java
index a7d9f4a..6649f05 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeArtifactTypeOverrideImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeArtifactTypeOverrideImpl.java
@@ -41,266 +41,258 @@
 public class XOseeArtifactTypeOverrideImpl extends MinimalEObjectImpl.Container implements XOseeArtifactTypeOverride
 {
   /**
-   * The cached value of the '{@link #getOverridenArtifactType() <em>Overriden Artifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOverridenArtifactType() <em>Overriden Artifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOverridenArtifactType()
-   * @generated
-   * @ordered
-   */
+    * @see #getOverridenArtifactType()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType overridenArtifactType;
 
   /**
-   * The default value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isInheritAll()
-   * @generated
-   * @ordered
-   */
+    * @see #isInheritAll()
+    * @generated
+    * @ordered
+    */
   protected static final boolean INHERIT_ALL_EDEFAULT = false;
 
   /**
-   * The cached value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isInheritAll()
-   * @generated
-   * @ordered
-   */
+    * @see #isInheritAll()
+    * @generated
+    * @ordered
+    */
   protected boolean inheritAll = INHERIT_ALL_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getOverrideOptions() <em>Override Options</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOverrideOptions() <em>Override Options</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOverrideOptions()
-   * @generated
-   * @ordered
-   */
+    * @see #getOverrideOptions()
+    * @generated
+    * @ordered
+    */
   protected EList<AttributeOverrideOption> overrideOptions;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XOseeArtifactTypeOverrideImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XOSEE_ARTIFACT_TYPE_OVERRIDE;
-  }
+      return OseeDslPackage.Literals.XOSEE_ARTIFACT_TYPE_OVERRIDE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getOverridenArtifactType()
   {
-    if (overridenArtifactType != null && overridenArtifactType.eIsProxy())
-    {
-      InternalEObject oldOverridenArtifactType = (InternalEObject)overridenArtifactType;
-      overridenArtifactType = (XArtifactType)eResolveProxy(oldOverridenArtifactType);
-      if (overridenArtifactType != oldOverridenArtifactType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE, oldOverridenArtifactType, overridenArtifactType));
+      if (overridenArtifactType != null && overridenArtifactType.eIsProxy()) {
+         InternalEObject oldOverridenArtifactType = (InternalEObject)overridenArtifactType;
+         overridenArtifactType = (XArtifactType)eResolveProxy(oldOverridenArtifactType);
+         if (overridenArtifactType != oldOverridenArtifactType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE, oldOverridenArtifactType, overridenArtifactType));
+         }
       }
-    }
-    return overridenArtifactType;
-  }
+      return overridenArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetOverridenArtifactType()
   {
-    return overridenArtifactType;
-  }
+      return overridenArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOverridenArtifactType(XArtifactType newOverridenArtifactType)
   {
-    XArtifactType oldOverridenArtifactType = overridenArtifactType;
-    overridenArtifactType = newOverridenArtifactType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE, oldOverridenArtifactType, overridenArtifactType));
-  }
+      XArtifactType oldOverridenArtifactType = overridenArtifactType;
+      overridenArtifactType = newOverridenArtifactType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE, oldOverridenArtifactType, overridenArtifactType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public boolean isInheritAll()
   {
-    return inheritAll;
-  }
+      return inheritAll;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setInheritAll(boolean newInheritAll)
   {
-    boolean oldInheritAll = inheritAll;
-    inheritAll = newInheritAll;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL, oldInheritAll, inheritAll));
-  }
+      boolean oldInheritAll = inheritAll;
+      inheritAll = newInheritAll;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL, oldInheritAll, inheritAll));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<AttributeOverrideOption> getOverrideOptions()
   {
-    if (overrideOptions == null)
-    {
-      overrideOptions = new EObjectContainmentEList<AttributeOverrideOption>(AttributeOverrideOption.class, this, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS);
-    }
-    return overrideOptions;
-  }
+      if (overrideOptions == null) {
+         overrideOptions = new EObjectContainmentEList<AttributeOverrideOption>(AttributeOverrideOption.class, this, OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS);
+      }
+      return overrideOptions;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
-        return ((InternalEList<?>)getOverrideOptions()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
+            return ((InternalEList<?>)getOverrideOptions()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
-        if (resolve) return getOverridenArtifactType();
-        return basicGetOverridenArtifactType();
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
-        return isInheritAll();
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
-        return getOverrideOptions();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
+            if (resolve) return getOverridenArtifactType();
+            return basicGetOverridenArtifactType();
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
+            return isInheritAll();
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
+            return getOverrideOptions();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
-        setOverridenArtifactType((XArtifactType)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
-        setInheritAll((Boolean)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
-        getOverrideOptions().clear();
-        getOverrideOptions().addAll((Collection<? extends AttributeOverrideOption>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
+            setOverridenArtifactType((XArtifactType)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
+            setInheritAll((Boolean)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
+            getOverrideOptions().clear();
+            getOverrideOptions().addAll((Collection<? extends AttributeOverrideOption>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
-        setOverridenArtifactType((XArtifactType)null);
-        return;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
-        setInheritAll(INHERIT_ALL_EDEFAULT);
-        return;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
-        getOverrideOptions().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
+            setOverridenArtifactType((XArtifactType)null);
+            return;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
+            setInheritAll(INHERIT_ALL_EDEFAULT);
+            return;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
+            getOverrideOptions().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
-        return overridenArtifactType != null;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
-        return inheritAll != INHERIT_ALL_EDEFAULT;
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
-        return overrideOptions != null && !overrideOptions.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDEN_ARTIFACT_TYPE:
+            return overridenArtifactType != null;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__INHERIT_ALL:
+            return inheritAll != INHERIT_ALL_EDEFAULT;
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE__OVERRIDE_OPTIONS:
+            return overrideOptions != null && !overrideOptions.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (inheritAll: ");
-    result.append(inheritAll);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (inheritAll: ");
+      result.append(inheritAll);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XOseeArtifactTypeOverrideImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumEntryImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumEntryImpl.java
index 3102e51..d971734 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumEntryImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumEntryImpl.java
@@ -31,315 +31,311 @@
 public class XOseeEnumEntryImpl extends MinimalEObjectImpl.Container implements XOseeEnumEntry
 {
   /**
-   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected static final String NAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getName()
-   * @generated
-   * @ordered
-   */
+    * @see #getName()
+    * @generated
+    * @ordered
+    */
   protected String name = NAME_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOrdinal()
-   * @generated
-   * @ordered
-   */
+    * @see #getOrdinal()
+    * @generated
+    * @ordered
+    */
   protected static final String ORDINAL_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOrdinal() <em>Ordinal</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOrdinal()
-   * @generated
-   * @ordered
-   */
+    * @see #getOrdinal()
+    * @generated
+    * @ordered
+    */
   protected String ordinal = ORDINAL_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEntryGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getEntryGuid()
+    * @generated
+    * @ordered
+    */
   protected static final String ENTRY_GUID_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEntryGuid() <em>Entry Guid</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEntryGuid()
-   * @generated
-   * @ordered
-   */
+    * @see #getEntryGuid()
+    * @generated
+    * @ordered
+    */
   protected String entryGuid = ENTRY_GUID_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected static final String DESCRIPTION_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDescription()
-   * @generated
-   * @ordered
-   */
+    * @see #getDescription()
+    * @generated
+    * @ordered
+    */
   protected String description = DESCRIPTION_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XOseeEnumEntryImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XOSEE_ENUM_ENTRY;
-  }
+      return OseeDslPackage.Literals.XOSEE_ENUM_ENTRY;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getName()
   {
-    return name;
-  }
+      return name;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setName(String newName)
   {
-    String oldName = name;
-    name = newName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__NAME, oldName, name));
-  }
+      String oldName = name;
+      name = newName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__NAME, oldName, name));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getOrdinal()
   {
-    return ordinal;
-  }
+      return ordinal;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOrdinal(String newOrdinal)
   {
-    String oldOrdinal = ordinal;
-    ordinal = newOrdinal;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL, oldOrdinal, ordinal));
-  }
+      String oldOrdinal = ordinal;
+      ordinal = newOrdinal;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL, oldOrdinal, ordinal));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getEntryGuid()
   {
-    return entryGuid;
-  }
+      return entryGuid;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setEntryGuid(String newEntryGuid)
   {
-    String oldEntryGuid = entryGuid;
-    entryGuid = newEntryGuid;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID, oldEntryGuid, entryGuid));
-  }
+      String oldEntryGuid = entryGuid;
+      entryGuid = newEntryGuid;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID, oldEntryGuid, entryGuid));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDescription()
   {
-    return description;
-  }
+      return description;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDescription(String newDescription)
   {
-    String oldDescription = description;
-    description = newDescription;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION, oldDescription, description));
-  }
+      String oldDescription = description;
+      description = newDescription;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION, oldDescription, description));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
-        return getName();
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
-        return getOrdinal();
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
-        return getEntryGuid();
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
-        return getDescription();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
+            return getName();
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
+            return getOrdinal();
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
+            return getEntryGuid();
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
+            return getDescription();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
-        setName((String)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
-        setOrdinal((String)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
-        setEntryGuid((String)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
-        setDescription((String)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
+            setName((String)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
+            setOrdinal((String)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
+            setEntryGuid((String)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
+            setDescription((String)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
-        setName(NAME_EDEFAULT);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
-        setOrdinal(ORDINAL_EDEFAULT);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
-        setEntryGuid(ENTRY_GUID_EDEFAULT);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
-        setDescription(DESCRIPTION_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
+            setName(NAME_EDEFAULT);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
+            setOrdinal(ORDINAL_EDEFAULT);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
+            setEntryGuid(ENTRY_GUID_EDEFAULT);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
+            setDescription(DESCRIPTION_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
-        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
-        return ORDINAL_EDEFAULT == null ? ordinal != null : !ORDINAL_EDEFAULT.equals(ordinal);
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
-        return ENTRY_GUID_EDEFAULT == null ? entryGuid != null : !ENTRY_GUID_EDEFAULT.equals(entryGuid);
-      case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
-        return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__NAME:
+            return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ORDINAL:
+            return ORDINAL_EDEFAULT == null ? ordinal != null : !ORDINAL_EDEFAULT.equals(ordinal);
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__ENTRY_GUID:
+            return ENTRY_GUID_EDEFAULT == null ? entryGuid != null : !ENTRY_GUID_EDEFAULT.equals(entryGuid);
+         case OseeDslPackage.XOSEE_ENUM_ENTRY__DESCRIPTION:
+            return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (name: ");
-    result.append(name);
-    result.append(", ordinal: ");
-    result.append(ordinal);
-    result.append(", entryGuid: ");
-    result.append(entryGuid);
-    result.append(", description: ");
-    result.append(description);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (name: ");
+      result.append(name);
+      result.append(", ordinal: ");
+      result.append(ordinal);
+      result.append(", entryGuid: ");
+      result.append(entryGuid);
+      result.append(", description: ");
+      result.append(description);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XOseeEnumEntryImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumOverrideImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumOverrideImpl.java
index a790011..8e42a1f 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumOverrideImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumOverrideImpl.java
@@ -40,266 +40,258 @@
 public class XOseeEnumOverrideImpl extends OseeElementImpl implements XOseeEnumOverride
 {
   /**
-   * The cached value of the '{@link #getOverridenEnumType() <em>Overriden Enum Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOverridenEnumType() <em>Overriden Enum Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOverridenEnumType()
-   * @generated
-   * @ordered
-   */
+    * @see #getOverridenEnumType()
+    * @generated
+    * @ordered
+    */
   protected XOseeEnumType overridenEnumType;
 
   /**
-   * The default value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isInheritAll()
-   * @generated
-   * @ordered
-   */
+    * @see #isInheritAll()
+    * @generated
+    * @ordered
+    */
   protected static final boolean INHERIT_ALL_EDEFAULT = false;
 
   /**
-   * The cached value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #isInheritAll() <em>Inherit All</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #isInheritAll()
-   * @generated
-   * @ordered
-   */
+    * @see #isInheritAll()
+    * @generated
+    * @ordered
+    */
   protected boolean inheritAll = INHERIT_ALL_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getOverrideOptions() <em>Override Options</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getOverrideOptions() <em>Override Options</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getOverrideOptions()
-   * @generated
-   * @ordered
-   */
+    * @see #getOverrideOptions()
+    * @generated
+    * @ordered
+    */
   protected EList<OverrideOption> overrideOptions;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XOseeEnumOverrideImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XOSEE_ENUM_OVERRIDE;
-  }
+      return OseeDslPackage.Literals.XOSEE_ENUM_OVERRIDE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumType getOverridenEnumType()
   {
-    if (overridenEnumType != null && overridenEnumType.eIsProxy())
-    {
-      InternalEObject oldOverridenEnumType = (InternalEObject)overridenEnumType;
-      overridenEnumType = (XOseeEnumType)eResolveProxy(oldOverridenEnumType);
-      if (overridenEnumType != oldOverridenEnumType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE, oldOverridenEnumType, overridenEnumType));
+      if (overridenEnumType != null && overridenEnumType.eIsProxy()) {
+         InternalEObject oldOverridenEnumType = (InternalEObject)overridenEnumType;
+         overridenEnumType = (XOseeEnumType)eResolveProxy(oldOverridenEnumType);
+         if (overridenEnumType != oldOverridenEnumType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE, oldOverridenEnumType, overridenEnumType));
+         }
       }
-    }
-    return overridenEnumType;
-  }
+      return overridenEnumType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XOseeEnumType basicGetOverridenEnumType()
   {
-    return overridenEnumType;
-  }
+      return overridenEnumType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setOverridenEnumType(XOseeEnumType newOverridenEnumType)
   {
-    XOseeEnumType oldOverridenEnumType = overridenEnumType;
-    overridenEnumType = newOverridenEnumType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE, oldOverridenEnumType, overridenEnumType));
-  }
+      XOseeEnumType oldOverridenEnumType = overridenEnumType;
+      overridenEnumType = newOverridenEnumType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE, oldOverridenEnumType, overridenEnumType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public boolean isInheritAll()
   {
-    return inheritAll;
-  }
+      return inheritAll;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setInheritAll(boolean newInheritAll)
   {
-    boolean oldInheritAll = inheritAll;
-    inheritAll = newInheritAll;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL, oldInheritAll, inheritAll));
-  }
+      boolean oldInheritAll = inheritAll;
+      inheritAll = newInheritAll;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL, oldInheritAll, inheritAll));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<OverrideOption> getOverrideOptions()
   {
-    if (overrideOptions == null)
-    {
-      overrideOptions = new EObjectContainmentEList<OverrideOption>(OverrideOption.class, this, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS);
-    }
-    return overrideOptions;
-  }
+      if (overrideOptions == null) {
+         overrideOptions = new EObjectContainmentEList<OverrideOption>(OverrideOption.class, this, OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS);
+      }
+      return overrideOptions;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
-        return ((InternalEList<?>)getOverrideOptions()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
+            return ((InternalEList<?>)getOverrideOptions()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
-        if (resolve) return getOverridenEnumType();
-        return basicGetOverridenEnumType();
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
-        return isInheritAll();
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
-        return getOverrideOptions();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
+            if (resolve) return getOverridenEnumType();
+            return basicGetOverridenEnumType();
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
+            return isInheritAll();
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
+            return getOverrideOptions();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
-        setOverridenEnumType((XOseeEnumType)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
-        setInheritAll((Boolean)newValue);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
-        getOverrideOptions().clear();
-        getOverrideOptions().addAll((Collection<? extends OverrideOption>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
+            setOverridenEnumType((XOseeEnumType)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
+            setInheritAll((Boolean)newValue);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
+            getOverrideOptions().clear();
+            getOverrideOptions().addAll((Collection<? extends OverrideOption>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
-        setOverridenEnumType((XOseeEnumType)null);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
-        setInheritAll(INHERIT_ALL_EDEFAULT);
-        return;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
-        getOverrideOptions().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
+            setOverridenEnumType((XOseeEnumType)null);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
+            setInheritAll(INHERIT_ALL_EDEFAULT);
+            return;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
+            getOverrideOptions().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
-        return overridenEnumType != null;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
-        return inheritAll != INHERIT_ALL_EDEFAULT;
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
-        return overrideOptions != null && !overrideOptions.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDEN_ENUM_TYPE:
+            return overridenEnumType != null;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__INHERIT_ALL:
+            return inheritAll != INHERIT_ALL_EDEFAULT;
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE__OVERRIDE_OPTIONS:
+            return overrideOptions != null && !overrideOptions.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (inheritAll: ");
-    result.append(inheritAll);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (inheritAll: ");
+      result.append(inheritAll);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XOseeEnumOverrideImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumTypeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumTypeImpl.java
index b13bbf3..99ebf49 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumTypeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XOseeEnumTypeImpl.java
@@ -34,132 +34,126 @@
 public class XOseeEnumTypeImpl extends OseeTypeImpl implements XOseeEnumType
 {
   /**
-   * The cached value of the '{@link #getEnumEntries() <em>Enum Entries</em>}' containment reference list.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getEnumEntries() <em>Enum Entries</em>}' containment reference list.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getEnumEntries()
-   * @generated
-   * @ordered
-   */
+    * @see #getEnumEntries()
+    * @generated
+    * @ordered
+    */
   protected EList<XOseeEnumEntry> enumEntries;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XOseeEnumTypeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XOSEE_ENUM_TYPE;
-  }
+      return OseeDslPackage.Literals.XOSEE_ENUM_TYPE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public EList<XOseeEnumEntry> getEnumEntries()
   {
-    if (enumEntries == null)
-    {
-      enumEntries = new EObjectContainmentEList<XOseeEnumEntry>(XOseeEnumEntry.class, this, OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES);
-    }
-    return enumEntries;
-  }
+      if (enumEntries == null) {
+         enumEntries = new EObjectContainmentEList<XOseeEnumEntry>(XOseeEnumEntry.class, this, OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES);
+      }
+      return enumEntries;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
-        return ((InternalEList<?>)getEnumEntries()).basicRemove(otherEnd, msgs);
-    }
-    return super.eInverseRemove(otherEnd, featureID, msgs);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
+            return ((InternalEList<?>)getEnumEntries()).basicRemove(otherEnd, msgs);
+      }
+      return super.eInverseRemove(otherEnd, featureID, msgs);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
-        return getEnumEntries();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
+            return getEnumEntries();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @SuppressWarnings("unchecked")
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
-        getEnumEntries().clear();
-        getEnumEntries().addAll((Collection<? extends XOseeEnumEntry>)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
+            getEnumEntries().clear();
+            getEnumEntries().addAll((Collection<? extends XOseeEnumEntry>)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
-        getEnumEntries().clear();
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
+            getEnumEntries().clear();
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
-        return enumEntries != null && !enumEntries.isEmpty();
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XOSEE_ENUM_TYPE__ENUM_ENTRIES:
+            return enumEntries != null && !enumEntries.isEmpty();
+      }
+      return super.eIsSet(featureID);
+   }
 
 } //XOseeEnumTypeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XRelationTypeImpl.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XRelationTypeImpl.java
index d7db3e7..bf037d6 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XRelationTypeImpl.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/impl/XRelationTypeImpl.java
@@ -35,443 +35,435 @@
 public class XRelationTypeImpl extends OseeTypeImpl implements XRelationType
 {
   /**
-   * The default value of the '{@link #getSideAName() <em>Side AName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getSideAName() <em>Side AName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideAName()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideAName()
+    * @generated
+    * @ordered
+    */
   protected static final String SIDE_ANAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getSideAName() <em>Side AName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSideAName() <em>Side AName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideAName()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideAName()
+    * @generated
+    * @ordered
+    */
   protected String sideAName = SIDE_ANAME_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getSideAArtifactType() <em>Side AArtifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSideAArtifactType() <em>Side AArtifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideAArtifactType()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideAArtifactType()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType sideAArtifactType;
 
   /**
-   * The default value of the '{@link #getSideBName() <em>Side BName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getSideBName() <em>Side BName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideBName()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideBName()
+    * @generated
+    * @ordered
+    */
   protected static final String SIDE_BNAME_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getSideBName() <em>Side BName</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSideBName() <em>Side BName</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideBName()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideBName()
+    * @generated
+    * @ordered
+    */
   protected String sideBName = SIDE_BNAME_EDEFAULT;
 
   /**
-   * The cached value of the '{@link #getSideBArtifactType() <em>Side BArtifact Type</em>}' reference.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getSideBArtifactType() <em>Side BArtifact Type</em>}' reference.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getSideBArtifactType()
-   * @generated
-   * @ordered
-   */
+    * @see #getSideBArtifactType()
+    * @generated
+    * @ordered
+    */
   protected XArtifactType sideBArtifactType;
 
   /**
-   * The default value of the '{@link #getDefaultOrderType() <em>Default Order Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getDefaultOrderType() <em>Default Order Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDefaultOrderType()
-   * @generated
-   * @ordered
-   */
+    * @see #getDefaultOrderType()
+    * @generated
+    * @ordered
+    */
   protected static final String DEFAULT_ORDER_TYPE_EDEFAULT = null;
 
   /**
-   * The cached value of the '{@link #getDefaultOrderType() <em>Default Order Type</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getDefaultOrderType() <em>Default Order Type</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getDefaultOrderType()
-   * @generated
-   * @ordered
-   */
+    * @see #getDefaultOrderType()
+    * @generated
+    * @ordered
+    */
   protected String defaultOrderType = DEFAULT_ORDER_TYPE_EDEFAULT;
 
   /**
-   * The default value of the '{@link #getMultiplicity() <em>Multiplicity</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The default value of the '{@link #getMultiplicity() <em>Multiplicity</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMultiplicity()
-   * @generated
-   * @ordered
-   */
+    * @see #getMultiplicity()
+    * @generated
+    * @ordered
+    */
   protected static final RelationMultiplicityEnum MULTIPLICITY_EDEFAULT = RelationMultiplicityEnum.ONE_TO_ONE;
 
   /**
-   * The cached value of the '{@link #getMultiplicity() <em>Multiplicity</em>}' attribute.
-   * <!-- begin-user-doc -->
+    * The cached value of the '{@link #getMultiplicity() <em>Multiplicity</em>}' attribute.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @see #getMultiplicity()
-   * @generated
-   * @ordered
-   */
+    * @see #getMultiplicity()
+    * @generated
+    * @ordered
+    */
   protected RelationMultiplicityEnum multiplicity = MULTIPLICITY_EDEFAULT;
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected XRelationTypeImpl()
   {
-    super();
-  }
+      super();
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   protected EClass eStaticClass()
   {
-    return OseeDslPackage.Literals.XRELATION_TYPE;
-  }
+      return OseeDslPackage.Literals.XRELATION_TYPE;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getSideAName()
   {
-    return sideAName;
-  }
+      return sideAName;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setSideAName(String newSideAName)
   {
-    String oldSideAName = sideAName;
-    sideAName = newSideAName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_ANAME, oldSideAName, sideAName));
-  }
+      String oldSideAName = sideAName;
+      sideAName = newSideAName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_ANAME, oldSideAName, sideAName));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getSideAArtifactType()
   {
-    if (sideAArtifactType != null && sideAArtifactType.eIsProxy())
-    {
-      InternalEObject oldSideAArtifactType = (InternalEObject)sideAArtifactType;
-      sideAArtifactType = (XArtifactType)eResolveProxy(oldSideAArtifactType);
-      if (sideAArtifactType != oldSideAArtifactType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE, oldSideAArtifactType, sideAArtifactType));
+      if (sideAArtifactType != null && sideAArtifactType.eIsProxy()) {
+         InternalEObject oldSideAArtifactType = (InternalEObject)sideAArtifactType;
+         sideAArtifactType = (XArtifactType)eResolveProxy(oldSideAArtifactType);
+         if (sideAArtifactType != oldSideAArtifactType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE, oldSideAArtifactType, sideAArtifactType));
+         }
       }
-    }
-    return sideAArtifactType;
-  }
+      return sideAArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetSideAArtifactType()
   {
-    return sideAArtifactType;
-  }
+      return sideAArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setSideAArtifactType(XArtifactType newSideAArtifactType)
   {
-    XArtifactType oldSideAArtifactType = sideAArtifactType;
-    sideAArtifactType = newSideAArtifactType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE, oldSideAArtifactType, sideAArtifactType));
-  }
+      XArtifactType oldSideAArtifactType = sideAArtifactType;
+      sideAArtifactType = newSideAArtifactType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE, oldSideAArtifactType, sideAArtifactType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getSideBName()
   {
-    return sideBName;
-  }
+      return sideBName;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setSideBName(String newSideBName)
   {
-    String oldSideBName = sideBName;
-    sideBName = newSideBName;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_BNAME, oldSideBName, sideBName));
-  }
+      String oldSideBName = sideBName;
+      sideBName = newSideBName;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_BNAME, oldSideBName, sideBName));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType getSideBArtifactType()
   {
-    if (sideBArtifactType != null && sideBArtifactType.eIsProxy())
-    {
-      InternalEObject oldSideBArtifactType = (InternalEObject)sideBArtifactType;
-      sideBArtifactType = (XArtifactType)eResolveProxy(oldSideBArtifactType);
-      if (sideBArtifactType != oldSideBArtifactType)
-      {
-        if (eNotificationRequired())
-          eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE, oldSideBArtifactType, sideBArtifactType));
+      if (sideBArtifactType != null && sideBArtifactType.eIsProxy()) {
+         InternalEObject oldSideBArtifactType = (InternalEObject)sideBArtifactType;
+         sideBArtifactType = (XArtifactType)eResolveProxy(oldSideBArtifactType);
+         if (sideBArtifactType != oldSideBArtifactType) {
+            if (eNotificationRequired())
+               eNotify(new ENotificationImpl(this, Notification.RESOLVE, OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE, oldSideBArtifactType, sideBArtifactType));
+         }
       }
-    }
-    return sideBArtifactType;
-  }
+      return sideBArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public XArtifactType basicGetSideBArtifactType()
   {
-    return sideBArtifactType;
-  }
+      return sideBArtifactType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setSideBArtifactType(XArtifactType newSideBArtifactType)
   {
-    XArtifactType oldSideBArtifactType = sideBArtifactType;
-    sideBArtifactType = newSideBArtifactType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE, oldSideBArtifactType, sideBArtifactType));
-  }
+      XArtifactType oldSideBArtifactType = sideBArtifactType;
+      sideBArtifactType = newSideBArtifactType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE, oldSideBArtifactType, sideBArtifactType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public String getDefaultOrderType()
   {
-    return defaultOrderType;
-  }
+      return defaultOrderType;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setDefaultOrderType(String newDefaultOrderType)
   {
-    String oldDefaultOrderType = defaultOrderType;
-    defaultOrderType = newDefaultOrderType;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE, oldDefaultOrderType, defaultOrderType));
-  }
+      String oldDefaultOrderType = defaultOrderType;
+      defaultOrderType = newDefaultOrderType;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE, oldDefaultOrderType, defaultOrderType));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public RelationMultiplicityEnum getMultiplicity()
   {
-    return multiplicity;
-  }
+      return multiplicity;
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public void setMultiplicity(RelationMultiplicityEnum newMultiplicity)
   {
-    RelationMultiplicityEnum oldMultiplicity = multiplicity;
-    multiplicity = newMultiplicity == null ? MULTIPLICITY_EDEFAULT : newMultiplicity;
-    if (eNotificationRequired())
-      eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__MULTIPLICITY, oldMultiplicity, multiplicity));
-  }
+      RelationMultiplicityEnum oldMultiplicity = multiplicity;
+      multiplicity = newMultiplicity == null ? MULTIPLICITY_EDEFAULT : newMultiplicity;
+      if (eNotificationRequired())
+         eNotify(new ENotificationImpl(this, Notification.SET, OseeDslPackage.XRELATION_TYPE__MULTIPLICITY, oldMultiplicity, multiplicity));
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
-        return getSideAName();
-      case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
-        if (resolve) return getSideAArtifactType();
-        return basicGetSideAArtifactType();
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
-        return getSideBName();
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
-        if (resolve) return getSideBArtifactType();
-        return basicGetSideBArtifactType();
-      case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
-        return getDefaultOrderType();
-      case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
-        return getMultiplicity();
-    }
-    return super.eGet(featureID, resolve, coreType);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
+            return getSideAName();
+         case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
+            if (resolve) return getSideAArtifactType();
+            return basicGetSideAArtifactType();
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
+            return getSideBName();
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
+            if (resolve) return getSideBArtifactType();
+            return basicGetSideBArtifactType();
+         case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
+            return getDefaultOrderType();
+         case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
+            return getMultiplicity();
+      }
+      return super.eGet(featureID, resolve, coreType);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eSet(int featureID, Object newValue)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
-        setSideAName((String)newValue);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
-        setSideAArtifactType((XArtifactType)newValue);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
-        setSideBName((String)newValue);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
-        setSideBArtifactType((XArtifactType)newValue);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
-        setDefaultOrderType((String)newValue);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
-        setMultiplicity((RelationMultiplicityEnum)newValue);
-        return;
-    }
-    super.eSet(featureID, newValue);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
+            setSideAName((String)newValue);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
+            setSideAArtifactType((XArtifactType)newValue);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
+            setSideBName((String)newValue);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
+            setSideBArtifactType((XArtifactType)newValue);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
+            setDefaultOrderType((String)newValue);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
+            setMultiplicity((RelationMultiplicityEnum)newValue);
+            return;
+      }
+      super.eSet(featureID, newValue);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public void eUnset(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
-        setSideAName(SIDE_ANAME_EDEFAULT);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
-        setSideAArtifactType((XArtifactType)null);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
-        setSideBName(SIDE_BNAME_EDEFAULT);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
-        setSideBArtifactType((XArtifactType)null);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
-        setDefaultOrderType(DEFAULT_ORDER_TYPE_EDEFAULT);
-        return;
-      case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
-        setMultiplicity(MULTIPLICITY_EDEFAULT);
-        return;
-    }
-    super.eUnset(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
+            setSideAName(SIDE_ANAME_EDEFAULT);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
+            setSideAArtifactType((XArtifactType)null);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
+            setSideBName(SIDE_BNAME_EDEFAULT);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
+            setSideBArtifactType((XArtifactType)null);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
+            setDefaultOrderType(DEFAULT_ORDER_TYPE_EDEFAULT);
+            return;
+         case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
+            setMultiplicity(MULTIPLICITY_EDEFAULT);
+            return;
+      }
+      super.eUnset(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public boolean eIsSet(int featureID)
   {
-    switch (featureID)
-    {
-      case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
-        return SIDE_ANAME_EDEFAULT == null ? sideAName != null : !SIDE_ANAME_EDEFAULT.equals(sideAName);
-      case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
-        return sideAArtifactType != null;
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
-        return SIDE_BNAME_EDEFAULT == null ? sideBName != null : !SIDE_BNAME_EDEFAULT.equals(sideBName);
-      case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
-        return sideBArtifactType != null;
-      case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
-        return DEFAULT_ORDER_TYPE_EDEFAULT == null ? defaultOrderType != null : !DEFAULT_ORDER_TYPE_EDEFAULT.equals(defaultOrderType);
-      case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
-        return multiplicity != MULTIPLICITY_EDEFAULT;
-    }
-    return super.eIsSet(featureID);
-  }
+      switch (featureID) {
+         case OseeDslPackage.XRELATION_TYPE__SIDE_ANAME:
+            return SIDE_ANAME_EDEFAULT == null ? sideAName != null : !SIDE_ANAME_EDEFAULT.equals(sideAName);
+         case OseeDslPackage.XRELATION_TYPE__SIDE_AARTIFACT_TYPE:
+            return sideAArtifactType != null;
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BNAME:
+            return SIDE_BNAME_EDEFAULT == null ? sideBName != null : !SIDE_BNAME_EDEFAULT.equals(sideBName);
+         case OseeDslPackage.XRELATION_TYPE__SIDE_BARTIFACT_TYPE:
+            return sideBArtifactType != null;
+         case OseeDslPackage.XRELATION_TYPE__DEFAULT_ORDER_TYPE:
+            return DEFAULT_ORDER_TYPE_EDEFAULT == null ? defaultOrderType != null : !DEFAULT_ORDER_TYPE_EDEFAULT.equals(defaultOrderType);
+         case OseeDslPackage.XRELATION_TYPE__MULTIPLICITY:
+            return multiplicity != MULTIPLICITY_EDEFAULT;
+      }
+      return super.eIsSet(featureID);
+   }
 
   /**
-   * <!-- begin-user-doc -->
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   @Override
   public String toString()
   {
-    if (eIsProxy()) return super.toString();
+      if (eIsProxy()) return super.toString();
 
-    StringBuffer result = new StringBuffer(super.toString());
-    result.append(" (sideAName: ");
-    result.append(sideAName);
-    result.append(", sideBName: ");
-    result.append(sideBName);
-    result.append(", defaultOrderType: ");
-    result.append(defaultOrderType);
-    result.append(", multiplicity: ");
-    result.append(multiplicity);
-    result.append(')');
-    return result.toString();
-  }
+      StringBuffer result = new StringBuffer(super.toString());
+      result.append(" (sideAName: ");
+      result.append(sideAName);
+      result.append(", sideBName: ");
+      result.append(sideBName);
+      result.append(", defaultOrderType: ");
+      result.append(defaultOrderType);
+      result.append(", multiplicity: ");
+      result.append(multiplicity);
+      result.append(')');
+      return result.toString();
+   }
 
 } //XRelationTypeImpl
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslAdapterFactory.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslAdapterFactory.java
index 299e0fb..b981e7b 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslAdapterFactory.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslAdapterFactory.java
@@ -22,831 +22,789 @@
 public class OseeDslAdapterFactory extends AdapterFactoryImpl
 {
   /**
-   * The cached model package.
-   * <!-- begin-user-doc -->
+    * The cached model package.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected static OseeDslPackage modelPackage;
 
   /**
-   * Creates an instance of the adapter factory.
-   * <!-- begin-user-doc -->
+    * Creates an instance of the adapter factory.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDslAdapterFactory()
   {
-    if (modelPackage == null)
-    {
-      modelPackage = OseeDslPackage.eINSTANCE;
-    }
-  }
+      if (modelPackage == null) {
+         modelPackage = OseeDslPackage.eINSTANCE;
+      }
+   }
 
   /**
-   * Returns whether this factory is applicable for the type of the object.
-   * <!-- begin-user-doc -->
+    * 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
-   */
+    * @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;
-  }
+      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 -->
+    * The switch that delegates to the <code>createXXX</code> methods.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected OseeDslSwitch<Adapter> modelSwitch =
-    new OseeDslSwitch<Adapter>()
-    {
-      @Override
-      public Adapter caseOseeDsl(OseeDsl object)
-      {
-        return createOseeDslAdapter();
-      }
-      @Override
-      public Adapter caseImport(Import object)
-      {
-        return createImportAdapter();
-      }
-      @Override
-      public Adapter caseOseeElement(OseeElement object)
-      {
-        return createOseeElementAdapter();
-      }
-      @Override
-      public Adapter caseOseeType(OseeType object)
-      {
-        return createOseeTypeAdapter();
-      }
-      @Override
-      public Adapter caseXArtifactType(XArtifactType object)
-      {
-        return createXArtifactTypeAdapter();
-      }
-      @Override
-      public Adapter caseXAttributeTypeRef(XAttributeTypeRef object)
-      {
-        return createXAttributeTypeRefAdapter();
-      }
-      @Override
-      public Adapter caseXAttributeType(XAttributeType object)
-      {
-        return createXAttributeTypeAdapter();
-      }
-      @Override
-      public Adapter caseXOseeEnumType(XOseeEnumType object)
-      {
-        return createXOseeEnumTypeAdapter();
-      }
-      @Override
-      public Adapter caseXOseeEnumEntry(XOseeEnumEntry object)
-      {
-        return createXOseeEnumEntryAdapter();
-      }
-      @Override
-      public Adapter caseXOseeEnumOverride(XOseeEnumOverride object)
-      {
-        return createXOseeEnumOverrideAdapter();
-      }
-      @Override
-      public Adapter caseOverrideOption(OverrideOption object)
-      {
-        return createOverrideOptionAdapter();
-      }
-      @Override
-      public Adapter caseAddEnum(AddEnum object)
-      {
-        return createAddEnumAdapter();
-      }
-      @Override
-      public Adapter caseRemoveEnum(RemoveEnum object)
-      {
-        return createRemoveEnumAdapter();
-      }
-      @Override
-      public Adapter caseXOseeArtifactTypeOverride(XOseeArtifactTypeOverride object)
-      {
-        return createXOseeArtifactTypeOverrideAdapter();
-      }
-      @Override
-      public Adapter caseAttributeOverrideOption(AttributeOverrideOption object)
-      {
-        return createAttributeOverrideOptionAdapter();
-      }
-      @Override
-      public Adapter caseAddAttribute(AddAttribute object)
-      {
-        return createAddAttributeAdapter();
-      }
-      @Override
-      public Adapter caseRemoveAttribute(RemoveAttribute object)
-      {
-        return createRemoveAttributeAdapter();
-      }
-      @Override
-      public Adapter caseUpdateAttribute(UpdateAttribute object)
-      {
-        return createUpdateAttributeAdapter();
-      }
-      @Override
-      public Adapter caseXRelationType(XRelationType object)
-      {
-        return createXRelationTypeAdapter();
-      }
-      @Override
-      public Adapter caseCondition(Condition object)
-      {
-        return createConditionAdapter();
-      }
-      @Override
-      public Adapter caseSimpleCondition(SimpleCondition object)
-      {
-        return createSimpleConditionAdapter();
-      }
-      @Override
-      public Adapter caseCompoundCondition(CompoundCondition object)
-      {
-        return createCompoundConditionAdapter();
-      }
-      @Override
-      public Adapter caseXArtifactMatcher(XArtifactMatcher object)
-      {
-        return createXArtifactMatcherAdapter();
-      }
-      @Override
-      public Adapter caseRole(Role object)
-      {
-        return createRoleAdapter();
-      }
-      @Override
-      public Adapter caseReferencedContext(ReferencedContext object)
-      {
-        return createReferencedContextAdapter();
-      }
-      @Override
-      public Adapter caseUsersAndGroups(UsersAndGroups object)
-      {
-        return createUsersAndGroupsAdapter();
-      }
-      @Override
-      public Adapter caseAccessContext(AccessContext object)
-      {
-        return createAccessContextAdapter();
-      }
-      @Override
-      public Adapter caseHierarchyRestriction(HierarchyRestriction object)
-      {
-        return createHierarchyRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseRelationTypeArtifactTypePredicate(RelationTypeArtifactTypePredicate object)
-      {
-        return createRelationTypeArtifactTypePredicateAdapter();
-      }
-      @Override
-      public Adapter caseRelationTypeArtifactPredicate(RelationTypeArtifactPredicate object)
-      {
-        return createRelationTypeArtifactPredicateAdapter();
-      }
-      @Override
-      public Adapter caseRelationTypePredicate(RelationTypePredicate object)
-      {
-        return createRelationTypePredicateAdapter();
-      }
-      @Override
-      public Adapter caseObjectRestriction(ObjectRestriction object)
-      {
-        return createObjectRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseArtifactMatchRestriction(ArtifactMatchRestriction object)
-      {
-        return createArtifactMatchRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseArtifactTypeRestriction(ArtifactTypeRestriction object)
-      {
-        return createArtifactTypeRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseAttributeTypeRestriction(AttributeTypeRestriction object)
-      {
-        return createAttributeTypeRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseLegacyRelationTypeRestriction(LegacyRelationTypeRestriction object)
-      {
-        return createLegacyRelationTypeRestrictionAdapter();
-      }
-      @Override
-      public Adapter caseRelationTypeRestriction(RelationTypeRestriction object)
-      {
-        return createRelationTypeRestrictionAdapter();
-      }
-      @Override
-      public Adapter defaultCase(EObject object)
-      {
-        return createEObjectAdapter();
-      }
-    };
+    new OseeDslSwitch<Adapter>() {
+         @Override
+         public Adapter caseOseeDsl(OseeDsl object) {
+            return createOseeDslAdapter();
+         }
+         @Override
+         public Adapter caseImport(Import object) {
+            return createImportAdapter();
+         }
+         @Override
+         public Adapter caseOseeElement(OseeElement object) {
+            return createOseeElementAdapter();
+         }
+         @Override
+         public Adapter caseOseeType(OseeType object) {
+            return createOseeTypeAdapter();
+         }
+         @Override
+         public Adapter caseXArtifactType(XArtifactType object) {
+            return createXArtifactTypeAdapter();
+         }
+         @Override
+         public Adapter caseXAttributeTypeRef(XAttributeTypeRef object) {
+            return createXAttributeTypeRefAdapter();
+         }
+         @Override
+         public Adapter caseXAttributeType(XAttributeType object) {
+            return createXAttributeTypeAdapter();
+         }
+         @Override
+         public Adapter caseXOseeEnumType(XOseeEnumType object) {
+            return createXOseeEnumTypeAdapter();
+         }
+         @Override
+         public Adapter caseXOseeEnumEntry(XOseeEnumEntry object) {
+            return createXOseeEnumEntryAdapter();
+         }
+         @Override
+         public Adapter caseXOseeEnumOverride(XOseeEnumOverride object) {
+            return createXOseeEnumOverrideAdapter();
+         }
+         @Override
+         public Adapter caseOverrideOption(OverrideOption object) {
+            return createOverrideOptionAdapter();
+         }
+         @Override
+         public Adapter caseAddEnum(AddEnum object) {
+            return createAddEnumAdapter();
+         }
+         @Override
+         public Adapter caseRemoveEnum(RemoveEnum object) {
+            return createRemoveEnumAdapter();
+         }
+         @Override
+         public Adapter caseXOseeArtifactTypeOverride(XOseeArtifactTypeOverride object) {
+            return createXOseeArtifactTypeOverrideAdapter();
+         }
+         @Override
+         public Adapter caseAttributeOverrideOption(AttributeOverrideOption object) {
+            return createAttributeOverrideOptionAdapter();
+         }
+         @Override
+         public Adapter caseAddAttribute(AddAttribute object) {
+            return createAddAttributeAdapter();
+         }
+         @Override
+         public Adapter caseRemoveAttribute(RemoveAttribute object) {
+            return createRemoveAttributeAdapter();
+         }
+         @Override
+         public Adapter caseUpdateAttribute(UpdateAttribute object) {
+            return createUpdateAttributeAdapter();
+         }
+         @Override
+         public Adapter caseXRelationType(XRelationType object) {
+            return createXRelationTypeAdapter();
+         }
+         @Override
+         public Adapter caseCondition(Condition object) {
+            return createConditionAdapter();
+         }
+         @Override
+         public Adapter caseSimpleCondition(SimpleCondition object) {
+            return createSimpleConditionAdapter();
+         }
+         @Override
+         public Adapter caseCompoundCondition(CompoundCondition object) {
+            return createCompoundConditionAdapter();
+         }
+         @Override
+         public Adapter caseXArtifactMatcher(XArtifactMatcher object) {
+            return createXArtifactMatcherAdapter();
+         }
+         @Override
+         public Adapter caseRole(Role object) {
+            return createRoleAdapter();
+         }
+         @Override
+         public Adapter caseReferencedContext(ReferencedContext object) {
+            return createReferencedContextAdapter();
+         }
+         @Override
+         public Adapter caseUsersAndGroups(UsersAndGroups object) {
+            return createUsersAndGroupsAdapter();
+         }
+         @Override
+         public Adapter caseAccessContext(AccessContext object) {
+            return createAccessContextAdapter();
+         }
+         @Override
+         public Adapter caseHierarchyRestriction(HierarchyRestriction object) {
+            return createHierarchyRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseRelationTypeArtifactTypePredicate(RelationTypeArtifactTypePredicate object) {
+            return createRelationTypeArtifactTypePredicateAdapter();
+         }
+         @Override
+         public Adapter caseRelationTypeArtifactPredicate(RelationTypeArtifactPredicate object) {
+            return createRelationTypeArtifactPredicateAdapter();
+         }
+         @Override
+         public Adapter caseRelationTypePredicate(RelationTypePredicate object) {
+            return createRelationTypePredicateAdapter();
+         }
+         @Override
+         public Adapter caseObjectRestriction(ObjectRestriction object) {
+            return createObjectRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseArtifactMatchRestriction(ArtifactMatchRestriction object) {
+            return createArtifactMatchRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseArtifactTypeRestriction(ArtifactTypeRestriction object) {
+            return createArtifactTypeRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseAttributeTypeRestriction(AttributeTypeRestriction object) {
+            return createAttributeTypeRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseLegacyRelationTypeRestriction(LegacyRelationTypeRestriction object) {
+            return createLegacyRelationTypeRestrictionAdapter();
+         }
+         @Override
+         public Adapter caseRelationTypeRestriction(RelationTypeRestriction object) {
+            return createRelationTypeRestrictionAdapter();
+         }
+         @Override
+         public Adapter defaultCase(EObject object) {
+            return createEObjectAdapter();
+         }
+      };
 
   /**
-   * Creates an adapter for the <code>target</code>.
-   * <!-- begin-user-doc -->
+    * 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
-   */
+    * @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);
-  }
+      return modelSwitch.doSwitch((EObject)target);
+   }
 
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl <em>Osee Dsl</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl <em>Osee Dsl</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.osee.framework.core.dsl.oseeDsl.OseeDsl
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeDsl
+    * @generated
+    */
   public Adapter createOseeDslAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import <em>Import</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Import <em>Import</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.osee.framework.core.dsl.oseeDsl.Import
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Import
+    * @generated
+    */
   public Adapter createImportAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement <em>Osee Element</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement <em>Osee Element</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.osee.framework.core.dsl.oseeDsl.OseeElement
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeElement
+    * @generated
+    */
   public Adapter createOseeElementAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType <em>Osee Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType <em>Osee Type</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.osee.framework.core.dsl.oseeDsl.OseeType
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OseeType
+    * @generated
+    */
   public Adapter createOseeTypeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType <em>XArtifact Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType <em>XArtifact Type</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.osee.framework.core.dsl.oseeDsl.XArtifactType
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactType
+    * @generated
+    */
   public Adapter createXArtifactTypeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef <em>XAttribute Type Ref</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef <em>XAttribute Type Ref</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.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeTypeRef
+    * @generated
+    */
   public Adapter createXAttributeTypeRefAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType <em>XAttribute Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType <em>XAttribute Type</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.osee.framework.core.dsl.oseeDsl.XAttributeType
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType
+    * @generated
+    */
   public Adapter createXAttributeTypeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType <em>XOsee Enum Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType <em>XOsee Enum Type</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.osee.framework.core.dsl.oseeDsl.XOseeEnumType
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumType
+    * @generated
+    */
   public Adapter createXOseeEnumTypeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry <em>XOsee Enum Entry</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry <em>XOsee Enum Entry</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.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumEntry
+    * @generated
+    */
   public Adapter createXOseeEnumEntryAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride <em>XOsee Enum Override</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride <em>XOsee Enum Override</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.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeEnumOverride
+    * @generated
+    */
   public Adapter createXOseeEnumOverrideAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption <em>Override Option</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption <em>Override Option</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.osee.framework.core.dsl.oseeDsl.OverrideOption
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.OverrideOption
+    * @generated
+    */
   public Adapter createOverrideOptionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum <em>Add Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum <em>Add Enum</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.osee.framework.core.dsl.oseeDsl.AddEnum
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddEnum
+    * @generated
+    */
   public Adapter createAddEnumAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum <em>Remove Enum</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum <em>Remove Enum</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.osee.framework.core.dsl.oseeDsl.RemoveEnum
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveEnum
+    * @generated
+    */
   public Adapter createRemoveEnumAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride <em>XOsee Artifact Type Override</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride <em>XOsee Artifact Type Override</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.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XOseeArtifactTypeOverride
+    * @generated
+    */
   public Adapter createXOseeArtifactTypeOverrideAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption <em>Attribute Override Option</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption <em>Attribute Override Option</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.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeOverrideOption
+    * @generated
+    */
   public Adapter createAttributeOverrideOptionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute <em>Add Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute <em>Add Attribute</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.osee.framework.core.dsl.oseeDsl.AddAttribute
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AddAttribute
+    * @generated
+    */
   public Adapter createAddAttributeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute <em>Remove Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute <em>Remove Attribute</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.osee.framework.core.dsl.oseeDsl.RemoveAttribute
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RemoveAttribute
+    * @generated
+    */
   public Adapter createRemoveAttributeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute <em>Update Attribute</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute <em>Update Attribute</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.osee.framework.core.dsl.oseeDsl.UpdateAttribute
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UpdateAttribute
+    * @generated
+    */
   public Adapter createUpdateAttributeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType <em>XRelation Type</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType <em>XRelation Type</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.osee.framework.core.dsl.oseeDsl.XRelationType
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType
+    * @generated
+    */
   public Adapter createXRelationTypeAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition <em>Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Condition <em>Condition</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.osee.framework.core.dsl.oseeDsl.Condition
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Condition
+    * @generated
+    */
   public Adapter createConditionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition <em>Simple Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition <em>Simple Condition</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.osee.framework.core.dsl.oseeDsl.SimpleCondition
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.SimpleCondition
+    * @generated
+    */
   public Adapter createSimpleConditionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition <em>Compound Condition</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition <em>Compound Condition</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.osee.framework.core.dsl.oseeDsl.CompoundCondition
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.CompoundCondition
+    * @generated
+    */
   public Adapter createCompoundConditionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher <em>XArtifact Matcher</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher <em>XArtifact Matcher</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.osee.framework.core.dsl.oseeDsl.XArtifactMatcher
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.XArtifactMatcher
+    * @generated
+    */
   public Adapter createXArtifactMatcherAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role <em>Role</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.Role <em>Role</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.osee.framework.core.dsl.oseeDsl.Role
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.Role
+    * @generated
+    */
   public Adapter createRoleAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext <em>Referenced Context</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext <em>Referenced Context</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.osee.framework.core.dsl.oseeDsl.ReferencedContext
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ReferencedContext
+    * @generated
+    */
   public Adapter createReferencedContextAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups <em>Users And Groups</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups <em>Users And Groups</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.osee.framework.core.dsl.oseeDsl.UsersAndGroups
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.UsersAndGroups
+    * @generated
+    */
   public Adapter createUsersAndGroupsAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext <em>Access Context</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext <em>Access Context</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.osee.framework.core.dsl.oseeDsl.AccessContext
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AccessContext
+    * @generated
+    */
   public Adapter createAccessContextAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction <em>Hierarchy Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction <em>Hierarchy Restriction</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.osee.framework.core.dsl.oseeDsl.HierarchyRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.HierarchyRestriction
+    * @generated
+    */
   public Adapter createHierarchyRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate <em>Relation Type Artifact Type Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate <em>Relation Type Artifact Type Predicate</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.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactTypePredicate
+    * @generated
+    */
   public Adapter createRelationTypeArtifactTypePredicateAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate <em>Relation Type Artifact Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate <em>Relation Type Artifact Predicate</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.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeArtifactPredicate
+    * @generated
+    */
   public Adapter createRelationTypeArtifactPredicateAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate <em>Relation Type Predicate</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate <em>Relation Type Predicate</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.osee.framework.core.dsl.oseeDsl.RelationTypePredicate
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypePredicate
+    * @generated
+    */
   public Adapter createRelationTypePredicateAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction <em>Object Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction <em>Object Restriction</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.osee.framework.core.dsl.oseeDsl.ObjectRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ObjectRestriction
+    * @generated
+    */
   public Adapter createObjectRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction <em>Artifact Match Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction <em>Artifact Match Restriction</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.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactMatchRestriction
+    * @generated
+    */
   public Adapter createArtifactMatchRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction <em>Artifact Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction <em>Artifact Type Restriction</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.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.ArtifactTypeRestriction
+    * @generated
+    */
   public Adapter createArtifactTypeRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction <em>Attribute Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction <em>Attribute Type Restriction</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.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.AttributeTypeRestriction
+    * @generated
+    */
   public Adapter createAttributeTypeRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction <em>Legacy Relation Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction <em>Legacy Relation Type Restriction</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.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.LegacyRelationTypeRestriction
+    * @generated
+    */
   public Adapter createLegacyRelationTypeRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction <em>Relation Type Restriction</em>}'.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for an object of class '{@link org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction <em>Relation Type Restriction</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.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction
-   * @generated
-   */
+    * @return the new adapter.
+    * @see org.eclipse.osee.framework.core.dsl.oseeDsl.RelationTypeRestriction
+    * @generated
+    */
   public Adapter createRelationTypeRestrictionAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Creates a new adapter for the default case.
-   * <!-- begin-user-doc -->
+    * Creates a new adapter for the default case.
+    * <!-- begin-user-doc -->
    * This default implementation returns null.
    * <!-- end-user-doc -->
-   * @return the new adapter.
-   * @generated
-   */
+    * @return the new adapter.
+    * @generated
+    */
   public Adapter createEObjectAdapter()
   {
-    return null;
-  }
+      return null;
+   }
 
 } //OseeDslAdapterFactory
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslSwitch.java b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslSwitch.java
index d85d32a..16098ec 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslSwitch.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src-gen/org/eclipse/osee/framework/core/dsl/oseeDsl/util/OseeDslSwitch.java
@@ -25,946 +25,907 @@
 public class OseeDslSwitch<T> extends Switch<T>
 {
   /**
-   * The cached model package
-   * <!-- begin-user-doc -->
+    * The cached model package
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   protected static OseeDslPackage modelPackage;
 
   /**
-   * Creates an instance of the switch.
-   * <!-- begin-user-doc -->
+    * Creates an instance of the switch.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @generated
-   */
+    * @generated
+    */
   public OseeDslSwitch()
   {
-    if (modelPackage == null)
-    {
-      modelPackage = OseeDslPackage.eINSTANCE;
-    }
-  }
+      if (modelPackage == null) {
+         modelPackage = OseeDslPackage.eINSTANCE;
+      }
+   }
 
   /**
-   * Checks whether this is a switch for the given package.
-   * <!-- begin-user-doc -->
+    * Checks whether this is a switch for the given package.
+    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
-   * @parameter ePackage the package in question.
-   * @return whether this is a switch for the given package.
-   * @generated
-   */
+    * @parameter 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;
-  }
+      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 -->
+    * 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
-   */
+    * @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 OseeDslPackage.OSEE_DSL:
-      {
-        OseeDsl oseeDsl = (OseeDsl)theEObject;
-        T result = caseOseeDsl(oseeDsl);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
+      switch (classifierID) {
+         case OseeDslPackage.OSEE_DSL: {
+            OseeDsl oseeDsl = (OseeDsl)theEObject;
+            T result = caseOseeDsl(oseeDsl);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.IMPORT: {
+            Import import_ = (Import)theEObject;
+            T result = caseImport(import_);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.OSEE_ELEMENT: {
+            OseeElement oseeElement = (OseeElement)theEObject;
+            T result = caseOseeElement(oseeElement);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.OSEE_TYPE: {
+            OseeType oseeType = (OseeType)theEObject;
+            T result = caseOseeType(oseeType);
+            if (result == null) result = caseOseeElement(oseeType);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XARTIFACT_TYPE: {
+            XArtifactType xArtifactType = (XArtifactType)theEObject;
+            T result = caseXArtifactType(xArtifactType);
+            if (result == null) result = caseOseeType(xArtifactType);
+            if (result == null) result = caseOseeElement(xArtifactType);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XATTRIBUTE_TYPE_REF: {
+            XAttributeTypeRef xAttributeTypeRef = (XAttributeTypeRef)theEObject;
+            T result = caseXAttributeTypeRef(xAttributeTypeRef);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XATTRIBUTE_TYPE: {
+            XAttributeType xAttributeType = (XAttributeType)theEObject;
+            T result = caseXAttributeType(xAttributeType);
+            if (result == null) result = caseOseeType(xAttributeType);
+            if (result == null) result = caseOseeElement(xAttributeType);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XOSEE_ENUM_TYPE: {
+            XOseeEnumType xOseeEnumType = (XOseeEnumType)theEObject;
+            T result = caseXOseeEnumType(xOseeEnumType);
+            if (result == null) result = caseOseeType(xOseeEnumType);
+            if (result == null) result = caseOseeElement(xOseeEnumType);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XOSEE_ENUM_ENTRY: {
+            XOseeEnumEntry xOseeEnumEntry = (XOseeEnumEntry)theEObject;
+            T result = caseXOseeEnumEntry(xOseeEnumEntry);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XOSEE_ENUM_OVERRIDE: {
+            XOseeEnumOverride xOseeEnumOverride = (XOseeEnumOverride)theEObject;
+            T result = caseXOseeEnumOverride(xOseeEnumOverride);
+            if (result == null) result = caseOseeElement(xOseeEnumOverride);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.OVERRIDE_OPTION: {
+            OverrideOption overrideOption = (OverrideOption)theEObject;
+            T result = caseOverrideOption(overrideOption);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ADD_ENUM: {
+            AddEnum addEnum = (AddEnum)theEObject;
+            T result = caseAddEnum(addEnum);
+            if (result == null) result = caseOverrideOption(addEnum);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.REMOVE_ENUM: {
+            RemoveEnum removeEnum = (RemoveEnum)theEObject;
+            T result = caseRemoveEnum(removeEnum);
+            if (result == null) result = caseOverrideOption(removeEnum);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE: {
+            XOseeArtifactTypeOverride xOseeArtifactTypeOverride = (XOseeArtifactTypeOverride)theEObject;
+            T result = caseXOseeArtifactTypeOverride(xOseeArtifactTypeOverride);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ATTRIBUTE_OVERRIDE_OPTION: {
+            AttributeOverrideOption attributeOverrideOption = (AttributeOverrideOption)theEObject;
+            T result = caseAttributeOverrideOption(attributeOverrideOption);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ADD_ATTRIBUTE: {
+            AddAttribute addAttribute = (AddAttribute)theEObject;
+            T result = caseAddAttribute(addAttribute);
+            if (result == null) result = caseAttributeOverrideOption(addAttribute);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.REMOVE_ATTRIBUTE: {
+            RemoveAttribute removeAttribute = (RemoveAttribute)theEObject;
+            T result = caseRemoveAttribute(removeAttribute);
+            if (result == null) result = caseAttributeOverrideOption(removeAttribute);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.UPDATE_ATTRIBUTE: {
+            UpdateAttribute updateAttribute = (UpdateAttribute)theEObject;
+            T result = caseUpdateAttribute(updateAttribute);
+            if (result == null) result = caseAttributeOverrideOption(updateAttribute);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XRELATION_TYPE: {
+            XRelationType xRelationType = (XRelationType)theEObject;
+            T result = caseXRelationType(xRelationType);
+            if (result == null) result = caseOseeType(xRelationType);
+            if (result == null) result = caseOseeElement(xRelationType);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.CONDITION: {
+            Condition condition = (Condition)theEObject;
+            T result = caseCondition(condition);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.SIMPLE_CONDITION: {
+            SimpleCondition simpleCondition = (SimpleCondition)theEObject;
+            T result = caseSimpleCondition(simpleCondition);
+            if (result == null) result = caseCondition(simpleCondition);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.COMPOUND_CONDITION: {
+            CompoundCondition compoundCondition = (CompoundCondition)theEObject;
+            T result = caseCompoundCondition(compoundCondition);
+            if (result == null) result = caseCondition(compoundCondition);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.XARTIFACT_MATCHER: {
+            XArtifactMatcher xArtifactMatcher = (XArtifactMatcher)theEObject;
+            T result = caseXArtifactMatcher(xArtifactMatcher);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ROLE: {
+            Role role = (Role)theEObject;
+            T result = caseRole(role);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.REFERENCED_CONTEXT: {
+            ReferencedContext referencedContext = (ReferencedContext)theEObject;
+            T result = caseReferencedContext(referencedContext);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.USERS_AND_GROUPS: {
+            UsersAndGroups usersAndGroups = (UsersAndGroups)theEObject;
+            T result = caseUsersAndGroups(usersAndGroups);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ACCESS_CONTEXT: {
+            AccessContext accessContext = (AccessContext)theEObject;
+            T result = caseAccessContext(accessContext);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.HIERARCHY_RESTRICTION: {
+            HierarchyRestriction hierarchyRestriction = (HierarchyRestriction)theEObject;
+            T result = caseHierarchyRestriction(hierarchyRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE: {
+            RelationTypeArtifactTypePredicate relationTypeArtifactTypePredicate = (RelationTypeArtifactTypePredicate)theEObject;
+            T result = caseRelationTypeArtifactTypePredicate(relationTypeArtifactTypePredicate);
+            if (result == null) result = caseRelationTypePredicate(relationTypeArtifactTypePredicate);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE: {
+            RelationTypeArtifactPredicate relationTypeArtifactPredicate = (RelationTypeArtifactPredicate)theEObject;
+            T result = caseRelationTypeArtifactPredicate(relationTypeArtifactPredicate);
+            if (result == null) result = caseRelationTypePredicate(relationTypeArtifactPredicate);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.RELATION_TYPE_PREDICATE: {
+            RelationTypePredicate relationTypePredicate = (RelationTypePredicate)theEObject;
+            T result = caseRelationTypePredicate(relationTypePredicate);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.OBJECT_RESTRICTION: {
+            ObjectRestriction objectRestriction = (ObjectRestriction)theEObject;
+            T result = caseObjectRestriction(objectRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION: {
+            ArtifactMatchRestriction artifactMatchRestriction = (ArtifactMatchRestriction)theEObject;
+            T result = caseArtifactMatchRestriction(artifactMatchRestriction);
+            if (result == null) result = caseObjectRestriction(artifactMatchRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION: {
+            ArtifactTypeRestriction artifactTypeRestriction = (ArtifactTypeRestriction)theEObject;
+            T result = caseArtifactTypeRestriction(artifactTypeRestriction);
+            if (result == null) result = caseObjectRestriction(artifactTypeRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION: {
+            AttributeTypeRestriction attributeTypeRestriction = (AttributeTypeRestriction)theEObject;
+            T result = caseAttributeTypeRestriction(attributeTypeRestriction);
+            if (result == null) result = caseObjectRestriction(attributeTypeRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION: {
+            LegacyRelationTypeRestriction legacyRelationTypeRestriction = (LegacyRelationTypeRestriction)theEObject;
+            T result = caseLegacyRelationTypeRestriction(legacyRelationTypeRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         case OseeDslPackage.RELATION_TYPE_RESTRICTION: {
+            RelationTypeRestriction relationTypeRestriction = (RelationTypeRestriction)theEObject;
+            T result = caseRelationTypeRestriction(relationTypeRestriction);
+            if (result == null) result = caseObjectRestriction(relationTypeRestriction);
+            if (result == null) result = defaultCase(theEObject);
+            return result;
+         }
+         default: return defaultCase(theEObject);
       }
-      case OseeDslPackage.IMPORT:
-      {
-        Import import_ = (Import)theEObject;
-        T result = caseImport(import_);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.OSEE_ELEMENT:
-      {
-        OseeElement oseeElement = (OseeElement)theEObject;
-        T result = caseOseeElement(oseeElement);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.OSEE_TYPE:
-      {
-        OseeType oseeType = (OseeType)theEObject;
-        T result = caseOseeType(oseeType);
-        if (result == null) result = caseOseeElement(oseeType);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XARTIFACT_TYPE:
-      {
-        XArtifactType xArtifactType = (XArtifactType)theEObject;
-        T result = caseXArtifactType(xArtifactType);
-        if (result == null) result = caseOseeType(xArtifactType);
-        if (result == null) result = caseOseeElement(xArtifactType);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XATTRIBUTE_TYPE_REF:
-      {
-        XAttributeTypeRef xAttributeTypeRef = (XAttributeTypeRef)theEObject;
-        T result = caseXAttributeTypeRef(xAttributeTypeRef);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XATTRIBUTE_TYPE:
-      {
-        XAttributeType xAttributeType = (XAttributeType)theEObject;
-        T result = caseXAttributeType(xAttributeType);
-        if (result == null) result = caseOseeType(xAttributeType);
-        if (result == null) result = caseOseeElement(xAttributeType);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XOSEE_ENUM_TYPE:
-      {
-        XOseeEnumType xOseeEnumType = (XOseeEnumType)theEObject;
-        T result = caseXOseeEnumType(xOseeEnumType);
-        if (result == null) result = caseOseeType(xOseeEnumType);
-        if (result == null) result = caseOseeElement(xOseeEnumType);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XOSEE_ENUM_ENTRY:
-      {
-        XOseeEnumEntry xOseeEnumEntry = (XOseeEnumEntry)theEObject;
-        T result = caseXOseeEnumEntry(xOseeEnumEntry);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XOSEE_ENUM_OVERRIDE:
-      {
-        XOseeEnumOverride xOseeEnumOverride = (XOseeEnumOverride)theEObject;
-        T result = caseXOseeEnumOverride(xOseeEnumOverride);
-        if (result == null) result = caseOseeElement(xOseeEnumOverride);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.OVERRIDE_OPTION:
-      {
-        OverrideOption overrideOption = (OverrideOption)theEObject;
-        T result = caseOverrideOption(overrideOption);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ADD_ENUM:
-      {
-        AddEnum addEnum = (AddEnum)theEObject;
-        T result = caseAddEnum(addEnum);
-        if (result == null) result = caseOverrideOption(addEnum);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.REMOVE_ENUM:
-      {
-        RemoveEnum removeEnum = (RemoveEnum)theEObject;
-        T result = caseRemoveEnum(removeEnum);
-        if (result == null) result = caseOverrideOption(removeEnum);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XOSEE_ARTIFACT_TYPE_OVERRIDE:
-      {
-        XOseeArtifactTypeOverride xOseeArtifactTypeOverride = (XOseeArtifactTypeOverride)theEObject;
-        T result = caseXOseeArtifactTypeOverride(xOseeArtifactTypeOverride);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ATTRIBUTE_OVERRIDE_OPTION:
-      {
-        AttributeOverrideOption attributeOverrideOption = (AttributeOverrideOption)theEObject;
-        T result = caseAttributeOverrideOption(attributeOverrideOption);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ADD_ATTRIBUTE:
-      {
-        AddAttribute addAttribute = (AddAttribute)theEObject;
-        T result = caseAddAttribute(addAttribute);
-        if (result == null) result = caseAttributeOverrideOption(addAttribute);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.REMOVE_ATTRIBUTE:
-      {
-        RemoveAttribute removeAttribute = (RemoveAttribute)theEObject;
-        T result = caseRemoveAttribute(removeAttribute);
-        if (result == null) result = caseAttributeOverrideOption(removeAttribute);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.UPDATE_ATTRIBUTE:
-      {
-        UpdateAttribute updateAttribute = (UpdateAttribute)theEObject;
-        T result = caseUpdateAttribute(updateAttribute);
-        if (result == null) result = caseAttributeOverrideOption(updateAttribute);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XRELATION_TYPE:
-      {
-        XRelationType xRelationType = (XRelationType)theEObject;
-        T result = caseXRelationType(xRelationType);
-        if (result == null) result = caseOseeType(xRelationType);
-        if (result == null) result = caseOseeElement(xRelationType);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.CONDITION:
-      {
-        Condition condition = (Condition)theEObject;
-        T result = caseCondition(condition);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.SIMPLE_CONDITION:
-      {
-        SimpleCondition simpleCondition = (SimpleCondition)theEObject;
-        T result = caseSimpleCondition(simpleCondition);
-        if (result == null) result = caseCondition(simpleCondition);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.COMPOUND_CONDITION:
-      {
-        CompoundCondition compoundCondition = (CompoundCondition)theEObject;
-        T result = caseCompoundCondition(compoundCondition);
-        if (result == null) result = caseCondition(compoundCondition);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.XARTIFACT_MATCHER:
-      {
-        XArtifactMatcher xArtifactMatcher = (XArtifactMatcher)theEObject;
-        T result = caseXArtifactMatcher(xArtifactMatcher);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ROLE:
-      {
-        Role role = (Role)theEObject;
-        T result = caseRole(role);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.REFERENCED_CONTEXT:
-      {
-        ReferencedContext referencedContext = (ReferencedContext)theEObject;
-        T result = caseReferencedContext(referencedContext);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.USERS_AND_GROUPS:
-      {
-        UsersAndGroups usersAndGroups = (UsersAndGroups)theEObject;
-        T result = caseUsersAndGroups(usersAndGroups);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ACCESS_CONTEXT:
-      {
-        AccessContext accessContext = (AccessContext)theEObject;
-        T result = caseAccessContext(accessContext);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.HIERARCHY_RESTRICTION:
-      {
-        HierarchyRestriction hierarchyRestriction = (HierarchyRestriction)theEObject;
-        T result = caseHierarchyRestriction(hierarchyRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_TYPE_PREDICATE:
-      {
-        RelationTypeArtifactTypePredicate relationTypeArtifactTypePredicate = (RelationTypeArtifactTypePredicate)theEObject;
-        T result = caseRelationTypeArtifactTypePredicate(relationTypeArtifactTypePredicate);
-        if (result == null) result = caseRelationTypePredicate(relationTypeArtifactTypePredicate);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.RELATION_TYPE_ARTIFACT_PREDICATE:
-      {
-        RelationTypeArtifactPredicate relationTypeArtifactPredicate = (RelationTypeArtifactPredicate)theEObject;
-        T result = caseRelationTypeArtifactPredicate(relationTypeArtifactPredicate);
-        if (result == null) result = caseRelationTypePredicate(relationTypeArtifactPredicate);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.RELATION_TYPE_PREDICATE:
-      {
-        RelationTypePredicate relationTypePredicate = (RelationTypePredicate)theEObject;
-        T result = caseRelationTypePredicate(relationTypePredicate);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.OBJECT_RESTRICTION:
-      {
-        ObjectRestriction objectRestriction = (ObjectRestriction)theEObject;
-        T result = caseObjectRestriction(objectRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ARTIFACT_MATCH_RESTRICTION:
-      {
-        ArtifactMatchRestriction artifactMatchRestriction = (ArtifactMatchRestriction)theEObject;
-        T result = caseArtifactMatchRestriction(artifactMatchRestriction);
-        if (result == null) result = caseObjectRestriction(artifactMatchRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ARTIFACT_TYPE_RESTRICTION:
-      {
-        ArtifactTypeRestriction artifactTypeRestriction = (ArtifactTypeRestriction)theEObject;
-        T result = caseArtifactTypeRestriction(artifactTypeRestriction);
-        if (result == null) result = caseObjectRestriction(artifactTypeRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.ATTRIBUTE_TYPE_RESTRICTION:
-      {
-        AttributeTypeRestriction attributeTypeRestriction = (AttributeTypeRestriction)theEObject;
-        T result = caseAttributeTypeRestriction(attributeTypeRestriction);
-        if (result == null) result = caseObjectRestriction(attributeTypeRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.LEGACY_RELATION_TYPE_RESTRICTION:
-      {
-        LegacyRelationTypeRestriction legacyRelationTypeRestriction = (LegacyRelationTypeRestriction)theEObject;
-        T result = caseLegacyRelationTypeRestriction(legacyRelationTypeRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      case OseeDslPackage.RELATION_TYPE_RESTRICTION:
-      {
-        RelationTypeRestriction relationTypeRestriction = (RelationTypeRestriction)theEObject;
-        T result = caseRelationTypeRestriction(relationTypeRestriction);
-        if (result == null) result = caseObjectRestriction(relationTypeRestriction);
-        if (result == null) result = defaultCase(theEObject);
-        return result;
-      }
-      default: return defaultCase(theEObject);
-    }
-  }
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Osee Dsl</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Osee Dsl</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>Osee Dsl</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Osee Dsl</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseOseeDsl(OseeDsl object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Import</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Import</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>Import</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Import</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseImport(Import object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Osee Element</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Osee Element</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>Osee Element</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Osee Element</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseOseeElement(OseeElement object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Osee Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Osee Type</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>Osee Type</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Osee Type</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseOseeType(OseeType object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XArtifact Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XArtifact Type</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>XArtifact Type</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XArtifact Type</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXArtifactType(XArtifactType object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XAttribute Type Ref</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XAttribute Type Ref</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>XAttribute Type Ref</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XAttribute Type Ref</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXAttributeTypeRef(XAttributeTypeRef object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XAttribute Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XAttribute Type</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>XAttribute Type</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XAttribute Type</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXAttributeType(XAttributeType object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Type</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>XOsee Enum Type</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XOsee Enum Type</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXOseeEnumType(XOseeEnumType object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Entry</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Entry</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>XOsee Enum Entry</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XOsee Enum Entry</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXOseeEnumEntry(XOseeEnumEntry object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Override</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XOsee Enum Override</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>XOsee Enum Override</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XOsee Enum Override</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXOseeEnumOverride(XOseeEnumOverride object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Override Option</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Override Option</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>Override Option</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Override Option</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseOverrideOption(OverrideOption object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Add Enum</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Add Enum</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>Add Enum</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Add Enum</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseAddEnum(AddEnum object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Remove Enum</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Remove Enum</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>Remove Enum</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Remove Enum</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRemoveEnum(RemoveEnum object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XOsee Artifact Type Override</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XOsee Artifact Type Override</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>XOsee Artifact Type Override</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XOsee Artifact Type Override</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXOseeArtifactTypeOverride(XOseeArtifactTypeOverride object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Attribute Override Option</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Attribute Override Option</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>Attribute Override Option</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Attribute Override Option</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseAttributeOverrideOption(AttributeOverrideOption object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Add Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Add Attribute</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>Add Attribute</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Add Attribute</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseAddAttribute(AddAttribute object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Remove Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Remove Attribute</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>Remove Attribute</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Remove Attribute</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRemoveAttribute(RemoveAttribute object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Update Attribute</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Update Attribute</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>Update Attribute</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Update Attribute</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseUpdateAttribute(UpdateAttribute object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XRelation Type</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XRelation Type</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>XRelation Type</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XRelation Type</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXRelationType(XRelationType object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Condition</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>Condition</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Condition</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseCondition(Condition object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Simple Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Simple Condition</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>Simple Condition</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Simple Condition</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseSimpleCondition(SimpleCondition object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Compound Condition</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Compound Condition</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>Compound Condition</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Compound Condition</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseCompoundCondition(CompoundCondition object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>XArtifact Matcher</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>XArtifact Matcher</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>XArtifact Matcher</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>XArtifact Matcher</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseXArtifactMatcher(XArtifactMatcher object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Role</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Role</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>Role</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Role</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRole(Role object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Referenced Context</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Referenced Context</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>Referenced Context</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Referenced Context</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseReferencedContext(ReferencedContext object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Users And Groups</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Users And Groups</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>Users And Groups</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Users And Groups</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseUsersAndGroups(UsersAndGroups object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Access Context</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Access Context</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>Access Context</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Access Context</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseAccessContext(AccessContext object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Hierarchy Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Hierarchy Restriction</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>Hierarchy Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Hierarchy Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseHierarchyRestriction(HierarchyRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Relation Type Artifact Type Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Relation Type Artifact Type Predicate</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>Relation Type Artifact Type Predicate</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Relation Type Artifact Type Predicate</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRelationTypeArtifactTypePredicate(RelationTypeArtifactTypePredicate object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Relation Type Artifact Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Relation Type Artifact Predicate</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>Relation Type Artifact Predicate</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Relation Type Artifact Predicate</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRelationTypeArtifactPredicate(RelationTypeArtifactPredicate object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Relation Type Predicate</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Relation Type Predicate</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>Relation Type Predicate</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Relation Type Predicate</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRelationTypePredicate(RelationTypePredicate object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Object Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Object Restriction</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>Object Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Object Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseObjectRestriction(ObjectRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Artifact Match Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Artifact Match Restriction</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>Artifact Match Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Artifact Match Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseArtifactMatchRestriction(ArtifactMatchRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Artifact Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Artifact Type Restriction</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>Artifact Type Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Artifact Type Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseArtifactTypeRestriction(ArtifactTypeRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Attribute Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Attribute Type Restriction</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>Attribute Type Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Attribute Type Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseAttributeTypeRestriction(AttributeTypeRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Legacy Relation Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Legacy Relation Type Restriction</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>Legacy Relation Type Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Legacy Relation Type Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseLegacyRelationTypeRestriction(LegacyRelationTypeRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>Relation Type Restriction</em>'.
-   * <!-- begin-user-doc -->
+    * Returns the result of interpreting the object as an instance of '<em>Relation Type Restriction</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>Relation Type Restriction</em>'.
-   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-   * @generated
-   */
+    * @param object the target of the switch.
+    * @return the result of interpreting the object as an instance of '<em>Relation Type Restriction</em>'.
+    * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+    * @generated
+    */
   public T caseRelationTypeRestriction(RelationTypeRestriction object)
   {
-    return null;
-  }
+      return null;
+   }
 
   /**
-   * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-   * <!-- begin-user-doc -->
+    * 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
-   */
+    * @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;
-  }
+      return null;
+   }
 
 } //OseeDslSwitch
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/OseeDsl.xtext b/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/OseeDsl.xtext
index 4d93203..e999e3a 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/OseeDsl.xtext
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/OseeDsl.xtext
@@ -47,9 +47,9 @@
 	'attributeType' name=STRING ('extends' baseAttributeType=AttributeBaseType) ('overrides'
 	override=[XAttributeType|STRING])? '{' ('guid' typeGuid=STRING)? 'uuid' uuid=HEX_INT 'dataProvider'
 	dataProvider=('DefaultAttributeDataProvider' | 'UriAttributeDataProvider' | QUALIFIED_NAME) 'min' min=WHOLE_NUM_STR
-	'max' max=(WHOLE_NUM_STR | 'unlimited') ('taggerId' taggerId=('DefaultAttributeTaggerProvider' | QUALIFIED_NAME))?
-	('enumType' enumType=[XOseeEnumType|STRING])? ('description' description=STRING)? ('defaultValue'
-	defaultValue=STRING)? ('fileExtension' fileExtension=STRING)? ('mediaType' mediaType=STRING)? '}';
+	'max' max=(WHOLE_NUM_STR | 'unlimited') (('taggerId' taggerId=('DefaultAttributeTaggerProvider' | QUALIFIED_NAME))? &
+	('enumType' enumType=[XOseeEnumType|STRING])? & ('description' description=STRING)? & ('defaultValue'
+	defaultValue=STRING)? & ('fileExtension' fileExtension=STRING)? & ('mediaType' mediaType=STRING)?) '}';
 
 AttributeBaseType:
 	'BooleanAttribute' | 'CompressedContentAttribute' | 'DateAttribute' | 'EnumeratedAttribute' |
diff --git a/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/validation/OseeDslJavaValidator.java b/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/validation/OseeDslJavaValidator.java
index fc70eda..3b5043e 100644
--- a/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/validation/OseeDslJavaValidator.java
+++ b/plugins/org.eclipse.osee.framework.core.dsl/src/org/eclipse/osee/framework/core/dsl/validation/OseeDslJavaValidator.java
@@ -35,6 +35,7 @@
 import org.eclipse.osee.framework.core.dsl.oseeDsl.XAttributeType;
 import org.eclipse.osee.framework.core.dsl.oseeDsl.XRelationType;
 import org.eclipse.osee.framework.core.dsl.oseeDsl.util.OseeDslSwitch;
+import org.eclipse.xtext.util.Strings;
 import org.eclipse.xtext.validation.Check;
 import org.eclipse.xtext.validation.ComposedChecks;
 
@@ -53,6 +54,31 @@
    public static final String NON_UNIQUE_RELATION_TYPE_RESTRICTION = "non_unique_relation_type_restriction";
 
    @Check
+   public void checkAttributeValidity(XAttributeType attribute) {
+      String min = attribute.getMin();
+      int minOccurrences = 0;
+      if (!Strings.isEmpty(min)) {
+         minOccurrences = Integer.parseInt(min);
+         if (minOccurrences > 0 && Strings.isEmpty(attribute.getDefaultValue())) {
+            error("Default value cannot be empty if min greater than 0", attribute,
+               OseeDslPackage.Literals.XATTRIBUTE_TYPE__DEFAULT_VALUE);
+         }
+      }
+      if (minOccurrences < 0) {
+         error("min cannot be less than 0", attribute, OseeDslPackage.Literals.XATTRIBUTE_TYPE__MIN);
+      }
+
+      String max = attribute.getMax();
+      int maxOccurrences = 0;
+      if (!Strings.isEmpty(max)) {
+         maxOccurrences = Integer.parseInt(max);
+      }
+      if (minOccurrences > maxOccurrences) {
+         error("min must not be greater than max", attribute, OseeDslPackage.Literals.XATTRIBUTE_TYPE__MAX);
+      }
+   }
+
+   @Check
    public void checkUuidValidity(OseeDsl oseeDsl) {
       Map<String, OseeType> uuids = new HashMap<String, OseeType>();
       EStructuralFeature feature = OseeDslPackage.Literals.OSEE_TYPE__UUID;
