diff --git a/src/main/scala/leon/synthesis/Cost.scala b/src/main/scala/leon/synthesis/Cost.scala
index e3cb213d35d758fef1dc60a2521e5de60015e5a1..7d989b3476c18edd1ed6a0d16a948dc8da585aa6 100644
--- a/src/main/scala/leon/synthesis/Cost.scala
+++ b/src/main/scala/leon/synthesis/Cost.scala
@@ -16,7 +16,7 @@ case class SolutionCost(s: Solution) extends Cost {
 }
 
 case class ProblemCost(p: Problem) extends Cost {
-  val value = math.pow(2, p.xs.size).toInt + formulaSize(p.phi)
+  val value = p.xs.size
 }
 
 case class RuleApplicationCost(rule: Rule, app: RuleApplication) extends Cost {
diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala
index a9a7f17351a9696217cb7cecb56867f535e91d7b..aaf3054ae57bcad27a322003311fad84d208ce03 100644
--- a/src/main/scala/leon/synthesis/Rules.scala
+++ b/src/main/scala/leon/synthesis/Rules.scala
@@ -20,7 +20,7 @@ object Rules {
     new EqualitySplit(_),
     new CEGIS(_),
     new Assert(_),
-//    new ADTSplit(_),
+    new ADTSplit(_),
     new IntegerEquation(_),
     new IntegerInequalities(_)
   )
@@ -50,6 +50,14 @@ object RuleFastApplication {
   }
 }
 
+object RuleFastInapplicable {
+  def apply() = {
+    RuleResult(List(new RuleApplication(0, ls => Solution.simplest) {
+      def apply() = RuleApplicationImpossible
+    }))
+  }
+}
+
 object RuleFastStep {
   def apply(sub: List[Problem], onSuccess: List[Solution] => Solution) = {
     RuleResult(List(RuleFastApplication(sub, onSuccess)))
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index 96eccf1d1a1ac7984305a6db21cdbeb2dfbd42ef..ae3717d3cb1cfbc721a63bdc560e236426f1429b 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -72,7 +72,7 @@ class Synthesizer(val reporter: Reporter,
   }
 
   case class TaskTryRules(p: Problem) extends AOOrTask[Solution] {
-    val cost = Cost.zero
+    val cost = ProblemCost(p)
 
     override def toString = p.toString
   }
diff --git a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
index 0f3fd8607da4a14bcd57bb7bc3583f94124d3655..ac005a3803fa02b6e0992e7c1dd1b296e8b6a509 100644
--- a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
+++ b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala
@@ -40,23 +40,23 @@ class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", syn
                 result = Some(RuleFastSuccess(Solution(BooleanLiteral(true), Set(), Tuple(p.xs.map(valuateWithModel(satModel))).setType(tpe))))
 
               case _ =>
-                result = Some(RuleInapplicable)
+                result = Some(RuleFastInapplicable())
             }
 
           case (Some(false), _) =>
             if (predicates.isEmpty) {
               result = Some(RuleFastSuccess(Solution(BooleanLiteral(false), Set(), Error(p.phi+" is UNSAT!").setType(tpe))))
             } else {
-              result = Some(RuleInapplicable)
+              result = Some(RuleFastInapplicable())
             }
           case _ =>
-            result = Some(RuleInapplicable)
+            result = Some(RuleFastInapplicable())
         }
 
         i += 1 
       }
 
-      result.getOrElse(RuleInapplicable)
+      result.getOrElse(RuleFastInapplicable())
     } else {
       RuleInapplicable
     }
diff --git a/src/main/scala/leon/synthesis/search/AndOrGraph.scala b/src/main/scala/leon/synthesis/search/AndOrGraph.scala
index 74659050bc917b8a36f3bbbcc3e933a3217d95e5..75913701ce175c2d2da747b04ad09047b2127f13 100644
--- a/src/main/scala/leon/synthesis/search/AndOrGraph.scala
+++ b/src/main/scala/leon/synthesis/search/AndOrGraph.scala
@@ -131,13 +131,13 @@ class AndOrGraph[AT <: AOAndTask[S], OT <: AOOrTask[S], S <: AOSolution](val roo
       if (!alternatives.isEmpty) {
         minAlternative = alternatives.values.minBy(_.minCost)
         val old = minCost 
-        minCost        = minAlternative.minCost + task.cost
+        minCost        = minAlternative.minCost
         if (minCost != old) {
           Option(parent).foreach(_.updateMin())
         }
       } else {
         minAlternative = null
-        minCost        = task.cost
+        minCost        = Cost.zero
       }
     }
 
diff --git a/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala b/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala
index 0dbf5d73d507e33e2df5d60fb1c25abddc6b5652..04059da77e6be06e7a1309a8ce4046223559818f 100644
--- a/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala
+++ b/src/main/scala/leon/synthesis/search/AndOrGraphSearch.scala
@@ -4,35 +4,21 @@ abstract class AndOrGraphSearch[AT <: AOAndTask[S],
                                 OT <: AOOrTask[S],
                                 S <: AOSolution](val g: AndOrGraph[AT, OT, S]) {
 
-  def nextLeaf: Option[g.Leaf] = {
-    import collection.mutable.PriorityQueue
-
-    case class WT(t: g.Tree, prefixCost: Cost) extends Ordered[WT] {
-      val cost = t.minCost + prefixCost
-
-      def compare(that: WT) = that.cost.compare(this.cost) // DESC
-    }
-
-    val q = new PriorityQueue[WT]()
-    q += WT(g.tree, Cost.zero)
+  def nextLeafSimple: Option[g.Leaf] = {
+    var c : g.Tree = g.tree
 
     var res: Option[g.Leaf] = None
 
-    while(res.isEmpty && !q.isEmpty) {
-      q.dequeue() match {
-        case WT(l: g.Leaf, c) =>
+    while(res.isEmpty) {
+      c match {
+        case l: g.Leaf =>
           res = Some(l)
 
-        case WT(an: g.AndNode, c) =>
-          if (!an.isSolved) {
-            q ++= (an.subProblems -- an.subSolutions.keySet).values.map(n => WT(n, c + an.minCost))
-          }
-
-        case WT(on: g.OrNode, c) =>
-          if (!on.isSolved) {
-            q ++= on.alternatives.values.map(n => WT(n, c + on.minCost))
-          }
+        case an: g.AndNode =>
+          c = (an.subProblems -- an.subSolutions.keySet).values.minBy(_.minCost)
 
+        case on: g.OrNode =>
+          c = on.alternatives.values.minBy(_.minCost)
       }
     }
 
@@ -48,7 +34,7 @@ abstract class AndOrGraphSearch[AT <: AOAndTask[S],
 
   def search(): Option[S] = {
     while (!g.tree.isSolved && continue) {
-      nextLeaf match {
+      nextLeafSimple match {
         case Some(l) =>
           l match {
             case al: g.AndLeaf =>