diff --git a/ipc/ipdl/ipdl/lower.py b/ipc/ipdl/ipdl/lower.py
index 7b6fe747d5b8777e610f578b104adf2a6c871d34..67011b6d635590d639b242cea75a65a608e03377 100644
--- a/ipc/ipdl/ipdl/lower.py
+++ b/ipc/ipdl/ipdl/lower.py
@@ -4733,9 +4733,8 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
         return helper
 
     def genAsyncDtor(self, md):
-        actor = md.actorDecl()
-        actorvar = actor.var()
-        method = MethodDefn(self.makeDtorMethodDecl(md))
+        actorvar = ExprVar("actor")
+        method = MethodDefn(self.makeDtorMethodDecl(md, actorvar))
 
         method.addstmt(self.dtorPrologue(actorvar))
 
@@ -4745,7 +4744,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
             stmts
             + sendstmts
             + [Whitespace.NL]
-            + self.dtorEpilogue(md, actor.var())
+            + self.dtorEpilogue(md, actorvar)
             + [StmtReturn(sendok)]
         )
 
@@ -4758,9 +4757,8 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
         return method, (lbl, case)
 
     def genBlockingDtorMethod(self, md):
-        actor = md.actorDecl()
-        actorvar = actor.var()
-        method = MethodDefn(self.makeDtorMethodDecl(md))
+        actorvar = ExprVar("actor")
+        method = MethodDefn(self.makeDtorMethodDecl(md, actorvar))
 
         method.addstmt(self.dtorPrologue(actorvar))
 
@@ -4786,7 +4784,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
         method.addstmt(ifsendok)
 
         method.addstmts(
-            self.dtorEpilogue(md, actor.var()) + [Whitespace.NL, StmtReturn(sendok)]
+            self.dtorEpilogue(md, actorvar) + [Whitespace.NL, StmtReturn(sendok)]
         )
 
         return method
@@ -4903,10 +4901,10 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
 
         return method, movemethod, promisemethod, (lbl, case)
 
-    def genBlockingSendMethod(self, md, fromActor=None):
+    def genBlockingSendMethod(self, md):
         method = MethodDefn(self.makeSendMethodDecl(md))
 
-        msgvar, serstmts = self.makeMessage(md, errfnSend, fromActor)
+        msgvar, serstmts = self.makeMessage(md, errfnSend)
         replyvar = self.replyvar
 
         sendok, sendstmts = self.sendBlocking(md, msgvar, replyvar)
@@ -4975,12 +4973,12 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
                 StmtDecl(Decl(r.bareType(self.side), r.var().name), initargs=[])
                 for r in md.returns
             ]
-            + self.invokeRecvHandler(md, implicit=False)
+            + self.invokeRecvHandler(md)
             + [Whitespace.NL]
             + saveIdStmts
             + self.makeReply(md, errfnRecv, routingId=idvar)
             + [Whitespace.NL]
-            + self.dtorEpilogue(md, md.actorDecl().var())
+            + self.dtorEpilogue(md, ExprVar.THIS)
             + [Whitespace.NL, StmtReturn(_Result.Processed)]
         )
 
@@ -5019,9 +5017,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
         msgvar = self.msgvar
         writervar = ExprVar("writer__")
         routingId = self.protocol.routingId(fromActor)
-        this = ExprVar.THIS
-        if md.decl.type.isDtor():
-            this = md.actorDecl().var()
+        this = fromActor or ExprVar.THIS
 
         stmts = (
             [
@@ -5508,7 +5504,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
 
         return StmtDecl(Decl(actortype, md.actorDecl().var().name), init=callalloc)
 
-    def invokeRecvHandler(self, md, implicit=True):
+    def invokeRecvHandler(self, md):
         retsems = "in"
         if md.decl.type.isAsync() and md.returns:
             retsems = "resolver"
@@ -5520,7 +5516,6 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
                     paramsems="move",
                     retsems=retsems,
                     retcallsems="out",
-                    implicit=implicit,
                 ),
             ),
         )
@@ -5536,8 +5531,19 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
         )
         return [okdecl, failif]
 
-    def makeDtorMethodDecl(self, md):
+    def makeDtorMethodDecl(self, md, actorvar):
         decl = self.makeSendMethodDecl(md)
+        decl.params.insert(
+            0,
+            Decl(
+                _cxxInType(
+                    ipdl.type.ActorType(md.decl.type.constructedType()),
+                    side=self.side,
+                    direction="send",
+                ),
+                actorvar.name,
+            ),
+        )
         decl.methodspec = MethodSpec.STATIC
         return decl
 
diff --git a/ipc/ipdl/ipdl/type.py b/ipc/ipdl/ipdl/type.py
index f9f843b644df2fe6c1cd985c33d33fed62cc6687..ed0ea4831df615783240f7781fb781b7f24dd675 100644
--- a/ipc/ipdl/ipdl/type.py
+++ b/ipc/ipdl/ipdl/type.py
@@ -390,7 +390,7 @@ class MessageType(SendSemanticsType):
         return len(self.returns) or self.isSync() or self.isInterrupt()
 
     def hasImplicitActorParam(self):
-        return self.isCtor() or self.isDtor()
+        return self.isCtor()
 
 
 class ProtocolType(SendSemanticsType):