diff --git a/src/object.c b/src/object.c
index 089bb895a5adb0ad8e3b1143419bad4be76d719f..3495a012a0e52c14e2f8fb665ea07f579ff76ac5 100644
--- a/src/object.c
+++ b/src/object.c
@@ -839,6 +839,13 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason
           return;
       }
       get_destroy_called_mark(o)->p=p;
+  } else if ((p->flags & (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) ==
+	     (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) {
+    /* We might have event handlers that need
+     * the program to reach the parent.
+     */
+    get_destroy_called_mark(o)->p=p;
+    destroy_called = 1;
   }
   debug_malloc_touch(o);
   debug_malloc_touch(o->storage);
diff --git a/src/program.c b/src/program.c
index 45a343aa403f81bc611f5dac3bcff94afc43f692..29b0c320ee83c26565ee58f8e3903e515d75f92b 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4642,6 +4642,10 @@ void lower_inherit(struct program *p,
     return;
   }
 
+  if (p->flags & PROGRAM_HAS_C_METHODS) {
+    Pike_compiler->new_program->flags |= PROGRAM_HAS_C_METHODS;
+  }
+
  /* parent offset was increased by 42 for above test.. */
   if(parent_offset)
     parent_offset-=42;