diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala
index d14b02f95c5b63f287d5b685bf73545748dd6980..69f95f45559737bfd895989aba010dbc0667bb3a 100644
--- a/src/main/scala/leon/codegen/CompilationUnit.scala
+++ b/src/main/scala/leon/codegen/CompilationUnit.scala
@@ -315,8 +315,8 @@ class CompilationUnit(val ctx: LeonContext,
         val k = jvmToValue(entry.getKey, from)
         val v = jvmToValue(entry.getValue, to)
         (k, v)
-      }
-      FiniteMap(pairs.toSeq, from, to)
+      }.toMap
+      FiniteMap(pairs, from, to)
 
     case (lambda: runtime.Lambda, _: FunctionType) =>
       val cls = lambda.getClass
diff --git a/src/main/scala/leon/datagen/VanuatooDataGen.scala b/src/main/scala/leon/datagen/VanuatooDataGen.scala
index b742ec58f68dc34b35cd2e093578c4e19b2462ef..e68e21f011f3936797157688901018923c2127bf 100644
--- a/src/main/scala/leon/datagen/VanuatooDataGen.scala
+++ b/src/main/scala/leon/datagen/VanuatooDataGen.scala
@@ -99,7 +99,7 @@ class VanuatooDataGen(ctx: LeonContext, p: Program) extends DataGenerator {
         val cs = for (size <- List(0, 1, 2, 5)) yield {
           val subs   = (1 to size).flatMap(i => List(from, to)).toList
 
-          Constructor[Expr, TypeTree](subs, mt, s => FiniteMap(s.grouped(2).map(t => (t(0), t(1))).toSeq, from, to), mt.asString(ctx)+"@"+size)
+          Constructor[Expr, TypeTree](subs, mt, s => FiniteMap(s.grouped(2).map(t => (t(0), t(1))).toMap, from, to), mt.asString(ctx)+"@"+size)
         }
         constructors += mt -> cs
         cs
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index bd2a594ec873a079e58be27852d1c3e223f55130..f17f9caefb644bfb08c1c5d9b7a429c2f408a872 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -603,26 +603,24 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
       )
 
     case f @ FiniteMap(ss, kT, vT) =>
-      FiniteMap(ss.map{ case (k, v) => (e(k), e(v)) }.distinct, kT, vT)
+      FiniteMap(ss.map{ case (k, v) => (e(k), e(v)) }, kT, vT)
 
     case g @ MapApply(m,k) => (e(m), e(k)) match {
-      case (FiniteMap(ss, _, _), e) => ss.find(_._1 == e) match {
-        case Some((_, v0)) => v0
-        case None => throw RuntimeError("Key not found: " + e.asString)
-      }
-      case (l,r) => throw EvalError(typeErrorMsg(l, MapType(r.getType, g.getType)))
+      case (FiniteMap(ss, _, _), e) =>
+        ss.getOrElse(e, throw RuntimeError("Key not found: " + e.asString))
+      case (l,r) =>
+        throw EvalError(typeErrorMsg(l, MapType(r.getType, g.getType)))
     }
     case u @ MapUnion(m1,m2) => (e(m1), e(m2)) match {
-      case (f1@FiniteMap(ss1, _, _), FiniteMap(ss2, _, _)) => {
-        val filtered1 = ss1.filterNot(s1 => ss2.exists(s2 => s2._1 == s1._1))
-        val newSs = filtered1 ++ ss2
+      case (f1@FiniteMap(ss1, _, _), FiniteMap(ss2, _, _)) =>
+        val newSs = ss1 ++ ss2
         val MapType(kT, vT) = u.getType
         FiniteMap(newSs, kT, vT)
-      }
-      case (l, r) => throw EvalError(typeErrorMsg(l, m1.getType))
+      case (l, r) =>
+        throw EvalError(typeErrorMsg(l, m1.getType))
     }
     case i @ MapIsDefinedAt(m,k) => (e(m), e(k)) match {
-      case (FiniteMap(ss, _, _), e) => BooleanLiteral(ss.exists(_._1 == e))
+      case (FiniteMap(ss, _, _), e) => BooleanLiteral(ss.contains(e))
       case (l, r) => throw EvalError(typeErrorMsg(l, m.getType))
     }
 
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index be64c2f7776cb60917a0315482562c87e96447fc..9fa7606da23741a13f4d705374f867c23957fc53 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1329,10 +1329,10 @@ trait CodeExtraction extends ASTExtractors {
           Forall(vds, exBody)
 
         case ExFiniteMap(tptFrom, tptTo, args) =>
-          val singletons: Seq[(LeonExpr, LeonExpr)] = args.collect {
+          val singletons = args.collect {
             case ExTuple(tpes, trees) if trees.size == 2 =>
               (extractTree(trees(0)), extractTree(trees(1)))
-          }
+          }.toMap
 
           if (singletons.size != args.size) {
             outOfSubsetError(tr, "Some map elements could not be extracted as Tuple2")
@@ -1678,17 +1678,17 @@ trait CodeExtraction extends ASTExtractors {
               MapIsDefinedAt(a1, a2)
 
             case (IsTyped(a1, mt: MapType), "updated", List(k, v)) =>
-              MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to))
+              MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to))
 
             case (IsTyped(a1, mt: MapType), "+", List(k, v)) =>
-              MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to))
+              MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to))
 
             case (IsTyped(a1, mt: MapType), "+", List(IsTyped(kv, TupleType(List(_, _))))) =>
               kv match {
                 case Tuple(List(k, v)) =>
-                  MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to))
+                  MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to))
                 case kv =>
-                  MapUnion(a1, FiniteMap(Seq((TupleSelect(kv, 1), TupleSelect(kv, 2))), mt.from, mt.to))
+                  MapUnion(a1, FiniteMap(Map(TupleSelect(kv, 1) -> TupleSelect(kv, 2)), mt.from, mt.to))
               }
 
             case (IsTyped(a1, mt1: MapType), "++", List(IsTyped(a2, mt2: MapType)))  if mt1 == mt2 =>
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index 2f703312a0f1e064ed9af3d1f6f094d5d6f96bbc..200a9e167e8d70e076b9d13fc7c301331e127138 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -1107,7 +1107,7 @@ object ExprOps {
     case BooleanType                => BooleanLiteral(false)
     case UnitType                   => UnitLiteral()
     case SetType(baseType)          => FiniteSet(Set(), baseType)
-    case MapType(fromType, toType)  => FiniteMap(Nil, fromType, toType)
+    case MapType(fromType, toType)  => FiniteMap(Map(), fromType, toType)
     case TupleType(tpes)            => Tuple(tpes.map(simplestValue))
     case ArrayType(tpe)             => EmptyArray(tpe)
 
@@ -1304,7 +1304,7 @@ object ExprOps {
     case wp: WildcardPattern =>
       1
     case _ =>
-      1 + (if(p.binder.isDefined) 1 else 0) + p.subPatterns.map(patternSize).sum
+      1 + p.binder.size + p.subPatterns.map(patternSize).sum
   }
 
   def formulaSize(e: Expr): Int = e match {
diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala
index 3db4d0bb7628f527dc125d9ac3deba238906244e..7216652a427e6784142a17f69c730fa61e2ff0aa 100644
--- a/src/main/scala/leon/purescala/Expressions.scala
+++ b/src/main/scala/leon/purescala/Expressions.scala
@@ -788,7 +788,7 @@ object Expressions {
 
   /* Map operations */
   /** $encodingof `Map[keyType, valueType](key1 -> value1, key2 -> value2 ...)` */
-  case class FiniteMap(singletons: Seq[(Expr, Expr)], keyType: TypeTree, valueType: TypeTree) extends Expr {
+  case class FiniteMap(pairs: Map[Expr, Expr], keyType: TypeTree, valueType: TypeTree) extends Expr {
     val getType = MapType(keyType, valueType).unveilUntyped
   }
   /** $encodingof `map.apply(key)` (or `map(key)`)*/
diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index d2ccfa7da010c732fdf3784b614a218e6198fada..cd57d2187fe0cd59d45e3d88e17b0926e2279412 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -159,12 +159,12 @@ object Extractors {
       case FiniteSet(els, base) =>
         Some((els.toSeq, els => FiniteSet(els.toSet, base)))
       case FiniteMap(args, f, t) => {
-        val subArgs = args.flatMap { case (k, v) => Seq(k, v) }
+        val subArgs = args.flatMap { case (k, v) => Seq(k, v) }.toSeq
         val builder = (as: Seq[Expr]) => {
-          def rec(kvs: Seq[Expr]): Seq[(Expr, Expr)] = kvs match {
+          def rec(kvs: Seq[Expr]): Map[Expr, Expr] = kvs match {
             case Seq(k, v, t@_*) =>
-              (k, v) +: rec(t)
-            case Seq() => Seq()
+              Map(k -> v) ++ rec(t)
+            case Seq() => Map()
             case _ => sys.error("odd number of key/value expressions")
           }
           FiniteMap(rec(as), f, t)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala
index 620a294edf2ef6b6df0c60d697380958f7ccc23d..cb1c3246d7eff487e00904c3acbd61d7068aa316 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala
@@ -63,7 +63,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget {
             RawArrayValue(tupleTypeWrap(from), Map(), fromSMT(elem, to))
 
           case MapType(k, v) =>
-            FiniteMap(Nil, k, v)
+            FiniteMap(Map(), k, v)
 
         }
 
@@ -76,7 +76,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget {
             RawArrayValue(tupleTypeWrap(from), Map(), fromSMT(elem, to))
 
           case MapType(k, v) =>
-            FiniteMap(Nil, k, v)
+            FiniteMap(Map(), k, v)
 
         }
 
@@ -92,7 +92,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget {
 
           case MapType(k, v) =>
             val FiniteMap(elems, k, v) = fromSMT(arr, otpe)
-            FiniteMap(elems :+ (fromSMT(key, k) -> fromSMT(elem, v)), k, v)
+            FiniteMap(elems + (fromSMT(key, k) -> fromSMT(elem, v)), k, v)
         }
 
       case (FunctionApplication(SimpleSymbol(SSymbol("singleton")), elems), Some(SetType(base))) =>
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 952dbeadc9f862dea9c4653a651da8838e7ade31..9035700a0f12120da6086be426334622017f2b37 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -213,7 +213,7 @@ trait SMTLIBTarget extends Interruptible {
       val elems = r.elems.flatMap {
         case (k, CaseClass(leonSome, Seq(x))) => Some(k -> x)
         case (k, _)                           => None
-      }.toSeq
+      }.toMap
       FiniteMap(elems, from, to)
 
     case other =>
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index abf4e41693436fc61e76b53977e8fbf57a62999b..9a06cff266e221b0459b7d23e9417b4940ec5743 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -658,7 +658,7 @@ trait AbstractZ3Solver extends Solver {
                     val elems = r.elems.flatMap {
                       case (k, CaseClass(leonSome, Seq(x))) => Some(k -> x)
                       case (k, _) => None
-                    }.toSeq
+                    }.toMap
 
                     FiniteMap(elems, from, to)
                 }
diff --git a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
index 6eaf481381b7d433a0566c9433a077e026399e5e..810d9d40edfd4aaf18c7c54aff0a579db600f2db 100644
--- a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
+++ b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala
@@ -6,17 +6,10 @@ import leon._
 import leon.test._
 import leon.test.helpers._
 import leon.evaluators._
-
-import leon.utils.{TemporaryInputPhase, PreprocessingPhase}
-import leon.frontends.scalac.ExtractionPhase
-
 import leon.purescala.Common._
 import leon.purescala.Definitions._
 import leon.purescala.Expressions._
-import leon.purescala.DefOps._
 import leon.purescala.Types._
-import leon.purescala.Extractors._
-import leon.purescala.Constructors._
 import leon.codegen._
 
 class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL {
@@ -292,8 +285,6 @@ class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL {
         fail("Expected FiniteMap, got "+e)
     }
 
-    val em     = FiniteMap(Seq(), Int32Type, Int32Type)
-
     for(e <- allEvaluators) {
       eqMap(eval(e, fcall("Maps.finite0")()).res, Map())
       eqMap(eval(e, fcall("Maps.finite1")()).res, Map(i(1) -> i(2)))