diff --git a/src/orderedsets/TreeOperations.scala b/src/orderedsets/TreeOperations.scala
index af94736e68285092752fb40ea01e45c3877ebd00..5d8005963daaa80060b12fd7ec6afddb93b9e8bb 100644
--- a/src/orderedsets/TreeOperations.scala
+++ b/src/orderedsets/TreeOperations.scala
@@ -29,88 +29,6 @@ object TreeOperations {
     case _ => Stream(expr :: Nil)
   }
 
-  def searchAndReplace(subst: Expr => Option[Expr], recursive: Boolean = true)(expr: Expr) = {
-    def rec(ex: Expr, skip: Expr = null): Expr = (if (ex == skip) None else subst(ex)) match {
-      case Some(newExpr) => {
-        if (newExpr.getType == NoType) {
-          Settings.reporter.warning("REPLACING IN EXPRESSION WITH AN UNTYPED TREE ! " + ex + " --to--> " + newExpr)
-        }
-        if (ex == newExpr)
-          if (recursive) rec(ex, ex) else ex
-        else
-          if (recursive) rec(newExpr) else newExpr
-      }
-      case None => ex match {
-        case l@Let(i, e, b) => {
-          val re = rec(e)
-          val rb = rec(b)
-          if (re != e || rb != b)
-            Let(i, re, rb).setType(l.getType)
-          else
-            l
-        }
-        case f@FunctionInvocation(fd, args) => {
-          var change = false
-          val rargs = args.map(a => {
-            val ra = rec(a)
-            if (ra != a) {
-              change = true
-              ra
-            } else {
-              a
-            }
-          })
-          if (change)
-            FunctionInvocation(fd, rargs).setType(f.getType)
-          else
-            f
-        }
-        case i@IfExpr(t1, t2, t3) => IfExpr(rec(t1), rec(t2), rec(t3)).setType(i.getType)
-        case m@MatchExpr(scrut, cses) => MatchExpr(rec(scrut), cses.map(inCase(_))).setType(m.getType)
-        case And(exs) => And(exs.map(rec(_)))
-        case Or(exs) => Or(exs.map(rec(_)))
-        case Not(e) => Not(rec(e))
-        case u@UnaryOperator(t, recons) => {
-          val r = rec(t)
-          if (r != t)
-            recons(r).setType(u.getType)
-          else
-            u
-        }
-        case b@BinaryOperator(t1, t2, recons) => {
-          val r1 = rec(t1)
-          val r2 = rec(t2)
-          if (r1 != t1 || r2 != t2)
-            recons(r1, r2).setType(b.getType)
-          else
-            b
-        }
-        case c@CaseClass(cd, args) => {
-          CaseClass(cd, args.map(rec(_))).setType(c.getType)
-        }
-        case c@CaseClassSelector(cc, sel) => {
-          val rc = rec(cc)
-          if (rc != cc)
-            CaseClassSelector(rc, sel).setType(c.getType)
-          else
-            c
-        }
-        case f@FiniteSet(elems) => {
-          FiniteSet(elems.map(rec(_))).setType(f.getType)
-        }
-        case Terminal() => ex   // Ok
-        case _ => error("Unsupported case in searchAndReplace : " + ex.getClass) // Missed case
-      }
-    }
-
-    def inCase(cse: MatchCase): MatchCase = cse match {
-      case SimpleCase(pat, rhs) => SimpleCase(pat, rec(rhs))
-      case GuardedCase(pat, guard, rhs) => GuardedCase(pat, rec(guard), rec(rhs))
-    }
-
-    rec(expr)
-  }
-
   def asCatamorphism(program: Program, f: FunDef): Option[Seq[(CaseClassDef, Identifier, Seq[Identifier], Expr)]] = {
     def recCallsOnMatchedVars(l: (CaseClassDef, Identifier, Seq[Identifier], Expr)) = {
       var varSet = MutableSet.empty[Identifier]