diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
index b9de2bd619fe5c30edfe6b5d19690bd813cfc6d1..c6385d426be2b026da6ced35fb36a1353651473e 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
@@ -6,9 +6,8 @@ package solvers.smtlib
 import purescala.Common.FreshIdentifier
 import purescala.Expressions.{FunctionInvocation, BooleanLiteral, Expr, Implies}
 import purescala.Definitions.TypedFunDef
-import purescala.Constructors.application
+import purescala.Constructors.{application, implies}
 import purescala.DefOps.typedTransitiveCallees
-import leon.purescala.ExprOps.matchToIfThenElse
 import smtlib.parser.Commands._
 import smtlib.parser.Terms._
 import smtlib.theories.Core.Equals
@@ -43,13 +42,13 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
 
       functions +=(tfd, id2sym(id))
 
-      val bodyAssert = Assert(Equals(id2sym(id): Term, toSMT(matchToIfThenElse(tfd.body.get))(Map())))
+      val bodyAssert = Assert(Equals(id2sym(id): Term, toSMT(tfd.body.get)(Map())))
 
       val specAssert = tfd.postcondition map { post =>
-        val term = matchToIfThenElse(Implies(
+        val term = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(post, Seq(FunctionInvocation(tfd, Seq())))
-        ))
+        )
         Assert(toSMT(term)(Map()))
       }
 
@@ -75,7 +74,7 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
 
     val smtBodies = smtFunDecls map { case FunDec(sym, _, _) =>
       val tfd = functions.toA(sym)
-      toSMT(matchToIfThenElse(tfd.body.get))(tfd.params.map { p =>
+      toSMT(tfd.body.get)(tfd.params.map { p =>
         (p.id, id2sym(p.id): Term)
       }.toMap)
     }
@@ -87,10 +86,10 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
         tfd <- seen
         post <- tfd.postcondition
       } {
-        val term = matchToIfThenElse(Implies(
+        val term = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(post, Seq(FunctionInvocation(tfd, tfd.params map { _.toVariable})))
-        ))
+        )
         sendCommand(Assert(quantifiedTerm(ForAll, term)))
       }
     }
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 9c21bc903c9165bcb392b68e742757d4e5332301..fcfe4c801cf4334f90a051b0b361b9187964be18 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -505,6 +505,13 @@ trait SMTLIBTarget {
           someTester(vt),
           Seq(ArraysEx.Select(toSMT(m), toSMT(k)))
         )
+
+      case p : Passes =>
+        toSMT(matchToIfThenElse(p.asConstraint))
+
+      case m : MatchExpr =>
+        toSMT(matchToIfThenElse(m))
+
       /**
        * ===== Everything else =====
        */
@@ -575,7 +582,6 @@ trait SMTLIBTarget {
           case _ => reporter.fatalError("Unhandled nary "+e)
         }
 
-
       case o => unsupported("Tree: " + o)
     }
   }
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
index 3087d11834002c2e5a019b0cb358a797e7cc031f..4c40da893037643f66b1ba6d289cc4109ee20d43 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
@@ -50,21 +50,21 @@ trait SMTLIBZ3QuantifiedTarget extends SMTLIBZ3Target {
       val term = quantifiedTerm(
         SMTForall,
         tfd.params map { _.id },
-        matchToIfThenElse(Equals(
+        Equals(
           FunctionInvocation(tfd, tfd.params.map {_.toVariable}),
-          matchToIfThenElse(tfd.body.get)
-        ))
+          tfd.body.get
+        )
       )
       sendCommand(Assert(term))
 
       tfd.postcondition foreach { post =>
-        val axiom = matchToIfThenElse(implies(
+        val axiom = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(
             post,
             Seq(FunctionInvocation(tfd, tfd.params map { _.toVariable }))
           )
-        ))
+        )
         sendCommand(Assert(quantifiedTerm(SMTForall, axiom)))
       }
     }