diff --git a/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala b/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
index c5ed3070e4e2d7526d5ec755f55eb6230325b1ed..0316953f1804a6323a85da5a601bab665bdd2ac5 100644
--- a/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
+++ b/src/main/scala/leon/codegen/runtime/ChooseEntryPoint.scala
@@ -9,6 +9,7 @@ import purescala.Definitions._
 import purescala.Trees.{Tuple => LeonTuple, _}
 import purescala.TreeOps.valuateWithModel
 import purescala.TypeTrees._
+import solvers.TimeoutSolver
 import solvers.z3._
 
 import codegen.CompilationUnit
@@ -41,7 +42,7 @@ object ChooseEntryPoint {
 
     val tStart = System.currentTimeMillis;
 
-    val solver = new FairZ3Solver(ctx, program).setTimeout(10000L)
+    val solver = (new FairZ3Solver(ctx, program) with TimeoutSolver).setTimeout(10000L)
 
     val inputsMap = (p.as zip inputs).map {
       case (id, v) =>
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index ab78f94dcac73ebf335398305c9dc87313398ec3..0d61de43985b6e345907c5e6a9d581bd691dfd1e 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -9,6 +9,8 @@ import purescala.TreeOps._
 import purescala.Trees._
 import purescala.TypeTrees._
 
+import solvers.TimeoutSolver
+
 import xlang.Trees._
 
 abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program) extends Evaluator(ctx, prog) {
@@ -370,7 +372,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program) extends Evalu
 
       val tStart = System.currentTimeMillis;
 
-      val solver = new FairZ3Solver(ctx, program).setTimeout(10000L)
+      val solver = (new FairZ3Solver(ctx, program) with TimeoutSolver).setTimeout(10000L)
 
       val inputsMap = p.as.map {
         case id =>
diff --git a/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala b/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
index ae59400daba40d71cd5cea4d2aa448cc8ab4974f..bfae8365d27b29d282990f999149399d52a773f6 100644
--- a/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
+++ b/src/main/scala/leon/solvers/TimeoutAssumptionSolver.scala
@@ -7,16 +7,14 @@ import purescala.Trees.Expr
 
 trait TimeoutAssumptionSolver extends TimeoutSolver with AssumptionSolver {
 
-  protected def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean]
-
-  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  abstract override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     optTimeout match {
       case Some(to) =>
         interruptAfter(to) {
-          innerCheckAssumptions(assumptions)
+          super.checkAssumptions(assumptions)
         }
       case None =>
-        innerCheckAssumptions(assumptions)
+        super.checkAssumptions(assumptions)
     }
   }
 }
diff --git a/src/main/scala/leon/solvers/TimeoutSolver.scala b/src/main/scala/leon/solvers/TimeoutSolver.scala
index ab98755c24aaf59204edc4f9dd64efec9eb102d1..1f805c3db44d68ba7e07a1373c5b31a496cc1781 100644
--- a/src/main/scala/leon/solvers/TimeoutSolver.scala
+++ b/src/main/scala/leon/solvers/TimeoutSolver.scala
@@ -55,16 +55,14 @@ trait TimeoutSolver extends Solver with Interruptible {
     this
   }
 
-  protected def innerCheck: Option[Boolean]
-
-  override def check: Option[Boolean] = {
+  abstract override def check: Option[Boolean] = {
     optTimeout match {
       case Some(to) =>
         interruptAfter(to) {
-          innerCheck
+          super.check
         }
       case None =>
-        innerCheck
+        super.check
     }
   }
 
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index aebc323478d90bd70049ca3a98dac6075b344760..873388137625de6c28ad579a59d24ac861f3c685 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -21,9 +21,9 @@ import scala.collection.mutable.{Set => MutableSet}
 // with a Z3 instance"
 trait AbstractZ3Solver
   extends Solver
-     with TimeoutAssumptionSolver
      with AssumptionSolver
-     with IncrementalSolver {
+     with IncrementalSolver 
+     with Interruptible {
 
   val context : LeonContext
   val program : Program
diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
index b863c5ac8e676ec1c1c5cc72875985722cd280fc..71589d58fa81ede5a40c70afc928ca57d4d40fa8 100644
--- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
@@ -354,11 +354,11 @@ class FairZ3Solver(val context : LeonContext, val program: Program)
     frameExpressions = frameExpressions.drop(lvl)
   }
 
-  def innerCheck: Option[Boolean] = {
+  override def check: Option[Boolean] = {
     fairCheck(Set())
   }
 
-  def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     fairCheck(assumptions)
   }
 
diff --git a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
index d9f2696caa0f8fe463b68728cb9bf7c5a8105d77..59b0f79fe1446c1923a86e5d7493922283fa4f1a 100644
--- a/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/UninterpretedZ3Solver.scala
@@ -76,7 +76,7 @@ class UninterpretedZ3Solver(val context : LeonContext, val program: Program)
     solver.assertCnstr(toZ3Formula(expression).get)
   }
 
-  def innerCheck: Option[Boolean] = {
+  override def check: Option[Boolean] = {
     solver.check match {
       case Some(true) =>
         if (containsFunCalls) {
@@ -90,7 +90,7 @@ class UninterpretedZ3Solver(val context : LeonContext, val program: Program)
     }
   }
 
-  def innerCheckAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
+  override def checkAssumptions(assumptions: Set[Expr]): Option[Boolean] = {
     variables ++= assumptions.flatMap(variablesOf(_))
     solver.checkAssumptions(assumptions.toSeq.map(toZ3Formula(_).get) : _*)
   }
diff --git a/src/main/scala/leon/synthesis/SynthesisContext.scala b/src/main/scala/leon/synthesis/SynthesisContext.scala
index adf89f1cc3d441af80e10755adf744e0d3fc6a7e..cd938e9466c1b3369902997ac6f02905155a9974 100644
--- a/src/main/scala/leon/synthesis/SynthesisContext.scala
+++ b/src/main/scala/leon/synthesis/SynthesisContext.scala
@@ -21,11 +21,11 @@ case class SynthesisContext(
 ) {
 
   def newSolver: SynthesisContext.SynthesisSolver = {
-    new FairZ3Solver(context, program)
+    new FairZ3Solver(context, program) with TimeoutAssumptionSolver
   }
 
   def newFastSolver: SynthesisContext.SynthesisSolver = {
-    new UninterpretedZ3Solver(context, program)
+    new UninterpretedZ3Solver(context, program) with TimeoutAssumptionSolver
   }
 
   val solverFactory = SolverFactory(() => newSolver)
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index 78e5f20a251ab3a4ed98248e7f772ebddf3a9379..9bb0bda005c5d86367441727add33ae10e052570 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -81,7 +81,7 @@ class Synthesizer(val context : LeonContext,
 
     val (npr, fds) = solutionToProgram(sol)
 
-    val solverf = SolverFactory(() => new FairZ3Solver(context, npr).setTimeout(timeoutMs))
+    val solverf = SolverFactory(() => (new FairZ3Solver(context, npr) with TimeoutSolver).setTimeout(timeoutMs))
 
     val vcs = generateVerificationConditions(reporter, npr, fds.map(_.id.name))
     val vctx = VerificationContext(context, Seq(solverf), context.reporter)
diff --git a/src/main/scala/leon/termination/Processor.scala b/src/main/scala/leon/termination/Processor.scala
index c66333a4fea09c064d0c370a9be30f42f2fc8bd3..6c72adb980c72933092ebd16878147f1ff1eb251 100644
--- a/src/main/scala/leon/termination/Processor.scala
+++ b/src/main/scala/leon/termination/Processor.scala
@@ -99,7 +99,7 @@ trait Solvable { self: Processor =>
       val newProgram  : Program         = program.copy(mainObject = program.mainObject.copy(defs = allDefs))
       val context     : LeonContext     = self.checker.context
 
-      solvers = new TimeoutSolverFactory(SolverFactory(() => new FairZ3Solver(context, newProgram)), 500) :: Nil
+      solvers = new TimeoutSolverFactory(SolverFactory(() => new FairZ3Solver(context, newProgram) with TimeoutSolver), 500) :: Nil
     }
   }
 
diff --git a/src/main/scala/leon/testgen/TestGeneration.scala b/src/main/scala/leon/testgen/TestGeneration.scala
index e08e7b1721e714b093079910e3ea0704cadb5245..ce6d2fa6df8661678cc3a8e79c990b8854f235fe 100644
--- a/src/main/scala/leon/testgen/TestGeneration.scala
+++ b/src/main/scala/leon/testgen/TestGeneration.scala
@@ -59,7 +59,7 @@ class TestGeneration(context : LeonContext) {
   }
 
   def generatePathConditions(program: Program): Set[Expr] = {
-    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program))
+    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program) with TimeoutSolver)
 
     val callGraph = new CallGraph(program)
     callGraph.writeDotFile("testgen.dot")
@@ -74,7 +74,7 @@ class TestGeneration(context : LeonContext) {
 
   private def generateTestCases(program: Program): Set[Map[Identifier, Expr]] = {
     val allPaths = generatePathConditions(program)
-    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program))
+    val z3Solverf = SolverFactory( () => new FairZ3Solver(context, program) with TimeoutSolver)
 
     allPaths.flatMap(pathCond => {
       reporter.info("Now considering path condition: " + pathCond)
diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala
index 905b37484d719507100ac6df97a54d265a7edb40..dc67963e713459d9392a39420a40849320343aa2 100644
--- a/src/main/scala/leon/verification/AnalysisPhase.scala
+++ b/src/main/scala/leon/verification/AnalysisPhase.scala
@@ -151,7 +151,7 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] {
     val reporter = ctx.reporter
 
     val baseFactories = Seq(
-      SolverFactory(() => new FairZ3Solver(ctx, program))
+      SolverFactory(() => new FairZ3Solver(ctx, program) with TimeoutSolver)
     )
 
     val solverFactories = timeout match {
diff --git a/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala b/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
index edd96fdc19763e4d33f4eb1943fe06f753ab3950..5678bd6277fc3a0f1a44d0be667f9a0bbad8de96 100644
--- a/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
+++ b/src/test/scala/leon/test/solvers/TimeoutSolverTests.scala
@@ -4,6 +4,7 @@ package leon.test
 package solvers
 
 import leon._
+import leon.utils.Interruptible
 import leon.solvers._
 import leon.solvers.combinators._
 import leon.purescala.Common._
@@ -12,13 +13,13 @@ import leon.purescala.Trees._
 import leon.purescala.TypeTrees._
 
 class TimeoutSolverTests extends LeonTestSuite {
-  private class IdioticSolver(val context : LeonContext, val program: Program) extends Solver with TimeoutSolver {
+  private class IdioticSolver(val context : LeonContext, val program: Program) extends Solver with Interruptible{
     val name = "Idiotic"
     val description = "Loops"
 
     var interrupted = false
 
-    def innerCheck = {
+    override def check: Option[Boolean] = {
       while(!interrupted) {
         Thread.sleep(100)
       }
@@ -41,7 +42,7 @@ class TimeoutSolverTests extends LeonTestSuite {
   }
 
   private def getTOSolver : SolverFactory[Solver] = {
-    SolverFactory(() => new IdioticSolver(testContext, Program.empty).setTimeout(1000L))
+    SolverFactory(() => (new IdioticSolver(testContext, Program.empty) with TimeoutSolver).setTimeout(1000L))
   }
 
   private def check(sf: SolverFactory[Solver], e: Expr): Option[Boolean] = {