diff --git a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.61.0-SNAPSHOT.jar b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.61.0-SNAPSHOT.jar
index 3f0e72c15..2962de339 100644
Binary files a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.61.0-SNAPSHOT.jar and b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.61.0-SNAPSHOT.jar differ
diff --git a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.61.0-SNAPSHOT.jar b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.61.0-SNAPSHOT.jar
index bb198270e..3e8f6bdcf 100644
Binary files a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.61.0-SNAPSHOT.jar and b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.61.0-SNAPSHOT.jar differ
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Feature.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Feature.java
index b7c4e9bfa..b7e9706bd 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Feature.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Feature.java
@@ -1072,18 +1072,21 @@ public interface Feature extends Type {
*
*
*
- *
If this Feature is an end Feature of its owningType, then return the first ownedMember of the Feature that is a Feature, but not a Multiplicity or a MetadataFeature, and whose owningMembership is not a FeatureMembership. If this exists, it is the crossFeature of the end Feature.
+ * If this Feature is an end Feature of its owningType, then return the first ownedMember of the Feature that is a Feature, but not a Multiplicity, MetadataFeature, or BindingConnector, and whose owningMembership is not a FeatureMembership or FeatureValue. If this exists, it is the crossFeature of the end Feature.
* if not isEnd or owningType = null then null
* else
* let ownedMemberFeatures: Sequence(Feature) =
* ownedMember->selectByKind(Feature)->
- * reject(oclIsKindOf(Multiplicity) or
+ * reject(oclIsKindOf(Multiplicity) or
* oclIsKindOf(MetadataFeature) or
- * oclIsKindOf(FeatureValue))->
- * reject(owningMembership.oclIsKindOf(FeatureMembership)) in
+ * oclIsKindOf(BindingConnector))->
+ * reject(owningMembership.oclIsKindOf(FeatureMembership) or
+ * owningMembership.oclIsKindOf(FeatureValue)) in
* if ownedMemberFeatures.isEmpty() then null
* else ownedMemberFeatures->first()
* endif
+ * endif
+ *
*
* @model ordered="false"
* annotation="http://www.omg.org/spec/SysML"
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/IndexExpression.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/IndexExpression.java
index ecad2f612..f452da4bb 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/IndexExpression.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/IndexExpression.java
@@ -11,7 +11,7 @@
*
* An IndexExpression is an OperatorExpression whose operator is "#", which resolves to the Function BasicFunctions::'#' from the Kernel Functions Library.
* arguments->notEmpty() and
- * not arguments->first().result.specializesFromLibrary('Collections::Array') implies
+ * not arguments->first().result.specializesFromLibrary('Collections::Collection') implies
* result.specializes(arguments->first().result)
* operator = '#'
*
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/MultiplicityRange.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/MultiplicityRange.java
index 2e9a05f17..b77bf332b 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/MultiplicityRange.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/MultiplicityRange.java
@@ -12,7 +12,15 @@
*
* A MultiplicityRange is a Multiplicity whose value is defined to be the (inclusive) range of natural numbers given by the result of a lowerBound Expression and the result of an upperBound Expression. The result of these Expressions shall be of type Natural. If the result of the upperBound Expression is the unbounded value *, then the specified range includes all natural numbers greater than or equal to the lowerBound value. If no lowerBound Expression, then the default is that the lower bound has the same value as the upper bound, except if the upperBound evaluates to *, in which case the default for the lower bound is 0.
*
- * bound->forAll(b | b.featuringType = self.featuringType)
+ * let boundsFeaturingType : OrderedSet(Type) =
+ * if owningNamespace <> null and owningNamespace.oclIsKindOf(Feature) and
+ * owningNamespace.oclAsType(Feature).isOwnedCrossFeature() then
+ * owningNamespace.oclAsType(Feature).owningNamespace.oclAsType(Feature).featuringType
+ * else
+ * featuringType
+ * endif in
+ * bound->forAll(b | b.featuringType = boundsFeaturingType)
+ *
* bound->forAll(b |
* b.result.specializesFromLibrary('ScalarValues::Integer') and
* let value : UnlimitedNatural = valueOf(b) in
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Redefinition.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Redefinition.java
index 495215f90..22b34cf4c 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Redefinition.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Redefinition.java
@@ -36,7 +36,11 @@
* and
* (direction = FeatureDirectionKind::inout implies
* redefiningFeature.direction <> null))
- * redefinedFeature.isEnd implies redefiningFeature.isEnd
+ * redefinedFeature.isEnd and
+ * redefiningFeature.owningType <> null and
+ * (redefiningFeature.owningType.oclIsKindOf(Association) or
+ * redefiningFeature.owningType.oclIsKindOf(Connector)) implies
+ * redefiningFeature.isEnd
*
*
*
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/RequirementUsage.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/RequirementUsage.java
index 40107bb78..f28b5cd65 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/RequirementUsage.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/RequirementUsage.java
@@ -42,7 +42,8 @@
* specializesFromLibrary('Requirements::requirementChecks')
* isComposite and owningType <> null and
* (owningType.oclIsKindOf(RequirementDefinition) or
- * owningType.oclIsKindOf(RequirementUsage)) implies
+ * owningType.oclIsKindOf(RequirementUsage)) and
+ * not owningFeatureMembership.oclIsKindOf(RequirementConstraintMembership) implies
* specializesFromLibrary('Requirements::RequirementCheck::subrequirements')
* owningfeatureMembership <> null and
* owningfeatureMembership.oclIsKindOf(ObjectiveMembership) implies
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/SendActionUsage.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/SendActionUsage.java
index f64245837..6c4b9cc8e 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/SendActionUsage.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/SendActionUsage.java
@@ -19,7 +19,7 @@
* payloadArgument <> null
* receiverArgument = argument(3)
* isSubactionUsage() implies
- * specializesFromLibrary('Actions::Action::acceptSubactions')
+ * specializesFromLibrary('Actions::Action::sendSubactions')
* specializesFromLibrary('Actions::sendActions')
*
*
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Type.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Type.java
index 51c4987a6..b654db963 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Type.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Type.java
@@ -39,8 +39,10 @@
* specializesFromLibrary('Base::Anything')
* directedFeature = feature->select(f | directionOf(f) <> null)
* feature = featureMembership.ownedMemberFeature
- * featureMembership = ownedFeatureMembership->union(
- * inheritedMembership->selectByKind(FeatureMembership))
+ * featureMembership = ownedFeatureMembership->
+ * union(inheritedMembership->
+ * selectByKind(FeatureMembership)->
+ * select(mem | self.specializes(mem.owningType)))
* ownedFeature = ownedFeatureMembership.ownedMemberFeature
* differencingType = ownedDifferencing.differencingType
* intersectingType->excludes(self)
diff --git a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Usage.java b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Usage.java
index 384dfaad1..399e2d0ab 100644
--- a/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Usage.java
+++ b/org.omg.sysml.model/src/main/java/org/omg/sysml/lang/sysml/Usage.java
@@ -43,7 +43,7 @@
* nestedFlow = nestedUsage->selectByKind(FlowUsage)
* nestedInterface = nestedUsage->selectByKind(ReferenceUsage)
* nestedItem = nestedUsage->selectByKind(ItemUsage)
- * nestedMetadata = nestedUsage->selectByKind(MetadataUsage)
+ * nestedMetadata = ownedMember->selectByKind(MetadataUsage)
* nestedOccurrence = nestedUsage->selectByKind(OccurrenceUsage)
* nestedPart = nestedUsage->selectByKind(PartUsage)
* nestedPort = nestedUsage->selectByKind(PortUsage)
diff --git a/org.omg.sysml.model/src/main/resources/model/SysML.ecore b/org.omg.sysml.model/src/main/resources/model/SysML.ecore
index 88a1e51a2..61685a0d0 100644
--- a/org.omg.sysml.model/src/main/resources/model/SysML.ecore
+++ b/org.omg.sysml.model/src/main/resources/model/SysML.ecore
@@ -1744,7 +1744,7 @@
-
+
@@ -2503,7 +2503,7 @@
-
+
-
+
@@ -3411,7 +3411,7 @@
-
+
@@ -3688,7 +3688,7 @@
-
+
@@ -3869,7 +3869,7 @@
-
+
@@ -4442,7 +4442,7 @@
-
+
@@ -4826,7 +4826,7 @@
-
+
diff --git a/org.omg.sysml/model/KerML.genmodel b/org.omg.sysml/model/KerML.genmodel
index fd248e310..5a5157195 100644
--- a/org.omg.sysml/model/KerML.genmodel
+++ b/org.omg.sysml/model/KerML.genmodel
@@ -42,29 +42,16 @@
-
-
-
-
-
-
-
-
-
+
+
-
-
+
@@ -109,6 +96,19 @@
+
+
+
+
+
+
+
+
@@ -118,10 +118,10 @@
propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Namespace/member"/>
-
+
@@ -213,31 +213,25 @@
-
-
-
-
-
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//MembershipImport/importedMembership"/>
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Conjugation/originalType"/>
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Conjugation/owningType"/>
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Conjugation/conjugatedType"/>
+
-
@@ -326,6 +318,14 @@
+
+
+
+
+
@@ -460,14 +460,6 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//ParameterMembership/ownedMemberParameter"/>
+
+
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Behavior/step"/>
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Behavior/parameter"/>
+
+
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Step/behavior"/>
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Step/parameter"/>
-
-
-
+
+
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Connector/relatedFeature"/>
-
-
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Connector/association"/>
+
+
+
+
+
+
+
+
+
+
@@ -551,19 +566,6 @@
-
-
-
-
-
-
-
-
-
@@ -571,14 +573,11 @@
propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Function/result"/>
-
-
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//FeatureChainExpression/targetFeature"/>
+
-
-
@@ -590,13 +589,23 @@
propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//InstantiationExpression/instantiatedType.1"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
@@ -613,36 +622,22 @@
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
+
-
-
-
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//BooleanExpression/predicate"/>
-
+
+
+
+
+
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//ResultExpressionMembership/ownedResultExpression"/>
-
+
@@ -659,7 +654,7 @@
-
+
@@ -675,23 +670,28 @@
-
-
-
-
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//FeatureValue/featureWithValue"/>
+
+
+
-
-
+
+
+
+
-
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//Package/filterCondition"/>
+
+
+
-
+
+ propertySortChoices="true" ecoreFeature="ecore:EReference kerml.ecore#//ElementFilterMembership/condition"/>
+
diff --git a/org.omg.sysml/model/KerML_only.uml b/org.omg.sysml/model/KerML_only.uml
index aa488c8ba..1a98cc52e 100644
--- a/org.omg.sysml/model/KerML_only.uml
+++ b/org.omg.sysml/model/KerML_only.uml
@@ -1,130 +1,13 @@
-
-
-
- <p>A <code>Relationship</code> is an <code>Element</code> that relates other <code>Element</code>. Some of its <code>relatedElements</code> may be owned, in which case those <code>ownedRelatedElements</code> will be deleted from a model if their <code>owningRelationship</code> is. A <code>Relationship</code> may also be owned by another <code>Element</code>, in which case the <code>ownedRelatedElements</code> of the <code>Relationship</code> are also considered to be transitively owned by the <code>owningRelatedElement</code> of the <code>Relationship</code>.</p>
-
-<p>The <code>relatedElements</code> of a <code>Relationship</code> are divided into <code>source</code> and <code>target</code> <code>Elements</code>. The <code>Relationship</code> is considered to be directed from the <code>source</code> to the <code>target</code> <code>Elements</code>. An undirected <code>Relationship</code> may have either all <code>source</code> or all <code>target</code> <code>Elements</code>.</p>
-
-<p>A "relationship <code>Element</code>" in the abstract syntax is generically any <code>Element</code> that is an instance of either <code>Relationship</code> or a direct or indirect specialization of <code>Relationship</code>. Any other kind of <code>Element</code> is a "non-relationship <code>Element</code>". It is a convention of that non-relationship <code>Elements</code> are <em>only</em> related via reified relationship <code>Elements</code>. Any meta-associations directly between non-relationship <code>Elements</code> must be derived from underlying reified <code>Relationship</code>.</p>
-
-
-
-
- <p>The <code>relatedElements</code> of a <code>Relationship</code> consist of all of its <code>source</code> <code>Elements</code> followed by all of its <code>target</code> <code>Elements</code>.</p>
-
-
- OCL2.0
- relatedElement = source->union(target)
-
-
-
-
-
- <p>The Elements that are related by this Relationship, derived as the union of the <code>source</code> and <code>target</code> Elements of the Relationship.</p>
-
-
-
-
-
-
- <p>The <code>relatedElements</code> to which this Relationship is considered to be directed.</p>
-
-
-
-
-
-
-
- <p>The <code>relatedElements</c ode> from which this Relationship is considered to be directed.</p>
-
-
-
-
-
-
- <p>The <tt>relatedElement</tt> of this Relationship that owns the Relationship, if any.</p>
-
-
-
-
-
-
- <p>The <tt>relatedElements</tt> of this Relationship that are owned by the Relationship.</p>
-
-
-
-
-
-
- <p>Whether this Relationship was generated by tooling to meet semantic rules, rather than being directly created by a modeler.</p>
-
-
-
-
-
-
- <p>Return whether this Relationship has either an <code>owningRelatedElement</code> or <code>owningRelationship</code> that is a library element.</p>
-
-
-
- OCL2.0
- if owningRelatedElement <> null then owningRelatedElement.libraryNamespace()
-else if owningRelationship <> null then owningRelationship.libraryNamespace()
-else null endif endif
-
-
-
-
-
-
-
-
-
- <p>If the <code>owningRelationship</code> of the <code>Relationship</code> is null but its <code>owningRelatedElement</code> is non-null, construct the <code>path</code> using the position of the <code>Relationship</code> in the list of <code>ownedRelationships</code> of its <code>owningRelatedElement</code>. Otherwise, return the <code>path</code> of the <code>Relationship</code> as specified for an <code>Element</code> in general.</p>
-
-
-
- OCL2.0
- if owningRelationship = null and owningRelatedElement <> null then
- owningRelatedElement.path() + '/' +
- owningRelatedElement.ownedRelationship->indexOf(self).toString()
- -- A position index shall be converted to a decimal string representation
- -- consisting of only decimal digits, with no sign, leading zeros or leading
- -- or trailing whitespace.
-else self.oclAsType(Element).path()
-endif
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
<p>An <code>Element</code> is a constituent of a model that is uniquely identified relative to all other <code>Elements</code>. It can have <code>Relationships</code> with other <code>Elements</code>. Some of these <code>Relationships</code> might imply ownership of other <code>Elements</code>, which means that if an <code>Element</code> is deleted from a model, then so are all the <code>Elements</code> that it owns.</p>
@@ -463,6 +346,132 @@ endif endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <p>A <code>Relationship</code> is an <code>Element</code> that relates other <code>Element</code>. Some of its <code>relatedElements</code> may be owned, in which case those <code>ownedRelatedElements</code> will be deleted from a model if their <code>owningRelationship</code> is. A <code>Relationship</code> may also be owned by another <code>Element</code>, in which case the <code>ownedRelatedElements</code> of the <code>Relationship</code> are also considered to be transitively owned by the <code>owningRelatedElement</code> of the <code>Relationship</code>.</p>
+
+<p>The <code>relatedElements</code> of a <code>Relationship</code> are divided into <code>source</code> and <code>target</code> <code>Elements</code>. The <code>Relationship</code> is considered to be directed from the <code>source</code> to the <code>target</code> <code>Elements</code>. An undirected <code>Relationship</code> may have either all <code>source</code> or all <code>target</code> <code>Elements</code>.</p>
+
+<p>A "relationship <code>Element</code>" in the abstract syntax is generically any <code>Element</code> that is an instance of either <code>Relationship</code> or a direct or indirect specialization of <code>Relationship</code>. Any other kind of <code>Element</code> is a "non-relationship <code>Element</code>". It is a convention of that non-relationship <code>Elements</code> are <em>only</em> related via reified relationship <code>Elements</code>. Any meta-associations directly between non-relationship <code>Elements</code> must be derived from underlying reified <code>Relationship</code>.</p>
+
+
+
+
+ <p>The <code>relatedElements</code> of a <code>Relationship</code> consist of all of its <code>source</code> <code>Elements</code> followed by all of its <code>target</code> <code>Elements</code>.</p>
+
+
+ OCL2.0
+ relatedElement = source->union(target)
+
+
+
+
+
+ <p>The Elements that are related by this Relationship, derived as the union of the <code>source</code> and <code>target</code> Elements of the Relationship.</p>
+
+
+
+
+
+
+ <p>The <code>relatedElements</code> to which this Relationship is considered to be directed.</p>
+
+
+
+
+
+
+
+ <p>The <code>relatedElements</c ode> from which this Relationship is considered to be directed.</p>
+
+
+
+
+
+
+ <p>The <tt>relatedElement</tt> of this Relationship that owns the Relationship, if any.</p>
+
+
+
+
+
+
+ <p>The <tt>relatedElements</tt> of this Relationship that are owned by the Relationship.</p>
+
+
+
+
+
+
+ <p>Whether this Relationship was generated by tooling to meet semantic rules, rather than being directly created by a modeler.</p>
+
+
+
+
+
+
+ <p>Return whether this Relationship has either an <code>owningRelatedElement</code> or <code>owningRelationship</code> that is a library element.</p>
+
+
+
+ OCL2.0
+ if owningRelatedElement <> null then owningRelatedElement.libraryNamespace()
+else if owningRelationship <> null then owningRelationship.libraryNamespace()
+else null endif endif
+
+
+
+
+
+
+
+
+
+ <p>If the <code>owningRelationship</code> of the <code>Relationship</code> is null but its <code>owningRelatedElement</code> is non-null, construct the <code>path</code> using the position of the <code>Relationship</code> in the list of <code>ownedRelationships</code> of its <code>owningRelatedElement</code>. Otherwise, return the <code>path</code> of the <code>Relationship</code> as specified for an <code>Element</code> in general.</p>
+
+
+
+ OCL2.0
+ if owningRelationship = null and owningRelatedElement <> null then
+ owningRelatedElement.path() + '/' +
+ owningRelatedElement.ownedRelationship->indexOf(self).toString()
+ -- A position index shall be converted to a decimal string representation
+ -- consisting of only decimal digits, with no sign, leading zeros or leading
+ -- or trailing whitespace.
+else self.oclAsType(Element).path()
+endif
+
+
+
+
+
+
+
+
+
+
+ <p>The <code>Dependencies</code> that have a certain <code>client</code> <code>Element</code>.</p>
+
+
+
+
+
<p>A <code>Dependency</code> is a <code>Relationship</code> that indicates that one or more <code>client</code> <code>Elements</code> require one more <code>supplier</code> <code>Elements</code> for their complete specification. In general, this means that a change to one of the <code>supplier</code> <code>Elements</code> may necessitate a change to, or re-specification of, the <code>client</code> <code>Elements</code>.</p>
@@ -485,15 +494,6 @@ endif endif
-
-
-
- <p>The <code>Dependencies</code> that have a certain <code>client</code> <code>Element</code>.</p>
-
-
-
-
-
@@ -503,274 +503,293 @@ endif endif