diff --git a/src/main/scala/inox/ast/SymbolOps.scala b/src/main/scala/inox/ast/SymbolOps.scala
index 7bd557dae35f843b54bacddb8025b25a9d918798..7a007f1143f27affd0a68bb5daa49c94113c8511 100644
--- a/src/main/scala/inox/ast/SymbolOps.scala
+++ b/src/main/scala/inox/ast/SymbolOps.scala
@@ -236,6 +236,29 @@ trait SymbolOps { self: TypeOps =>
     normalizeClauses(inlineFunctions(e))
   }
 
+  def simplifyLets(expr: Expr): Expr = postMap({
+    case Let(v1, Let(v2, e2, b2), b1) =>
+      Some(Let(v2, e2, Let(v1, b2, b1)))
+
+    case Let(v, ts @ (
+      TupleSelect(_: Variable, _) |
+      ADTSelector(_: Variable, _) |
+      FiniteMap(Seq(), _, _, _)   |
+      FiniteBag(Seq(), _)         |
+      FiniteSet(Seq(), _)
+    ), b) =>
+      Some(replaceFromSymbols(Map(v -> ts), b))
+
+    case Let(vd, e, b) =>
+      exprOps.count { case v: Variable if vd.toVariable == v => 1 case _ => 0 } (b) match {
+        case 0 => Some(b)
+        case 1 => Some(replaceFromSymbols(Map(vd -> e), b))
+        case _ => None
+      }
+
+    case _ => None
+  }, applyRec = true)(expr)
+
   /** Fully expands all let expressions. */
   def expandLets(expr: Expr): Expr = {
     def rec(ex: Expr, s: Map[Variable,Expr]) : Expr = ex match {