diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index 4aee2f2411567d5432be77a84de31cee7c29ed18..8abed0de05d65641950383323658ab37aaae195e 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -380,9 +380,6 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
       case (FiniteMap(ss), e) => BooleanLiteral(ss.exists(_._1 == e))
       case (l, r) => throw EvalError(typeErrorMsg(l, m.getType))
     }
-    case Distinct(args) =>
-      val newArgs = args.map(e(_))
-      BooleanLiteral(newArgs.distinct.size == newArgs.size)
 
     case gv: GenericValue =>
       gv
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index c7bd6778b5c8330b1fa0eac42fc197ee191dc5b1..763986c39c386e51d557014dfefe1f0903e451f2 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1569,9 +1569,6 @@ trait CodeExtraction extends ASTExtractors {
             case (IsTyped(a1, at: ArrayType), "length", Nil) =>
               ArrayLength(a1)
 
-            case (IsTyped(a1, at: ArrayType), "clone", Nil) =>
-              ArrayClone(a1)
-
             case (IsTyped(a1, at: ArrayType), "updated", List(k, v)) =>
               ArrayUpdated(a1, k, v)
 
diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index 6df0021863297f20ecb5c5b6b3e8e5f389ea57c2..6cf4e1bbe3cf193e21276981e89bf64046c17b3c 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -27,8 +27,6 @@ object Extractors {
       case CaseClassInstanceOf(cd, e) => Some((e, CaseClassInstanceOf(cd, _)))
       case TupleSelect(t, i) => Some((t, tupleSelect(_, i)))
       case ArrayLength(a) => Some((a, ArrayLength))
-      case ArrayClone(a) => Some((a, ArrayClone))
-      case ArrayMake(t) => Some((t, ArrayMake))
       case Lambda(args, body) => Some((body, Lambda(args, _)))
       case Forall(args, body) => Some((body, Forall(args, _)))
       case (ue: UnaryExtractable) => ue.extract
@@ -126,7 +124,6 @@ object Extractors {
           val tpe = leastUpperBound(as.map(_.getType)).map(ArrayType(_)).getOrElse(expr.getType)
           FiniteArray(as).setType(tpe)
         }))
-      case Distinct(args) => Some((args, Distinct))
       case Tuple(args) => Some((args, Tuple))
       case IfExpr(cond, thenn, elze) => Some((Seq(cond, thenn, elze), (as: Seq[Expr]) => IfExpr(as(0), as(1), as(2))))
       case MatchExpr(scrut, cases) =>
diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
index c34da78b44ca90edbaf2d27cb0dc3915e5495656..fe01a181b1467baa492ee9149521b5f31de6c13e 100644
--- a/src/main/scala/leon/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -363,13 +363,10 @@ class PrettyPrinter(opts: PrinterOptions, val sb: StringBuffer = new StringBuffe
       case MapGet(m,k)               => p"$m($k)"
       case MapIsDefinedAt(m,k)       => p"$m.isDefinedAt($k)"
       case ArrayLength(a)            => p"$a.length"
-      case ArrayClone(a)             => p"$a.clone"
       case ArrayFill(size, v)        => p"Array.fill($size)($v)"
-      case ArrayMake(v)              => p"Array.make($v)"
       case ArraySelect(a, i)         => p"$a($i)"
       case ArrayUpdated(a, i, v)     => p"$a.updated($i, $v)"
       case FiniteArray(exprs)        => p"Array($exprs)"
-      case Distinct(exprs)           => p"distinct($exprs)"
       case Not(expr)                 => p"\u00AC$expr"
       case ValDef(id, tpe)           => p"${typed(id)}"
       case This(_)                   => p"this"
diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala
index d4e366d9ab35450e394232441183b89a44f1c476..b48def12d12d13469e11c178f642f1c5062c2f10 100644
--- a/src/main/scala/leon/purescala/ScalaPrinter.scala
+++ b/src/main/scala/leon/purescala/ScalaPrinter.scala
@@ -50,7 +50,6 @@ class ScalaPrinter(opts: PrinterOptions, sb: StringBuffer = new StringBuffer) ex
       case SetIntersection(l,r) => p"$l & $r"
       case SetCardinality(s)    => p"$s.size"
       case FiniteArray(exprs)   => p"Array($exprs)"
-      case Distinct(exprs)      => p"distinct($exprs)"
       case Not(expr)            => p"!$expr"
       case _ =>
         super.pp(tree)
diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala
index 2af53e1bf8c34ecbb7512288ff64652980374230..a6dd02d2d0e1f1bcdadee8de98e87a1ada5a4ebe 100644
--- a/src/main/scala/leon/purescala/TreeOps.scala
+++ b/src/main/scala/leon/purescala/TreeOps.scala
@@ -1173,7 +1173,6 @@ object TreeOps {
             None
           }
       }
-      case ListType(t)           => mapType(t).map(ListType(_))
       case SetType(t)            => mapType(t).map(SetType(_))
       case MultisetType(t)       => mapType(t).map(MultisetType(_))
       case ArrayType(t)          => mapType(t).map(ArrayType(_))
diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala
index 232786e969fb1b8c471ba260e258f500a73d12b6..94a79ca5773610ce8023f59b7f7555a56ddfd426 100644
--- a/src/main/scala/leon/purescala/Trees.scala
+++ b/src/main/scala/leon/purescala/Trees.scala
@@ -402,49 +402,6 @@ object Trees {
     def getType = leastUpperBound(Seq(set1, set2).map(_.getType)).getOrElse(Untyped)
   }
 
-  @deprecated("SetMin is not supported by any solver", "2.3")
-  case class SetMin(set: Expr) extends Expr {
-    val getType = Int32Type
-  }
-
-  @deprecated("SetMax is not supported by any solver", "2.3")
-  case class SetMax(set: Expr) extends Expr {
-    val getType = Int32Type
-  }
-
-  /* Multiset expressions  !!! UNSUPPORTED / DEPRECATED !!! */
-  case class EmptyMultiset(baseType: TypeTree) extends Expr with Terminal {
-    val getType = MultisetType(baseType)
-  }
-  case class FiniteMultiset(elements: Seq[Expr]) extends Expr {
-    assert(elements.size > 0)
-    def getType = MultisetType(leastUpperBound(elements.map(_.getType)).getOrElse(Untyped))
-  }
-  case class Multiplicity(element: Expr, multiset: Expr) extends Expr {
-    val getType = Int32Type
-  }
-  case class MultisetCardinality(multiset: Expr) extends Expr {
-    val getType = Int32Type
-  }
-  case class MultisetIntersection(multiset1: Expr, multiset2: Expr) extends Expr {
-    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
-  }
-  case class MultisetUnion(multiset1: Expr, multiset2: Expr) extends Expr  {
-    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
-  }
-  case class MultisetPlus(multiset1: Expr, multiset2: Expr) extends Expr { // disjoint union 
-    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
-  }
-  case class MultisetDifference(multiset1: Expr, multiset2: Expr) extends Expr  {
-    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
-  }
-  case class MultisetToSet(multiset: Expr) extends Expr {
-    def getType = multiset.getType match {
-      case MultisetType(base) => SetType(base)
-      case _ => Untyped
-    }
-  }
-
   /* Map operations. */
   case class FiniteMap(singletons: Seq[(Expr, Expr)]) extends Expr with MutableTyped
   case class MapGet(map: Expr, key: Expr) extends Expr {
@@ -462,15 +419,6 @@ object Trees {
   }
 
   /* Array operations */
-  @deprecated("Unsupported Array operation with most solvers", "Leon 2.3")
-  case class ArrayFill(length: Expr, defaultValue: Expr) extends Expr {
-    def getType = ArrayType(defaultValue.getType)
-  }
-
-  @deprecated("Unsupported Array operation with most solvers", "Leon 2.3")
-  case class ArrayMake(defaultValue: Expr) extends Expr {
-    def getType = ArrayType(defaultValue.getType)
-  }
 
   case class ArraySelect(array: Expr, index: Expr) extends Expr {
     def getType = array.getType match {
@@ -496,15 +444,6 @@ object Trees {
 
   case class FiniteArray(exprs: Seq[Expr]) extends Expr with MutableTyped
 
-  @deprecated("Unsupported Array operation with most solvers", "Leon 2.3")
-  case class ArrayClone(array: Expr) extends Expr {
-    def getType = array.getType
-  }
-
-  case class Distinct(exprs: Seq[Expr]) extends Expr {
-    val getType = BooleanType
-  }
-
   /* Special trees */
 
   // Provide an oracle (synthesizable, all-seeing choose)
@@ -534,6 +473,53 @@ object Trees {
     }
   }
 
+  /**
+   * DEPRECATED TREES
+   * These trees are not guaranteed to be supported by Leon.
+   **/
+  case class ArrayFill(length: Expr, defaultValue: Expr) extends Expr {
+    def getType = ArrayType(defaultValue.getType)
+  }
+
+  case class SetMin(set: Expr) extends Expr {
+    val getType = Int32Type
+  }
+
+  case class SetMax(set: Expr) extends Expr {
+    val getType = Int32Type
+  }
+
+  case class EmptyMultiset(baseType: TypeTree) extends Expr with Terminal {
+    val getType = MultisetType(baseType)
+  }
+  case class FiniteMultiset(elements: Seq[Expr]) extends Expr {
+    assert(elements.size > 0)
+    def getType = MultisetType(leastUpperBound(elements.map(_.getType)).getOrElse(Untyped))
+  }
+  case class Multiplicity(element: Expr, multiset: Expr) extends Expr {
+    val getType = Int32Type
+  }
+  case class MultisetCardinality(multiset: Expr) extends Expr {
+    val getType = Int32Type
+  }
+  case class MultisetIntersection(multiset1: Expr, multiset2: Expr) extends Expr {
+    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
+  }
+  case class MultisetUnion(multiset1: Expr, multiset2: Expr) extends Expr  {
+    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
+  }
+  case class MultisetPlus(multiset1: Expr, multiset2: Expr) extends Expr { // disjoint union 
+    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
+  }
+  case class MultisetDifference(multiset1: Expr, multiset2: Expr) extends Expr  {
+    def getType = leastUpperBound(Seq(multiset1, multiset2).map(_.getType)).getOrElse(Untyped)
+  }
+  case class MultisetToSet(multiset: Expr) extends Expr {
+    def getType = multiset.getType match {
+      case MultisetType(base) => SetType(base)
+      case _ => Untyped
+    }
+  }
 
 
 }
diff --git a/src/main/scala/leon/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala
index 38074b978feb50eff0ffc43d9edaf4bcd1fa7981..bf448e739c3a953e8f32bb78157493b4724e46b5 100644
--- a/src/main/scala/leon/purescala/TypeTrees.scala
+++ b/src/main/scala/leon/purescala/TypeTrees.scala
@@ -76,7 +76,6 @@ object TypeTrees {
     }
   }
 
-  case class ListType(base: TypeTree) extends TypeTree
   case class SetType(base: TypeTree) extends TypeTree
   case class MultisetType(base: TypeTree) extends TypeTree
   case class MapType(from: TypeTree, to: TypeTree) extends TypeTree
@@ -143,7 +142,6 @@ object TypeTrees {
       case CaseClassType(ccd, ts) => Some((ts, ts => CaseClassType(ccd, ts)))
       case AbstractClassType(acd, ts) => Some((ts, ts => AbstractClassType(acd, ts)))
       case TupleType(ts) => Some((ts, TupleType(_)))
-      case ListType(t) => Some((Seq(t), ts => ListType(ts.head)))
       case ArrayType(t) => Some((Seq(t), ts => ArrayType(ts.head)))
       case SetType(t) => Some((Seq(t), ts => SetType(ts.head)))
       case MultisetType(t) => Some((Seq(t), ts => MultisetType(ts.head)))
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index 28b86d8f3ea9c291a7b4ee9f036890f0eb8ae910..1ee056af437a7a0ab03c6e9abf07ac0001a90a89 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -669,7 +669,6 @@ trait AbstractZ3Solver
         val u = exprs.zipWithIndex.foldLeft(a)((array, expI) => ArrayUpdated(array, IntLiteral(expI._2), expI._1))
         rec(u)
       }
-      case Distinct(exs) => z3.mkDistinct(exs.map(rec(_)): _*)
 
       case gv @ GenericValue(tp, id) =>
         z3.mkApp(genericValueToDecl(gv))
diff --git a/src/main/scala/leon/xlang/ArrayTransformation.scala b/src/main/scala/leon/xlang/ArrayTransformation.scala
index e6f31d739ced12dac775ec26de5a8b8cdb9d1178..a66541178b7e0bd962d842d005454d3a5ee1c786 100644
--- a/src/main/scala/leon/xlang/ArrayTransformation.scala
+++ b/src/main/scala/leon/xlang/ArrayTransformation.scala
@@ -41,10 +41,6 @@ object ArrayTransformation extends TransformationPhase {
       val Variable(id) = ra
       Assignment(id, ArrayUpdated(ra, ri, rv).setPos(up))
     }
-    case ArrayClone(a) => {
-      val ra = transform(a)
-      ra
-    }
     case Let(i, v, b) => {
       v.getType match {
         case ArrayType(_) => {
diff --git a/src/main/scala/leon/xlang/TreeOps.scala b/src/main/scala/leon/xlang/TreeOps.scala
index 40c23677e51a9eea40c40368c5409869b65df12f..b3de6e91aa99dcc0246339719cd3f24371ff254c 100644
--- a/src/main/scala/leon/xlang/TreeOps.scala
+++ b/src/main/scala/leon/xlang/TreeOps.scala
@@ -23,8 +23,6 @@ object TreeOps {
       case LetVar(_, _, _) => true
       case LetDef(_, _) => true
       case ArrayUpdate(_, _, _) => true
-      case ArrayMake(_) => true
-      case ArrayClone(_) => true
       case Epsilon(_) => true
       case _ => false
     }}(expr)
diff --git a/src/test/resources/regression/termination/valid/BubbleSort.scala b/src/test/resources/regression/termination/valid/BubbleSort.scala
deleted file mode 100644
index ff7f58e9f941d52ab981ccf014e9589e7c6542ec..0000000000000000000000000000000000000000
--- a/src/test/resources/regression/termination/valid/BubbleSort.scala
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Copyright 2009-2014 EPFL, Lausanne */
-
-import leon.lang._
-
-/* The calculus of Computation textbook */
-
-object BubbleSort {
-
-  def sort(a: Array[Int]): Array[Int] = ({
-    require(a.length >= 1)
-    var i = a.length - 1
-    var j = 0
-    val sa = a.clone
-    (while(i > 0) {
-      j = 0
-      (while(j < i) {
-        if(sa(j) > sa(j+1)) {
-          val tmp = sa(j)
-          sa(j) = sa(j+1)
-          sa(j+1) = tmp
-        }
-        j = j + 1
-      }) invariant(
-            j >= 0 &&
-            j <= i &&
-            i < sa.length &&
-            sa.length >= 0 &&
-            partitioned(sa, 0, i, i+1, sa.length-1) &&
-            sorted(sa, i, sa.length-1) &&
-            partitioned(sa, 0, j-1, j, j)
-          )
-      i = i - 1
-    }) invariant(
-          i >= 0 &&
-          i < sa.length &&
-          sa.length >= 0 &&
-          partitioned(sa, 0, i, i+1, sa.length-1) &&
-          sorted(sa, i, sa.length-1)
-       )
-    sa
-  }) ensuring(res => sorted(res, 0, a.length-1))
-
-  def sorted(a: Array[Int], l: Int, u: Int): Boolean = {
-    require(a.length >= 0 && l >= 0 && u < a.length && l <= u)
-    var k = l
-    var isSorted = true
-    (while(k < u) {
-      if(a(k) > a(k+1))
-        isSorted = false
-      k = k + 1
-    }) invariant(k <= u && k >= l)
-    isSorted
-  }
-
-  def partitioned(a: Array[Int], l1: Int, u1: Int, l2: Int, u2: Int): Boolean = {
-    require(a.length >= 0 && l1 >= 0 && u1 < l2 && u2 < a.length)
-    if(l2 > u2 || l1 > u1)
-      true
-    else {
-      var i = l1
-      var j = l2
-      var isPartitionned = true
-      (while(i <= u1) {
-        j = l2
-        (while(j <= u2) {
-          if(a(i) > a(j))
-            isPartitionned = false
-          j = j + 1
-        }) invariant(j >= l2 && i <= u1)
-        i = i + 1
-      }) invariant(i >= l1)
-      isPartitionned
-    }
-  }
-
-}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array10.scala b/src/test/resources/regression/verification/xlang/valid/Array10.scala
deleted file mode 100644
index a36e980fdeadd8a82c76a8858aedcff1cb0f15aa..0000000000000000000000000000000000000000
--- a/src/test/resources/regression/verification/xlang/valid/Array10.scala
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Copyright 2009-2014 EPFL, Lausanne */
-
-object Array10 {
-
-  def foo(a: Array[Int]): Int = {
-    require(a.length > 0)
-    val b = a.clone
-    b(0)
-  } ensuring(res => res == a(0))
-
-}