diff --git a/src/main/scala/leon/evaluators/AngelicEvaluator.scala b/src/main/scala/leon/evaluators/AngelicEvaluator.scala
index c1374b54f39117c4ddf09c8315df012cc5d6a989..090eeff0f6d38a5802718989ff81fe623e670d4e 100644
--- a/src/main/scala/leon/evaluators/AngelicEvaluator.scala
+++ b/src/main/scala/leon/evaluators/AngelicEvaluator.scala
@@ -4,12 +4,11 @@ package leon
 package evaluators
 
 import leon.solvers.Model
-import purescala.Definitions.Program
 import purescala.Expressions.Expr
 import EvaluationResults._
 
-class AngelicEvaluator(ctx: LeonContext, prog: Program, underlying: NDEvaluator)
-  extends Evaluator(ctx, prog)
+class AngelicEvaluator(underlying: NDEvaluator)
+  extends Evaluator(underlying.context, underlying.program)
   with DeterministicEvaluator
 {
   val description: String = "angelic evaluator"
@@ -24,3 +23,20 @@ class AngelicEvaluator(ctx: LeonContext, prog: Program, underlying: NDEvaluator)
       other.asInstanceOf[Result[Nothing]]
   }
 }
+
+class DemonicEvaluator(underlying: NDEvaluator)
+  extends Evaluator(underlying.context, underlying.program)
+  with DeterministicEvaluator
+{
+  val description: String = "demonic evaluator"
+  val name: String = "Interpreter that demands an underlying non-deterministic program has unique solution"
+
+  def eval(expr: Expr, model: Model): EvaluationResult = underlying.eval(expr, model) match {
+    case Successful(Stream(h)) =>
+      Successful(h)
+    case Successful(_) =>
+      RuntimeError("Underlying ND-evaluator did not return unique solution!")
+    case other@(RuntimeError(_) | EvaluatorError(_)) =>
+      other.asInstanceOf[Result[Nothing]]
+  }
+}
\ No newline at end of file
diff --git a/src/main/scala/leon/evaluators/DefaultEvaluator.scala b/src/main/scala/leon/evaluators/DefaultEvaluator.scala
index 5c951eedc1a68943c42d9ee4f07f8d58e5f74bf9..ed71ff7e33d14503e1871ce9b0347032d56b62f3 100644
--- a/src/main/scala/leon/evaluators/DefaultEvaluator.scala
+++ b/src/main/scala/leon/evaluators/DefaultEvaluator.scala
@@ -1,3 +1,5 @@
+/* Copyright 2009-2015 EPFL, Lausanne */
+
 package leon
 package evaluators
 
@@ -5,4 +7,5 @@ import purescala.Definitions.Program
 
 class DefaultEvaluator(ctx: LeonContext, prog: Program)
   extends RecursiveEvaluator(ctx, prog, 5000)
-  with DefaultContexts
\ No newline at end of file
+  with HasDefaultGlobalContext
+  with HasDefaultRecContext
\ No newline at end of file
diff --git a/src/main/scala/leon/evaluators/DualEvaluator.scala b/src/main/scala/leon/evaluators/DualEvaluator.scala
index 05f60fd270f7d7ebc28b8627b703d23f30b6e214..98fd4b03c5133535eb6ff67ad9a2b86dfadc1a82 100644
--- a/src/main/scala/leon/evaluators/DualEvaluator.scala
+++ b/src/main/scala/leon/evaluators/DualEvaluator.scala
@@ -10,17 +10,16 @@ import purescala.Types._
 
 import codegen._
 
-class DualEvaluator(ctx: LeonContext, prog: Program, params: CodeGenParams) extends RecursiveEvaluator(ctx, prog, params.maxFunctionInvocations) {
+class DualEvaluator(ctx: LeonContext, prog: Program, params: CodeGenParams)
+  extends RecursiveEvaluator(ctx, prog, params.maxFunctionInvocations)
+  with HasDefaultGlobalContext
+{
 
   type RC = DualRecContext
-  type GC = GlobalContext
-
-  def initGC(model: solvers.Model) = new GlobalContext(model, this.maxSteps)
+  def initRC(mappings: Map[Identifier, Expr]): RC = DualRecContext(mappings)
 
   implicit val debugSection = utils.DebugSectionEvaluation
 
-  def initRC(mappings: Map[Identifier, Expr]): RC = DualRecContext(mappings)
-
   var monitor = new runtime.LeonCodeGenRuntimeMonitor(params.maxFunctionInvocations)
 
   val unit = new CompilationUnit(ctx, prog, params)
diff --git a/src/main/scala/leon/evaluators/Evaluator.scala b/src/main/scala/leon/evaluators/Evaluator.scala
index 9843da81d4187e468cf418c6100f2ce68f2dfefd..7f86322b07b760c042d932d61002207609bb6524 100644
--- a/src/main/scala/leon/evaluators/Evaluator.scala
+++ b/src/main/scala/leon/evaluators/Evaluator.scala
@@ -3,6 +3,7 @@
 package leon
 package evaluators
 
+import leon.purescala.Types.TypeTree
 import purescala.Common._
 import purescala.Definitions._
 import purescala.Expressions._
@@ -50,4 +51,4 @@ trait DeterministicEvaluator extends Evaluator {
 
 trait NDEvaluator extends Evaluator {
   type Value = Stream[Expr]
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/leon/evaluators/EvaluatorContexts.scala b/src/main/scala/leon/evaluators/EvaluatorContexts.scala
index 776e389dd855736132d8c066fc837cc2b4bc34ad..f5c71f8d9951a6ca4b90428e98c80984ae5f4328 100644
--- a/src/main/scala/leon/evaluators/EvaluatorContexts.scala
+++ b/src/main/scala/leon/evaluators/EvaluatorContexts.scala
@@ -29,11 +29,12 @@ class GlobalContext(val model: Model, val maxSteps: Int) {
   var stepsLeft = maxSteps
 }
 
-protected[evaluators] trait DefaultContexts extends ContextualEvaluator {
-
-  final type RC = DefaultRecContext
-  final type GC = GlobalContext
-
+trait HasDefaultRecContext extends ContextualEvaluator {
+  type RC = DefaultRecContext
   def initRC(mappings: Map[Identifier, Expr]) = DefaultRecContext(mappings)
+}
+
+trait HasDefaultGlobalContext extends ContextualEvaluator {
   def initGC(model: solvers.Model) = new GlobalContext(model, this.maxSteps)
+  type GC = GlobalContext
 }
\ No newline at end of file
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index d1392d498b367475191ad8e42f82aa64778f5ccc..972a2a459af2285ef4fc1de8e6b73d69e1723c2f 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -3,17 +3,16 @@
 package leon
 package evaluators
 
-import leon.purescala.Constructors._
-import leon.purescala.ExprOps._
-import leon.purescala.Expressions.Pattern
-import leon.purescala.Extractors._
-import leon.purescala.Quantification._
-import leon.purescala.TypeOps._
-import leon.purescala.Types._
-import leon.solvers.{SolverFactory, HenkinModel}
+import purescala.Constructors._
+import purescala.ExprOps._
+import purescala.Expressions.Pattern
+import purescala.Extractors._
+import purescala.TypeOps._
+import purescala.Types._
 import purescala.Common._
 import purescala.Expressions._
 import purescala.Definitions._
+import solvers.SolverFactory
 
 abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int)
   extends ContextualEvaluator(ctx, prog, maxSteps)
diff --git a/src/main/scala/leon/evaluators/StreamEvaluator.scala b/src/main/scala/leon/evaluators/StreamEvaluator.scala
index 5b387368ba259ac4cbeb2cf8f716feace7d370d9..1a5c9e0630e720e4769236688d9e22eec6bbf45c 100644
--- a/src/main/scala/leon/evaluators/StreamEvaluator.scala
+++ b/src/main/scala/leon/evaluators/StreamEvaluator.scala
@@ -13,21 +13,18 @@ import purescala.Definitions.{TypedFunDef, Program}
 import purescala.Expressions._
 
 import leon.solvers.SolverFactory
-import leon.utils.StreamUtils.cartesianProduct
+import leon.utils.StreamUtils._
 
 class StreamEvaluator(ctx: LeonContext, prog: Program)
   extends ContextualEvaluator(ctx, prog, 50000)
   with NDEvaluator
-  with DefaultContexts
+  with HasDefaultGlobalContext
+  with HasDefaultRecContext
 {
 
   val name = "ND-evaluator"
   val description = "Non-deterministic interpreter for Leon programs that returns a Stream of solutions"
 
-  case class NDValue(tp: TypeTree) extends Expr with Terminal {
-    val getType = tp
-  }
-
   protected[evaluators] def e(expr: Expr)(implicit rctx: RC, gctx: GC): Stream[Expr] = expr match {
     case Variable(id) =>
       rctx.mappings.get(id).toStream
@@ -74,10 +71,6 @@ class StreamEvaluator(ctx: LeonContext, prog: Program)
     case Error(tpe, desc) =>
       Stream()
 
-    case NDValue(tp) =>
-      import grammars.ValueGrammar
-      ValueGrammar.getProductions(tp).toStream.map{ g => g.builder(Seq())}
-
     case IfExpr(cond, thenn, elze) =>
       e(cond).distinct.flatMap {
         case BooleanLiteral(true) => e(thenn)
@@ -226,7 +219,8 @@ class StreamEvaluator(ctx: LeonContext, prog: Program)
             solverf.shutdown()
           }
           sol
-        }).takeWhile(_.isDefined).map(_.get)
+        }).takeWhile(_.isDefined).take(10).map(_.get)
+        // This take(10) is there because we are not working well with infinite streams yet...
       } catch {
         case e: Throwable =>
           solverf.reclaim(solver)
@@ -586,6 +580,4 @@ class StreamEvaluator(ctx: LeonContext, prog: Program)
 
   }
 
-
 }
-
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index c0fd0d23603d0d55ad7f2ca0c12c80ee03a721ba..9150e91bfef8e062958198958565910973cb6498 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -1140,12 +1140,47 @@ object ExprOps {
       GenericValue(tp, 0)
 
     case FunctionType(from, to) =>
-      val args = from.map(tpe => ValDef(FreshIdentifier("x", tpe, true)))
+      val args = from.map(tpe => ValDef(FreshIdentifier("x", tpe, alwaysShowUniqueID = true)))
       Lambda(args, simplestValue(to))
 
     case _ => throw LeonFatalError("I can't choose simplest value for type " + tpe)
   }
 
+  def valuesOf(tp: TypeTree): Stream[Expr] = {
+    import utils.StreamUtils._
+    tp match {
+      case BooleanType =>
+        Stream(BooleanLiteral(false), BooleanLiteral(true))
+      case Int32Type =>
+        Stream.iterate(0) { prev =>
+          if (prev > 0) -prev else -prev + 1
+        } map IntLiteral
+      case IntegerType =>
+        Stream.iterate(BigInt(0)) { prev =>
+          if (prev > 0) -prev else -prev + 1
+        } map InfiniteIntegerLiteral
+      case UnitType =>
+        Stream(UnitLiteral())
+      case tp: TypeParameter =>
+        Stream.from(0) map (GenericValue(tp, _))
+      case TupleType(stps) =>
+        cartesianProduct(stps map (tp => valuesOf(tp))) map Tuple
+      case SetType(base) =>
+        def elems = valuesOf(base)
+        elems.scanLeft(Stream(FiniteSet(Set(), base): Expr)){ (prev, curr) =>
+          prev flatMap {
+            case fs@FiniteSet(elems, tp) =>
+              Stream(fs, FiniteSet(elems + curr, tp))
+          }
+        }.flatten // FIXME Need cp οr is this fine?
+      case cct: CaseClassType =>
+        cartesianProduct(cct.fieldsTypes map valuesOf) map (CaseClass(cct, _))
+      case act: AbstractClassType =>
+        interleave(act.knownCCDescendants.map(cct => valuesOf(cct)))
+    }
+  }
+
+
   /** Hoists all IfExpr at top level.
     *
     * Guarantees that all IfExpr will be at the top level and as soon as you
diff --git a/src/main/scala/leon/repair/RepairNDEvaluator.scala b/src/main/scala/leon/repair/RepairNDEvaluator.scala
index e9d63b1b96db406da3aa34e80c735b7bbbe9cdf6..56e8467478f5f0135945b9a72da0e525e4ac2c70 100644
--- a/src/main/scala/leon/repair/RepairNDEvaluator.scala
+++ b/src/main/scala/leon/repair/RepairNDEvaluator.scala
@@ -1,81 +1,25 @@
 /* Copyright 2009-2015 EPFL, Lausanne */
 
-package leon.repair
-
-import leon.purescala._
-import Definitions._
-import Expressions._
-import Types._
-import ExprOps.postMap
-import Constructors.not
-import leon.LeonContext
-import leon.evaluators.DefaultEvaluator
-import scala.util.Try
-
-// This evaluator treats the condition cond non-deterministically in the following sense:
-// If a function invocation fails or violates a postcondition for cond, 
-// it backtracks and gets executed again for !cond
-class RepairNDEvaluator(ctx: LeonContext, prog: Program, fd : FunDef, cond: Expr) extends DefaultEvaluator(ctx, prog) {
-
-  override def e(expr: Expr)(implicit rctx: RC, gctx: GC): Expr = expr match {
- 
-    case FunctionInvocation(tfd, args) if tfd.fd == fd =>
-      if (gctx.stepsLeft < 0) {
-        throw RuntimeError("Exceeded number of allocated methods calls ("+gctx.maxSteps+")")
-      }
-      gctx.stepsLeft -= 1
-
-      val evArgs = args.map(a => e(a))
-
-      // build a mapping for the function...
-      val frame = rctx.newVars(tfd.paramSubst(evArgs))
-      
-      if(tfd.hasPrecondition) {
-        e(tfd.precondition.get)(frame, gctx) match {
-          case BooleanLiteral(true) =>
-          case BooleanLiteral(false) =>
-            throw RuntimeError("Precondition violation for " + tfd.id.name + " reached in evaluation.: " + tfd.precondition.get)
-          case other =>
-            throw RuntimeError(typeErrorMsg(other, BooleanType))
-        }
-      }
-
-      if(!tfd.hasBody && !rctx.mappings.isDefinedAt(tfd.id)) {
-        throw EvalError("Evaluation of function with unknown implementation.")
-      }
-
-      val body = tfd.body.getOrElse(rctx.mappings(tfd.id))
-      
-      def treat(subst : Expr => Expr) = {
-        val callResult = e(subst(body))(frame, gctx)
-  
-        tfd.postcondition match {
-          case Some(post) =>
-            e(subst(Application(post, Seq(callResult))))(frame, gctx) match {
-              case BooleanLiteral(true) =>
-              case BooleanLiteral(false) => throw RuntimeError("Postcondition violation for " + tfd.id.name + " reached in evaluation.")
-              case other => throw EvalError(typeErrorMsg(other, BooleanType))
-            }
-          case None =>
-        }
-  
-        callResult
-      }
-    
-      Try {
-        treat(e => e)
-      }.getOrElse {
-        treat( postMap {
-          // Use reference equality, just in case cond appears again in the program
-          case c if c eq cond => Some(not(cond))
-          case _ => None
-        })
-      }
-      
-    case _ => super.e(expr)     
+package leon
+package repair
+
+import purescala.Definitions.Program
+import purescala.Expressions._
+import purescala.ExprOps.valuesOf
+import evaluators.StreamEvaluator
+
+/** This evaluator treats the expression [[nd]] (reference equality) as a non-deterministic value */
+class RepairNDEvaluator(ctx: LeonContext, prog: Program, nd: Expr) extends StreamEvaluator(ctx, prog) {
+
+  override def e(expr: Expr)(implicit rctx: RC, gctx: GC): Stream[Expr] = expr match {
+    case Not(c) if c eq nd =>
+      // This is a hack: We know the only way nd is wrapped within a Not is if it is NOT within
+      // a recursive call. So we need to treat it deterministically at this point...
+      super.e(c) collect { case BooleanLiteral(b) => BooleanLiteral(!b) }
+    case c if c eq nd =>
+      valuesOf(c.getType)
+    case other =>
+      super.e(other)
   }
 
-  
-  
-  
 }
diff --git a/src/main/scala/leon/repair/RepairTrackingEvaluator.scala b/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
index 2846bc4848bd12147a68f7c03a3b7319f8aae88c..fd12f7216f482fa50ce84816caa79fa8a450d689 100644
--- a/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
+++ b/src/main/scala/leon/repair/RepairTrackingEvaluator.scala
@@ -16,13 +16,11 @@ import leon.evaluators._
   * as well as if each invocation was successful or erroneous (led to an error)
   * (.fiStatus) 
   */
-class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends RecursiveEvaluator(ctx, prog, 50000) {
+class RepairTrackingEvaluator(ctx: LeonContext, prog: Program) extends RecursiveEvaluator(ctx, prog, 50000) with HasDefaultGlobalContext {
   type RC = CollectingRecContext
-  type GC = GlobalContext
 
   def initRC(mappings: Map[Identifier, Expr]) = CollectingRecContext(mappings, None)
-  def initGC(model: leon.solvers.Model) = new GlobalContext(model, maxSteps)
-  
+
   type FI = (FunDef, Seq[Expr])
   
   // This is a call graph to track dependencies of function invocations.
diff --git a/src/main/scala/leon/repair/rules/Focus.scala b/src/main/scala/leon/repair/rules/Focus.scala
index d6b4d874ffc1063dc2288f39af3f862a35542371..93520c5ea9cd467cf73a94392a565022782eb3d9 100644
--- a/src/main/scala/leon/repair/rules/Focus.scala
+++ b/src/main/scala/leon/repair/rules/Focus.scala
@@ -4,8 +4,9 @@ package leon
 package repair
 package rules
 
+import sun.nio.cs.StreamEncoder
 import synthesis._
-import evaluators._
+import leon.evaluators._
 
 import purescala.Expressions._
 import purescala.Common._
@@ -93,11 +94,10 @@ case object Focus extends PreprocessingRule("Focus") {
 
     def testCondition(cond: Expr) = {
       val ndSpec = postMap {
-        case c if c eq cond => Some(not(cond)) // Use reference equality
+        case c if c eq cond => Some(not(cond))
         case _ => None
       }(fdSpec)
-
-      forAllTests(ndSpec, Map(), new RepairNDEvaluator(ctx, program, fd, cond))
+      forAllTests(ndSpec, Map(), new AngelicEvaluator(new RepairNDEvaluator(ctx, program, cond)))
     }
 
     guides.flatMap {
diff --git a/src/main/scala/leon/utils/StreamUtils.scala b/src/main/scala/leon/utils/StreamUtils.scala
index c972f2e27dd1a28325f8477fa2042ea0620bc78f..2ea08a593725b6f28f4e96be85a00088eb1f9f76 100644
--- a/src/main/scala/leon/utils/StreamUtils.scala
+++ b/src/main/scala/leon/utils/StreamUtils.scala
@@ -3,17 +3,23 @@
 package leon.utils
 
 object StreamUtils {
-  def interleave[T](streams : Seq[Stream[T]]) : Stream[T] = {
-    var ss = streams
-    while(ss.nonEmpty && ss.head.isEmpty) {
-      ss = ss.tail
+
+  def interleave[T](streams: Stream[Stream[T]]): Stream[T] = {
+    def rec(streams: Stream[Stream[T]], diag: Int): Stream[T] = {
+      if(streams.isEmpty) Stream() else {
+        val (take, leave) = streams.splitAt(diag)
+        val (nonEmpty, empty) = take partition (_.nonEmpty)
+        nonEmpty.map(_.head) ++ rec(nonEmpty.map(_.tail) ++ leave, diag + 1 - empty.size)
+      }
     }
-    if(ss.isEmpty) return Stream.empty
-    if(ss.size == 1) return ss.head
+    rec(streams, 1)
+  }
 
-    // TODO: This circular-shifts the list. I'd be interested in a constant time
-    // operation. Perhaps simply by choosing the right data-structure?
-    Stream.cons(ss.head.head, interleave(ss.tail :+ ss.head.tail))
+  def interleave[T](streams : Seq[Stream[T]]) : Stream[T] = {
+    if (streams.isEmpty) Stream() else {
+      val nonEmpty = streams filter (_.nonEmpty)
+      nonEmpty.toStream.map(_.head) ++ interleave(nonEmpty.map(_.tail))
+    }
   }
 
   def cartesianProduct[T](streams : Seq[Stream[T]]) : Stream[List[T]] = {
diff --git a/src/test/resources/regression/repair/Heap3.scala b/src/test/resources/regression/repair/Heap3.scala
new file mode 100644
index 0000000000000000000000000000000000000000..3305b5d15a0731bd3aeaa1269c2404807f49a266
--- /dev/null
+++ b/src/test/resources/regression/repair/Heap3.scala
@@ -0,0 +1,113 @@
+/* Copyright 2009-2015 EPFL, Lausanne
+ *
+ * Author: Ravi
+ * Date: 20.11.2013
+ **/
+
+import leon.lang._
+import leon.collection._
+
+object Heaps {
+ 
+  sealed abstract class Heap {
+    val rank : BigInt = this match {
+      case Leaf() => 0
+      case Node(_, l, r) => 
+        1 + max(l.rank, r.rank)
+    }
+    def content : Set[BigInt] = this match {
+      case Leaf() => Set[BigInt]()
+      case Node(v,l,r) => l.content ++ Set(v) ++ r.content
+    }
+  }
+  case class Leaf() extends Heap
+  case class Node(value:BigInt, left: Heap, right: Heap) extends Heap
+
+  def max(i1 : BigInt, i2 : BigInt) = if (i1 >= i2) i1 else i2
+
+  def hasHeapProperty(h : Heap) : Boolean = h match {
+    case Leaf() => true
+    case Node(v, l, r) => 
+      ( l match {
+        case Leaf() => true
+        case n@Node(v2,_,_) => v >= v2 && hasHeapProperty(n)
+      }) && 
+      ( r match {
+        case Leaf() => true
+        case n@Node(v2,_,_) => v >= v2 && hasHeapProperty(n)
+      })
+  }
+
+  def hasLeftistProperty(h: Heap) : Boolean = h match {
+    case Leaf() => true
+    case Node(_,l,r) => 
+      hasLeftistProperty(l) && 
+      hasLeftistProperty(r) && 
+      l.rank >= r.rank 
+  }
+
+  def heapSize(t: Heap): BigInt = { t match {
+    case Leaf() => BigInt(0)
+    case Node(v, l, r) => heapSize(l) + 1 + heapSize(r)
+  }} ensuring(_ >= 0)
+
+  private def merge(h1: Heap, h2: Heap) : Heap = {
+    require(
+      hasLeftistProperty(h1) && hasLeftistProperty(h2) && 
+      hasHeapProperty(h1) && hasHeapProperty(h2)
+    )
+    (h1,h2) match {
+      case (Leaf(), _) => h2
+      case (_, Leaf()) => h1
+      case (Node(v1, l1, r1), Node(v2, l2, r2)) =>
+        if(v1 >= v2) // FIXME swapped the branches
+          makeN(v2, l2, merge(h1, r2))
+        else
+          makeN(v1, l1, merge(r1, h2))
+    }
+  } ensuring { res => 
+    hasLeftistProperty(res) && hasHeapProperty(res) &&
+    heapSize(h1) + heapSize(h2) == heapSize(res) &&
+    h1.content ++ h2.content == res.content 
+  }
+
+  private def makeN(value: BigInt, left: Heap, right: Heap) : Heap = {
+    require(
+      hasLeftistProperty(left) && hasLeftistProperty(right)
+    )
+    if(left.rank >= right.rank)
+      Node(value, left, right)
+    else
+      Node(value, right, left)
+  } ensuring { res =>
+    hasLeftistProperty(res)  }
+
+  def insert(element: BigInt, heap: Heap) : Heap = {
+    require(hasLeftistProperty(heap) && hasHeapProperty(heap))
+
+    merge(Node(element, Leaf(), Leaf()), heap)
+
+  } ensuring { res =>
+    hasLeftistProperty(res) && hasHeapProperty(res) &&
+    heapSize(res) == heapSize(heap) + 1 &&
+    res.content == heap.content ++ Set(element)
+  }
+
+  def findMax(h: Heap) : Option[BigInt] = {
+    h match {
+      case Node(m,_,_) => Some(m)
+      case Leaf() => None()
+    }
+  }
+
+  def removeMax(h: Heap) : Heap = {
+    require(hasLeftistProperty(h) && hasHeapProperty(h))
+    h match {
+      case Node(_,l,r) => merge(l, r)
+      case l => l
+    }
+  } ensuring { res =>
+    hasLeftistProperty(res) && hasHeapProperty(res)
+  }
+
+} 
diff --git a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
index 82c419b043468ebe20cc5422630f96a1d5128457..ff882c96157cb6b85b02e101a3c0b84e0cfe058f 100644
--- a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
+++ b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
@@ -206,7 +206,7 @@ class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL {
   def normalEvaluators(implicit ctx: LeonContext, pgm: Program): List[Evaluator] = {
     List(
       new DefaultEvaluator(ctx, pgm),
-      new AngelicEvaluator(ctx, pgm, new StreamEvaluator(ctx, pgm))
+      new AngelicEvaluator(new StreamEvaluator(ctx, pgm))
     )
   }
 
diff --git a/src/test/scala/leon/regression/repair/RepairSuite.scala b/src/test/scala/leon/regression/repair/RepairSuite.scala
index 50b845f923e2356d1ce4c0c9a27692a78cd30ce5..5b6667d5f4233521a4dc79a5d309618e49e8f07d 100644
--- a/src/test/scala/leon/regression/repair/RepairSuite.scala
+++ b/src/test/scala/leon/regression/repair/RepairSuite.scala
@@ -16,6 +16,7 @@ class RepairSuite extends LeonRegressionSuite {
     
   val fileToFun = Map(
     "Compiler1.scala"   -> "desugar",
+    "Heap3.scala"       -> "merge",
     "Heap4.scala"       -> "merge",
     "ListEasy.scala"    -> "pad",
     "List1.scala"       -> "pad",
@@ -23,7 +24,10 @@ class RepairSuite extends LeonRegressionSuite {
     "MergeSort2.scala"  -> "merge"
   )
   
-  for (file <- filesInResourceDir("regression/repair/", _.endsWith(".scala")) if fileToFun contains file.getName) {
+  for (file <- filesInResourceDir("regression/repair/", _.endsWith(".scala"))) {
+    if (!(fileToFun contains file.getName)) {
+      fail(s"Don't know which function to repair for ${file.getName}")
+    }
     val path = file.getAbsoluteFile.toString
     val name = file.getName
 
diff --git a/src/test/scala/leon/unit/evaluators/EvaluatorSuite.scala b/src/test/scala/leon/unit/evaluators/EvaluatorSuite.scala
index 4002a0af0fb4ef8c71bf7542af74a6f8d6d366c9..b510c01bb891532c60cace6017b2a61d09bfdbb3 100644
--- a/src/test/scala/leon/unit/evaluators/EvaluatorSuite.scala
+++ b/src/test/scala/leon/unit/evaluators/EvaluatorSuite.scala
@@ -20,7 +20,7 @@ class EvaluatorSuite extends LeonTestSuite with helpers.ExpressionsDSL {
   def normalEvaluators(implicit ctx: LeonContext, pgm: Program): List[DeterministicEvaluator] = {
     List(
       new DefaultEvaluator(ctx, pgm),
-      new AngelicEvaluator(ctx, pgm, new StreamEvaluator(ctx, pgm))
+      new AngelicEvaluator(new StreamEvaluator(ctx, pgm))
     )
   }