diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala
index b52e7e6b93e76e53e97dd9e483785ffcc0c0f40a..753e9236064a4ee3eaedbe13647de85a133dcd5f 100644
--- a/src/main/scala/leon/purescala/Definitions.scala
+++ b/src/main/scala/leon/purescala/Definitions.scala
@@ -524,6 +524,9 @@ object Definitions {
     def isRecursive(p: Program) = p.callGraph.transitiveCallees(this) contains this
 
     def paramIds = params map { _.id }
+
+    def applied(args: Seq[Expr]): FunctionInvocation = Constructors.functionInvocation(this, args)
+    def applied = FunctionInvocation(this.typed, this.paramIds map Variable)
   }
 
 
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index 801bc8c7cdc5f4e98150b7ee716fe48e26fedd07..c632a6d6999e2e9ada259d6041b4e041178fe527 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -1436,10 +1436,6 @@ object ExprOps extends { val Deconstructor = Operator } with SubTreeOps[Expr] {
               else (m: Apriori) => None} &&
           (args1 zip args2).mergeall{ case (a1, a2) => isHomo(a1, a2) }
 
-        case (Terminating(tfd1, args1), Terminating(tfd2, args2)) =>
-          idHomo(tfd1.fd.id, tfd2.fd.id)(apriori) && tfd1.tps.zip(tfd2.tps).mergeall{ case (t1, t2) => if(t1 == t2) (m: Apriori) => Option(m) else (m: Apriori) => None} &&
-          (args1 zip args2).mergeall{ case (a1, a2) => isHomo(a1, a2) }
-
         case (Lambda(defs, body), Lambda(defs2, body2)) =>
           // We remove variables introduced by lambdas.
           ((defs zip defs2).mergeall{ case (ValDef(a1), ValDef(a2)) =>
@@ -1558,8 +1554,6 @@ object ExprOps extends { val Deconstructor = Operator } with SubTreeOps[Expr] {
 
       }
 
-      import synthesis.Witnesses.Terminating
-
       val res = (t1, t2) match {
         case (Variable(i1), Variable(i2)) =>
           idHomo(i1, i2)
@@ -1589,14 +1583,6 @@ object ExprOps extends { val Deconstructor = Operator } with SubTreeOps[Expr] {
           fdHomo(tfd1.fd, tfd2.fd) &&
           (args1 zip args2).forall{ case (a1, a2) => isHomo(a1, a2) }
 
-        case (Terminating(tfd1, args1), Terminating(tfd2, args2)) =>
-          // TODO: Check type params
-          fdHomo(tfd1.fd, tfd2.fd) &&
-          (args1 zip args2).forall{ case (a1, a2) => isHomo(a1, a2) }
-
-        case (v1, v2) if isValue(v1) && isValue(v2) =>
-          v1 == v2
-
         case Same(Deconstructor(es1, _), Deconstructor(es2, _)) =>
           (es1.size == es2.size) &&
           (es1 zip es2).forall{ case (e1, e2) => isHomo(e1, e2) }
@@ -2050,7 +2036,6 @@ object ExprOps extends { val Deconstructor = Operator } with SubTreeOps[Expr] {
   def liftClosures(e: Expr): (Set[FunDef], Expr) = {
     var fds: Map[FunDef, FunDef] = Map()
 
-    import synthesis.Witnesses.Terminating
     val res1 = preMap({
       case LetDef(lfds, b) =>
         val nfds = lfds.map(fd => fd -> fd.duplicate())
@@ -2066,13 +2051,6 @@ object ExprOps extends { val Deconstructor = Operator } with SubTreeOps[Expr] {
           None
         }
 
-      case Terminating(tfd, args) =>
-        if (fds contains tfd.fd) {
-          Some(Terminating(fds(tfd.fd).typed(tfd.tps), args))
-        } else {
-          None
-        }
-
       case _ =>
         None
     })(e)
diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala
index 0ec09cbf1bdc30f77e11201a751312c16f1bbabc..49f9c0ff2fbe318d303f0c9e2f2719c0da60bf75 100644
--- a/src/main/scala/leon/repair/Repairman.scala
+++ b/src/main/scala/leon/repair/Repairman.scala
@@ -179,7 +179,7 @@ class Repairman(ctx0: LeonContext, initProgram: Program, fd: FunDef, verifTimeou
 
     val origBody = fd.body.get
 
-    val term  = Terminating(fd.typed, fd.params.map(_.id.toVariable))
+    val term  = Terminating(fd.applied)
     val guide = Guide(origBody)
     val pre   = fd.precOrTrue
 
diff --git a/src/main/scala/leon/synthesis/SourceInfo.scala b/src/main/scala/leon/synthesis/SourceInfo.scala
index af78f227531217a1fbd3411130ecf4243df80add..ca689cca02a138c7562c517a1dccad108f2f4a3d 100644
--- a/src/main/scala/leon/synthesis/SourceInfo.scala
+++ b/src/main/scala/leon/synthesis/SourceInfo.scala
@@ -47,7 +47,7 @@ object SourceInfo {
 
   def extractFromFunction(ctx: LeonContext, prog: Program, fd: FunDef): Seq[SourceInfo] = {
 
-    val term = Terminating(fd.typed, fd.params.map(_.id.toVariable))
+    val term = Terminating(fd.applied)
 
     val eFinder = new ExamplesFinder(ctx, prog)
 
diff --git a/src/main/scala/leon/synthesis/Witnesses.scala b/src/main/scala/leon/synthesis/Witnesses.scala
index 6e040e7c4f82b982ca4428dc875ea8e9fc679621..ed33df1736d8247416a6bebbc67e57f3f3317ef5 100644
--- a/src/main/scala/leon/synthesis/Witnesses.scala
+++ b/src/main/scala/leon/synthesis/Witnesses.scala
@@ -4,7 +4,6 @@ package leon.synthesis
 
 import leon.purescala._
 import Types._
-import Definitions.TypedFunDef
 import Extractors._
 import Expressions.Expr
 import PrinterHelpers._
@@ -23,12 +22,12 @@ object Witnesses {
       p"⊙{$e}"
     }
   }
-  
-  case class Terminating(tfd: TypedFunDef, args: Seq[Expr]) extends Witness {
-    def extract: Option[(Seq[Expr], Seq[Expr] => Expr)] = Some((args, Terminating(tfd, _)))
+
+  case class Terminating(fi: Expr) extends Witness {
+    def extract: Option[(Seq[Expr], Seq[Expr] => Expr)] = Some(( Seq(fi), { case Seq(fi) => Terminating(fi) }))
 
     override def printWith(implicit pctx: PrinterContext): Unit = {
-      p"↓${tfd.id}($args)"
+      p"↓$fi"
     }
   }
   
diff --git a/src/main/scala/leon/synthesis/rules/CEGISLike.scala b/src/main/scala/leon/synthesis/rules/CEGISLike.scala
index 128d7299da70987e1a408f100619b8a42a46b92a..b8a41fdf7309e1cd05274055d3eca3cf4795bc41 100644
--- a/src/main/scala/leon/synthesis/rules/CEGISLike.scala
+++ b/src/main/scala/leon/synthesis/rules/CEGISLike.scala
@@ -343,7 +343,7 @@ abstract class CEGISLike[T <: Typed](name: String) extends Rule(name) {
 
             val e = builder(cs.map { c =>
               val fd = cToFd(c)
-              FunctionInvocation(fd.typed, fd.params.map(_.toVariable))
+              fd.applied
             })
 
             outerExprToInnerExpr(e)
@@ -371,7 +371,7 @@ abstract class CEGISLike[T <: Typed](name: String) extends Rule(name) {
           // Top-level expression for rootC
           val expr = {
             val fd = cToFd(rootC)
-            FunctionInvocation(fd.typed, fd.params.map(_.toVariable))
+            fd.applied
           }
 
           (expr, cToFd.values.toSeq)
diff --git a/src/main/scala/leon/synthesis/rules/IntroduceRecCalls.scala b/src/main/scala/leon/synthesis/rules/IntroduceRecCalls.scala
index 0a4c32f7467414bac5d897bd6f4c309478193ad5..8fdb03c55967b875a6b02382fc1c842ed85e1382 100644
--- a/src/main/scala/leon/synthesis/rules/IntroduceRecCalls.scala
+++ b/src/main/scala/leon/synthesis/rules/IntroduceRecCalls.scala
@@ -75,9 +75,7 @@ case object IntroduceRecCalls extends NormalizingRule("Introduce rec. calls") {
           }) else Nil
         }
 
-        val newWs = calls map {
-          case FunctionInvocation(tfd, args) => Terminating(tfd, args)
-        }
+        val newWs = calls map Terminating
 
         val TopLevelAnds(ws) = p.ws
 
diff --git a/src/main/scala/leon/synthesis/utils/Helpers.scala b/src/main/scala/leon/synthesis/utils/Helpers.scala
index 493e166a80a9f26cafaba104d8062c3504f8cea5..14b7e2fb362b119c5f250e3f6e2752380e9add9c 100644
--- a/src/main/scala/leon/synthesis/utils/Helpers.scala
+++ b/src/main/scala/leon/synthesis/utils/Helpers.scala
@@ -79,7 +79,7 @@ object Helpers {
     }
 
     val res = gs.flatMap {
-      case term@Terminating(tfd, args) if tpe forall (isSubtypeOf(tfd.returnType, _)) =>
+      case term@Terminating(FunctionInvocation(tfd, args)) if tpe forall (isSubtypeOf(tfd.returnType, _)) =>
         val ids = tfd.params.map(vd => FreshIdentifier("<hole>", vd.getType, true)).toList
 
         for (((a, i), tpe) <- args.zipWithIndex zip tfd.params.map(_.getType);