diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/as2es/AS2EcoreDeclarationVisitor.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/as2es/AS2EcoreDeclarationVisitor.java
index 03d8402..142d0ed 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/as2es/AS2EcoreDeclarationVisitor.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/as2es/AS2EcoreDeclarationVisitor.java
@@ -88,7 +88,7 @@
 import com.google.common.collect.Iterables;
 
 public class AS2EcoreDeclarationVisitor
-	extends AbstractExtendingVisitor<Object, AS2Ecore>
+extends AbstractExtendingVisitor<Object, AS2Ecore>
 {
 	public static final @NonNull DuplicateConstraintsFilter duplicateConstraintsFilter = new DuplicateConstraintsFilter();
 	public static final @NonNull DuplicateOperationsFilter duplicateOperationsFilter = new DuplicateOperationsFilter();
@@ -125,7 +125,7 @@
 				return false;		// FIXME Bug 405061 workaround
 			}
 			return true;
-//			return (anOperation != null) && (anOperation.getRedefinedOperation().size() != 0);
+			//			return (anOperation != null) && (anOperation.getRedefinedOperation().size() != 0);
 		}
 	}
 
@@ -171,7 +171,7 @@
 				return true;		// FIXME Bug 405061 workaround
 			}
 			return false;
-//			return (anOperation != null) && (anOperation.getRedefinedOperation().size() == 0);
+			//			return (anOperation != null) && (anOperation.getRedefinedOperation().size() == 0);
 		}
 	}
 
@@ -186,12 +186,12 @@
 				return true;
 			}
 			return !ClassUtil.safeEquals(aProperty.getName(), aProperty.getRedefinedProperties().get(0).getName());
-//			return (aProperty != null) && (aProperty.getRedefinedProperty().size() == 0);
+			//			return (aProperty != null) && (aProperty.getRedefinedProperty().size() == 0);
 		}
 	}
 
 	protected final @NonNull DelegateInstaller delegateInstaller;
-	
+
 	public AS2EcoreDeclarationVisitor(@NonNull AS2Ecore context) {
 		super(context);
 		this.delegateInstaller = context.getDelegateInstaller();
@@ -207,7 +207,7 @@
 		else {
 			eClassifier.eUnset(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME);
 		}
-//		visitAll(eClassifier.getETypeParameters(), pivotType.getTypeParameters());
+		//		visitAll(eClassifier.getETypeParameters(), pivotType.getTypeParameters());
 		delegateInstaller.installDelegates(eClassifier, pivotType);
 		for (Constraint pivotInvariant : pivotType.getOwnedInvariants()) {
 			if (!pivotInvariant.isIsCallable()) {
@@ -364,7 +364,7 @@
 	}
 
 	public <T extends EObject> void safeVisitAll(@NonNull List<T> eObjects, @NonNull Iterable<? extends Element> pivotObjects) {
-	for (Element pivotObject : pivotObjects) {
+		for (Element pivotObject : pivotObjects) {
 			@SuppressWarnings("unchecked")
 			T eObject = (T) safeVisit(pivotObject);
 			if (eObject != null) {
@@ -449,11 +449,11 @@
 			isAbstract = true;
 			isInterface = true;
 		}
-//		else if ("OclSelf".equals(className)) {
-//			instanceClass = Object.class;
-//			isAbstract = true;
-//			isInterface = true;
-//		}
+		//		else if ("OclSelf".equals(className)) {
+		//			instanceClass = Object.class;
+		//			isAbstract = true;
+		//			isInterface = true;
+		//		}
 		else if ("OclState".equals(className)) {
 			instanceClass = Object.class;
 			isAbstract = true;
@@ -487,7 +487,7 @@
 		context.defer(pivotClass);		// Defer superclass resolution
 		@SuppressWarnings("null")@NonNull List<EOperation> eOperations = eClass.getEOperations();
 		@NonNull Iterable<Constraint> nonDuplicateConstraints = Iterables.filter(pivotClass.getOwnedInvariants(), nonDuplicateConstraintsFilter);
-//		safeVisitAll(eOperations, nonDuplicateConstraints);
+		//		safeVisitAll(eOperations, nonDuplicateConstraints);
 		@NonNull Iterable<Operation> nonDuplicateOperations = Iterables.filter(pivotClass.getOwnedOperations(), nonDuplicateOperationsFilter);
 		safeVisitAll(eOperations, nonDuplicateOperations);
 		@SuppressWarnings("null")@NonNull List<EStructuralFeature> eStructuralFeatures = eClass.getEStructuralFeatures();
@@ -514,7 +514,7 @@
 				if (eDuplicates == null) {
 					eDuplicates = new ArrayList<ETypedElement>();
 				}
-//				Object eOperation = safeVisit(asConstraint);
+				//				Object eOperation = safeVisit(asConstraint);
 				if (asConstraint.isIsCallable()) {
 					EOperation eOperation = AS2Ecore.createConstraintEOperation(asConstraint, asConstraint.getName(), options);
 					eOperations.add(eOperation);
@@ -669,17 +669,17 @@
 			if (imports.size() > 0) {
 				imports = new ArrayList<Import>(imports);
 				Collections.sort(imports, new Comparator<Import>()
-						{
-						@Override
-						public int compare(Import o1, Import o2) {
-							String n1 = o1.getName();
-							String n2 = o2.getName();
-							if (n1 == null) n1 = "";
-							if (n2 == null) n1 = "";
-							return n1.compareTo(n2);
-						}
+				{
+					@Override
+					public int compare(Import o1, Import o2) {
+						String n1 = o1.getName();
+						String n2 = o2.getName();
+						if (n1 == null) n1 = "";
+						if (n2 == null) n1 = "";
+						return n1.compareTo(n2);
 					}
-				);
+				}
+						);
 			}
 			EAnnotation importAnnotation = null;
 			URI ecoreURI = context.getEcoreURI();
@@ -694,7 +694,7 @@
 					if (eTarget != null) {
 						URI uri = null;
 						if ((eTarget instanceof EPackage) && ClassUtil.isRegistered(eTarget.eResource())) {
-	 						String nsURI = ((EPackage)eTarget).getNsURI();
+							String nsURI = ((EPackage)eTarget).getNsURI();
 							if (nsURI != null) {
 								uri = URI.createURI(nsURI);
 							}
@@ -732,12 +732,12 @@
 		copyTemplateSignature(eTypeParameters, pivotOperation);
 		@SuppressWarnings("null")@NonNull List<EParameter> eParameters = eOperation.getEParameters();
 		safeVisitAll(eParameters, pivotOperation.getOwnedParameters());
-//		safeVisitAll(eOperation.getEGenericExceptions(), pivotOperation.getRaisedException());
+		//		safeVisitAll(eOperation.getEGenericExceptions(), pivotOperation.getRaisedException());
 		LanguageExpression bodyExpression = pivotOperation.getBodyExpression();
 		if (bodyExpression != null) {
 			EAnnotation eBodyConstraint = delegateInstaller.createOperationDelegate(eOperation, bodyExpression, context.getEcoreURI());
 			if (eBodyConstraint != null) {
-//				AS2Ecore.copyComments(eBodyConstraint, bodyExpression);
+				//				AS2Ecore.copyComments(eBodyConstraint, bodyExpression);
 			}
 		}
 		for (Constraint pivotConstraint : pivotOperation.getOwnedPreconditions()) {
@@ -746,6 +746,13 @@
 		for (Constraint pivotConstraint : pivotOperation.getOwnedPostconditions()) {
 			safeVisit(pivotConstraint);		// Results are inserted directly
 		}
+		if (pivotOperation.isIsTransient()) {
+			EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
+			eAnnotation.setSource(PivotConstants.OPERATION_ANNOTATION_SOURCE);
+			EMap<String, String> details = eAnnotation.getDetails();
+			details.put(PivotConstants.OPERATION_IS_TRANSIENT, "true");
+			eOperation.getEAnnotations().add(eAnnotation);
+		}
 		return eOperation;
 	}
 
@@ -784,7 +791,7 @@
 		@SuppressWarnings("null")
 		@NonNull EDataType eDataType = EcoreFactory.eINSTANCE.createEDataType();
 		copyDataTypeOrEnum(eDataType, pivotPrimitiveType);
-/*		Class<?> instanceClass = null;
+		/*		Class<?> instanceClass = null;
 		String name = pivotPrimitiveType.getName();
 		if ("Boolean".equals(name)) {
 			instanceClass = Boolean.class;
@@ -843,9 +850,9 @@
 		eStructuralFeature.setTransient(pivotProperty.isIsTransient());
 		eStructuralFeature.setUnsettable(pivotProperty.isIsUnsettable());
 		eStructuralFeature.setVolatile(pivotProperty.isIsVolatile());
-//		Object defaultValue = pivotProperty.getDefaultValue();
+		//		Object defaultValue = pivotProperty.getDefaultValue();
 		String defaultValueLiteral = pivotProperty.getDefaultValueString();
-/*		if (defaultValue != null) {
+		/*		if (defaultValue != null) {
 			if (defaultValue instanceof String) {
 				defaultValueLiteral = (String)defaultValue;
 			}
@@ -879,8 +886,8 @@
 				boxedValue = metamodelManager.getExternalResourceSet().getEObject(uri, false);
 			}
 			pivotElement.setDefaultValue(boxedValue); * /
-			
-			
+
+
 		} */
 		if (defaultValueLiteral != null) {
 			eStructuralFeature.setDefaultValueLiteral(defaultValueLiteral);
@@ -892,7 +899,7 @@
 		if (defaultExpression != null) {
 			delegateInstaller.createPropertyDelegate(eStructuralFeature, defaultExpression, context.getEcoreURI());
 		}
-/*		for (Property redefinedProperty : pivotProperty.getRedefinedProperty()) {
+		/*		for (Property redefinedProperty : pivotProperty.getRedefinedProperty()) {
 			EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
 			eAnnotation.setSource(PivotConstants.REDEFINES_ANNOTATION_SOURCE);
 			eStructuralFeature.getEAnnotations().add(eAnnotation);
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/es2as/Ecore2ASDeclarationSwitch.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/es2as/Ecore2ASDeclarationSwitch.java
index eff06e0..e434b7b 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/es2as/Ecore2ASDeclarationSwitch.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/ecore/es2as/Ecore2ASDeclarationSwitch.java
@@ -91,28 +91,28 @@
 {
 	public static boolean hasDocumentationKey(@Nullable String source, @NonNull EMap<String, String> details) {
 		return (details.size() == 1) && PivotConstantsInternal.DOCUMENTATION_ANNOTATION_SOURCE.equals(source)
-			&& details.containsKey(PivotConstantsInternal.DOCUMENTATION_ANNOTATION_KEY);
+				&& details.containsKey(PivotConstantsInternal.DOCUMENTATION_ANNOTATION_KEY);
 	}
-	
+
 	public static boolean hasImportKey(@Nullable String source, @NonNull EMap<String, String> details) {
 		return PivotConstants.IMPORT_ANNOTATION_SOURCE.equals(source);
 	}
-	
+
 	public static boolean isDocumentationKey(@Nullable String source, @Nullable String key) {
 		return PivotConstantsInternal.DOCUMENTATION_ANNOTATION_SOURCE.equals(source)
-			&& PivotConstantsInternal.DOCUMENTATION_ANNOTATION_KEY.equals(key);
+				&& PivotConstantsInternal.DOCUMENTATION_ANNOTATION_KEY.equals(key);
 	}
 
 	protected final @NonNull AbstractExternal2AS converter;
 	protected final @NonNull EnvironmentFactoryInternal environmentFactory;
 	protected final @NonNull Technology technology;
-	
+
 	public Ecore2ASDeclarationSwitch(@NonNull AbstractExternal2AS converter) {
 		this.converter = converter;
 		this.environmentFactory = converter.getEnvironmentFactory();
 		this.technology = environmentFactory.getTechnology();
 	}
-	
+
 	@Override
 	public Object caseEAnnotation(EAnnotation eObject) {
 		String source = eObject.getSource();
@@ -178,8 +178,8 @@
 			excludedAnnotations.add(redefinesAnnotation);
 		}
 		copyClassifier(pivotElement, eObject2, excludedAnnotations);
-		pivotElement.setIsAbstract(eObject2.isAbstract());			
-		pivotElement.setIsInterface(eObject2.isInterface());			
+		pivotElement.setIsAbstract(eObject2.isAbstract());
+		pivotElement.setIsInterface(eObject2.isInterface());
 		doSwitchAll(eObject2.getEGenericSuperTypes());
 		List<Operation> pivotOperations = pivotElement.getOwnedOperations();
 		List<Constraint> pivotInvariants = pivotElement.getOwnedInvariants();
@@ -247,7 +247,7 @@
 		}
 		else if ("String".equals(newName) && (instanceClass == String.class)) {
 			isPrimitive = true;
-		} 
+		}
 		else if ("UnlimitedNatural".equals(newName) && ((instanceClass == Number.class) || (instanceClass == BigInteger.class)
 				|| (instanceClass == Long.class) || (instanceClass == long.class)
 				|| (instanceClass == Integer.class) || (instanceClass == int.class)
@@ -275,7 +275,7 @@
 		if (!isPrimitive && (instanceClass != null)) {
 			try {
 				PivotMetamodelManager metamodelManager = converter.getMetamodelManager();
-		    	StandardLibraryInternal standardLibrary = metamodelManager.getStandardLibrary();
+				StandardLibraryInternal standardLibrary = metamodelManager.getStandardLibrary();
 				PrimitiveType behavioralClass = standardLibrary.getBehavioralClass(instanceClass);
 				if (behavioralClass != null) {
 					pivotElement.setBehavioralClass(behavioralClass);
@@ -307,7 +307,7 @@
 		pivotElement.setName(newName);
 		copyDataTypeOrEnum(pivotElement, eObject2);
 		doSwitchAll(pivotElement.getOwnedLiterals(), eObject2.getELiterals());
-//		pivotElement.getSuperClass().add(metamodelManager.getOclAnyType());
+		//		pivotElement.getSuperClass().add(metamodelManager.getOclAnyType());
 		pivotElement.getSuperClasses().add(environmentFactory.getStandardLibrary().getOclEnumerationType());
 		return pivotElement;
 	}
@@ -325,17 +325,17 @@
 		else {
 			pivotElement.eUnset(PivotPackage.Literals.ENUMERATION_LITERAL__VALUE);
 		}
-//			String literal = basicGet(eObject, EcorePackage.Literals.EENUM_LITERAL__LITERAL, String.class);
-//			Enumerator instance = eEnumLiteral.getInstance();
-//			if (literal != null) {
-/*				AnnotationCS csAnnotation = PivotFactory.eINSTANCE.createAnnotationCS();
+		//			String literal = basicGet(eObject, EcorePackage.Literals.EENUM_LITERAL__LITERAL, String.class);
+		//			Enumerator instance = eEnumLiteral.getInstance();
+		//			if (literal != null) {
+		/*				AnnotationCS csAnnotation = PivotFactory.eINSTANCE.createAnnotationCS();
 				csAnnotation.setIdSource(EcorePackage.eNS_URI);
 				DetailCS csDetail = PivotFactory.eINSTANCE.createDetailCS();
 				csDetail.setIdName("literal");
 				copyDetailLines(csDetail.getValue(), literal);
 				csAnnotation.getDetails().add(csDetail);
 				pivotElement.getAnnotations().add(csAnnotation); */
-//			}
+		//			}
 		return pivotElement;
 	}
 
@@ -363,10 +363,10 @@
 		org.eclipse.ocl.pivot.Package pivotElement = converter.refreshElement(org.eclipse.ocl.pivot.Package.class, PivotPackage.Literals.PACKAGE, eObject2);
 		String oldName = pivotElement.getName();
 		String newName = technology.getOriginalName(eObject2);
-//		if (newName == null) {
-//			newName = "anon_" + Integer.toHexString(System.identityHashCode(eObject2));
-//			logger.error("Anonymous package named as '" + newName + "'");
-//		}
+		//		if (newName == null) {
+		//			newName = "anon_" + Integer.toHexString(System.identityHashCode(eObject2));
+		//			logger.error("Anonymous package named as '" + newName + "'");
+		//		}
 		String oldNsURI = pivotElement.getURI();
 		String newNsURI = eObject2.getNsURI();
 		boolean nameChange = (oldName != newName) || ((oldName != null) && !oldName.equals(newName));
@@ -407,13 +407,13 @@
 		List<EAnnotation> exclusions = new ArrayList<EAnnotation>();
 		EAnnotation eAnnotation = eObject2.getEAnnotation(EcorePackage.eNS_URI);
 		if (eAnnotation != null) {
-			exclusions.add(eAnnotation);		
+			exclusions.add(eAnnotation);
 		}
 		if (ClassUtil.basicGetMetamodelAnnotation(eObject2) != null) {
-			exclusions.add(ClassUtil.getMetamodelAnnotation(eObject2));		
+			exclusions.add(ClassUtil.getMetamodelAnnotation(eObject2));
 		}
 		converter.addMapping(eObject2, pivotElement);
-//		copyNamedElement(pivotElement, eObject2);
+		//		copyNamedElement(pivotElement, eObject2);
 		copyAnnotatedElement(pivotElement, eObject2, exclusions);
 		doSwitchAll(pivotElement.getOwnedPackages(), eObject2.getESubpackages());
 		doSwitchAll(pivotElement.getOwnedClasses(), eObject2.getEClassifiers());
@@ -431,7 +431,7 @@
 	@Override
 	public Object caseEReference(EReference eObject) {
 		@SuppressWarnings("null") @NonNull EReference eObject2 = eObject;
-		Property pivotElement = converter.refreshNamedElement(Property.class, PivotPackage.Literals.PROPERTY, eObject2);	
+		Property pivotElement = converter.refreshNamedElement(Property.class, PivotPackage.Literals.PROPERTY, eObject2);
 		List<EAnnotation> excludedAnnotations = null;
 		EAnnotation oppositeRole = eObject2.getEAnnotation(EMOFExtendedMetaData.EMOF_PACKAGE_NS_URI_2_0);
 		if (oppositeRole != null) {
@@ -446,11 +446,11 @@
 			excludedAnnotations.add(oppositeRole);
 		}
 		copyStructuralFeature(pivotElement, eObject2, excludedAnnotations);
-		pivotElement.setIsComposite(eObject2.isContainment());			
-		pivotElement.setIsResolveProxies(eObject2.isResolveProxies());			
+		pivotElement.setIsComposite(eObject2.isContainment());
+		pivotElement.setIsResolveProxies(eObject2.isResolveProxies());
 		if ((eObject2.getEOpposite() != null)
-		 || (excludedAnnotations != null)
-		 || !eObject2.getEKeys().isEmpty()) {
+				|| (excludedAnnotations != null)
+				|| !eObject2.getEKeys().isEmpty()) {
 			converter.queueReference(eObject2);	// Defer
 		}
 		return pivotElement;
@@ -463,11 +463,11 @@
 		converter.addMapping(eObject2, pivotElement);
 		String name = technology.getOriginalName(eObject2);
 		pivotElement.setName(name);
-//		TemplateParameter templateParameter = pivotElement.isTemplateParameter();
-//		if (templateParameter == null) {
-//			templateParameter = PivotFactory.eINSTANCE.createTemplateParameter();
-//			templateParameter.setOwnedParameteredElement(pivotElement);
-//		}
+		//		TemplateParameter templateParameter = pivotElement.isTemplateParameter();
+		//		if (templateParameter == null) {
+		//			templateParameter = PivotFactory.eINSTANCE.createTemplateParameter();
+		//			templateParameter.setOwnedParameteredElement(pivotElement);
+		//		}
 		List<EGenericType> eBounds = eObject2.getEBounds();
 		if (!eBounds.isEmpty()) {
 			doSwitchAll(eBounds);
@@ -501,7 +501,7 @@
 			Comment pivotComment = PivotFactory.eINSTANCE.createComment();
 			pivotComment.setBody(commentBody.replaceAll("\\r", ""));
 			constraint.getOwnedComments().add(pivotComment);
-		}				
+		}
 		converter.addMapping(eOperation, constraint);
 		return constraint;
 	}
@@ -514,6 +514,8 @@
 		@SuppressWarnings("null") @NonNull List<ETypeParameter> eTypeParameters = eOperation.getETypeParameters();
 		copyTemplateSignature(pivotElement,eTypeParameters);
 		doSwitchAll(eOperation.getEGenericExceptions());
+		String isTransientString = EcoreUtil.getAnnotation(eOperation, PivotConstants.OPERATION_ANNOTATION_SOURCE, PivotConstants.OPERATION_IS_TRANSIENT);
+		pivotElement.setIsTransient((isTransientString != null) && Boolean.getBoolean(isTransientString));
 		converter.queueReference(eOperation);				// For superclasses
 		return pivotElement;
 	}
@@ -522,9 +524,9 @@
 		List<EAnnotation> excludedAnnotations = null;
 		EAnnotation redefinesAnnotation = eOperation.getEAnnotation(PivotConstantsInternal.REDEFINES_ANNOTATION_SOURCE);
 		if (redefinesAnnotation != null) {
-//			if (excludedAnnotations == null) {
-				excludedAnnotations = new ArrayList<EAnnotation>();
-//			}
+			//			if (excludedAnnotations == null) {
+			excludedAnnotations = new ArrayList<EAnnotation>();
+			//			}
 			excludedAnnotations.add(redefinesAnnotation);
 		}
 		EAnnotation oclAnnotation = OCLCommon.getDelegateAnnotation(eOperation);
@@ -574,8 +576,8 @@
 				}
 				ExpressionInOCL specification = PivotFactory.eINSTANCE.createExpressionInOCL();
 				specification.setBody(value);
-//				constraint.setExprString(entry.getValue());
-//				constraint.setExprString(entry.getValue());
+				//				constraint.setExprString(entry.getValue());
+				//				constraint.setExprString(entry.getValue());
 				if (bodyName != null) {
 					pivotElement.setBodyExpression(specification);
 					pivotElement.setImplementation(new EObjectOperation(pivotElement, eOperation, specification));
@@ -593,7 +595,7 @@
 					}
 					copyAnnotationComment(constraint, oclAnnotation, key);
 				}
-			}				
+			}
 		}
 		return excludedAnnotations;
 	}
@@ -641,9 +643,9 @@
 					Comment pivotComment = PivotFactory.eINSTANCE.createComment();
 					pivotComment.setBody(details.get(PivotConstantsInternal.DOCUMENTATION_ANNOTATION_KEY));
 					pivotElement.getOwnedComments().add(pivotComment);
-				}				
+				}
 				else if (hasImportKey(source, details)) {
-				}				
+				}
 				else /*if (!eAnnotation.getContents().isEmpty()
 				 || !eAnnotation.getReferences().isEmpty()
 				 || (details.size() > 1)
@@ -710,12 +712,12 @@
 				{
 					converter.error("Unsupported feature constraint " + key);
 				}
-			}				
+			}
 			if (bestEntry != null) {
 				String value = bestEntry.getValue();
 				ExpressionInOCL specification = PivotFactory.eINSTANCE.createExpressionInOCL();
 				specification.setBody(value);
-//					constraint.setExprString(entry.getValue());
+				//					constraint.setExprString(entry.getValue());
 				pivotElement.setOwnedExpression(specification);
 				pivotElement.setImplementation(new EObjectProperty(eObject, specification));
 			}
@@ -724,11 +726,11 @@
 			}
 		}
 		copyTypedElement(pivotElement, eObject, excludedAnnotations);
-		pivotElement.setIsReadOnly(!eObject.isChangeable());			
-		pivotElement.setIsDerived(eObject.isDerived());			
-		pivotElement.setIsTransient(eObject.isTransient());			
-		pivotElement.setIsUnsettable(eObject.isUnsettable());			
-		pivotElement.setIsVolatile(eObject.isVolatile());			
+		pivotElement.setIsReadOnly(!eObject.isChangeable());
+		pivotElement.setIsDerived(eObject.isDerived());
+		pivotElement.setIsTransient(eObject.isTransient());
+		pivotElement.setIsUnsettable(eObject.isUnsettable());
+		pivotElement.setIsVolatile(eObject.isVolatile());
 	}
 
 	protected void copyTypedElement(@NonNull TypedElement pivotElement, @NonNull ETypedElement eTypedElement, List<EAnnotation> excludedAnnotations) {
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotConstants.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotConstants.java
index d322dc8..cfa50f4 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotConstants.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotConstants.java
@@ -13,6 +13,9 @@
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.ocl.common.OCLConstants;
 
+/**
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
 public interface PivotConstants
 {
 	/**
@@ -23,17 +26,17 @@
 	 * intended to be used by client code.
 	 */
 	static final @NonNull String AS_METAMODEL_ANNOTATION_SOURCE = "http://www.eclipse.org/OCL/ASMetamodel";
-	
+
 	/**
 	 * The Package name of the shared metamodel.
 	 */
 	static final @NonNull String METAMODEL_NAME = "$metamodel$";
-	
+
 	/**
 	 * The Package name of the shared types metamodel.
 	 */
 	static final @NonNull String TYPES_METAMODEL_NAME = "$types$";	// FIXME Use extension point
-	
+
 	/**
 	 * The Package name of the shared uml metamodel.
 	 */
@@ -45,7 +48,7 @@
 	static final @NonNull String OCLSTDLIB_FILE_EXTENSION = "oclstdlib";
 	static final @NonNull String OCL_AS_FILE_EXTENSION = "oclas";
 	static final @NonNull String DOT_OCL_AS_FILE_EXTENSION = "." + OCL_AS_FILE_EXTENSION;
-	
+
 	/**
 	 * String-valued URI prefix of a package defining the primitive types. Proxy references to
 	 * e.g. OCL's String rather than Ecore's EString are constructed by just appending 'String' to
@@ -65,7 +68,17 @@
 	 */
 	static final @NonNull String COLLECTION_ANNOTATION_SOURCE = "http://www.eclipse.org/OCL/Collection";
 	static final @NonNull String COLLECTION_IS_NULL_FREE = "nullFree";
-	
+
+	/**
+	 * EOperation annotation identifying that anoperation is transient (not-cached).
+	 * @since 1.3
+	 */
+	static final @NonNull String OPERATION_ANNOTATION_SOURCE = "http://www.eclipse.org/OCL/Operation";
+	/**
+	 * @since 1.3
+	 */
+	static final @NonNull String OPERATION_IS_TRANSIENT = "isTransient";
+
 	/**
 	 * EPackage annotation indicating that the EPackage is an Ecore serialisation of an OCL AS Library.
 	 * No details are defined for this EAnnotation.
@@ -92,10 +105,10 @@
 	static final @NonNull String ORPHANAGE_PREFIX = "orphanage";
 	static final @NonNull String ORPHANAGE_URI = "http://www.eclipse.org/ocl/2015/Orphanage";
 	static final @NonNull String PRIMITIVES_URI = "http://www.eclipse.org/ocl/2015/Primitives";
-	
+
 	static final @NonNull String OCL_LANGUAGE = "OCL";			// More visible UMLUtil.Language_OCL
 	static final @NonNull String OCL_NAME = "ocl";
-	
+
 	static final @NonNull String MESSAGE_PART_NAME = "message";
 	static final @NonNull String SEVERITY_PART_NAME = "severity";
 	static final @NonNull String STATUS_PART_NAME = "status";
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/BaseDeclarationVisitor.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/BaseDeclarationVisitor.java
index f26b760..362ab51 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/BaseDeclarationVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/BaseDeclarationVisitor.java
@@ -221,6 +221,8 @@
 		List<LanguageExpression> bodyExpressions = object.getBodyExpression() != null ? Collections.singletonList(object.getBodyExpression()) : Collections.<LanguageExpression>emptyList();
 		context.refreshList(csElement.getOwnedBodyExpressions(), context.visitDeclarations(SpecificationCS.class, bodyExpressions, null));
 		context.refreshList(csElement.getOwnedPostconditions(), context.visitDeclarations(ConstraintCS.class, object.getOwnedPostconditions(), null));
+		List<@NonNull String> qualifiers = ClassUtil.nullFree(csElement.getQualifiers());
+		context.refreshQualifiers(qualifiers, "transient", "!transient", object.isIsTransient() ? Boolean.TRUE : null);
 		return csElement;
 	}
 
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSContainmentVisitor.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSContainmentVisitor.java
index 486752e..43ee158 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSContainmentVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/cs2as/BaseCSContainmentVisitor.java
@@ -114,7 +114,7 @@
 	protected Continuation<?> refreshClass(org.eclipse.ocl.pivot.@NonNull Class pivotElement, @NonNull StructuredClassCS csElement) {
 		pivotElement.setIsAbstract(csElement.isIsAbstract());
 		pivotElement.setIsInterface(csElement.isIsInterface());
-//		pivotElement.setIsStatic(qualifiers.contains("static"));
+		//		pivotElement.setIsStatic(qualifiers.contains("static"));
 		context.refreshPivotList(Property.class, pivotElement.getOwnedProperties(), csElement.getOwnedProperties());
 		context.refreshPivotList(Operation.class, pivotElement.getOwnedOperations(), csElement.getOwnedOperations());
 		refreshClassifier(pivotElement, csElement);
@@ -158,7 +158,7 @@
 		if (name == null) {
 			throw new IllegalStateException("Null name");
 		}
-/*		if ((name == null) && (csElement.eContainer() == null)) {
+		/*		if ((name == null) && (csElement.eContainer() == null)) {
 			Resource csResource = csElement.eResource();
 			if (csResource != null) {
 				URI csURI = csResource.getURI();
@@ -210,7 +210,7 @@
 			throw new IllegalStateException("Null resource for root package");
 		}
 		Object pivotObject = context.getConverter().getPivotElement(csElement);
-//		Object pivotObject = csElement.getPivot();
+		//		Object pivotObject = csElement.getPivot();
 		if (pivotObject == null) {
 			Resource asResource = context.getConverter().getASResource();
 			for (EObject oldRoot : asResource.getContents()) {
@@ -250,18 +250,18 @@
 		return pivotElement;
 	}
 
-	
+
 	/**
 	 * Method used to refresh every {@link RootPackageCS} element.
-	 * 
-	 * There are some Roots which may own packages like those created in OCLinEcore or StdLin documents 
+	 *
+	 * There are some Roots which may own packages like those created in OCLinEcore or StdLin documents
 	 */
 	protected @NonNull <@NonNull T extends Model> T refreshRootPackage(@NonNull Class<T> pivotClass, /*@NonNull*/ EClass pivotEClass, @NonNull RootPackageCS csElement) {
 		@NonNull T pivotElement = refreshRoot(pivotClass, pivotEClass, csElement);
 		context.refreshPivotList(org.eclipse.ocl.pivot.Package.class, pivotElement.getOwnedPackages(), csElement.getOwnedPackages());
 		return pivotElement;
 	}
-	
+
 	@Override
 	public Continuation<?> visitAnnotationCS(@NonNull AnnotationCS csElement) {
 		@SuppressWarnings("null") @NonNull EClass eClass = PivotPackage.Literals.ANNOTATION;
@@ -320,7 +320,7 @@
 
 	@Override
 	public Continuation<?> visitElementCS(@NonNull ElementCS csElement) {
-// FIXME		return visiting(csElement);
+		// FIXME		return visiting(csElement);
 		System.out.println("Unsupported " + csElement.eClass().getName() + " for CS2AS Containment pass");
 		return null;
 	}
@@ -359,7 +359,7 @@
 			context.addDiagnostic(csElement, "An all-package import cannot have an associated alias name");
 		}
 		Namespace namespace = csElement.getReferredNamespace();
-		if ((namespace != null) && !namespace.eIsProxy()) {			
+		if ((namespace != null) && !namespace.eIsProxy()) {
 			Namespace oldNamespace = pivotElement.getImportedNamespace();
 			if (namespace != oldNamespace) {
 				pivotElement.setImportedNamespace(namespace);
@@ -403,6 +403,9 @@
 		List<SpecificationCS> csBodyExpressions = csElement.getOwnedBodyExpressions();
 		SpecificationCS csBodyExpression = csBodyExpressions.size() > 0 ? csBodyExpressions.get(0) : null;
 		pivotElement.setBodyExpression(PivotUtil.getPivot(ExpressionInOCL.class, csBodyExpression));
+		List<String> qualifiers = csElement.getQualifiers();
+		assert qualifiers != null;
+		pivotElement.setIsTransient(ElementUtil.getQualifier(qualifiers, "transient", "!transient", true));
 		return null;
 	}
 
