diff --git a/src/main/scala/inox/ast/DSL.scala b/src/main/scala/inox/ast/DSL.scala
index ec4646dfa2afe8aa90719b66fd7365557a967bbf..d0f2ebcc20969fc2bdd7b809a3d0608b1961b50a 100644
--- a/src/main/scala/inox/ast/DSL.scala
+++ b/src/main/scala/inox/ast/DSL.scala
@@ -111,11 +111,13 @@ trait DSL {
 
   def if_ (cond: Expr)(thenn: Expr) = new DanglingElse(cond, thenn)
 
+  def ite(cond: Expr, thenn: Expr, elze: Expr) = IfExpr(cond, thenn, elze)
+
   implicit class FunctionInv(fd: FunDef) {
     def apply(args: Expr*) = functionInvocation(fd, args.toSeq)
   }
 
-  implicit class CC(ct: ClassType) {
+  implicit class CaseClassToExpr(ct: ClassType) {
     def apply(args: Expr*) = CaseClass(ct, args)
   }
 
@@ -172,23 +174,71 @@ trait DSL {
   }
 
   implicit class PatternSuspension(pat: Pattern) {
-    def ~> (rhs: Expr) = MatchCase(pat, None, rhs)
+
+    def ~> (rhs: => Expr) = {
+      val Seq() = pat.binders
+      MatchCase(pat, None, rhs)
+    }
+    def ~> (rhs: Expr => Expr) = {
+      val Seq(b1) = pat.binders
+      MatchCase(pat, None, rhs(b1.toVariable))
+    }
+    def ~> (rhs: (Expr, Expr) => Expr) = {
+      val Seq(b1, b2) = pat.binders
+      MatchCase(pat, None, rhs(b1.toVariable, b2.toVariable))
+    }
+    def ~> (rhs: (Expr, Expr, Expr) => Expr) = {
+      val Seq(b1, b2, b3) = pat.binders
+      MatchCase(pat, None, rhs(b1.toVariable, b2.toVariable, b3.toVariable))
+    }
+    def ~> (rhs: (Expr, Expr, Expr, Expr) => Expr) = {
+      val Seq(b1, b2, b3, b4) = pat.binders
+      MatchCase(pat, None,
+        rhs(b1.toVariable, b2.toVariable, b3.toVariable, b4.toVariable))
+    }
   }
 
-  // TODO: Remove this at some point
-  private def test(e1: Expr, e2: Expr)(implicit simpl: SimplificationLevel) = {
-    val pattern = WildcardPattern(None)
+  private def l2p[T](l: Literal[T]) = LiteralPattern(None, l)
+  def P(i: Int)     = l2p(IntLiteral(i))
+  def P(b: BigInt)  = l2p(IntegerLiteral(b))
+  def P(b: Boolean) = l2p(BooleanLiteral(b))
+  def P(c: Char)    = l2p(CharLiteral(c))
+  def P()           = l2p(UnitLiteral())
+  def P(ps: Pattern*) = TuplePattern(None, ps.toSeq)
+
+  def __ = WildcardPattern(None)
 
+  implicit class BinderToPattern(b: ValDef) {
+    def @@ (p: Pattern) = p.withBinder(b)
+  }
+
+  implicit class CaseClassToPattern(ct: ClassType) {
+    def pat(ps: Pattern*) = CaseClassPattern(None, ct, ps.toSeq)
+  }
+
+  implicit class TypeToInstanceOfPattern(ct: ClassType) {
+    def :: (vd: Option[ValDef]) = InstanceOfPattern(vd, ct)
+    def :: (vd: ValDef) = InstanceOfPattern(Some(vd), ct)
+  }
+
+
+  // TODO: Remove this at some point
+  private def test(e1: Expr, e2: Expr, ct: ClassType)(implicit simpl: SimplificationLevel) = {
     prec(e1) in
       let("i" :: Untyped, e1) { i =>
         if_ (\("j" :: Untyped)(j => e1(j))) {
           e1 + e2 + i + L(42)
         } else_ {
           assertion(L(true), "Weird things") in
-            e2 matchOn (
-            pattern ~> e1,
-            pattern ~> e2
-            )
+          ct(e1, e2) matchOn (
+            ct.pat(
+              ("i" :: Untyped) :: ct, P(42),
+              P(P(__), ( "j" :: Untyped) @@ P(42))
+            ) ~> {
+              (i, j) => e1
+            },
+            __ ~> e2
+          )
         }
       }
   } ensures e2