diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index 1d5dee8b468aaed99dc6742683a28e987c0c5253..ad7ae73770ba92ccb9ce2a9662a759f713c6d43f 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -299,7 +299,7 @@ trait CodeGeneration {
         mkUnbox(bs(i - 1), ch)
 
       // Sets
-      case FiniteSet(es) =>
+      case FiniteSet(es, _) =>
         ch << DefaultNew(SetClass)
         for(e <- es) {
           ch << DUP
@@ -337,7 +337,7 @@ trait CodeGeneration {
         ch << InvokeVirtual(SetClass, "minus", s"(L$SetClass;)L$SetClass;")
 
       // Maps
-      case FiniteMap(ss) =>
+      case FiniteMap(ss, _, _) =>
         ch << DefaultNew(MapClass)
         for((f,t) <- ss) {
           ch << DUP
diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala
index 138cefc9cd5119df5f5855149428f7191c6a9960..e183533b5ece0fe30b49ba31fe18c045b0236801 100644
--- a/src/main/scala/leon/codegen/CompilationUnit.scala
+++ b/src/main/scala/leon/codegen/CompilationUnit.scala
@@ -154,14 +154,14 @@ class CompilationUnit(val ctx: LeonContext,
     //case f @ FiniteArray(exprs) if f.getType == ArrayType(BooleanType) =>
     //  exprs.map(e => exprToJVM(e).asInstanceOf[java.lang.Boolean].booleanValue).toArray
 
-    case s @ FiniteSet(els) =>
+    case s @ FiniteSet(els, _) =>
       val s = new leon.codegen.runtime.Set()
       for (e <- els) {
         s.add(exprToJVM(e))
       }
       s
 
-    case m @ FiniteMap(els) =>
+    case m @ FiniteMap(els, _, _) =>
       val m = new leon.codegen.runtime.Map()
       for ((k,v) <- els) {
         m.add(exprToJVM(k), exprToJVM(v))
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index 0a69169a83fe481fa93302d9ca2916812c0bc0f2..d5bf1facfabd69ae22c8b6d1fcc8f5853b0dba9b 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -128,7 +128,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
 
     case FunctionInvocation(TypedFunDef(fd, Seq(tp)), Seq(set)) if fd == program.library.setToList.get =>
       val els = e(set) match {
-        case FiniteSet(els) => els
+        case FiniteSet(els, _) => els
         case _ => throw EvalError(typeErrorMsg(set, SetType(tp)))
       }
       val cons = program.library.Cons.get
@@ -211,8 +211,8 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
       val rv = e(re)
 
       (lv,rv) match {
-        case (FiniteSet(el1),FiniteSet(el2)) => BooleanLiteral(el1.toSet == el2.toSet)
-        case (FiniteMap(el1),FiniteMap(el2)) => BooleanLiteral(el1.toSet == el2.toSet)
+        case (FiniteSet(el1, _),FiniteSet(el2, _)) => BooleanLiteral(el1.toSet == el2.toSet)
+        case (FiniteMap(el1, _, _),FiniteMap(el2, _, _)) => BooleanLiteral(el1.toSet == el2.toSet)
         case (BooleanLiteral(b1),BooleanLiteral(b2)) => BooleanLiteral(b1 == b2)
         case _ => BooleanLiteral(lv == rv)
       }
@@ -382,7 +382,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
 
     case SetUnion(s1,s2) =>
       (e(s1), e(s2)) match {
-        case (f@FiniteSet(els1),FiniteSet(els2)) => 
+        case (f@FiniteSet(els1, _),FiniteSet(els2, _)) => 
           val SetType(tpe) = f.getType
           finiteSet(els1 ++ els2, tpe)
         case (le,re) => throw EvalError(typeErrorMsg(le, s1.getType))
@@ -390,7 +390,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
 
     case SetIntersection(s1,s2) =>
       (e(s1), e(s2)) match {
-        case (f @ FiniteSet(els1), FiniteSet(els2)) => {
+        case (f @ FiniteSet(els1, _), FiniteSet(els2, _)) => {
           val newElems = els1 intersect els2
           val SetType(tpe) = f.getType
           finiteSet(newElems, tpe)
@@ -400,7 +400,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
 
     case SetDifference(s1,s2) =>
       (e(s1), e(s2)) match {
-        case (f @ FiniteSet(els1),FiniteSet(els2)) => {
+        case (f @ FiniteSet(els1, _),FiniteSet(els2, _)) => {
           val SetType(tpe) = f.getType
           val newElems = els1 -- els2
           finiteSet(newElems, tpe)
@@ -409,23 +409,22 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
       }
 
     case ElementOfSet(el,s) => (e(el), e(s)) match {
-      case (e, f @ FiniteSet(els)) => BooleanLiteral(els.contains(e))
+      case (e, f @ FiniteSet(els, _)) => BooleanLiteral(els.contains(e))
       case (l,r) => throw EvalError(typeErrorMsg(r, SetType(l.getType)))
     }
     case SubsetOf(s1,s2) => (e(s1), e(s2)) match {
-      case (f@FiniteSet(els1),FiniteSet(els2)) => BooleanLiteral(els1.toSet.subsetOf(els2.toSet))
+      case (f@FiniteSet(els1, _),FiniteSet(els2, _)) => BooleanLiteral(els1.toSet.subsetOf(els2.toSet))
       case (le,re) => throw EvalError(typeErrorMsg(le, s1.getType))
     }
     case SetCardinality(s) =>
       val sr = e(s)
       sr match {
-        case FiniteSet(els) => IntLiteral(els.size)
+        case FiniteSet(els, _) => IntLiteral(els.size)
         case _ => throw EvalError(typeErrorMsg(sr, SetType(Untyped)))
       }
 
-    case f @ FiniteSet(els) => 
-      val SetType(tp) = f.getType
-      finiteSet(els.map(e), tp)
+    case f @ FiniteSet(els, base) => 
+      finiteSet(els.map(e), base)
     case i @ IntLiteral(_) => i
     case i @ InfiniteIntegerLiteral(_) => i
     case b @ BooleanLiteral(_) => b
@@ -465,18 +464,18 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
         tp
       )
 
-    case f @ FiniteMap(ss) => 
-      val MapType(kT, vT) = f.getType
+    case f @ FiniteMap(ss, kT, vT) => 
       finiteMap(ss.map{ case (k, v) => (e(k), e(v)) }.distinct, kT, vT)
+
     case g @ MapGet(m,k) => (e(m), e(k)) match {
-      case (FiniteMap(ss), e) => ss.find(_._1 == e) match {
+      case (FiniteMap(ss, _, _), e) => ss.find(_._1 == e) match {
         case Some((_, v0)) => v0
         case None => throw RuntimeError("Key not found: " + e)
       }
       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)) => {
+      case (f1@FiniteMap(ss1, _, _), FiniteMap(ss2, _, _)) => {
         val filtered1 = ss1.filterNot(s1 => ss2.exists(s2 => s2._1 == s1._1))
         val newSs = filtered1 ++ ss2
         val MapType(kT, vT) = u.getType
@@ -485,7 +484,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
       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.exists(_._1 == 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 9e209b5d54f7ba0c02b8ee6c78b4757a9187b2f0..60e5f7a76fb187c990464d60b2e6ded2ecd2a7f2 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1707,7 +1707,7 @@ trait CodeExtraction extends ASTExtractors {
               MapIsDefinedAt(a1, a2)
 
             case (IsTyped(a1, mt: MapType), "updated", List(k, v)) =>
-              MapUnion(a1, NonemptyMap(Seq((k, v))))
+              MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to))
 
             case (IsTyped(a1, mt1: MapType), "++", List(IsTyped(a2, mt2: MapType)))  if mt1 == mt2 =>
               MapUnion(a1, a2)
diff --git a/src/main/scala/leon/purescala/Constructors.scala b/src/main/scala/leon/purescala/Constructors.scala
index 0bc69cb3b74c4018dbf63f0a055697a2f1d8bf74..2c15bdaf386c427365faac434fe64aacd5c6c949 100644
--- a/src/main/scala/leon/purescala/Constructors.scala
+++ b/src/main/scala/leon/purescala/Constructors.scala
@@ -188,8 +188,7 @@ object Constructors {
   }
 
   def finiteSet(els: Set[Expr], tpe: TypeTree) = {
-    if (els.isEmpty) EmptySet(tpe)
-    else NonemptySet(els)
+    FiniteSet(els, tpe)
   }
 
   def finiteMultiset(els: Seq[Expr], tpe: TypeTree) = {
@@ -198,8 +197,7 @@ object Constructors {
   }
 
   def finiteMap(els: Seq[(Expr, Expr)], keyType: TypeTree, valueType: TypeTree) = {
-    if (els.isEmpty) EmptyMap(keyType, valueType)
-    else NonemptyMap(els.distinct)
+    FiniteMap(els, keyType, valueType)
   }
 
   def finiteArray(els: Seq[Expr]): Expr = {
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index 0c158ec3225c6b136357daff92667dddfbce3e86..8943c6b164f079dba6d5d67da02f00d87a17c9fe 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -967,8 +967,8 @@ object ExprOps {
     case CharType                   => CharLiteral('a')
     case BooleanType                => BooleanLiteral(false)
     case UnitType                   => UnitLiteral()
-    case SetType(baseType)          => EmptySet(tpe)
-    case MapType(fromType, toType)  => EmptyMap(fromType, toType)
+    case SetType(baseType)          => FiniteSet(Set(), tpe)
+    case MapType(fromType, toType)  => FiniteMap(Nil, fromType, toType)
     case TupleType(tpes)            => Tuple(tpes.map(simplestValue))
     case ArrayType(tpe)             => EmptyArray(tpe)
 
diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala
index 5aecb99741b38304661ebb30982e2f0f9e058b06..2a75af65cfecee84e2c4f24b061af22f81256f42 100644
--- a/src/main/scala/leon/purescala/Expressions.scala
+++ b/src/main/scala/leon/purescala/Expressions.scala
@@ -405,15 +405,10 @@ object Expressions {
   }
 
   /* Set expressions */
-  case class NonemptySet(elements: Set[Expr]) extends Expr {
-    require(elements.nonEmpty)
-    val getType = SetType(optionToType(leastUpperBound(elements.toSeq.map(_.getType)))).unveilUntyped
+  case class FiniteSet(elements: Set[Expr], base: TypeTree) extends Expr {
+    val getType = SetType(base).unveilUntyped
   }
-  
-  case class EmptySet(tpe: TypeTree) extends Expr with Terminal {
-    val getType = SetType(tpe).unveilUntyped
-  }
-  
+
   case class ElementOfSet(element: Expr, set: Expr) extends Expr {
     val getType = BooleanType
   }
@@ -435,21 +430,10 @@ object Expressions {
   }
 
   /* Map operations. */
-  case class NonemptyMap(singletons: Seq[(Expr, Expr)]) extends Expr {
-    require(singletons.nonEmpty)
-    val getType = {
-      val (keys, values) = singletons.unzip
-      MapType(
-        optionToType(leastUpperBound(keys.map(_.getType))),
-        optionToType(leastUpperBound(values.map(_.getType)))
-      ).unveilUntyped
-    }
-  }
-  
-  case class EmptyMap(keyType: TypeTree, valueType: TypeTree) extends Expr with Terminal {
+  case class FiniteMap(singletons: Seq[(Expr, Expr)], keyType: TypeTree, valueType: TypeTree) extends Expr {
     val getType = MapType(keyType, valueType).unveilUntyped
   }
-  
+
   case class MapGet(map: Expr, key: Expr) extends Expr {
     val getType = map.getType match {
       case MapType(_, to) => to
diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index d3186cde0176c0e7e24c5e81886879e22b16365f..249c4622e1c54807404ff64051b7d570bd48b415 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -108,9 +108,9 @@ object Extractors {
       case CaseClass(cd, args) => Some((args, CaseClass(cd, _)))
       case And(args) => Some((args, and))
       case Or(args) => Some((args, or))
-      case NonemptySet(els) =>
-        Some(( els.toSeq, els => NonemptySet(els.toSet) ))
-      case NonemptyMap(args) => {
+      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 builder = (as: Seq[Expr]) => {
           def rec(kvs: Seq[Expr]) : Seq[(Expr, Expr)] = kvs match {
@@ -119,7 +119,7 @@ object Extractors {
             case Seq() => Seq()
             case _ => sys.error("odd number of key/value expressions")
           }
-          NonemptyMap(rec(as))
+          FiniteMap(rec(as), f, t)
         }
         Some((subArgs, builder))
       }
@@ -267,14 +267,6 @@ object Extractors {
     }
   }
 
-  object FiniteSet {
-    def unapply(e: Expr): Option[Set[Expr]] = e match {
-      case EmptySet(_) => Some(Set())
-      case NonemptySet(els) => Some(els)
-      case _ => None
-    }
-  }
-  
   object FiniteMultiset {
     def unapply(e: Expr): Option[Seq[Expr]] = e match {
       case EmptyMultiset(_) => Some(Seq())
@@ -282,15 +274,7 @@ object Extractors {
       case _ => None
     }
   }
-  
-  object FiniteMap {
-    def unapply(e: Expr): Option[Seq[(Expr, Expr)]] = e match {
-      case EmptyMap(_, _) => Some(Seq())
-      case NonemptyMap(pairs) => Some(pairs)
-      case _ => None
-    }
-  }
-  
+
   object FiniteArray {
     def unapply(e: Expr): Option[(Map[Int, Expr], Option[Expr], Expr)] = e match {
       case EmptyArray(_) => 
diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
index 41f469eaeeff441c7e6958ab16f555406b8d99d8..b274f8edaaf045ce8f6a1dd8638c2e419317fa01 100644
--- a/src/main/scala/leon/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -373,8 +373,8 @@ class PrettyPrinter(opts: PrinterOptions, val sb: StringBuffer = new StringBuffe
       case BVShiftLeft(l,r)          => optP { p"$l << $r" }
       case BVAShiftRight(l,r)        => optP { p"$l >> $r" }
       case BVLShiftRight(l,r)        => optP { p"$l >>> $r" }
-      case fs @ FiniteSet(rs)        => p"{${rs.toSeq}}"
-      case fm @ FiniteMap(rs)        => p"{$rs}"
+      case fs @ FiniteSet(rs, _)     => p"{${rs.toSeq}}"
+      case fm @ FiniteMap(rs, _, _)  => p"{$rs}"
       case FiniteMultiset(rs)        => p"{|$rs|)"
       case EmptyMultiset(_)          => p"\u2205"
       case Not(ElementOfSet(e,s))    => p"$e \u2209 $s"
diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala
index b586ecdbee24329e6fc3bc52924738517bff4be0..07f5394e48264c56c98dfea2d9fbc6c1c15e670b 100644
--- a/src/main/scala/leon/purescala/ScalaPrinter.scala
+++ b/src/main/scala/leon/purescala/ScalaPrinter.scala
@@ -26,23 +26,9 @@ class ScalaPrinter(opts: PrinterOptions, sb: StringBuffer = new StringBuffer) ex
       case Not(Equals(l, r))    => p"$l != $r"
       case Implies(l,r)         => pp(or(not(l), r))
       case Choose(pred, None) => p"choose($pred)"
-      case s @ FiniteSet(rss)    => {
-        val rs = rss.toSeq
-        s.getType match {
-          case SetType(ut) =>
-            p"Set[$ut]($rs)"
-          case _ =>
-            p"Set($rs)"
-        }
-      }
-      case m @ FiniteMap(els) => {
-        m.getType match {
-          case MapType(k,v) =>
-            p"Map[$k,$v]($els)"
-          case _ =>
-            p"Map($els)"
-        }
-      }
+      case s @ FiniteSet(rss, t) => p"Set[$t](${rss.toSeq})"
+      case m @ FiniteMap(els, k, v) => p"Map[$k,$v]($els)"
+      
       case ElementOfSet(e,s)    => p"$s.contains(e)"
       case SetUnion(l,r)        => p"$l ++ $r"
       case MapUnion(l,r)        => p"$l ++ $r"
diff --git a/src/main/scala/leon/purescala/TypeOps.scala b/src/main/scala/leon/purescala/TypeOps.scala
index 56f77cabb6d8a408b1c8201b2317dd0a4b363322..635f8a03128d3d896b942c7c1bdab7ff2d506065 100644
--- a/src/main/scala/leon/purescala/TypeOps.scala
+++ b/src/main/scala/leon/purescala/TypeOps.scala
@@ -312,14 +312,11 @@ object TypeOps {
           case ens @ Ensuring(body, pred) =>
             Ensuring(srec(body), rec(idsMap)(pred)).copiedFrom(ens)
 
-          case s @ FiniteSet(elements) if elements.isEmpty =>
-            val SetType(tp) = s.getType
-            EmptySet(tpeSub(tp)).copiedFrom(s)
-
-          case m @ FiniteMap(elements) if elements.isEmpty =>
-            val MapType(a,b) = m.getType
-            EmptyMap(tpeSub(a), tpeSub(b)).copiedFrom(m)
+          case s @ FiniteSet(elems, tpe) =>
+            FiniteSet(elems.map(srec), tpeSub(tpe)).copiedFrom(s)
 
+          case m @ FiniteMap(elems, from, to) =>
+            FiniteMap(elems.map{ case (k, v) => (srec(k), srec(v)) }, tpeSub(from), tpeSub(to)).copiedFrom(m)
 
           case v @ Variable(id) if idsMap contains id =>
             Variable(idsMap(id)).copiedFrom(v)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Solver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Solver.scala
index cfc92dc44ede4f7acf61371fd50e652e86bfee5c..1b91684774ba01cc5e794ed25dfd57fd60800704 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Solver.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Solver.scala
@@ -71,7 +71,7 @@ class SMTLIBCVC4Solver(context: LeonContext, program: Program) extends SMTLIBSol
       GenericValue(tp, n.toInt)
 
     case (QualifiedIdentifier(SMTIdentifier(SSymbol("emptyset"), Seq()), _), SetType(base)) =>
-      EmptySet(base)
+      FiniteSet(Set(), base)
 
     case (FunctionApplication(SimpleSymbol(SSymbol("__array_store_all__")), Seq(_, elem)), RawArrayType(k,v)) =>
       RawArrayValue(k, Map(), fromSMT(elem, v))
@@ -92,12 +92,12 @@ class SMTLIBCVC4Solver(context: LeonContext, program: Program) extends SMTLIBSol
 
     case (FunctionApplication(SimpleSymbol(SSymbol("insert")), elems), SetType(base)) =>
       val selems = elems.init.map(fromSMT(_, base))
-      val FiniteSet(se) = fromSMT(elems.last, tpe)
+      val FiniteSet(se, _) = fromSMT(elems.last, tpe)
       finiteSet(se ++ selems, base)
 
     case (FunctionApplication(SimpleSymbol(SSymbol("union")), elems), SetType(base)) =>
       finiteSet(elems.map(fromSMT(_, tpe) match {
-        case FiniteSet(elems) => elems
+        case FiniteSet(elems, _) => elems
       }).flatten.toSet, base)
 
     // FIXME (nicolas)
@@ -126,10 +126,9 @@ class SMTLIBCVC4Solver(context: LeonContext, program: Program) extends SMTLIBSol
 
       FunctionApplication(constructors.toB(tpe), Seq(toSMT(size), ar))
 
-    case fm @ FiniteMap(elems) =>
+    case fm @ FiniteMap(elems, from, to) =>
       import OptionManager._
-      val mt @ MapType(from, to) = fm.getType
-      declareSort(mt)
+      declareSort(MapType(from, to))
 
       var m: Term = declareVariable(FreshIdentifier("mapconst", RawArrayType(from, leonOptionType(to))))
 
@@ -152,7 +151,7 @@ class SMTLIBCVC4Solver(context: LeonContext, program: Program) extends SMTLIBSol
      */
 
 
-    case fs @ FiniteSet(elems) =>
+    case fs @ FiniteSet(elems, _) =>
       if (elems.isEmpty) {
         QualifiedIdentifier(SMTIdentifier(SSymbol("emptyset")), Some(declareSort(fs.getType)))
       } else {
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
index a4c06d3b8597426eee0aa719631009b7e513ed7f..12a90827696eabf211dcc439e2bf82aa42b49969 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
@@ -566,7 +566,7 @@ abstract class SMTLIBSolver(val context: LeonContext,
       /**
        * ===== Map operations =====
        */
-      case m @ FiniteMap(elems) =>
+      case m @ FiniteMap(elems, _, _) =>
         import OptionManager._
         val mt @ MapType(_, to) = m.getType
         val ms = declareSort(mt)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Solver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Solver.scala
index 1fb33303f6db9961d08d4b705ce22cae8aa404b8..37efdd120ba60bcafb27cc325ad7c84782d6c587 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Solver.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Solver.scala
@@ -113,7 +113,7 @@ class SMTLIBZ3Solver(context: LeonContext, program: Program) extends SMTLIBSolve
     /**
      * ===== Set operations =====
      */
-    case fs @ FiniteSet(elems) =>
+    case fs @ FiniteSet(elems, base) =>
       val ss = declareSort(fs.getType)
       var res: Term = FunctionApplication(
         QualifiedIdentifier(SMTIdentifier(SSymbol("const")), Some(ss)),
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index b89713f944f7adc86290ac798b60f445a505fd65..4a5e6ed572d2f2fa74d38facdf0235892e83d4b7 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -636,20 +636,20 @@ trait AbstractZ3Solver
       case SetIntersection(s1, s2) => z3.mkSetIntersect(rec(s1), rec(s2))
       case SetUnion(s1, s2) => z3.mkSetUnion(rec(s1), rec(s2))
       case SetDifference(s1, s2) => z3.mkSetDifference(rec(s1), rec(s2))
-      case f @ FiniteSet(elems) => elems.foldLeft(z3.mkEmptySet(typeToSort(f.getType.asInstanceOf[SetType].base)))((ast, el) => z3.mkSetAdd(ast, rec(el)))
+      case f @ FiniteSet(elems, base) => elems.foldLeft(z3.mkEmptySet(typeToSort(base)))((ast, el) => z3.mkSetAdd(ast, rec(el)))
       case SetCardinality(s) =>
         val rs = rec(s)
         setCardDecls(s.getType)(rs)
 
       case SetMin(s) => intSetMinFun(rec(s))
       case SetMax(s) => intSetMaxFun(rec(s))
-      case f @ FiniteMap(elems) => f.getType match {
-        case tpe@MapType(fromType, toType) =>
-          typeToSort(tpe) //had to add this here because the mapRangeNoneConstructors was not yet constructed...
+      case f @ FiniteMap(elems, fromType, toType) =>
+          typeToSort(MapType(fromType, toType)) //had to add this here because the mapRangeNoneConstructors was not yet constructed...
           val fromSort = typeToSort(fromType)
-          elems.foldLeft(z3.mkConstArray(fromSort, mapRangeNoneConstructors(toType)())){ case (ast, (k,v)) => z3.mkStore(ast, rec(k), mapRangeSomeConstructors(toType)(rec(v))) }
-        case errorType => scala.sys.error("Unexpected type for finite map: " + (ex, errorType))
-      }
+          elems.foldLeft(z3.mkConstArray(fromSort, mapRangeNoneConstructors(toType)())){
+            case (ast, (k,v)) => z3.mkStore(ast, rec(k), mapRangeSomeConstructors(toType)(rec(v)))
+          }
+
       case mg @ MapGet(m,k) => m.getType match {
         case MapType(fromType, toType) =>
           val selected = z3.mkSelect(rec(m), rec(k))
@@ -658,7 +658,7 @@ trait AbstractZ3Solver
       }
       case MapUnion(m1,m2) => m1.getType match {
         case MapType(ft, tt) => m2 match {
-          case FiniteMap(ss) =>
+          case FiniteMap(ss, _, _) =>
             ss.foldLeft(rec(m1)){
               case (ast, (k, v)) => z3.mkStore(ast, rec(k), mapRangeSomeConstructors(tt)(rec(v)))
             }
diff --git a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
index 9c441813766e133c095d0608038df991a6ec9224..1465cd5325d7ad83cd5e08ef34b607af45f46693 100644
--- a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
+++ b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala
@@ -82,7 +82,7 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
     val result = checkCompSuccess(evaluator, in)
 
     def asIntSet(e : Expr) : Option[Set[Int]] = e match {
-      case FiniteSet(es) =>
+      case FiniteSet(es, _) =>
         val ois = es.map {
           case IntLiteral(v) => Some(v)
           case _ => None
@@ -107,7 +107,7 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
     val result = checkCompSuccess(evaluator, in)
 
     def asIntMap(e : Expr) : Option[Map[Int,Int]] = e match {
-      case FiniteMap(ss) =>
+      case FiniteMap(ss, _, _) =>
         val oips : Seq[Option[(Int,Int)]] = ss.map {
           case (IntLiteral(f), IntLiteral(t)) => Some(f -> t)
           case _ => None
@@ -365,8 +365,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite {
     val nil = mkCaseClass("Nil")
     val cons12 = mkCaseClass("Cons", IL(1), mkCaseClass("Cons", IL(2), mkCaseClass("Nil")))
 
-    val s123 = NonemptySet(Set(IL(1), IL(2), IL(3)))
-    val s246 = NonemptySet(Set(IL(2), IL(4), IL(6)))
+    val s123 = FiniteSet(Set(IL(1), IL(2), IL(3)), Int32Type)
+    val s246 = FiniteSet(Set(IL(2), IL(4), IL(6)), Int32Type)
 
     for(e <- evaluators) {
       checkSetComp(e, mkCall("finite"), Set(1, 2, 3))