diff --git a/src/main/scala/funcheck/FunCheckPlugin.scala b/src/main/scala/funcheck/FunCheckPlugin.scala
deleted file mode 100644
index 8799f320fad7f16eb89581d1d82abeddb89773b7..0000000000000000000000000000000000000000
--- a/src/main/scala/funcheck/FunCheckPlugin.scala
+++ /dev/null
@@ -1,79 +0,0 @@
-package funcheck
-
-import scala.tools.nsc
-import scala.tools.nsc.{Global,Phase}
-import scala.tools.nsc.plugins.{Plugin,PluginComponent}
-import purescala.Definitions.Program
-
-/** This class is the entry point for the plugin. */
-class FunCheckPlugin(val global: Global, val actionAfterExtraction : Option[Program=>Unit] = None) extends Plugin {
-  import global._
-
-  val name = "funcheck"
-  val description = "Static analysis for Scala by LARA."
-
-  var stopAfterAnalysis: Boolean = true
-  var stopAfterExtraction: Boolean = false
-  var silentlyTolerateNonPureBodies: Boolean = false
-
-  /** The help message displaying the options for that plugin. */
-  override val optionsHelp: Option[String] = Some(
-    "  -P:funcheck:uniqid             When pretty-printing funcheck trees, show identifiers IDs" + "\n" +
-    "  -P:funcheck:with-code          Allows the compiler to keep running after the static analysis" + "\n" +
-    "  -P:funcheck:parse              Checks only whether the program is valid PureScala" + "\n" +
-    "  -P:funcheck:extensions=ex1:... Specifies a list of qualified class names of extensions to be loaded" + "\n" +
-    "  -P:funcheck:nodefaults         Runs only the analyses provided by the extensions" + "\n" +
-    "  -P:funcheck:functions=fun1:... Only generates verification conditions for the specified functions" + "\n" +
-    "  -P:funcheck:unrolling=[0,1,2]  Unrolling depth for recursive functions" + "\n" + 
-    "  -P:funcheck:axioms             Generate simple forall axioms for recursive functions when possible" + "\n" + 
-    "  -P:funcheck:tolerant           Silently extracts non-pure function bodies as ''unknown''" + "\n" +
-    "  -P:funcheck:bapa               Use BAPA Z3 extension (incompatible with many other things)" + "\n" +
-    "  -P:funcheck:impure             Generate testcases only for impure functions" + "\n" +
-    "  -P:funcheck:testcases=[1,2]    Number of testcases to generate per function" + "\n" +
-    "  -P:funcheck:testbounds=l:u     Lower and upper bounds for integers in recursive datatypes" + "\n" +
-    "  -P:funcheck:timeout=N          Sets a timeout of N seconds" + "\n" +
-    "  -P:funcheck:XP                 Enable weird transformations and other bug-producing features" + "\n" +
-    "  -P:funcheck:BV                 Use bit-vectors for integers" + "\n" +
-    "  -P:funcheck:prune              Use additional SMT queries to rule out some unrollings" + "\n" +
-    "  -P:funcheck:cores              Use UNSAT cores in the unrolling/refinement step" + "\n" +
-    "  -P:funcheck:quickcheck         Use QuickCheck-like random search" + "\n" +
-    "  -P:funcheck:parallel           Run all solvers in parallel" + "\n" +
-    "  -P:funcheck:templates          Use new ``FunctionTemplate'' technique" + "\n" +
-    "  -P:funcheck:noLuckyTests       Do not perform additional tests to potentially find models early"
-  )
-
-  /** Processes the command-line options. */
-  private def splitList(lst: String) : Seq[String] = lst.split(':').map(_.trim).filter(!_.isEmpty)
-  override def processOptions(options: List[String], error: String => Unit) {
-    for(option <- options) {
-      option match {
-        case "with-code"  =>                     stopAfterAnalysis = false
-        case "uniqid"     =>                     purescala.Settings.showIDs = true
-        case "parse"      =>                     stopAfterExtraction = true
-        case "tolerant"   =>                     silentlyTolerateNonPureBodies = true
-        case "nodefaults" =>                     purescala.Settings.runDefaultExtensions = false
-        case "axioms"     =>                     purescala.Settings.noForallAxioms = false
-        case "bapa"       =>                     purescala.Settings.useBAPA = true
-        case "impure"     =>                     purescala.Settings.impureTestcases = true
-        case "XP"         =>                     purescala.Settings.experimental = true
-        case "BV"         =>                     purescala.Settings.bitvectorBitwidth = Some(32)
-        case "prune"      =>                     purescala.Settings.pruneBranches = true
-        case "cores"      =>                     purescala.Settings.useCores = true
-        case "quickcheck" =>                     purescala.Settings.useQuickCheck = true
-        case "parallel"   =>                     purescala.Settings.useParallel = true
-        case "templates"  =>                     purescala.Settings.useTemplates = true
-        case "noLuckyTests" =>                   purescala.Settings.luckyTest = false
-        case s if s.startsWith("unrolling=") =>  purescala.Settings.unrollingLevel = try { s.substring("unrolling=".length, s.length).toInt } catch { case _ => 0 }
-        case s if s.startsWith("functions=") =>  purescala.Settings.functionsToAnalyse = Set(splitList(s.substring("functions=".length, s.length)): _*)
-        case s if s.startsWith("extensions=") => purescala.Settings.extensionNames = splitList(s.substring("extensions=".length, s.length))
-        case s if s.startsWith("testbounds=") => purescala.Settings.testBounds = try { val l = splitList(s.substring("testBounds=".length, s.length)).map(_.toInt); if (l.size != 2) (0, 3) else (l(0), l(1)) } catch { case _ => (0, 3) }
-        case s if s.startsWith("timeout=") => purescala.Settings.solverTimeout = try { Some(s.substring("timeout=".length, s.length).toInt) } catch { case _ => None }
-        case s if s.startsWith("testcases=") =>  purescala.Settings.nbTestcases = try { s.substring("testcases=".length, s.length).toInt } catch { case _ => 1 }
-        case _ => error("Invalid option: " + option)
-      }
-    }
-  }
-
-  val components = List[PluginComponent](new AnalysisComponent(global, this))
-  val descriptions = List[String]("funcheck analyses")
-}
diff --git a/src/main/scala/purescala/AbstractZ3Solver.scala b/src/main/scala/leon/AbstractZ3Solver.scala
similarity index 65%
rename from src/main/scala/purescala/AbstractZ3Solver.scala
rename to src/main/scala/leon/AbstractZ3Solver.scala
index 771dc934df3d472f599066e5ba2f7f03b78a20c7..5c1fc48fa9b223cfeb134ad4920296e520d58129 100644
--- a/src/main/scala/purescala/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/AbstractZ3Solver.scala
@@ -1,11 +1,11 @@
-package purescala
+package leon
 
 import z3.scala._
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 import scala.collection.mutable.{Map => MutableMap}
 import scala.collection.mutable.{Set => MutableSet}
@@ -19,29 +19,29 @@ trait AbstractZ3Solver {
 
   class CantTranslateException(t: Z3AST) extends Exception("Can't translate from Z3 tree: " + t)
 
-  protected[purescala] var z3 : Z3Context
-  protected[purescala] var program : Program
+  protected[leon] var z3 : Z3Context
+  protected[leon] var program : Program
 
   def typeToSort(tt: TypeTree): Z3Sort
-  protected[purescala] var adtTesters: Map[CaseClassDef, Z3FuncDecl]
-  protected[purescala] var adtConstructors: Map[CaseClassDef, Z3FuncDecl]
-  protected[purescala] var adtFieldSelectors: Map[Identifier, Z3FuncDecl]
+  protected[leon] var adtTesters: Map[CaseClassDef, Z3FuncDecl]
+  protected[leon] var adtConstructors: Map[CaseClassDef, Z3FuncDecl]
+  protected[leon] var adtFieldSelectors: Map[Identifier, Z3FuncDecl]
 
-  protected[purescala] val mapRangeSorts: MutableMap[TypeTree, Z3Sort]
-  protected[purescala] val mapRangeSomeConstructors: MutableMap[TypeTree, Z3FuncDecl]
-  protected[purescala] val mapRangeNoneConstructors: MutableMap[TypeTree, Z3FuncDecl]
-  protected[purescala] val mapRangeSomeTesters: MutableMap[TypeTree, Z3FuncDecl]
-  protected[purescala] val mapRangeNoneTesters: MutableMap[TypeTree, Z3FuncDecl]
-  protected[purescala] val mapRangeValueSelectors: MutableMap[TypeTree, Z3FuncDecl]
+  protected[leon] val mapRangeSorts: MutableMap[TypeTree, Z3Sort]
+  protected[leon] val mapRangeSomeConstructors: MutableMap[TypeTree, Z3FuncDecl]
+  protected[leon] val mapRangeNoneConstructors: MutableMap[TypeTree, Z3FuncDecl]
+  protected[leon] val mapRangeSomeTesters: MutableMap[TypeTree, Z3FuncDecl]
+  protected[leon] val mapRangeNoneTesters: MutableMap[TypeTree, Z3FuncDecl]
+  protected[leon] val mapRangeValueSelectors: MutableMap[TypeTree, Z3FuncDecl]
 
-  protected[purescala] var funSorts: Map[TypeTree, Z3Sort]
-  protected[purescala] var funDomainConstructors: Map[TypeTree, Z3FuncDecl]
-  protected[purescala] var funDomainSelectors: Map[TypeTree, Seq[Z3FuncDecl]]
+  protected[leon] var funSorts: Map[TypeTree, Z3Sort]
+  protected[leon] var funDomainConstructors: Map[TypeTree, Z3FuncDecl]
+  protected[leon] var funDomainSelectors: Map[TypeTree, Seq[Z3FuncDecl]]
 
-  protected[purescala] var exprToZ3Id : Map[Expr,Z3AST]
-  protected[purescala] def fromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: Option[TypeTree]) : Expr
+  protected[leon] var exprToZ3Id : Map[Expr,Z3AST]
+  protected[leon] def fromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: Option[TypeTree]) : Expr
 
-  protected[purescala] def softFromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: TypeTree) : Option[Expr] = {
+  protected[leon] def softFromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: TypeTree) : Option[Expr] = {
     try {
       Some(fromZ3Formula(model, tree, Some(expectedType)))
     } catch {
@@ -49,9 +49,9 @@ trait AbstractZ3Solver {
     }
   }
 
-  protected[purescala] def solveWithBounds(vc: Expr, forValidity: Boolean) : (Option[Boolean], Map[Identifier, Expr]) 
+  protected[leon] def solveWithBounds(vc: Expr, forValidity: Boolean) : (Option[Boolean], Map[Identifier, Expr]) 
 
-  protected[purescala] def boundValues : Unit = {
+  protected[leon] def boundValues : Unit = {
     val lowerBound: Z3AST = z3.mkInt(Settings.testBounds._1, z3.mkIntSort)
     val upperBound: Z3AST = z3.mkInt(Settings.testBounds._2, z3.mkIntSort)
 
diff --git a/src/main/scala/purescala/Analysis.scala b/src/main/scala/leon/Analysis.scala
similarity index 98%
rename from src/main/scala/purescala/Analysis.scala
rename to src/main/scala/leon/Analysis.scala
index cd2a97b463c1915f569d02d2ba6f6ba2edd3f7dd..9849330cedf1a3d48c0eabd8cff0508a4a01b8b3 100644
--- a/src/main/scala/purescala/Analysis.scala
+++ b/src/main/scala/leon/Analysis.scala
@@ -1,9 +1,9 @@
-package purescala
+package leon
 
-import Common._
-import Definitions._
-import Trees._
-import TypeTrees._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
 import scala.collection.mutable.{Set => MutableSet}
 
diff --git a/src/main/scala/funcheck/Annotations.scala b/src/main/scala/leon/Annotations.scala
similarity index 86%
rename from src/main/scala/funcheck/Annotations.scala
rename to src/main/scala/leon/Annotations.scala
index c90e43247bb89039571373cf7d3321f808a16c2d..0831c8ff81ae212d6e0fd10d5a847c77c88186f4 100644
--- a/src/main/scala/funcheck/Annotations.scala
+++ b/src/main/scala/leon/Annotations.scala
@@ -1,4 +1,4 @@
-package funcheck
+package leon
 
 object Annotations {
   class induct extends StaticAnnotation
diff --git a/src/main/scala/purescala/DefaultTactic.scala b/src/main/scala/leon/DefaultTactic.scala
similarity index 99%
rename from src/main/scala/purescala/DefaultTactic.scala
rename to src/main/scala/leon/DefaultTactic.scala
index 7a212b667d54e2e42f1662c8a5044d26cb3ef34e..6f31b9ff59bc4b4681e7284c4dc3479400585534 100644
--- a/src/main/scala/purescala/DefaultTactic.scala
+++ b/src/main/scala/leon/DefaultTactic.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 import purescala.Common._
 import purescala.Trees._
diff --git a/src/main/scala/purescala/Evaluator.scala b/src/main/scala/leon/Evaluator.scala
similarity index 99%
rename from src/main/scala/purescala/Evaluator.scala
rename to src/main/scala/leon/Evaluator.scala
index ebaea193ee660b0adb5a9e343ed185036aa40258..aec3acfa1c0c20c797f0284b09ebb99f25a08a67 100644
--- a/src/main/scala/purescala/Evaluator.scala
+++ b/src/main/scala/leon/Evaluator.scala
@@ -1,8 +1,8 @@
-package purescala
+package leon
 
-import Common._
-import Trees._
-import TypeTrees._
+import purescala.Common._
+import purescala.Trees._
+import purescala.TypeTrees._
 
 object Evaluator {
 // Expr should be some ground term. We have call-by-value semantics.
diff --git a/src/main/scala/purescala/Extensions.scala b/src/main/scala/leon/Extensions.scala
similarity index 99%
rename from src/main/scala/purescala/Extensions.scala
rename to src/main/scala/leon/Extensions.scala
index 8bc5a4c4673c0688ea9a1364dc02b5af18dddb67..5905ec99820c7dff51cef6fef88705017a17614d 100644
--- a/src/main/scala/purescala/Extensions.scala
+++ b/src/main/scala/leon/Extensions.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 import purescala.Trees._
 import purescala.Definitions._
diff --git a/src/main/scala/purescala/FairZ3Solver.scala b/src/main/scala/leon/FairZ3Solver.scala
similarity index 97%
rename from src/main/scala/purescala/FairZ3Solver.scala
rename to src/main/scala/leon/FairZ3Solver.scala
index d4208a8dd8a08b3d3a802942535c3925276bbbaf..390a72ee9e5a41f9872ee1a10b50d56d893e27dd 100644
--- a/src/main/scala/purescala/FairZ3Solver.scala
+++ b/src/main/scala/leon/FairZ3Solver.scala
@@ -1,11 +1,11 @@
-package purescala
+package leon
 
 import z3.scala._
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 import scala.collection.mutable.{Map => MutableMap}
 import scala.collection.mutable.{Set => MutableSet}
@@ -31,8 +31,8 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
     )
   toggleWarningMessages(true)
 
-  protected[purescala] var z3: Z3Context = null
-  protected[purescala] var program: Program = null
+  protected[leon] var z3: Z3Context = null
+  protected[leon] var program: Program = null
   private var neverInitialized = true
 
   private var unrollingBank: UnrollingBank = null
@@ -98,9 +98,9 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
   private var setSorts: Map[TypeTree, Z3Sort] = Map.empty
   private var mapSorts: Map[TypeTree, Z3Sort] = Map.empty
 
-  protected[purescala] var funSorts: Map[TypeTree, Z3Sort] = Map.empty
-  protected[purescala] var funDomainConstructors: Map[TypeTree, Z3FuncDecl] = Map.empty
-  protected[purescala] var funDomainSelectors: Map[TypeTree, Seq[Z3FuncDecl]] = Map.empty
+  protected[leon] var funSorts: Map[TypeTree, Z3Sort] = Map.empty
+  protected[leon] var funDomainConstructors: Map[TypeTree, Z3FuncDecl] = Map.empty
+  protected[leon] var funDomainSelectors: Map[TypeTree, Seq[Z3FuncDecl]] = Map.empty
 
   private var intSetMinFun: Z3FuncDecl = null
   private var intSetMaxFun: Z3FuncDecl = null
@@ -108,20 +108,20 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
   private var adtSorts: Map[ClassTypeDef, Z3Sort] = Map.empty
   private var fallbackSorts: Map[TypeTree, Z3Sort] = Map.empty
 
-  protected[purescala] var adtTesters: Map[CaseClassDef, Z3FuncDecl] = Map.empty
-  protected[purescala] var adtConstructors: Map[CaseClassDef, Z3FuncDecl] = Map.empty
-  protected[purescala] var adtFieldSelectors: Map[Identifier, Z3FuncDecl] = Map.empty
+  protected[leon] var adtTesters: Map[CaseClassDef, Z3FuncDecl] = Map.empty
+  protected[leon] var adtConstructors: Map[CaseClassDef, Z3FuncDecl] = Map.empty
+  protected[leon] var adtFieldSelectors: Map[Identifier, Z3FuncDecl] = Map.empty
 
   private var reverseADTTesters: Map[Z3FuncDecl, CaseClassDef] = Map.empty
   private var reverseADTConstructors: Map[Z3FuncDecl, CaseClassDef] = Map.empty
   private var reverseADTFieldSelectors: Map[Z3FuncDecl, (CaseClassDef,Identifier)] = Map.empty
 
-  protected[purescala] val mapRangeSorts: MutableMap[TypeTree, Z3Sort] = MutableMap.empty
-  protected[purescala] val mapRangeSomeConstructors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
-  protected[purescala] val mapRangeNoneConstructors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
-  protected[purescala] val mapRangeSomeTesters: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
-  protected[purescala] val mapRangeNoneTesters: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
-  protected[purescala] val mapRangeValueSelectors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
+  protected[leon] val mapRangeSorts: MutableMap[TypeTree, Z3Sort] = MutableMap.empty
+  protected[leon] val mapRangeSomeConstructors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
+  protected[leon] val mapRangeNoneConstructors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
+  protected[leon] val mapRangeSomeTesters: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
+  protected[leon] val mapRangeNoneTesters: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
+  protected[leon] val mapRangeValueSelectors: MutableMap[TypeTree, Z3FuncDecl] = MutableMap.empty
 
   private def mapRangeSort(toType : TypeTree) : Z3Sort = mapRangeSorts.get(toType) match {
     case Some(z3sort) => z3sort
@@ -817,9 +817,9 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
     (cleanedUp, newClauses.reverse, ite2Bools)
   }
 
-  protected[purescala] var exprToZ3Id : Map[Expr,Z3AST] = Map.empty
-  protected[purescala] var z3IdToExpr : Map[Z3AST,Expr] = Map.empty
-  protected[purescala] def toZ3Formula(z3: Z3Context, expr: Expr, initialMap: Map[Identifier,Z3AST] = Map.empty) : Option[Z3AST] = {
+  protected[leon] var exprToZ3Id : Map[Expr,Z3AST] = Map.empty
+  protected[leon] var z3IdToExpr : Map[Z3AST,Expr] = Map.empty
+  protected[leon] def toZ3Formula(z3: Z3Context, expr: Expr, initialMap: Map[Identifier,Z3AST] = Map.empty) : Option[Z3AST] = {
     class CantTranslateException extends Exception
 
     val varsInformula: Set[Identifier] = variablesOf(expr)
@@ -1007,7 +1007,7 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
     }
   }
 
-  protected[purescala] def fromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: Option[TypeTree] = None) : Expr = {
+  protected[leon] def fromZ3Formula(model: Z3Model, tree : Z3AST, expectedType: Option[TypeTree] = None) : Expr = {
     def rec(t: Z3AST, expType: Option[TypeTree] = None) : Expr = expType match {
       case Some(MapType(kt,vt)) => 
         model.getArrayValue(t) match {
diff --git a/src/main/scala/purescala/FunctionTemplate.scala b/src/main/scala/leon/FunctionTemplate.scala
similarity index 97%
rename from src/main/scala/purescala/FunctionTemplate.scala
rename to src/main/scala/leon/FunctionTemplate.scala
index e8f1e0667941227954cb1d8465f8b171e3d2784b..6a4395f188bf19d7b636c3cb3ec646d921ed38b1 100644
--- a/src/main/scala/purescala/FunctionTemplate.scala
+++ b/src/main/scala/leon/FunctionTemplate.scala
@@ -1,12 +1,13 @@
-package purescala
+package leon
 
-import Common._
-import Trees._
-import TypeTrees._
-import Definitions._
+import purescala.Common._
+import purescala.Trees._
+import purescala.TypeTrees._
+import purescala.Definitions._
 
 import scala.collection.mutable.{Set=>MutableSet,Map=>MutableMap}
 
+// TODO: maybe a candidate for moving into purescala package?
 class FunctionTemplate private(
   funDef : FunDef,
   activatingBool : Identifier,
diff --git a/src/main/scala/purescala/InductionTactic.scala b/src/main/scala/leon/InductionTactic.scala
similarity index 99%
rename from src/main/scala/purescala/InductionTactic.scala
rename to src/main/scala/leon/InductionTactic.scala
index d93cc5957327f317dcf354dd8ea8413848d086e6..5e14f196318a74a53761f17dd9a8b06bd9c63f78 100644
--- a/src/main/scala/purescala/InductionTactic.scala
+++ b/src/main/scala/leon/InductionTactic.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 import purescala.Common._
 import purescala.Trees._
diff --git a/src/main/scala/purescala/ParallelSolver.scala b/src/main/scala/leon/ParallelSolver.scala
similarity index 96%
rename from src/main/scala/purescala/ParallelSolver.scala
rename to src/main/scala/leon/ParallelSolver.scala
index 63b04c76ccc4a21354d6ebe6cf94a9d7faf3395f..1a3e1d7c4e43ef7f397f42b10d2460eeb4c45ff3 100644
--- a/src/main/scala/purescala/ParallelSolver.scala
+++ b/src/main/scala/leon/ParallelSolver.scala
@@ -1,10 +1,10 @@
-package purescala
+package leon
 
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 import Evaluator._
 
diff --git a/src/main/scala/purescala/RandomSolver.scala b/src/main/scala/leon/RandomSolver.scala
similarity index 97%
rename from src/main/scala/purescala/RandomSolver.scala
rename to src/main/scala/leon/RandomSolver.scala
index 2b0efd49d5b0d27419065de15bb7f74e2fc57b52..f153818924cd47d79f7470b8487767df5f30f7bc 100644
--- a/src/main/scala/purescala/RandomSolver.scala
+++ b/src/main/scala/leon/RandomSolver.scala
@@ -1,10 +1,10 @@
-package purescala
+package leon
 
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 import Evaluator._
 
diff --git a/src/main/scala/purescala/Reporter.scala b/src/main/scala/leon/Reporter.scala
similarity index 98%
rename from src/main/scala/purescala/Reporter.scala
rename to src/main/scala/leon/Reporter.scala
index ed41c8beb628ee8ed93631db104536c4097f4e87..71f22363a9cc7f62848971617625ac8ee7f7704f 100644
--- a/src/main/scala/purescala/Reporter.scala
+++ b/src/main/scala/leon/Reporter.scala
@@ -1,7 +1,8 @@
-package purescala
+package leon
 
 import purescala.Definitions.Definition
 import purescala.Trees.Expr
+import purescala.PrettyPrinter
 
 abstract class Reporter {
   def error(msg: Any) : Unit
diff --git a/src/main/scala/purescala/Settings.scala b/src/main/scala/leon/Settings.scala
similarity index 98%
rename from src/main/scala/purescala/Settings.scala
rename to src/main/scala/leon/Settings.scala
index 914f9c0bd51f61514d49c9ea001f9f6d2ff5f480..d62dd80d241e1dbdded051234169f8ab06f91c01 100644
--- a/src/main/scala/purescala/Settings.scala
+++ b/src/main/scala/leon/Settings.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 // typically these settings can be changed through some command-line switch.
 object Settings {
diff --git a/src/main/scala/purescala/Stopwatch.scala b/src/main/scala/leon/Stopwatch.scala
similarity index 98%
rename from src/main/scala/purescala/Stopwatch.scala
rename to src/main/scala/leon/Stopwatch.scala
index c56d17626385cdd7643e1f5d85ce9cb58e9d0103..842e3fc0a6989d7ff58c69467a7df7f32132651f 100644
--- a/src/main/scala/purescala/Stopwatch.scala
+++ b/src/main/scala/leon/Stopwatch.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 /** Implements a stopwatch for profiling purposes */
 class Stopwatch(description : String, verbose : Boolean = false) {
diff --git a/src/main/scala/purescala/TestExtension.scala b/src/main/scala/leon/TestExtension.scala
similarity index 98%
rename from src/main/scala/purescala/TestExtension.scala
rename to src/main/scala/leon/TestExtension.scala
index f4244f1a96f0539792282e690f3c83074778149b..c76f81caf5aec469c7b22a1de442e01a83236674 100644
--- a/src/main/scala/purescala/TestExtension.scala
+++ b/src/main/scala/leon/TestExtension.scala
@@ -1,10 +1,10 @@
-package purescala
+package leon
 
 import purescala.Common._
 import purescala.Trees._
 import purescala.TypeTrees._
 import purescala.Definitions._
-import purescala.Extensions._
+import Extensions._
 
 class TestExtension(val reporter: Reporter) extends Analyser(reporter) {
   val description : String = "Testing."
diff --git a/src/main/scala/purescala/TimeoutSolver.scala b/src/main/scala/leon/TimeoutSolver.scala
similarity index 83%
rename from src/main/scala/purescala/TimeoutSolver.scala
rename to src/main/scala/leon/TimeoutSolver.scala
index dcd2a95adba7c29b9db22ef5de05cb511d3f5bcc..1785aec5ecc0be3dfc88d9b06a927d86e4e4f3a1 100644
--- a/src/main/scala/purescala/TimeoutSolver.scala
+++ b/src/main/scala/leon/TimeoutSolver.scala
@@ -1,10 +1,10 @@
-package purescala
+package leon
 
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 import scala.sys.error
 
diff --git a/src/main/scala/purescala/Timer.scala b/src/main/scala/leon/Timer.scala
similarity index 97%
rename from src/main/scala/purescala/Timer.scala
rename to src/main/scala/leon/Timer.scala
index b72b12b3e7076eb42588834e4db6d1565aabfc4f..ffc9d2c5b304951672d357665878e624f19ac966 100644
--- a/src/main/scala/purescala/Timer.scala
+++ b/src/main/scala/leon/Timer.scala
@@ -1,4 +1,4 @@
-package purescala
+package leon
 
 /** Creates a thread that, when started, counts for maxsecs seconds and then
  * calls the callback, unless the timer was halted first. */
diff --git a/src/main/scala/purescala/TrivialSolver.scala b/src/main/scala/leon/TrivialSolver.scala
similarity index 81%
rename from src/main/scala/purescala/TrivialSolver.scala
rename to src/main/scala/leon/TrivialSolver.scala
index 78cf3d0ef3117305c85d42d6bc9f556cd2d4c474..7e08c483237aa6649c9da425d6e0c58c7b9301aa 100644
--- a/src/main/scala/purescala/TrivialSolver.scala
+++ b/src/main/scala/leon/TrivialSolver.scala
@@ -1,11 +1,11 @@
-package purescala
+package leon
 
 import z3.scala._
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 class TrivialSolver(reporter: Reporter) extends Solver(reporter) {
   val description = "Solver for syntactically trivial formulas"
diff --git a/src/main/scala/funcheck/Utils.scala b/src/main/scala/leon/Utils.scala
similarity index 92%
rename from src/main/scala/funcheck/Utils.scala
rename to src/main/scala/leon/Utils.scala
index a88bc888a97eb8138ad9acde7143eb5d7e932f07..6d7f019ce669a9e81f7da0380048d0071d6713bc 100644
--- a/src/main/scala/funcheck/Utils.scala
+++ b/src/main/scala/leon/Utils.scala
@@ -1,4 +1,4 @@
-package funcheck
+package leon
 
 object Utils {
   sealed class IsValid(val property : Boolean) {
diff --git a/src/main/scala/purescala/VerificationCondition.scala b/src/main/scala/leon/VerificationCondition.scala
similarity index 94%
rename from src/main/scala/purescala/VerificationCondition.scala
rename to src/main/scala/leon/VerificationCondition.scala
index 7c6710fa2c1ae1b30109ddc16a832d6316bbe8ff..4150536fa441352761a7542019caa64d478b0d6a 100644
--- a/src/main/scala/purescala/VerificationCondition.scala
+++ b/src/main/scala/leon/VerificationCondition.scala
@@ -1,9 +1,9 @@
-package purescala
+package leon
 
+import purescala.Trees._
+import purescala.Definitions._
+import purescala.Common._
 import Extensions._
-import Trees._
-import Definitions._
-import Common._
 
 /** This is just to hold some history information. */
 class VerificationCondition(val condition: Expr, val funDef: FunDef, val kind: VCKind.Value, val tactic: Tactic, val info: String = "") extends ScalacPositional {
diff --git a/src/main/scala/purescala/Z3ModelReconstruction.scala b/src/main/scala/leon/Z3ModelReconstruction.scala
similarity index 95%
rename from src/main/scala/purescala/Z3ModelReconstruction.scala
rename to src/main/scala/leon/Z3ModelReconstruction.scala
index 59fea83e16667501e45af814134a0233957d09f5..913da2fa32b64056026f24e3d1ea1cbd8dd81672 100644
--- a/src/main/scala/purescala/Z3ModelReconstruction.scala
+++ b/src/main/scala/leon/Z3ModelReconstruction.scala
@@ -1,11 +1,11 @@
-package purescala
+package leon
 
 import z3.scala._
-import Common._
-import Definitions._
+import purescala.Common._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.TypeTrees._
 import Extensions._
-import Trees._
-import TypeTrees._
 
 trait Z3ModelReconstruction {
   self: AbstractZ3Solver =>
diff --git a/src/main/scala/purescala/isabelle/Main.scala b/src/main/scala/leon/isabelle/Main.scala
similarity index 99%
rename from src/main/scala/purescala/isabelle/Main.scala
rename to src/main/scala/leon/isabelle/Main.scala
index 48ce2afdbc0e1b8392b73375b4b197d8da2dd440..3fd96cff3553e8893dce9b9ba0e24609796c6685 100644
--- a/src/main/scala/purescala/isabelle/Main.scala
+++ b/src/main/scala/leon/isabelle/Main.scala
@@ -1,12 +1,14 @@
-package purescala.isabelle
-import purescala.Reporter
-import purescala.Trees._
-import purescala.Definitions._
-import purescala.Extensions._
-import purescala.Settings._
-import purescala.Common.Identifier
-import purescala.TypeTrees._
-import purescala.PrettyPrinter
+package leon.isabelle
+
+import leon.Extensions._
+import leon.Reporter
+import leon.Settings._
+
+import leon.purescala.Common.Identifier
+import leon.purescala.Definitions._
+import leon.purescala.PrettyPrinter
+import leon.purescala.Trees._
+import leon.purescala.TypeTrees._
 
 import java.lang.StringBuffer
 import java.io._
diff --git a/src/main/scala/purescala/isabelle/README b/src/main/scala/leon/isabelle/README
similarity index 100%
rename from src/main/scala/purescala/isabelle/README
rename to src/main/scala/leon/isabelle/README
diff --git a/src/main/scala/purescala/isabelle/StrongConnectedComponents.scala b/src/main/scala/leon/isabelle/StrongConnectedComponents.scala
similarity index 95%
rename from src/main/scala/purescala/isabelle/StrongConnectedComponents.scala
rename to src/main/scala/leon/isabelle/StrongConnectedComponents.scala
index d7a5991da5bffb44a455cbe8894b8ca7fd8e3413..78eb355ff9f64f42213adaa43028eb2e999bdedb 100644
--- a/src/main/scala/purescala/isabelle/StrongConnectedComponents.scala
+++ b/src/main/scala/leon/isabelle/StrongConnectedComponents.scala
@@ -1,12 +1,14 @@
-package purescala.isabelle
-import purescala.Reporter
-import purescala.Trees._
-import purescala.Definitions._
-import purescala.Extensions._
-import purescala.Settings._
-import purescala.Common.Identifier
-import purescala.TypeTrees._
-import purescala.PrettyPrinter
+package leon.isabelle
+
+import leon.Extensions._
+import leon.Reporter
+import leon.Settings._
+
+import leon.purescala.Common.Identifier
+import leon.purescala.Definitions._
+import leon.purescala.PrettyPrinter
+import leon.purescala.Trees._
+import leon.purescala.TypeTrees._
 
 import java.lang.StringBuffer
 import java.io._
diff --git a/src/main/scala/funcheck/AnalysisComponent.scala b/src/main/scala/leon/plugin/AnalysisComponent.scala
similarity index 89%
rename from src/main/scala/funcheck/AnalysisComponent.scala
rename to src/main/scala/leon/plugin/AnalysisComponent.scala
index 7ca519621e2e0c794a922eeb481b11205f57e1e7..7756946ad0ad11a87560d6bc1bb42882d3765469 100644
--- a/src/main/scala/funcheck/AnalysisComponent.scala
+++ b/src/main/scala/leon/plugin/AnalysisComponent.scala
@@ -1,9 +1,10 @@
-package funcheck
+package leon
+package plugin
 
 import scala.tools.nsc._
 import scala.tools.nsc.plugins._
 
-class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
+class AnalysisComponent(val global: Global, val pluginInstance: LeonPlugin)
   extends PluginComponent
   with CodeExtraction
 {
@@ -15,7 +16,7 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
 
   val phaseName = pluginInstance.name
 
-  /** this is initialized when the Funcheck phase starts*/
+  /** this is initialized when the Leon phase starts*/
   var fresh: scala.tools.nsc.util.FreshNameCreator = null 
   
   protected def stopIfErrors: Unit = {
@@ -39,14 +40,14 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
         sys.exit(0)
       } else {
         if(!pluginInstance.actionAfterExtraction.isDefined) {
-          println("Extracted program for " + unit + ". Re-run with -P:funcheck:parse to see the output.")
+          println("Extracted program for " + unit + ". Re-run with -P:leon:parse to see the output.")
         }
         //println(prog)
       }
 
       if(!pluginInstance.actionAfterExtraction.isDefined) {
         println("Starting analysis.")
-        val analysis = new purescala.Analysis(prog)
+        val analysis = new Analysis(prog)
         analysis.analyse
         if(pluginInstance.stopAfterAnalysis) {
           println("Analysis complete. Now terminating the compiler process.")
diff --git a/src/main/scala/funcheck/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala
similarity index 99%
rename from src/main/scala/funcheck/CodeExtraction.scala
rename to src/main/scala/leon/plugin/CodeExtraction.scala
index af9756e60bb900fcbbdd4f75fd6678e5cbf5a30b..1930fc7a0507f8d12451c127448a53b9089aa233 100644
--- a/src/main/scala/funcheck/CodeExtraction.scala
+++ b/src/main/scala/leon/plugin/CodeExtraction.scala
@@ -1,4 +1,5 @@
-package funcheck
+package leon
+package plugin
 
 import scala.tools.nsc._
 import scala.tools.nsc.plugins._
@@ -188,8 +189,8 @@ trait CodeExtraction extends Extractors {
             if(mods.isPrivate) funDef.addAnnotation("private")
             for(a <- dd.symbol.annotations) {
               a.atp.safeToString match {
-                case "funcheck.Annotations.induct" => funDef.addAnnotation("induct")
-                case "funcheck.Annotations.axiomatize" => funDef.addAnnotation("axiomatize")
+                case "leon.Annotations.induct" => funDef.addAnnotation("induct")
+                case "leon.Annotations.axiomatize" => funDef.addAnnotation("axiomatize")
                 case _ => ;
               }
             }
diff --git a/src/main/scala/funcheck/Extractors.scala b/src/main/scala/leon/plugin/Extractors.scala
similarity index 99%
rename from src/main/scala/funcheck/Extractors.scala
rename to src/main/scala/leon/plugin/Extractors.scala
index ff7791bae9c595e462da725b571bd8110da0ea22..ee684e97a56cd4e639958b67f9957d4bf2e751b0 100644
--- a/src/main/scala/funcheck/Extractors.scala
+++ b/src/main/scala/leon/plugin/Extractors.scala
@@ -1,11 +1,12 @@
-package funcheck
+package leon
+package plugin
 
 import scala.tools.nsc._
 
 /** Contains extractors to pull-out interesting parts of the Scala ASTs. */
 trait Extractors {
   val global: Global
-  val pluginInstance: FunCheckPlugin
+  val pluginInstance: LeonPlugin
 
   import global._
   import global.definitions._
@@ -45,7 +46,7 @@ trait Extractors {
 
     object ExHoldsExpression {
       def unapply(tree: Select) : Option[Tree] = tree match {
-        case Select(Apply(Select(Select(funcheckIdent, utilsName), any2IsValidName), realExpr :: Nil), holdsName) if (
+        case Select(Apply(Select(Select(leonIdent, utilsName), any2IsValidName), realExpr :: Nil), holdsName) if (
           utilsName.toString == "Utils" &&
           any2IsValidName.toString == "any2IsValid" &&
           holdsName.toString == "holds") => Some(realExpr)
diff --git a/src/main/scala/leon/plugin/LeonPlugin.scala b/src/main/scala/leon/plugin/LeonPlugin.scala
new file mode 100644
index 0000000000000000000000000000000000000000..39356927db6f25774de59f175ef2d8167f4a60ae
--- /dev/null
+++ b/src/main/scala/leon/plugin/LeonPlugin.scala
@@ -0,0 +1,80 @@
+package leon
+package plugin
+
+import scala.tools.nsc
+import scala.tools.nsc.{Global,Phase}
+import scala.tools.nsc.plugins.{Plugin,PluginComponent}
+import purescala.Definitions.Program
+
+/** This class is the entry point for the plugin. */
+class LeonPlugin(val global: Global, val actionAfterExtraction : Option[Program=>Unit] = None) extends Plugin {
+  import global._
+
+  val name = "leon"
+  val description = "The Leon static analyzer"
+
+  var stopAfterAnalysis: Boolean = true
+  var stopAfterExtraction: Boolean = false
+  var silentlyTolerateNonPureBodies: Boolean = false
+
+  /** The help message displaying the options for that plugin. */
+  override val optionsHelp: Option[String] = Some(
+    "  -P:leon:uniqid             When pretty-printing purescala trees, show identifiers IDs" + "\n" +
+    "  -P:leon:with-code          Allows the compiler to keep running after the static analysis" + "\n" +
+    "  -P:leon:parse              Checks only whether the program is valid PureScala" + "\n" +
+    "  -P:leon:extensions=ex1:... Specifies a list of qualified class names of extensions to be loaded" + "\n" +
+    "  -P:leon:nodefaults         Runs only the analyses provided by the extensions" + "\n" +
+    "  -P:leon:functions=fun1:... Only generates verification conditions for the specified functions" + "\n" +
+    "  -P:leon:unrolling=[0,1,2]  Unrolling depth for recursive functions" + "\n" + 
+    "  -P:leon:axioms             Generate simple forall axioms for recursive functions when possible" + "\n" + 
+    "  -P:leon:tolerant           Silently extracts non-pure function bodies as ''unknown''" + "\n" +
+    "  -P:leon:bapa               Use BAPA Z3 extension (incompatible with many other things)" + "\n" +
+    "  -P:leon:impure             Generate testcases only for impure functions" + "\n" +
+    "  -P:leon:testcases=[1,2]    Number of testcases to generate per function" + "\n" +
+    "  -P:leon:testbounds=l:u     Lower and upper bounds for integers in recursive datatypes" + "\n" +
+    "  -P:leon:timeout=N          Sets a timeout of N seconds" + "\n" +
+    "  -P:leon:XP                 Enable weird transformations and other bug-producing features" + "\n" +
+    "  -P:leon:BV                 Use bit-vectors for integers" + "\n" +
+    "  -P:leon:prune              Use additional SMT queries to rule out some unrollings" + "\n" +
+    "  -P:leon:cores              Use UNSAT cores in the unrolling/refinement step" + "\n" +
+    "  -P:leon:quickcheck         Use QuickCheck-like random search" + "\n" +
+    "  -P:leon:parallel           Run all solvers in parallel" + "\n" +
+    "  -P:leon:templates          Use new ``FunctionTemplate'' technique" + "\n" +
+    "  -P:leon:noLuckyTests       Do not perform additional tests to potentially find models early"
+  )
+
+  /** Processes the command-line options. */
+  private def splitList(lst: String) : Seq[String] = lst.split(':').map(_.trim).filter(!_.isEmpty)
+  override def processOptions(options: List[String], error: String => Unit) {
+    for(option <- options) {
+      option match {
+        case "with-code"  =>                     stopAfterAnalysis = false
+        case "uniqid"     =>                     leon.Settings.showIDs = true
+        case "parse"      =>                     stopAfterExtraction = true
+        case "tolerant"   =>                     silentlyTolerateNonPureBodies = true
+        case "nodefaults" =>                     leon.Settings.runDefaultExtensions = false
+        case "axioms"     =>                     leon.Settings.noForallAxioms = false
+        case "bapa"       =>                     leon.Settings.useBAPA = true
+        case "impure"     =>                     leon.Settings.impureTestcases = true
+        case "XP"         =>                     leon.Settings.experimental = true
+        case "BV"         =>                     leon.Settings.bitvectorBitwidth = Some(32)
+        case "prune"      =>                     leon.Settings.pruneBranches = true
+        case "cores"      =>                     leon.Settings.useCores = true
+        case "quickcheck" =>                     leon.Settings.useQuickCheck = true
+        case "parallel"   =>                     leon.Settings.useParallel = true
+        case "templates"  =>                     leon.Settings.useTemplates = true
+        case "noLuckyTests" =>                   leon.Settings.luckyTest = false
+        case s if s.startsWith("unrolling=") =>  leon.Settings.unrollingLevel = try { s.substring("unrolling=".length, s.length).toInt } catch { case _ => 0 }
+        case s if s.startsWith("functions=") =>  leon.Settings.functionsToAnalyse = Set(splitList(s.substring("functions=".length, s.length)): _*)
+        case s if s.startsWith("extensions=") => leon.Settings.extensionNames = splitList(s.substring("extensions=".length, s.length))
+        case s if s.startsWith("testbounds=") => leon.Settings.testBounds = try { val l = splitList(s.substring("testBounds=".length, s.length)).map(_.toInt); if (l.size != 2) (0, 3) else (l(0), l(1)) } catch { case _ => (0, 3) }
+        case s if s.startsWith("timeout=") => leon.Settings.solverTimeout = try { Some(s.substring("timeout=".length, s.length).toInt) } catch { case _ => None }
+        case s if s.startsWith("testcases=") =>  leon.Settings.nbTestcases = try { s.substring("testcases=".length, s.length).toInt } catch { case _ => 1 }
+        case _ => error("Invalid option: " + option)
+      }
+    }
+  }
+
+  val components = List[PluginComponent](new AnalysisComponent(global, this))
+  val descriptions = List[String]("leon analyses")
+}
diff --git a/src/main/scala/funcheck/Main.scala b/src/main/scala/leon/plugin/Main.scala
similarity index 80%
rename from src/main/scala/funcheck/Main.scala
rename to src/main/scala/leon/plugin/Main.scala
index 9266ccff24e925330515a54bad8b73fd02c4bed5..027b35a70572f345567122803aa9fd1ca7a5f0e6 100644
--- a/src/main/scala/funcheck/Main.scala
+++ b/src/main/scala/leon/plugin/Main.scala
@@ -1,12 +1,12 @@
-package funcheck
+package leon
+package plugin
 
 import scala.tools.nsc.{Global,Settings,SubComponent,CompilerCommand}
 
 import purescala.Definitions.Program
 
 object Main {
-  import purescala.{Reporter,DefaultReporter,Definitions,Analysis}
-  import Definitions.Program
+  import leon.{Reporter,DefaultReporter,Analysis}
 
   def main(args : Array[String]) : Unit = run(args)
 
@@ -37,9 +37,9 @@ object Main {
   }
 
   private def runWithSettings(args : Array[String], settings : Settings, printerFunction : String=>Unit, actionOnProgram : Option[Program=>Unit] = None) : Unit = {
-    val (funcheckOptions, nonfuncheckOptions) = args.toList.partition(_.startsWith("--"))
-    val command = new CompilerCommand(nonfuncheckOptions, settings) {
-      override val cmdName = "funcheck"
+    val (leonOptions, nonLeonOptions) = args.toList.partition(_.startsWith("--"))
+    val command = new CompilerCommand(nonLeonOptions, settings) {
+      override val cmdName = "leon"
     }
 
     if(command.ok) {
@@ -47,9 +47,8 @@ object Main {
         println(command.cmdName + " beta.")
       } else {
         val runner = new PluginRunner(settings, printerFunction, actionOnProgram)
-        runner.funcheckPlugin.processOptions(funcheckOptions.map(_.substring(2)), Console.err.println(_))
-        //runner.funcheckPlugin.stopAfterExtraction = false
-        runner.funcheckPlugin.stopAfterAnalysis = false
+        runner.leonPlugin.processOptions(leonOptions.map(_.substring(2)), Console.err.println(_))
+        runner.leonPlugin.stopAfterAnalysis = false
         val run = new runner.Run
         run.compile(command.files)
       }
@@ -60,7 +59,7 @@ object Main {
 /** This class is a compiler that will be used for running the plugin in
  * standalone mode. Original version courtesy of D. Zufferey. */
 class PluginRunner(settings : Settings, reportingFunction : String => Unit, actionOnProgram : Option[Program=>Unit]) extends Global(settings, new SimpleReporter(settings, reportingFunction)) {
-  val funcheckPlugin = new FunCheckPlugin(this, actionOnProgram)
+  val leonPlugin = new LeonPlugin(this, actionOnProgram)
 
   protected def myAddToPhasesSet(sub : SubComponent, descr : String) : Unit = {
     phasesSet += sub
@@ -77,7 +76,7 @@ class PluginRunner(settings : Settings, reportingFunction : String => Unit, acti
       pickler                 -> "serialize symbol tables",
       refchecks               -> "reference and override checking, translate nested objects"
     ) ::: {
-      val zipped = funcheckPlugin.components zip funcheckPlugin.descriptions
+      val zipped = leonPlugin.components zip leonPlugin.descriptions
       zipped
     }
     phs foreach (myAddToPhasesSet _).tupled
diff --git a/src/main/scala/funcheck/SimpleReporter.scala b/src/main/scala/leon/plugin/SimpleReporter.scala
similarity index 98%
rename from src/main/scala/funcheck/SimpleReporter.scala
rename to src/main/scala/leon/plugin/SimpleReporter.scala
index cd20fd8c53a35e7e496a3e6727e95927b505b163..0d8e4b0adf6d93d355c5bfaf57f49916b630851b 100644
--- a/src/main/scala/funcheck/SimpleReporter.scala
+++ b/src/main/scala/leon/plugin/SimpleReporter.scala
@@ -1,4 +1,5 @@
-package funcheck
+package leon
+package plugin
 
 import scala.tools.nsc.Settings
 import scala.tools.nsc.reporters.AbstractReporter
diff --git a/src/main/scala/purescala/Common.scala b/src/main/scala/leon/purescala/Common.scala
similarity index 98%
rename from src/main/scala/purescala/Common.scala
rename to src/main/scala/leon/purescala/Common.scala
index f3e95df309b860469bd9a3fe821b8744b7041630..6132bd607724a4b9273ad199545e46cfe2adb368 100644
--- a/src/main/scala/purescala/Common.scala
+++ b/src/main/scala/leon/purescala/Common.scala
@@ -1,3 +1,4 @@
+package leon
 package purescala
 
 object Common {
@@ -18,7 +19,7 @@ object Common {
     override def hashCode: Int = id
 
     override def toString: String = {
-      if(purescala.Settings.showIDs) {
+      if(Settings.showIDs) {
         // angle brackets: name + "\u3008" + id + "\u3009"
         name + "[" + id + "]"
       } else if(alwaysShowUniqueID) {
diff --git a/src/main/scala/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala
similarity index 99%
rename from src/main/scala/purescala/Definitions.scala
rename to src/main/scala/leon/purescala/Definitions.scala
index 5aa535395f095d4477e3b0f83d5b4af385618b49..efd8b52fb31e7cd4d61ff868bba3c836ca1f0e2e 100644
--- a/src/main/scala/purescala/Definitions.scala
+++ b/src/main/scala/leon/purescala/Definitions.scala
@@ -1,3 +1,4 @@
+package leon
 package purescala
 
 object Definitions {
diff --git a/src/main/scala/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
similarity index 99%
rename from src/main/scala/purescala/PrettyPrinter.scala
rename to src/main/scala/leon/purescala/PrettyPrinter.scala
index 16d811e913df7497f0530bd15f829bee19a53958..c5d2d7158ecd416ea8d25ecfaa84e0ecc882830f 100644
--- a/src/main/scala/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -1,6 +1,6 @@
+package leon
 package purescala
 
-
 /** This pretty-printer uses Unicode for some operators, to make sure we
  * distinguish PureScala from "real" Scala (and also because it's cute). */
 object PrettyPrinter {
diff --git a/src/main/scala/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala
similarity index 99%
rename from src/main/scala/purescala/Trees.scala
rename to src/main/scala/leon/purescala/Trees.scala
index 338b5d24ac10fd6ab014fbd6a42a019cf67a85c3..7a289934acf62f1cdd94c4341455722e6edd3290 100644
--- a/src/main/scala/purescala/Trees.scala
+++ b/src/main/scala/leon/purescala/Trees.scala
@@ -1,3 +1,4 @@
+package leon
 package purescala
 
 /** AST definitions for Pure Scala. */
diff --git a/src/main/scala/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala
similarity index 99%
rename from src/main/scala/purescala/TypeTrees.scala
rename to src/main/scala/leon/purescala/TypeTrees.scala
index eab21e5cb9219832fe3a54a321c7de79bdc550f7..e948a433f42e58cb452877414fada6fae5f8da5d 100644
--- a/src/main/scala/purescala/TypeTrees.scala
+++ b/src/main/scala/leon/purescala/TypeTrees.scala
@@ -1,3 +1,4 @@
+package leon
 package purescala
 
 object TypeTrees {
diff --git a/src/main/scala/purescala/z3plugins/bapa/AST.scala b/src/main/scala/leon/z3plugins/bapa/AST.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/AST.scala
rename to src/main/scala/leon/z3plugins/bapa/AST.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/BAPATheory.scala b/src/main/scala/leon/z3plugins/bapa/BAPATheory.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/BAPATheory.scala
rename to src/main/scala/leon/z3plugins/bapa/BAPATheory.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/BAPATheoryBubbles.scala b/src/main/scala/leon/z3plugins/bapa/BAPATheoryBubbles.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/BAPATheoryBubbles.scala
rename to src/main/scala/leon/z3plugins/bapa/BAPATheoryBubbles.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/BAPATheoryEqc.scala b/src/main/scala/leon/z3plugins/bapa/BAPATheoryEqc.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/BAPATheoryEqc.scala
rename to src/main/scala/leon/z3plugins/bapa/BAPATheoryEqc.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/Bubbles.scala b/src/main/scala/leon/z3plugins/bapa/Bubbles.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/Bubbles.scala
rename to src/main/scala/leon/z3plugins/bapa/Bubbles.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/NormalForms.scala b/src/main/scala/leon/z3plugins/bapa/NormalForms.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/NormalForms.scala
rename to src/main/scala/leon/z3plugins/bapa/NormalForms.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/PrettyPrinter.scala b/src/main/scala/leon/z3plugins/bapa/PrettyPrinter.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/PrettyPrinter.scala
rename to src/main/scala/leon/z3plugins/bapa/PrettyPrinter.scala
diff --git a/src/main/scala/purescala/z3plugins/bapa/VennRegions.scala b/src/main/scala/leon/z3plugins/bapa/VennRegions.scala
similarity index 100%
rename from src/main/scala/purescala/z3plugins/bapa/VennRegions.scala
rename to src/main/scala/leon/z3plugins/bapa/VennRegions.scala
diff --git a/testcases/sas2011-testcases/ListOperations.scala b/testcases/sas2011-testcases/ListOperations.scala
index 3a08ac8f916661e89e2455eeaa2edf0593765f7e..a4fc4f8dc44a90f59a772b52b1a05053316e94d2 100644
--- a/testcases/sas2011-testcases/ListOperations.scala
+++ b/testcases/sas2011-testcases/ListOperations.scala
@@ -1,6 +1,6 @@
 import scala.collection.immutable.Set
-import funcheck.Annotations._
-import funcheck.Utils._
+import leon.Annotations._
+import leon.Utils._
 
 object ListOperations {
     sealed abstract class List