diff --git a/src/main/scala/inox/ast/Extractors.scala b/src/main/scala/inox/ast/Extractors.scala
index 4582f9cb07a629e29c090147e95b11f32e6e7cb4..f7e261e88fe90e080e67abec9a3fee58cfd59326 100644
--- a/src/main/scala/inox/ast/Extractors.scala
+++ b/src/main/scala/inox/ast/Extractors.scala
@@ -231,14 +231,19 @@ trait TreeDeconstructor {
   * [[TreeDeconstructor]] instance. */
 trait Extractors { self: Trees =>
 
-  val deconstructor: TreeDeconstructor {
+  def getDeconstructor(that: Trees): TreeDeconstructor {
     val s: self.type
-    val t: self.type
+    val t: that.type
   } = new TreeDeconstructor {
     protected val s: self.type = self
-    protected val t: self.type = self
+    protected val t: that.type = that
   }
 
+  val deconstructor: TreeDeconstructor {
+    val s: self.type
+    val t: self.type
+  } = getDeconstructor(self)
+
   /** Operator Extractor to extract any Expression in a consistent way.
     *
     * You can match on any Inox Expr, and then get both a Seq[Expr] of
diff --git a/src/main/scala/inox/ast/TreeOps.scala b/src/main/scala/inox/ast/TreeOps.scala
index 5aeeef5aabd743d0d260d3776ebe0cbda306053b..7116a0ee910793def74f7d097a468a6162769192 100644
--- a/src/main/scala/inox/ast/TreeOps.scala
+++ b/src/main/scala/inox/ast/TreeOps.scala
@@ -12,11 +12,6 @@ trait TreeOps { self: Trees =>
   trait SelfTreeTransformer extends TreeTransformer {
     val s: self.type = self
     val t: self.type = self
-
-    lazy val deconstructor: TreeDeconstructor {
-      val s: self.type
-      val t: self.type
-    } = self.deconstructor
   }
 
   trait IdentityTreeTransformer extends SelfTreeTransformer {
@@ -57,10 +52,10 @@ trait TreeTransformer {
   val s: Trees
   val t: Trees
 
-  val deconstructor: TreeDeconstructor {
+  lazy val deconstructor: TreeDeconstructor {
     val s: TreeTransformer.this.s.type
     val t: TreeTransformer.this.t.type
-  }
+  } = s.getDeconstructor(t)
 
   def transform(id: Identifier, tpe: s.Type): (Identifier, t.Type) = (id, transform(tpe))
 
@@ -231,14 +226,6 @@ trait TreeTransformer {
   } = new TreeTransformerComposition {
     val t1: TreeTransformer.this.type = TreeTransformer.this
     val t2: that.type = that
-
-    lazy val deconstructor: TreeDeconstructor {
-      val s: TreeTransformer.this.s.type
-      val t: that.t.type
-    } = new TreeDeconstructor {
-      protected val s: TreeTransformer.this.s.type = TreeTransformer.this.s
-      protected val t: that.t.type = that.t
-    }
   }
 }