EMFTVM compiler optimizations.
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.atl b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.atl
index e3d21a8..68caa92 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.atl
+++ b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.atl
@@ -131,11 +131,11 @@
 	endif;
 
 --- Returns the source code location representing the apply section of this rule.
-helper context ATL!Rule def : applyLoc : String =
+helper context ATL!Rule def : applyLoc : ATL!LocatedElement =
 	if self.outPattern.oclIsUndefined() then
-		self.location
+		self
 	else
-		self.outPattern.location
+		self.outPattern
 	endif;
 
 --- Support for multiple rule inheritance, including rules outside same module
@@ -297,23 +297,22 @@
 abstract rule Unit {
 	from s : ATL!Unit in IN
 	to t : EMFTVM!Module (
-		name <- s.name,
-		sourceName <-
+		name <:= s.name,
+		sourceName <:=
 			let index : Integer = s.name.lastIndexOf('::') in
 			if index > 0 then
 				s.name.substring(index + 2, s.name.size()) + '.atl'
 			else
 				s.name + '.atl'
 			endif,
-		imports <- s.libraries->collect(l|l.name),
-		features <- Sequence{main}),
+		imports <:= s.libraries->collect(l|l.name)),
 	   main : EMFTVM!Operation (
-	   	name <- 'main',
-		static <- true,
-		"context" <- 'ExecEnv',
-		contextModel <- 'EMFTVM',
-		type <- 'Object',
-		typeModel <- '#native')
+	   	name <:= 'main',
+		static <:= true,
+		"context" <:= 'ExecEnv',
+		contextModel <:= 'EMFTVM',
+		type <:= 'Object',
+		typeModel <:= '#native')
 }
 
 rule Library extends Unit {
@@ -321,7 +320,7 @@
 	to t : EMFTVM!Module (
 		features <- s.helpers->collect(h|h.definition)->append(main)),
 	   main : EMFTVM!Operation (
-	   	body <- body),
+	   	body <:= body),
 	   body : EMFTVM!CodeBlock
 }
 
@@ -344,14 +343,14 @@
 			->append(main),
 		rules <- s.elements->select(e|e.oclIsKindOf(ATL!MatchedRule))),
 	   main : EMFTVM!Operation (
-	   	body <- body),
+	   	body <:= body),
 	   body : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln}),
+	   	lineNumbers <:= Sequence{ln}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn) 
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn) 
 }
 
 rule ModuleWithEntryPoint extends Module {
@@ -364,9 +363,9 @@
 	}
 	to t : EMFTVM!Module,
 	   body : EMFTVM!CodeBlock (
-		code <- Sequence{getenvtype_entry, invoke_entry}),
+		code <:= Sequence{getenvtype_entry, invoke_entry}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{getenvtype_entry, invoke_entry}),
+	   	instructions <:= Sequence{getenvtype_entry, invoke_entry}),
 	   getenvtype_entry : EMFTVM!Getenvtype,								-- [..., ExecEnv]
 	   invoke_entry : EMFTVM!InvokeStatic (									-- [..., result]
 	   	opname <- entryPointRule.name,
@@ -387,9 +386,9 @@
 	}
 	to t : EMFTVM!Module,
 	   body : EMFTVM!CodeBlock (
-		code <- Sequence{getenvtype_end, invoke_end}),
+		code <:= Sequence{getenvtype_end, invoke_end}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{getenvtype_end, invoke_end}),
+	   	instructions <:= Sequence{getenvtype_end, invoke_end}),
 	   getenvtype_end : EMFTVM!Getenvtype,									-- [..., ExecEnv]
 	   invoke_end : EMFTVM!InvokeStatic (									-- [..., result]
 	   	opname <- endPointRule.name,
@@ -408,9 +407,9 @@
 	}
 	to t : EMFTVM!Module,
 	   body : EMFTVM!CodeBlock (
-		code <- Sequence{getenvtype_entry, invoke_entry, pop, getenvtype_end, invoke_end}),
+		code <:= Sequence{getenvtype_entry, invoke_entry, pop, getenvtype_end, invoke_end}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{getenvtype_entry, invoke_entry, pop, getenvtype_end, invoke_end}),
+	   	instructions <:= Sequence{getenvtype_entry, invoke_entry, pop, getenvtype_end, invoke_end}),
 	   getenvtype_entry : EMFTVM!Getenvtype,								-- [..., ExecEnv]
 	   invoke_entry : EMFTVM!InvokeStatic (									-- [..., result]
 	   	opname <- entryPointRule.name,
@@ -549,14 +548,14 @@
 			endif;
 	}
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
-		code <- Sequence{findtype, new, store}),
+		lineNumbers <:= Sequence{ln},
+		code <:= Sequence{findtype, new, store}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{findtype, new, store}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{findtype, new, store}),
 	   lv : EMFTVM!LocalVariable (
 	   	name <- s.varName,
 		type <- s.type.typeName,
@@ -575,15 +574,15 @@
 		type <- s.type.typeName,
 		typeModel <- s.type.modelName),
 	   cb : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln},
+	   	lineNumbers <:= Sequence{ln},
 	   	nested <- Sequence{s.initExpression},
-		code <- Sequence{invokeCb, store}),
+		code <:= Sequence{invokeCb, store}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, store}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, store}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.initExpression, argcount <- 0),	-- [..., value]
 	   store : EMFTVM!Store (localVariable <- s)									-- [...]
 }
@@ -600,7 +599,7 @@
 		parameters <- s.parameters,
 		body <- body),
 	   body : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln},
+	   	lineNumbers <:= Sequence{ln},
 		localVariables <- s.parameters->collect(p|thisModule.resolveTemp(p, 'lv'))
 			->union(s.outPatternElements->collect(p|thisModule.resolveTemp(p, 'lv')))
 			->union(s.variables),
@@ -613,13 +612,13 @@
 				else
 					s.actionBlock.statements
 				endif),
-		code <- Sequence{invokeAllCbs}),
+		code <:= Sequence{invokeAllCbs}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeAllCbs}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeAllCbs}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs									-- [...]
 }
 
@@ -643,15 +642,15 @@
 		initialiser <- init),
 	   init : EMFTVM!CodeBlock, -- Empty initialiser
 	   cb : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln},
+	   	lineNumbers <:= Sequence{ln},
 	   	nested <- Sequence{s.initExpression},
-		code <- Sequence{load, invokeCb, set}),
+		code <:= Sequence{load, invokeCb, set}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load, invokeCb, set}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load, invokeCb, set}),
 	   load : EMFTVM!Load (localVariable <- thisModule.resolveTemp(s."rule", 'a_trace')),	-- [..., trace]
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.initExpression, argcount <- 0),			-- [..., trace, value]
 	   set : EMFTVM!"Set" (fieldname <- s.varName)											-- [...]
@@ -698,7 +697,7 @@
 		fields <- s.variables,
 		applier <- a),
 	   a : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{aln},
+	   	lineNumbers <:= Sequence{aln},
 	   	localVariables <- Sequence{a_trace}
 			->union(s.inPattern.elements->collect(e|thisModule.resolveTemp(e, 'ov')))
 			->union(s.outPatternElements->reject(e|e.isRefiningElement)->collect(e|thisModule.resolveTemp(e, 'ov'))),
@@ -720,13 +719,13 @@
 					)}
 				endif
 			),
-	   	code <- Sequence{a_invokeAllCbs}),
+	   	code <:= Sequence{a_invokeAllCbs}),
 	   aln : EMFTVM!LineNumber (
 	   	startLine <- s.applyLoc.startLine,
 		startColumn <- s.applyLoc.startColumn,
 		endLine <- s.applyLoc.endLine,
 		endColumn <- s.applyLoc.endColumn,
-		instructions <- Sequence{a_invokeAllCbs}),
+		instructions <:= Sequence{a_invokeAllCbs}),
 	   a_trace : EMFTVM!LocalVariable (
 	   	name <- '__trace__',
 		type <- 'TraceLink',
@@ -738,21 +737,21 @@
 	from s : ATL!MatchedRule in IN (
 		not s.inPattern.filter.oclIsUndefined())
 	using {
-		matchLoc : String = s.inPattern.filter.location;
+		matchLoc : ATL!LocatedElement = s.inPattern.filter;
 	}
 	to t : EMFTVM!Rule (
 		matcher <- m),
 	   m : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{mln},
+	   	lineNumbers <:= Sequence{mln},
 	   	localVariables <- s.inPattern.elements->collect(e|thisModule.resolveTemp(e, 'lv')),
 	   	nested <- Sequence{s.inPattern.filter},
-	   	code <- Sequence{invokeCb}),
+	   	code <:= Sequence{invokeCb}),
 	   mln : EMFTVM!LineNumber (
 	   	startLine <- matchLoc.startLine,
 		startColumn <- matchLoc.startColumn,
 		endLine <- matchLoc.endLine,
 		endColumn <- matchLoc.endColumn,
-	   	instructions <- Sequence{invokeCb}),
+	   	instructions <:= Sequence{invokeCb}),
 	   invokeCb : EMFTVM!InvokeCb  (codeBlock <- s.inPattern.filter)
 }
 
@@ -760,7 +759,7 @@
 	from s : ATL!MatchedRule in IN (
 		not s.actionBlock.oclIsUndefined())
 	using {
-		postLoc : String = s.actionBlock.location;
+		postLoc : ATL!LocatedElement = s.actionBlock;
 	}
 	to t : EMFTVM!Rule (
 		postApply <- p),
@@ -768,9 +767,9 @@
 	   	localVariables <- Sequence{p_trace}
 			->union(s.inPattern.elements->collect(e|thisModule.resolveTemp(e, 'pv')))
 			->union(s.outPatternElements->reject(e|e.isRefiningElement)->collect(e|thisModule.resolveTemp(e, 'pv'))),
-	   	lineNumbers <- Sequence{pln},
+	   	lineNumbers <:= Sequence{pln},
 	   	nested <- s.actionBlock.statements,
-		code <- Sequence{p_invokeAllCbs}),
+		code <:= Sequence{p_invokeAllCbs}),
 	   p_trace : EMFTVM!LocalVariable (
 	   	name <- '__trace__',
 	   	type <- 'TraceLink',
@@ -780,7 +779,7 @@
 		startColumn <- postLoc.startColumn,
 		endLine <- postLoc.endLine,
 		endColumn <- postLoc.endColumn,
-		instructions <- Sequence{p_invokeAllCbs}),
+		instructions <:= Sequence{p_invokeAllCbs}),
 	   p_invokeAllCbs : EMFTVM!InvokeAllCbs									-- [..., value]
 }
 
@@ -809,15 +808,15 @@
 			endif;
 	}
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.value},
-		code <- Sequence{load, invokeCb, set}),
+		code <:= Sequence{load, invokeCb, set}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load, invokeCb, set}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load, invokeCb, set}),
 	   load : EMFTVM!Load (
 	   	localVariable <-													-- [..., lv]
 			if s.parentRule.oclIsKindOf(ATL!MatchedRule) then
@@ -832,9 +831,9 @@
 rule ResolvingBinding extends Binding {
 	from s : ATL!Binding in IN (not s.isAssignment)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{load, invokeCb, invoke, set}),
+		code <:= Sequence{load, invokeCb, invoke, set}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{load, invokeCb, invoke, set}),
+		instructions <:= Sequence{load, invokeCb, invoke, set}),
 	   load : EMFTVM!Load,													-- [..., lv]
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., lv, value]
 	   invoke : EMFTVM!Invoke (opname <- 'resolve', argcount <- 0),			-- [..., lv, rvalue]
@@ -846,15 +845,15 @@
 rule ExpressionStat {
 	from s : ATL!ExpressionStat in IN
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.expression},
-		code <- Sequence{invokeCb}),
+		code <:= Sequence{invokeCb}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.expression, argcount <- 0)	-- [..., value]
 }
 
@@ -863,9 +862,9 @@
 		not s.refImmediateComposite().oclIsKindOf(ATL!ActionBlock) or
 		s.refImmediateComposite().statements->last() <> s)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{invokeCb, pop}),
+		code <:= Sequence{invokeCb, pop}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, pop}),
+	   	instructions <:= Sequence{invokeCb, pop}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., value]
 	   pop : EMFTVM!Pop														-- [...]
 }
@@ -874,15 +873,15 @@
 	from s : ATL!BindingStat in IN (
 		s.source.oclIsKindOf(ATL!NavigationOrAttributeCallExp))
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.source.source, s.value},
-		code <- Sequence{invokeCb, invokeCb2, set}),
+		code <:= Sequence{invokeCb, invokeCb2, set}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, invokeCb2, set}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, invokeCb2, set}),
 	   invokeCb : EMFTVM!InvokeCb (											-- [..., source]
 	   	codeBlock <- s.source.source, argcount <- 0),
 	   invokeCb2 : EMFTVM!InvokeCb (codeBlock <- s.value, argcount <- 0),	-- [..., source, value]
@@ -901,9 +900,9 @@
 rule ResolvingBindingStatAttribute extends BindingStatAttribute {
 	from s : ATL!BindingStat in IN (not s.isAssignment)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{invokeCb, invokeCb2, invoke, set}),
+		code <:= Sequence{invokeCb, invokeCb2, invoke, set}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokeCb, invokeCb2, invoke, set}),
+		instructions <:= Sequence{invokeCb, invokeCb2, invoke, set}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., source]
 	   invokeCb2 : EMFTVM!InvokeCb,											-- [..., source, value]
 	   invoke : EMFTVM!Invoke (opname <- 'resolve', argcount <- 0),			-- [..., source, rvalue]
@@ -922,9 +921,9 @@
 rule ResolvingBindingStatStaticAttribute extends BindingStatStaticAttribute {
 	from s : ATL!BindingStat in IN (not s.isAssignment)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{invokeCb, invokeCb2, invoke, set}),
+		code <:= Sequence{invokeCb, invokeCb2, invoke, set}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokeCb, invokeCb2, invoke, set}),
+		instructions <:= Sequence{invokeCb, invokeCb2, invoke, set}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., source]
 	   invokeCb2 : EMFTVM!InvokeCb,											-- [..., source, value]
 	   invoke : EMFTVM!Invoke (opname <- 'resolve', argcount <- 0),			-- [..., source, rvalue]
@@ -937,15 +936,15 @@
 		s.source.referredVariable.varName <> 'thisModule' and
 		not s.source.referredVariable.isMatchedRuleField)
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.value},
-		code <- Sequence{invokeCb, store}),
+		code <:= Sequence{invokeCb, store}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, store}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, store}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.value, argcount <- 0),	-- [..., value]
 	   store : EMFTVM!Store (localVariable <- s.source.referredVariable)	-- [...]
 }
@@ -953,9 +952,9 @@
 rule ResolvingBindingStatVariable extends BindingStatVariable {
 	from s : ATL!BindingStat in IN (not s.isAssignment)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{invokeCb, invoke, store}),
+		code <:= Sequence{invokeCb, invoke, store}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokeCb, invoke, store}),
+		instructions <:= Sequence{invokeCb, invoke, store}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., value]
 	   invoke : EMFTVM!Invoke (opname <- 'resolve', argcount <- 0),			-- [..., rvalue]
 	   store : EMFTVM!Store													-- [...]
@@ -966,15 +965,15 @@
 		s.source.oclIsKindOf(ATL!VariableExp) and
 		s.source.referredVariable.isMatchedRuleField)
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.value},
-		code <- Sequence{load, invokeCb, set}),
+		code <:= Sequence{load, invokeCb, set}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load, invokeCb, set}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load, invokeCb, set}),
 	   load : EMFTVM!Load (localVariable <- s.source.traceVariable()),		-- [..., trace]
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.value, argcount <- 0),	-- [..., trace, value]
 	   set : EMFTVM!"Set" (fieldname <- s.source.referredVariable.varName)	-- [...]
@@ -983,9 +982,9 @@
 rule ResolvingBindingStatRuleField extends BindingStatRuleField {
 	from s : ATL!BindingStat in IN (not s.isAssignment)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{load, invokeCb, invoke, set}),
+		code <:= Sequence{load, invokeCb, invoke, set}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{load, invokeCb, invoke, set}),
+		instructions <:= Sequence{load, invokeCb, invoke, set}),
 	   load : EMFTVM!Load,													-- [..., trace]
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., trace, value]
 	   invoke : EMFTVM!Invoke (opname <- 'resolve', argcount <- 0),			-- [..., trace, rvalue]
@@ -995,27 +994,27 @@
 abstract rule IfStat {
 	from s : ATL!IfStat in IN
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln}),
+		lineNumbers <:= Sequence{ln}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.condition, argcount <- 0)	-- [..., cond]
 }
 
 rule IfStatWithThenAndElse extends IfStat {
 	from s : ATL!IfStat in IN (s.thenStatements->notEmpty() and s.elseStatements->notEmpty())
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.condition, thenCb, elseCb},
-		code <- Sequence{invokeCb, ifn, invokeThen, goto, invokeElse}),
+		code <:= Sequence{invokeCb, ifn, invokeThen, goto, invokeElse}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, ifn, invokeThen, goto, invokeElse}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, ifn, invokeThen, goto, invokeElse}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., cond]
 	   ifn : EMFTVM!Ifn (target <- goto),									-- [...]
 	   invokeThen : EMFTVM!InvokeCb (codeBlock <- thenCb, argcount <- 0),	-- [..., result]
@@ -1023,68 +1022,68 @@
 	   invokeElse : EMFTVM!InvokeCb (codeBlock <- elseCb, argcount <- 0),	-- [..., result]
 	   thenCb : EMFTVM!CodeBlock (
 	   	nested <- s.thenStatements,
-		code <- Sequence{invokeAllCbs}),
+		code <:= Sequence{invokeAllCbs}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs (argcount <- 0),
 	   elseCb : EMFTVM!CodeBlock (
 	   	nested <- s.elseStatements,
-		code <- Sequence{invokeAllCbs2}),
+		code <:= Sequence{invokeAllCbs2}),
 	   invokeAllCbs2 : EMFTVM!InvokeAllCbs (argcount <- 0)
 }
 
 rule IfStatWithThen extends IfStat {
 	from s : ATL!IfStat in IN (s.thenStatements->notEmpty() and s.elseStatements->isEmpty())
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.condition, thenCb},
-		code <- Sequence{invokeCb, ifn, invokeThen}),
+		code <:= Sequence{invokeCb, ifn, invokeThen}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, ifn, invokeThen}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, ifn, invokeThen}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., cond]
 	   ifn : EMFTVM!Ifn (target <- invokeThen),								-- [...]
 	   invokeThen : EMFTVM!InvokeCb (codeBlock <- thenCb, argcount <- 0),	-- [..., result]
 	   thenCb : EMFTVM!CodeBlock (
 	   	nested <- s.thenStatements,
-		code <- Sequence{invokeAllCbs}),
+		code <:= Sequence{invokeAllCbs}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs (argcount <- 0)
 }
 
 rule IfStatWithElse extends IfStat {
 	from s : ATL!IfStat in IN (s.thenStatements->isEmpty() and s.elseStatements->notEmpty())
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.condition, elseCb},
-		code <- Sequence{invokeCb, ift, invokeElse}),
+		code <:= Sequence{invokeCb, ift, invokeElse}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, ift, invokeElse}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, ift, invokeElse}),
 	   invokeCb : EMFTVM!InvokeCb,											-- [..., cond]
 	   ift : EMFTVM!If (target <- invokeElse),								-- [...]
 	   invokeElse : EMFTVM!InvokeCb (codeBlock <- elseCb, argcount <- 0),	-- [..., result]
 	   elseCb : EMFTVM!CodeBlock (
 	   	nested <- s.elseStatements,
-		code <- Sequence{invokeAllCbs2}),
+		code <:= Sequence{invokeAllCbs2}),
 	   invokeAllCbs2 : EMFTVM!InvokeAllCbs (argcount <- 0)
 }
 
 rule IfStatWithNothing extends IfStat {
 	from s : ATL!IfStat in IN (s.thenStatements->isEmpty() and s.elseStatements->isEmpty())
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.condition},
-		code <- Sequence{invokeCb, pop}),
+		code <:= Sequence{invokeCb, pop}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, pop}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, pop}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.condition, argcount <- 0),	-- [..., cond]
 	   pop : EMFTVM!Pop 														-- [...]
 }
@@ -1093,15 +1092,15 @@
 	from s : ATL!ForStat in IN
 	to cb : EMFTVM!CodeBlock (
 		localVariables <- Sequence{s.iterator},
-		lineNumbers <- Sequence{ln},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.collection, loop},
-		code <- Sequence{invokeCb, it, store, invokeCb2, endit}),
+		code <:= Sequence{invokeCb, it, store, invokeCb2, endit}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, it, store, invokeCb2, endit}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, it, store, invokeCb2, endit}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.collection, argcount <- 0),		-- [..., coll]
 	   it : EMFTVM!Iterate (target <- endit),										-- [..., it(coll), value]
 	   store : EMFTVM!Store (localVariable <- s.iterator),							-- [..., it(coll)]
@@ -1109,7 +1108,7 @@
 	   endit : EMFTVM!Enditerate (target <- it),									-- [...]
 	   loop : EMFTVM!CodeBlock (
 	   	nested <- s.statements,
-		code <- Sequence{invokeAllCbs}),
+		code <:= Sequence{invokeAllCbs}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs (argcount <- 0)
 }
 
@@ -1124,14 +1123,14 @@
 lazy rule DeleteInPatternElement {
 	from s : ATL!InPatternElement
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
-		code <- Sequence{load, delete}),
+		lineNumbers <:= Sequence{ln},
+		code <:= Sequence{load, delete}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load, delete}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load, delete}),
 	   load : EMFTVM!Load (															-- [..., source]
 	   	localVariable <- thisModule.resolveTemp(s, 'ov')),
 	   delete : EMFTVM!Delete														-- [...]
@@ -1143,14 +1142,14 @@
 lazy rule RemapInPatternElement {
 	from s : ATL!InPatternElement
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
-		code <- Sequence{load, load2, invoke, pop}),
+		lineNumbers <:= Sequence{ln},
+		code <:= Sequence{load, load2, invoke, pop}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load, load2, invoke, pop}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load, load2, invoke, pop}),
 	   load : EMFTVM!Load (															-- [..., source]
 	   	localVariable <- thisModule.resolveTemp(s, 'ov')),
 	   load2 : EMFTVM!Load (														-- [..., source, target]
@@ -1167,14 +1166,14 @@
 lazy rule LoadPatternElement {
 	from s : ATL!PatternElement
 	to cb : EMFTVM!CodeBlock (
-		lineNumbers <- Sequence{ln},
-		code <- Sequence{load}),
+		lineNumbers <:= Sequence{ln},
+		code <:= Sequence{load}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{load}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{load}),
 	   load : EMFTVM!Load (															-- [..., source]
 	   	localVariable <- thisModule.resolveTemp(s, 'ov'))
 	do {
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.emftvm b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.emftvm
index b4ad609..501316c 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.emftvm
+++ b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.emftvm
Binary files differ
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.atl b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.atl
index 81bb5e5..6aa7864 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.atl
+++ b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.atl
@@ -142,21 +142,60 @@
 helper context ATL!VariableExp def : localVariable() : EMFTVM!LocalVariable =
 	thisModule.resolveTemp(self.referredVariable, 'lv');
 
--- Returns start line from a location string (e.g. 278 for '278:1-283:14')
-helper context String def : startLine : Integer =
-	self.substring(1, self.indexOf(':') - 1).toInteger();
+--- Returns a Sequence of the elements from a location string
+--- (e.g. Sequence{278, 1, 283, 14} for '278:1-283:14')
+helper context ATL!LocatedElement def : splitLocation : Sequence(String) =
+	self.location.split('-|:');
 
--- Returns start column from a location string (e.g. 1 for '278:1-283:14')
-helper context String def : startColumn : Integer =
-	self.substring(self.indexOf(':') + 1, self.indexOf('-') - 1).toInteger();
+--- Returns start line from a location string (e.g. 278 for '278:1-283:14')
+helper context ATL!LocatedElement def : startLine : Integer =
+	self.splitLocation->at(1).toInteger();
 
--- Returns end line from a location string (e.g. 283 for '278:1-283:14')
-helper context String def : endLine : Integer =
-	self.substring(self.indexOf('-') + 1, self.lastIndexOf(':') - 1).toInteger();
+--- Returns start column from a location string (e.g. 1 for '278:1-283:14')
+helper context ATL!LocatedElement def : startColumn : Integer =
+	self.splitLocation->at(2).toInteger();
 
--- Returns end column from a location string (e.g. 14 for '278:1-283:14')
-helper context String def : endColumn : Integer =
-	self.substring(self.lastIndexOf(':') + 1, self.size()).toInteger();
+--- Returns end line from a location string (e.g. 283 for '278:1-283:14')
+helper context ATL!LocatedElement def : endLine : Integer =
+	self.splitLocation->at(3).toInteger();
+
+--- Returns end column from a location string (e.g. 14 for '278:1-283:14')
+helper context ATL!LocatedElement def : endColumn : Integer =
+	self.splitLocation->at(4).toInteger();
+
+--- Returns 'true' if this OCL expression is part of a rule's input filter.
+helper context OclAny def : isFilterExpression : Boolean =
+	false;
+
+--- Returns 'true' if this OCL expression is part of a rule's input filter.
+helper context ATL!OclExpression def : isFilterExpression : Boolean =
+	let parent : OclAny = self.refImmediateComposite() in
+	(parent.oclIsKindOf(ATL!InPattern) and parent.filter = self)
+	or parent.isFilterExpression;
+
+--- Returns 'true' if this OCL expression is a rule search plan.
+helper context OclAny def : isSearchPlan : Boolean =
+	false;
+
+--- Returns 'true' if this OCL expression is a rule search plan.
+helper context ATL!OperationCallExp def : isSearchPlan : Boolean =
+	not self.isStatic and ( 
+		(
+			(self.operationName = '=' or self.operationName = 'includes') and
+			self.arguments->includes(a | 
+				a.oclIsKindOf(ATL!VariableExp) and a.referredVariable.isMatchedRuleField
+			)
+		) or (
+			self.operationName = 'and' and
+			self.arguments->includes(a | 
+				a.isSearchPlan
+			)
+		)
+	);
+
+--- Returns 'true' if this OCL expression is part of a rule search plan.
+helper context ATL!NavigationOrAttributeCallExp def : isSearchPlanExpression : Boolean =
+	not self.isStatic and self.refImmediateComposite().isSearchPlanExpression;
 
 -- ======================================================================
 -- helpers end
@@ -174,20 +213,20 @@
 		a : ATL!Attribute = s.feature;
 	}
 	to t : EMFTVM!Field (
-		name <- a.name,
-		type <- a.type.typeName,
-		typeModel <- a.type.modelName,
-		initialiser <- cb),
+		name <:= a.name,
+		type <:= a.type.typeName,
+		typeModel <:= a.type.modelName,
+		initialiser <:= cb),
 	   cb : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln},
+	   	lineNumbers <:= Sequence{ln},
 	   	nested <- Sequence{a.initExpression},
-	   	code <- Sequence{invokeCb}),
+	   	code <:= Sequence{invokeCb}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- a.initExpression, argcount <- 0)
 }
 
@@ -208,7 +247,7 @@
 		"context" <- s.contextType.typeName,
 		contextModel <- s.contextType.modelName),
 	   cb : EMFTVM!CodeBlock (
-	   	localVariables <- Sequence{lv}),
+	   	localVariables <:= Sequence{lv}),
 	   lv : EMFTVM!LocalVariable (
 		name <- 'self',
 		type <- s.contextType.typeName,
@@ -227,15 +266,15 @@
 		parameters <- o.parameters,
 		body <- cb),
 	   cb : EMFTVM!CodeBlock (
-	   	lineNumbers <- Sequence{ln},
+	   	lineNumbers <:= Sequence{ln},
 	   	nested <- Sequence{o.body},
-		code <- Sequence{invokeCb}),
+		code <:= Sequence{invokeCb}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- o.body, argcount <- 0)
 }
 
@@ -262,7 +301,7 @@
 		"context" <- s.contextType.typeName,
 		contextModel <- s.contextType.modelName),
 	   cb : EMFTVM!CodeBlock (
-	   	localVariables <- Sequence{lv}->union(o1.parameters->collect(p|thisModule.resolveTemp(p, 'lv')))),
+	   	localVariables <:= Sequence{lv}->union(o1.parameters->collect(p|thisModule.resolveTemp(p, 'lv')))),
 	   lv : EMFTVM!LocalVariable (
 		name <- 'self',
 		type <- s.contextType.typeName,
@@ -272,13 +311,13 @@
 rule Parameter {
 	from s : ATL!Parameter in IN
 	to t : EMFTVM!Parameter (
-		name <- s.varName,
-		type <- s.type.typeName,
-		typeModel <- s.type.modelName),
+		name <:= s.varName,
+		type <:= s.type.typeName,
+		typeModel <:= s.type.modelName),
 	   lv : EMFTVM!LocalVariable (
-	   	name <- s.varName,
-		type <- s.type.typeName,
-		typeModel <- s.type.modelName)
+	   	name <:= s.varName,
+		type <:= s.type.typeName,
+		typeModel <:= s.type.modelName)
 }
 
 -------------- VariableDeclarations -----------------
@@ -286,22 +325,22 @@
 rule Iterator {
 	from s : ATL!Iterator in IN
 	to lv : EMFTVM!LocalVariable (
-		name <- s.varName)
+		name <:= s.varName)
 }
 
 rule IteratorWithType extends Iterator {
 	from s : ATL!Iterator in IN (not s.type.oclIsUndefined())
 	to lv : EMFTVM!LocalVariable (
-		type <- s.type.typeName,
-		typeModel <- s.type.modelName) 
+		type <:= s.type.typeName,
+		typeModel <:= s.type.modelName) 
 }
 
 rule IterateResult {
 	from s : ATL!VariableDeclaration in IN (not s.baseExp.oclIsUndefined())
 	to lv : EMFTVM!LocalVariable (
-		name <- s.varName,
-		type <- s.type.typeName,
-		typeModel <- s.type.modelName) 
+		name <:= s.varName,
+		type <:= s.type.typeName,
+		typeModel <:= s.type.modelName) 
 }
 
 -------------- OclExpressions -----------------
@@ -310,12 +349,12 @@
 	from s : ATL!OclExpression in IN
 	to cb : EMFTVM!CodeBlock (
 		localVariables <- s.parentIterators->union(s.parentAccumulators),
-		lineNumbers <- Sequence{ln}),
+		lineNumbers <:= Sequence{ln}),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn)
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn)
 }
 
 rule NavigationOrAttributeCallExp extends OclExpression {
@@ -325,9 +364,9 @@
 		not (s.refImmediateComposite().oclIsKindOf(ATL!BindingStat) and s.refImmediateComposite().source = s))
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source},
-		code <- Sequence{invokeCb, get}),
+		code <:= Sequence{invokeCb, get}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, get}),
+	   	instructions <:= Sequence{invokeCb, get}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., result]
 	   get : EMFTVM!Get (fieldname <- s.name)								-- [..., value]
 }
@@ -338,9 +377,9 @@
 		not (s.refImmediateComposite().oclIsKindOf(ATL!BindingStat) and s.refImmediateComposite().source = s))
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source},
-		code <- Sequence{invokeCb, getStatic}),
+		code <:= Sequence{invokeCb, getStatic}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, getStatic}),
+	   	instructions <:= Sequence{invokeCb, getStatic}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., result]
 	   getStatic : EMFTVM!GetStatic (fieldname <- s.name)					-- [..., value]
 }
@@ -350,9 +389,9 @@
 		s.source.oclIsKindOf(ATL!SuperExp))
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source},
-		code <- Sequence{invokeCb, getSuper}),
+		code <:= Sequence{invokeCb, getSuper}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, getSuper}),
+	   	instructions <:= Sequence{invokeCb, getSuper}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., result]
 	   getSuper : EMFTVM!GetSuper (fieldname <- s.name)						-- [..., value]
 }
@@ -369,9 +408,9 @@
 		s.operationName <> 'oclIsUndefined')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeAllCbs, invoke}),
+		code <:= Sequence{invokeAllCbs, invoke}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeAllCbs, invoke}),
+	   	instructions <:= Sequence{invokeAllCbs, invoke}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs,									-- [..., source, args]
 	   invoke : EMFTVM!Invoke (												-- [..., result]
 	   	opname <- s.operationName, 
@@ -383,9 +422,9 @@
 		not s.isStatic and s.operationName = 'not')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeCb, _not}),
+		code <:= Sequence{invokeCb, _not}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, _not}),
+	   	instructions <:= Sequence{invokeCb, _not}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   _not : EMFTVM!Not													-- [..., result]
 }
@@ -395,9 +434,9 @@
 		not s.isStatic and s.operationName = 'and')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeCb, _and}),
+		code <:= Sequence{invokeCb, _and}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, _and}),
+	   	instructions <:= Sequence{invokeCb, _and}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   _and : EMFTVM!And (codeBlock <- s.arguments->first())				-- [..., result]
 }
@@ -407,9 +446,9 @@
 		not s.isStatic and s.operationName = 'or')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeCb, _or}),
+		code <:= Sequence{invokeCb, _or}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, _or}),
+	   	instructions <:= Sequence{invokeCb, _or}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   _or : EMFTVM!Or (codeBlock <- s.arguments->first())					-- [..., result]
 }
@@ -419,9 +458,9 @@
 		not s.isStatic and s.operationName = 'implies')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeCb, _implies}),
+		code <:= Sequence{invokeCb, _implies}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, _implies}),
+	   	instructions <:= Sequence{invokeCb, _implies}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   _implies : EMFTVM!Implies (codeBlock <- s.arguments->first())		-- [..., result]
 }
@@ -431,9 +470,9 @@
 		not s.isStatic and s.operationName = 'xor')
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->including(s.source),
-		code <- Sequence{invokeCb, invokeCb2, _xor}),
+		code <:= Sequence{invokeCb, invokeCb2, _xor}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, invokeCb2, _xor}),
+	   	instructions <:= Sequence{invokeCb, invokeCb2, _xor}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),				-- [..., source]
 	   invokeCb2 : EMFTVM!InvokeCb (codeBlock <- s.arguments->first(), argcount <- 0),	-- [..., source, arg1]
 	   _xor : EMFTVM!Xor																-- [..., result]
@@ -444,9 +483,9 @@
 		not s.isStatic and s.operationName = 'oclIsUndefined')
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source},
-		code <- Sequence{invokeCb, isnull}),
+		code <:= Sequence{invokeCb, isnull}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb, isnull}),
+	   	instructions <:= Sequence{invokeCb, isnull}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   isnull : EMFTVM!Isnull												-- [..., result]
 }
@@ -456,9 +495,9 @@
 		s.isStatic)
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeAllCbs, invokeStatic}),
+		code <:= Sequence{invokeAllCbs, invokeStatic}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeAllCbs, invokeStatic}),
+	   	instructions <:= Sequence{invokeAllCbs, invokeStatic}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs,									-- [..., type, args]
 	   invokeStatic : EMFTVM!InvokeStatic (									-- [..., result]
 	   	opname <- s.operationName, 
@@ -471,9 +510,9 @@
 		s.source.oclIsKindOf(ATL!SuperExp))
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.arguments->prepend(s.source),
-		code <- Sequence{invokeAllCbs, invokeSuper}),
+		code <:= Sequence{invokeAllCbs, invokeSuper}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeAllCbs, invokeSuper}),
+	   	instructions <:= Sequence{invokeAllCbs, invokeSuper}),
 	   invokeAllCbs : EMFTVM!InvokeAllCbs,									-- [..., self, args]
 	   invokeSuper : EMFTVM!InvokeSuper (									-- [..., result]
 	   	opname <- s.operationName, 
@@ -498,29 +537,29 @@
 	from s : ATL!LetExp in IN
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.variable},
-		code <- Sequence{invokeCb}),
+		code <:= Sequence{invokeCb}),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{invokeCb}),
+	   	instructions <:= Sequence{invokeCb}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.variable, argcount <- 0)	-- [..., result]
 }
 
 rule LetVariable {
 	from s : ATL!VariableDeclaration in IN (not s.letExp.oclIsUndefined())
 	to cb : EMFTVM!CodeBlock (
-		localVariables <- Sequence{lv},
-		lineNumbers <- Sequence{ln},
+		localVariables <:= Sequence{lv},
+		lineNumbers <:= Sequence{ln},
 		nested <- Sequence{s.initExpression, s.letExp.in_},
-		code <- Sequence{invokeCb, store, invokeCb2}),
+		code <:= Sequence{invokeCb, store, invokeCb2}),
 	   lv : EMFTVM!LocalVariable (
-	   	name <- s.varName,
-		type <- s.type.typeName,
-		typeModel <- s.type.modelName),
+	   	name <:= s.varName,
+		type <:= s.type.typeName,
+		typeModel <:= s.type.modelName),
 	   ln : EMFTVM!LineNumber (
-	   	startLine <- s.location.startLine,
-		startColumn <- s.location.startColumn,
-		endLine <- s.location.endLine,
-		endColumn <- s.location.endColumn,
-		instructions <- Sequence{invokeCb, store, invokeCb2}),
+	   	startLine <:= s.startLine,
+		startColumn <:= s.startColumn,
+		endLine <:= s.endLine,
+		endColumn <:= s.endColumn,
+		instructions <:= Sequence{invokeCb, store, invokeCb2}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.initExpression, argcount <- 0),	-- [..., value]
 	   store : EMFTVM!Store (localVariable <- lv),									-- [...]
 	   invokeCb2 : EMFTVM!InvokeCb (codeBlock <- s.letExp.in_)						-- [..., result]
@@ -532,9 +571,9 @@
 		not s.referredVariable.isMatchedRuleField and
 		not (s.refImmediateComposite().oclIsKindOf(ATL!BindingStat) and s.refImmediateComposite().source = s))
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{load}),
+		code <:= Sequence{load}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{load}),
+		instructions <:= Sequence{load}),
 	   load : EMFTVM!Load													-- [..., value]
 }
 
@@ -557,9 +596,9 @@
 rule SuperExp extends OclExpression {
 	from s : ATL!SuperExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{load}),
+		code <:= Sequence{load}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{load}),
+		instructions <:= Sequence{load}),
 	   load : EMFTVM!Load (
 	   	localVariable <- thisModule.resolveTemp(s.parentFeatureDef, 'lv'))
 }
@@ -569,9 +608,9 @@
 		s.referredVariable.varName = 'thisModule' and
 		not s.referredVariable.isMatchedRuleField)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{getenvtype}),
+		code <:= Sequence{getenvtype}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{getenvtype}),
+		instructions <:= Sequence{getenvtype}),
 	   getenvtype : EMFTVM!Getenvtype										-- [..., envtype]
 }
 
@@ -580,9 +619,9 @@
 		s.referredVariable.isMatchedRuleField and
 		not (s.refImmediateComposite().oclIsKindOf(ATL!BindingStat) and s.refImmediateComposite().source = s))
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{load, get}),
+		code <:= Sequence{load, get}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{load, get}),
+		instructions <:= Sequence{load, get}),
 	   load : EMFTVM!Load (localVariable <- s.traceVariable()),				-- [..., trace]
 	   get : EMFTVM!Get (fieldname <- s.referredVariable.varName)			-- [..., value]
 }
@@ -591,9 +630,9 @@
 	from s : ATL!IteratorExp in IN
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source, s.body},
-		code <- Sequence{invokesource, getbody, invoke}),
+		code <:= Sequence{invokesource, getbody, invoke}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokesource, getbody, invoke}),
+		instructions <:= Sequence{invokesource, getbody, invoke}),
 	   invokesource : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   getbody : EMFTVM!Getcb (codeBlock <- s.body),							-- [..., soure, cb]
 	   invoke : EMFTVM!Invoke (opname <- s.name, argcount <- 1)					-- [..., coll]
@@ -609,9 +648,9 @@
 	from s : ATL!IterateExp in IN
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.source, s.result.initExpression, s.body},
-		code <- Sequence{invokesource, invokeCb, getbody, invoke}),
+		code <:= Sequence{invokesource, invokeCb, getbody, invoke}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokesource, invokeCb, getbody, invoke}),
+		instructions <:= Sequence{invokesource, invokeCb, getbody, invoke}),
 	   invokesource : EMFTVM!InvokeCb (codeBlock <- s.source, argcount <- 0),	-- [..., source]
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.result.initExpression),		-- [..., source, acc]
 	   getbody : EMFTVM!Getcb (codeBlock <- s.body),							-- [..., source, acc, cb]
@@ -621,45 +660,45 @@
 rule StringExp extends OclExpression {
 	from s : ATL!StringExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Push (value <- s.stringSymbol)							-- [..., string]
 }
 
 rule IntegerExp extends OclExpression {
 	from s : ATL!IntegerExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Push (value <- s.integerSymbol)						-- [..., integer]
 }
 
 rule RealExp extends OclExpression {
 	from s : ATL!RealExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Push (value <- s.realSymbol)							-- [..., real]
 }
 
 rule BooleanTrueExp extends OclExpression {
 	from s : ATL!BooleanExp in IN (s.booleanSymbol)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Pusht													-- [..., true]
 }
 
 rule BooleanFalseExp extends OclExpression {
 	from s : ATL!BooleanExp in IN (not s.booleanSymbol)
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Pushf													-- [..., false]
 }
 
@@ -671,9 +710,9 @@
 	}
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.elements,
-		code <- Sequence{findtype, new}->union(invokes)),
+		code <:= Sequence{findtype, new}->union(invokes)),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{findtype, new}->union(invokes)),
+	   	instructions <:= Sequence{findtype, new}->union(invokes)),
 	   findtype : EMFTVM!Findtype, -- override								-- [..., colltype]
 	   new : EMFTVM!New														-- [..., coll]
 }
@@ -710,9 +749,9 @@
 	}
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.elements->collect(e | Sequence{e.key, e.value})->flatten(),
-		code <- Sequence{findtype, new}->union(puts)),
+		code <:= Sequence{findtype, new}->union(puts)),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{findtype, new}->union(puts)),
+	   	instructions <:= Sequence{findtype, new}->union(puts)),
 	   findtype : EMFTVM!Findtype (											-- [..., MapImplType]
 		modelname <- '#native',
 		typename <- thisModule.MapImplType),
@@ -727,9 +766,9 @@
 	}
 	to cb : EMFTVM!CodeBlock (
 		nested <- s.tuplePart->collect(e | e.initExpression),
-		code <- Sequence{findtype, findtype2, new}->union(puts)->append(invokeFromMap)),
+		code <:= Sequence{findtype, findtype2, new}->union(puts)->append(invokeFromMap)),
 	   ln : EMFTVM!LineNumber (
-	   	instructions <- Sequence{findtype, findtype2, new}->union(puts)->append(invokeFromMap)),
+	   	instructions <:= Sequence{findtype, findtype2, new}->union(puts)->append(invokeFromMap)),
 	   findtype : EMFTVM!Findtype (											-- [..., TupleType]
 		modelname <- '#native',
 		typename <- thisModule.TupleType_),
@@ -752,9 +791,9 @@
 		s.tupleTypeAttribute.oclIsUndefined() and	-- not used as a tuple element type
 		s.variableDeclaration.oclIsUndefined())		-- not used as a variable declaration type
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{findtype}),
+		code <:= Sequence{findtype}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{findtype}),
+		instructions <:= Sequence{findtype}),
 	   findtype : EMFTVM!Findtype (											-- [..., type]
 	   	modelname <- s.modelName, 
 		typename <- s.typeName)
@@ -763,18 +802,18 @@
 rule OclUndefinedExp extends OclExpression {
 	from s : ATL!OclUndefinedExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Push -- NULL											-- [..., null]
 }
 
 rule EnumLiteralExp extends OclExpression {
 	from s : ATL!EnumLiteralExp in IN
 	to cb : EMFTVM!CodeBlock (
-		code <- Sequence{push}),
+		code <:= Sequence{push}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{push}),
+		instructions <:= Sequence{push}),
 	   push : EMFTVM!Push (enumValue <- s.name)								-- [..., enumValue]
 }
 
@@ -782,9 +821,9 @@
 	from s : ATL!IfExp in IN
 	to cb : EMFTVM!CodeBlock (
 		nested <- Sequence{s.condition, s.thenExpression, s.elseExpression},
-		code <- Sequence{invokeCb, ifte}),
+		code <:= Sequence{invokeCb, ifte}),
 	   ln : EMFTVM!LineNumber (
-		instructions <- Sequence{invokeCb, ifte}),
+		instructions <:= Sequence{invokeCb, ifte}),
 	   invokeCb : EMFTVM!InvokeCb (codeBlock <- s.condition, argcount <- 0),		-- [..., cond]
 	   ifte : EMFTVM!Ifte (thenCb <- s.thenExpression, elseCb <- s.elseExpression)	-- [..., result]
 }
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.emftvm b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.emftvm
index fbff270..c17af74 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.emftvm
+++ b/plugins/org.eclipse.m2m.atl.emftvm.compiler/transformations/OCLtoEMFTVM.emftvm
Binary files differ
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TraceLinkSetImpl.java b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TraceLinkSetImpl.java
index 044b12d..63fc132 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TraceLinkSetImpl.java
+++ b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TraceLinkSetImpl.java
@@ -13,6 +13,7 @@
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -32,6 +33,7 @@
 import org.eclipse.m2m.atl.emftvm.trace.TraceLinkSet;
 import org.eclipse.m2m.atl.emftvm.trace.TracePackage;
 import org.eclipse.m2m.atl.emftvm.trace.TracedRule;
+import org.eclipse.m2m.atl.emftvm.trace.util.IdentityHashList;
 
 
 /**
@@ -85,17 +87,17 @@
 	/**
 	 * Lookup table of referred objects to {@link SourceElement}s.
 	 */
-	protected final Map<EObject, SourceElement> defaultSourceObjects = new HashMap<EObject, SourceElement>();
+	protected final Map<EObject, SourceElement> defaultSourceObjects = new IdentityHashMap<EObject, SourceElement>();
 
 	/**
 	 * Lookup table of referred objects to {@link SourceElementList}s.
 	 */
-	protected final Map<List<Object>, SourceElementList> defaultSourceObjectLists = new HashMap<List<Object>, SourceElementList>();
+	protected final Map<IdentityHashList<Object>, SourceElementList> defaultSourceObjectLists = new HashMap<IdentityHashList<Object>, SourceElementList>();
 
 	/**
 	 * Lookup table of traced rules by name.
 	 */
-	protected final Map<String, TracedRule> linksByRuleName = new HashMap<String, TracedRule>();
+	protected final Map<String, TracedRule> linksByRuleName = new IdentityHashMap<String, TracedRule>();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -168,8 +170,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated NOT
 	 */
+	@SuppressWarnings("unchecked")
 	public SourceElementList getDefaultSourceElements(final List<?> sourceElements) {
-		return defaultSourceObjectLists.get(sourceElements);
+		return defaultSourceObjectLists.get(sourceElements instanceof IdentityHashList<?> ? sourceElements
+				: new IdentityHashList<Object>((List<Object>) sourceElements));
 	}
 
 	/**
@@ -450,14 +454,13 @@
 	 */
 	private void defaultSourceElementAdded(final SourceElement se) {
 		final EObject object = se.getObject();
-		if (defaultSourceObjects.containsKey(object)) {
-			final SourceElement eSe = defaultSourceObjects.get(object);
+		final SourceElement eSe = defaultSourceObjects.put(object, se);
+		if (eSe != null) {
 			throw new IllegalArgumentException(String.format(
 					"Default trace already exists for source element %s::%s: %s::%s", 
 					se.getSourceOf().getRule(), se, 
 					eSe.getSourceOf().getRule(), eSe));
 		}
-		defaultSourceObjects.put(object, se);
 	}
 
 	/**
@@ -474,17 +477,16 @@
 	 */
 	private void defaultSourceElementListAdded(final SourceElementList sel) {
 		final List<Object> objects = sel.getSourceObjects();
-		if (defaultSourceObjectLists.containsKey(objects)) {
+		final SourceElementList eSel = defaultSourceObjectLists.put(new IdentityHashList<Object>(objects), sel);
+		if (eSel != null) {
 			assert !sel.getSourceElements().isEmpty();
 			final TracedRule selRule = sel.getSourceElements().get(0).getSourceOf().getRule();
-			final SourceElementList eSel = defaultSourceObjectLists.get(objects);
 			assert !eSel.getSourceElements().isEmpty();
 			final TracedRule eSelRule = eSel.getSourceElements().get(0).getSourceOf().getRule();
 			throw new IllegalArgumentException(String.format(
 					"Default trace already exists for source element list %s::%s: %s::%s", 
 					selRule, sel, eSelRule, eSel));
 		}
-		defaultSourceObjectLists.put(objects, sel);
 	}
 
 	/**
@@ -492,7 +494,7 @@
 	 * @param sel
 	 */
 	private void defaultSourceElementListRemoved(final SourceElementList sel) {
-		defaultSourceObjectLists.remove(sel.getSourceObjects());
+		defaultSourceObjectLists.remove(new IdentityHashList<Object>(sel.getSourceObjects()));
 	}
 
 } //TraceLinkSetImpl
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TracedRuleImpl.java b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TracedRuleImpl.java
index 182ed8c..72eb464 100644
--- a/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TracedRuleImpl.java
+++ b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/impl/TracedRuleImpl.java
@@ -14,6 +14,7 @@
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -34,6 +35,7 @@
 import org.eclipse.m2m.atl.emftvm.trace.TraceLinkSet;
 import org.eclipse.m2m.atl.emftvm.trace.TracePackage;
 import org.eclipse.m2m.atl.emftvm.trace.TracedRule;
+import org.eclipse.m2m.atl.emftvm.trace.util.IdentityHashList;
 
 /**
  * <!-- begin-user-doc -->
@@ -107,12 +109,12 @@
 	/**
 	 * Lookup table of referred objects to {@link SourceElement}s.
 	 */
-	protected final Map<Object, SourceElement> uniqueSourceObjects = new HashMap<Object, SourceElement>();
+	protected final Map<Object, SourceElement> uniqueSourceObjects = new IdentityHashMap<Object, SourceElement>();
 
 	/**
 	 * Lookup table of referred objects to {@link SourceElementList}s.
 	 */
-	protected final Map<List<Object>, SourceElementList> uniqueSourceObjectLists = new HashMap<List<Object>, SourceElementList>();
+	protected final Map<IdentityHashList<Object>, SourceElementList> uniqueSourceObjectLists = new HashMap<IdentityHashList<Object>, SourceElementList>();
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -485,14 +487,13 @@
 	 */
 	private void uniqueSourceElementAdded(final SourceElement se) {
 		final Object object = se.getRuntimeObject();
-		if (uniqueSourceObjects.containsKey(object)) {
-			final SourceElement eSe = uniqueSourceObjects.get(object);
+		final SourceElement eSe = uniqueSourceObjects.put(object, se);
+		if (eSe != null) {
 			throw new IllegalArgumentException(String.format(
 					"Unique trace already exists for source element %s::%s: %s::%s", 
 					se.getSourceOf().getRule(), se, 
 					eSe.getSourceOf().getRule(), eSe));
 		}
-		uniqueSourceObjects.put(object, se);
 	}
 
 	/**
@@ -509,17 +510,16 @@
 	 */
 	private void uniqueSourceElementListAdded(final SourceElementList sel) {
 		final List<Object> objects = sel.getSourceObjects();
-		if (uniqueSourceObjectLists.containsKey(objects)) {
+		final SourceElementList eSel = uniqueSourceObjectLists.put(new IdentityHashList<Object>(objects), sel);
+		if (eSel != null) {
 			assert !sel.getSourceElements().isEmpty();
 			final TracedRule selRule = sel.getSourceElements().get(0).getSourceOf().getRule();
-			final SourceElementList eSel = uniqueSourceObjectLists.get(objects);
 			assert !eSel.getSourceElements().isEmpty();
 			final TracedRule eSelRule = eSel.getSourceElements().get(0).getSourceOf().getRule();
 			throw new IllegalArgumentException(String.format(
 					"Unique trace already exists for source element list %s::%s: %s::%s", 
 					selRule, sel, eSelRule, eSel));
 		}
-		uniqueSourceObjectLists.put(objects, sel);
 	}
 
 	/**
@@ -527,7 +527,7 @@
 	 * @param sel
 	 */
 	private void uniqueSourceElementListRemoved(final SourceElementList sel) {
-		uniqueSourceObjectLists.remove(sel.getSourceObjects());
+		uniqueSourceObjectLists.remove(new IdentityHashList<Object>(sel.getSourceObjects()));
 	}
 
 } //TracedRuleImpl
diff --git a/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/util/IdentityHashList.java b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/util/IdentityHashList.java
new file mode 100644
index 0000000..2021309
--- /dev/null
+++ b/plugins/org.eclipse.m2m.atl.emftvm.trace/src/org/eclipse/m2m/atl/emftvm/trace/util/IdentityHashList.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Dennis Wagelaar.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Dennis Wagelaar - initial API and
+ *         implementation and/or initial documentation
+ *******************************************************************************/
+package org.eclipse.m2m.atl.emftvm.trace.util;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * {@link List} that uses object identity equality and shallow identity hashes
+ * for its elements.
+ * 
+ * @author <a href="mailto:dwagelaar@gmail.com">Dennis Wagelaar</a>
+ */
+public class IdentityHashList<E> implements List<E> {
+
+	private final List<E> inner;
+
+	/**
+	 * Creates a new {@link IdentityHashList}.
+	 * 
+	 * @param inner
+	 *            the inner {@link List} to delegate to
+	 */
+	public IdentityHashList(final List<E> inner) {
+		this.inner = inner;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean equals(final Object o) {
+		if (o == this)
+			return true;
+		if (!(o instanceof List))
+			return false;
+
+		final ListIterator<E> e1 = listIterator();
+		final ListIterator<?> e2 = ((List<?>) o).listIterator();
+		while (e1.hasNext() && e2.hasNext()) {
+			E o1 = e1.next();
+			Object o2 = e2.next();
+			if (o1 != o2) {
+				return false;
+			}
+		}
+		return !(e1.hasNext() || e2.hasNext());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int hashCode() {
+		int hashCode = 1;
+		final Iterator<E> i = iterator();
+		while (i.hasNext()) {
+			E obj = i.next();
+			hashCode = 31 * hashCode + (obj == null ? 0 : System.identityHashCode(obj));
+		}
+		return hashCode;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int size() {
+		return inner.size();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean isEmpty() {
+		return inner.isEmpty();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean contains(Object o) {
+		return inner.contains(o);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Iterator<E> iterator() {
+		return inner.iterator();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public Object[] toArray() {
+		return inner.toArray();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public <T> T[] toArray(T[] a) {
+		return inner.toArray(a);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean add(E o) {
+		return inner.add(o);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean remove(Object o) {
+		return inner.remove(o);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean containsAll(Collection<?> c) {
+		return inner.containsAll(c);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean addAll(Collection<? extends E> c) {
+		return inner.addAll(c);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean addAll(int index, Collection<? extends E> c) {
+		return inner.addAll(index, c);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean removeAll(Collection<?> c) {
+		return inner.removeAll(c);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public boolean retainAll(Collection<?> c) {
+		return inner.retainAll(c);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void clear() {
+		inner.clear();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public E get(int index) {
+		return inner.get(index);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public E set(int index, E element) {
+		return inner.set(index, element);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void add(int index, E element) {
+		inner.add(index, element);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public E remove(int index) {
+		return inner.remove(index);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int indexOf(Object o) {
+		return inner.indexOf(o);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public int lastIndexOf(Object o) {
+		return inner.lastIndexOf(o);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ListIterator<E> listIterator() {
+		return inner.listIterator();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public ListIterator<E> listIterator(int index) {
+		return inner.listIterator(index);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List<E> subList(int fromIndex, int toIndex) {
+		return inner.subList(fromIndex, toIndex);
+	}
+
+}
diff --git a/tests/org.eclipse.m2m.atl.emftvm.tests/launch/ATLtoEMFTVM.launch b/tests/org.eclipse.m2m.atl.emftvm.tests/launch/ATLtoEMFTVM.launch
index cf0c292..7637cb2 100644
--- a/tests/org.eclipse.m2m.atl.emftvm.tests/launch/ATLtoEMFTVM.launch
+++ b/tests/org.eclipse.m2m.atl.emftvm.tests/launch/ATLtoEMFTVM.launch
@@ -2,7 +2,7 @@
 <launchConfiguration type="org.eclipse.m2m.atl.emftvm.launcher.EMFTVMTransformation">
 <stringAttribute key="ATL File Name" value="//org.eclipse.m2m.atl.emftvm.compiler/transformations/ATLtoEMFTVM.atl"/>
 <booleanAttribute key="Disable JIT compiler" value="false"/>
-<booleanAttribute key="Display Profiling Data" value="false"/>
+<booleanAttribute key="Display Profiling Data" value="true"/>
 <booleanAttribute key="Display Timing Data" value="true"/>
 <booleanAttribute key="Enable JIT compiler" value="true"/>
 <mapAttribute key="Inout Model Options"/>
@@ -18,7 +18,7 @@
 <mapAttribute key="Metamodels">
 <mapEntry key="ATL" value="http://www.eclipse.org/gmt/2005/ATL"/>
 <mapEntry key="EMFTVM" value="http://www.eclipse.org/m2m/atl/2011/EMFTVM"/>
-<mapEntry key="Problem" value="platform:/plugin/org.eclipse.m2m.atl.common/org/eclipse/m2m/atl/common/resources/Problem.ecore"/>
+<mapEntry key="Problem" value="http://www.eclipse.org/gmt/2005/Problem"/>
 </mapAttribute>
 <stringAttribute key="Module Name" value="ATLtoEMFTVM"/>
 <stringAttribute key="Module Path" value="/org.eclipse.m2m.atl.emftvm.compiler/transformations/"/>