[509616] wip better TypedElement.isRequired
diff --git a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
index 6d49d6f..18f47cc 100644
--- a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
+++ b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/internal/PropertyImpl.java
@@ -1699,4 +1699,22 @@
 		}
 		setType(null);				// Easier to set them all than just the base_xxx ones
 	}
+
+	@Override
+	public void setName(String newName) {
+		if ("children".equals(newName)) {
+			super.setName(newName);
+		}
+		else {
+			super.setName(newName);
+		}
+	}
+
+	@Override
+	public void setIsRequired(boolean newIsRequired) {
+		if ("children".equals(name) && !newIsRequired) {
+			toString();
+		}
+		super.setIsRequired(newIsRequired);
+	}
 } //PropertyImpl
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
index a8f17b4..01714bc 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/context/AbstractBase2ASConversion.java
@@ -17,6 +17,7 @@
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.ocl.pivot.CollectionType;
 import org.eclipse.ocl.pivot.ExpressionInOCL;
 import org.eclipse.ocl.pivot.NamedElement;
 import org.eclipse.ocl.pivot.OCLExpression;
@@ -214,6 +215,9 @@
 		}
 	}
 	public void setType(@NonNull TypedElement pivotElement, Type type, boolean isRequired) {
+		if (type instanceof CollectionType) {
+			//			assert isRequired;
+		}
 		Type primaryType = type != null ? metamodelManager.getPrimaryType(type) : null;
 		if (primaryType != pivotElement.getType()) {
 			pivotElement.setType(primaryType);
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
index a51312f..c9803b7 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
@@ -553,14 +553,27 @@
 		Property pivotProperty = PivotFactory.eINSTANCE.createProperty();
 		pivotProperty.setName(eFeature.getName());
 		pivotProperty.setType(type);
+		pivotProperty.setIsRequired(eFeature.isMany() || eFeature.isRequired());
 		((PivotObjectImpl)pivotProperty).setESObject(eFeature);
 		return pivotProperty;
 	}
 
+	/**
+	 * @deprecated provide isRequired argument
+	 */
+	@Deprecated
 	public static @NonNull Property createProperty(@NonNull String name, @NonNull Type type) {
+		return createProperty(name, type, type instanceof CollectionType);
+	}
+
+	/**
+	 * @since 1.3
+	 */
+	public static @NonNull Property createProperty(@NonNull String name, @NonNull Type type, boolean isRequired) {
 		Property pivotProperty = PivotFactory.eINSTANCE.createProperty();
 		pivotProperty.setName(name);
 		pivotProperty.setType(type);
+		pivotProperty.setIsRequired(isRequired);
 		return pivotProperty;
 	}
 
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
index 8ff8804..faf9a07 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSPreOrderVisitor.java
@@ -584,6 +584,12 @@
 	}
 
 	@Override
+	public Continuation<?> visitTuplePartCS(@NonNull TuplePartCS object) {
+		// TODO Auto-generated method stub
+		return super.visitTuplePartCS(object);
+	}
+
+	@Override
 	public Continuation<?> visitTupleTypeCS(@NonNull TupleTypeCS csTupleType) {
 		return new TupleContinuation(context, csTupleType);
 	}
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
index 7048c10..70b1f39 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/ElementUtil.java
@@ -475,6 +475,14 @@
 				if (lower > 0) {
 					return true;
 				}
+				int upper = csMultiplicity.getUpper();
+				if (upper > 1) {
+					return true;
+				}
+			}
+			Element variableType = csTypeRef.getPivot();
+			if (variableType instanceof CollectionType) {
+				return true;
 			}
 		}
 		return false;
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
index 88b38e5..860cf14 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSLeft2RightVisitor.java
@@ -871,7 +871,7 @@
 					else {
 						accType = initType;
 					}
-					context.setType(acc, accType, false, null);
+					context.setType(acc, accType, accType instanceof CollectionType, null);
 				}
 				acc.setRepresentedParameter(iteration.getOwnedAccumulators().get(pivotAccumulators.size()));
 				pivotAccumulators.add(acc);
@@ -2120,7 +2120,8 @@
 				pivotElement.setOwnedInit(initExpression);
 				TypedRefCS csType = csTupleLiteralPart.getOwnedType();
 				Type type = csType != null ? PivotUtil.getPivot(Type.class, csType) : initExpression != null ? initExpression.getType() : null;
-				context.setType(pivotElement, type, (initExpression != null) && initExpression.isIsRequired(), null);
+				boolean isRequired = csType != null ? ElementUtil.isRequired(csType) : (initExpression != null) && initExpression.isIsRequired();
+				context.setType(pivotElement, type, isRequired, null);
 			}
 		}
 		return pivotElement;
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
index 4f62c62..00f18f3 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
@@ -109,6 +109,9 @@
 		MetamodelManager metamodelManager = ocl.getMetamodelManager();
 		try {
 			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
+			ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer[1]=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+
+
 			ocl.assertQueryResults(null, "Set{CollectionKind::Bag,CollectionKind::Collection,CollectionKind::_'OrderedSet',CollectionKind::_'Sequence',CollectionKind::_'Set'}", "CollectionKind.allInstances()");
 			ocl.assertQueryResults(null, "Set{true,false}", "Boolean.allInstances()");
 			ocl.assertQueryResults(null, "Set{null}", "OclVoid.allInstances()");
@@ -117,14 +120,14 @@
 			ocl.assertSemanticErrorQuery(classType, "Integer.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Integer", "allInstances", "");
 			ocl.assertSemanticErrorQuery(classType, "String.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "String", "allInstances", "");
 			ocl.assertSemanticErrorQuery(classType, "Set(Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", "");
 			ocl.assertSemanticErrorQuery(classType, "OclAny.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "OclAny", "allInstances", "");
 			ocl.assertSemanticErrorQuery(classType, "4.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Integer", "allInstances", "");
 			ocl.assertSemanticErrorQuery(classType, "true.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Boolean", "allInstances", "");
 			//		ocl.assertQueryInvalid(null, "true.allInstances()");
 			//		ocl.assertQueryResults(null, "Set{true,false}", "true.allInstances()");
 			ocl.assertSemanticErrorQuery(classType, "Set{1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer[1]=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
 			ocl.assertQueryInvalid(null, "OclInvalid.allInstances()");
 		} finally {
 			ocl.dispose();
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
index 6a97ccb..70b1a2c 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateOclAnyOperationsTest4.java
@@ -894,8 +894,8 @@
 		ocl.assertQueryEquals(null, tupleType, "Tuple{a:Integer=3}.oclType()");
 		ocl.assertQueryEquals(null, tupleType, "Tuple(a:Integer)");
 		ocl.assertQueryEquals(null, tupleTypeClass, "Tuple(a:Integer).oclType()");
-		ocl.assertSemanticErrorQuery(null, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
-		ocl.assertSemanticErrorQuery(null, "Tuple{a:Integer=3}.oclType().allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");	// FIXME
+		ocl.assertSemanticErrorQuery(null, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", "");
+		ocl.assertSemanticErrorQuery(null, "Tuple{a:Integer=3}.oclType().allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[?])", "allInstances", "");	// FIXME
 		ocl.assertQueryResults(null, "Set{}", "Tuple(a:Integer).oclType().allInstances()");
 		ocl.assertQueryEquals(null, "Tuple", "Tuple{a:Integer=3}.oclType().name");
 		ocl.dispose();