fsm_dealloc_test: no need for ST_DESTROYING

A separate ST_DESTROYING state originally helped with certain deallocation
scenarios. But now that fsm.c avoids re-entering osmo_fsm_inst_term() twice and
gracefully handles FSM instance deallocations for termination cascades, it is
actually just as safe without a separate ST_DESTROYING state. ST_DESTROYING was
used to flag deallocation and prevent entering osmo_fsm_inst_term() twice,
which works only in a very limited range of scenarios.

Remove ST_DESTROYING from fsm_dealloc_test.c to show that all tested scenarios
still clean up gracefully.

Change-Id: I05354e6cad9b82ba474fa50ffd41d481b3c697b4
diff --git a/tests/fsm/fsm_dealloc_test.err b/tests/fsm/fsm_dealloc_test.err
index aa7db51..d12c5aa 100644
--- a/tests/fsm/fsm_dealloc_test.err
+++ b/tests/fsm/fsm_dealloc_test.err
@@ -66,11 +66,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -79,131 +75,121 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG --- after term cascade:
 DLGLOBAL DEBUG --- all deallocated.
 DLGLOBAL DEBUG scene_alloc()
@@ -243,177 +229,164 @@
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
+DLGLOBAL DEBUG test(root){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(root){alive}: pre_term()
 DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 2 (root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (root.alive(),__twig1b.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
+DLGLOBAL DEBUG 4 (root.alive(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 3 (root.alive(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 2 (root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter())
+DLGLOBAL DEBUG 1 (root.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 2 (root.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying(),root.other_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),root.destroying())
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 3 (2*root.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 4 (2*root.alive(),__twig1a.cleanup(),root.other_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
+DLGLOBAL DEBUG 3 (2*root.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (root.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (root.alive(),__twig1a.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone())
+DLGLOBAL DEBUG 4 (root.alive(),__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 3 (root.alive(),__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (root.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter())
+DLGLOBAL DEBUG 1 (root.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 2 (root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (root.alive(),_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 4 (root.alive(),_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 6 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG 3 (root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 4 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 8 (root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 7 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 10 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 9 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 8 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 7 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.
-DLGLOBAL DEBUG 6 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 4 (root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 3 (root.alive(),root.destroying_onenter(),root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 7 (2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG 6 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 5 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 4 (root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 2 (root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (2*root.alive(),_branch1.cleanup(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 3 (2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 1 (root.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 2 (root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 1 (root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG --- all deallocated.
@@ -490,145 +463,131 @@
 DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
 DLGLOBAL DEBUG test(_branch0){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig0a.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig0a.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: removing reference _branch0.other[0] -> other
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(_branch0){alive}: removing reference _branch0.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch0.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[0] = _branch0
 DLGLOBAL DEBUG 2 (_branch0.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[1] -> _branch1
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[1] -> _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.other_gone())
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.other_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_OTHER_GONE: Dropped reference _branch1.other[0] = other
-DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(_branch1){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
+DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(_branch0)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 10 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
-DLGLOBAL DEBUG test(_branch1){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
+DLGLOBAL DEBUG test(_branch1){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG 3 (_branch0.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch0.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(_branch0)
 DLGLOBAL DEBUG 1 (_branch0.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch0.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch0.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch0.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 1 (root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 1 (root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch0){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch0){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG --- after term cascade:
 DLGLOBAL DEBUG --- all deallocated.
 DLGLOBAL DEBUG scene_alloc()
@@ -668,183 +627,170 @@
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG 2 (_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying(),_branch0.child_gone())
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 3 (2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 2 (_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 1 (_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(_branch0)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 2 (_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (_branch0.alive(),__twig0a.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive(),other.other_gone())
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive())
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying(),_branch0.child_gone())
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 4 (_branch0.alive(),__twig0a.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 3 (_branch0.alive(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 2 (_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 3 (2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 1 (_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(_branch0){destroying}: removing reference _branch0.other[0] -> other
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(_branch0){alive}: removing reference _branch0.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[0] = _branch0
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[1] -> _branch1
+DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[1] -> _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.other_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_OTHER_GONE: Dropped reference _branch1.other[0] = other
-DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(_branch1){destroying}: pre_term()
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup(),_branch1.child_gone(
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
+DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(_branch0)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch0))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
+DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.othe
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 12 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
-DLGLOBAL DEBUG test(_branch1){destroying}: No more children
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch0))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.clea
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup(),_branch1.child_gone(
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
+DLGLOBAL DEBUG test(_branch1){alive}: No more children
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 10 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 9 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(_branch0)
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),other.alive())
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.destroying())
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.destroying_onenter(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive(),root.chil
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: still exists: child[0]
+DLGLOBAL DEBUG 7 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 5 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(_branch0)
+DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 3 (_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
 DLGLOBAL DEBUG 1 (_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 1 (_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG --- all deallocated.
@@ -954,11 +900,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -967,107 +909,97 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -1105,39 +1037,35 @@
 DLGLOBAL DEBUG test(__twig0a){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (__twig0a.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(__twig0a){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.destroying_onenter())
-DLGLOBAL DEBUG test(__twig0a){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(__twig0a){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(__twig0a){destroying}: pre_term()
-DLGLOBAL DEBUG test(__twig0a){destroying}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup())
-DLGLOBAL DEBUG test(__twig0a){destroying}: cleanup()
-DLGLOBAL DEBUG test(__twig0a){destroying}: scene forgets __twig0a
-DLGLOBAL DEBUG test(__twig0a){destroying}: removing reference __twig0a.other[0] -> other
+DLGLOBAL DEBUG test(__twig0a){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
+DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
+DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
+DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
+DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),other.alive(),other.other_gone())
-DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),other.alive())
-DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),_branch0.alive(),_branch0.child_gone())
+DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.cleanup(),_branch0.alive(),_branch0.child_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
 DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[1]
-DLGLOBAL DEBUG 4 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.destroying_onenter(),__twig0a.cleanup())
-DLGLOBAL DEBUG test(__twig0a){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.destroying_onenter())
+DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
+DLGLOBAL DEBUG 1 (__twig0a.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (__twig0a.alive(),__twig0a.destroying_onenter(),_branch0.alive())
+DLGLOBAL DEBUG 2 (__twig0a.alive(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
 DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (__twig0a.alive(),__twig0a.destroying_onenter())
-DLGLOBAL DEBUG test(__twig0a){destroying}: Deallocated
 DLGLOBAL DEBUG 1 (__twig0a.alive())
+DLGLOBAL DEBUG test(__twig0a){alive}: Deallocated
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG   root
@@ -1182,11 +1110,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -1195,107 +1119,97 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -1395,11 +1309,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -1408,114 +1318,104 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -1553,32 +1453,28 @@
 DLGLOBAL DEBUG test(__twig0b){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (__twig0b.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(__twig0b){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (__twig0b.alive(),__twig0b.destroying_onenter())
-DLGLOBAL DEBUG test(__twig0b){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(__twig0b){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(__twig0b){destroying}: pre_term()
-DLGLOBAL DEBUG test(__twig0b){destroying}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 3 (__twig0b.alive(),__twig0b.destroying_onenter(),__twig0b.cleanup())
-DLGLOBAL DEBUG test(__twig0b){destroying}: cleanup()
-DLGLOBAL DEBUG test(__twig0b){destroying}: scene forgets __twig0b
+DLGLOBAL DEBUG test(__twig0b){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
+DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
+DLGLOBAL DEBUG 2 (__twig0b.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
+DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (__twig0b.alive(),__twig0b.destroying_onenter(),__twig0b.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 3 (__twig0b.alive(),__twig0b.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (__twig0b.alive(),__twig0b.destroying_onenter(),__twig0b.cleanup(),_branch0.alive(),_branch0.child_gone())
+DLGLOBAL DEBUG 4 (__twig0b.alive(),__twig0b.cleanup(),_branch0.alive(),_branch0.child_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
 DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
-DLGLOBAL DEBUG 4 (__twig0b.alive(),__twig0b.destroying_onenter(),__twig0b.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 3 (__twig0b.alive(),__twig0b.destroying_onenter(),__twig0b.cleanup())
-DLGLOBAL DEBUG test(__twig0b){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (__twig0b.alive(),__twig0b.destroying_onenter())
+DLGLOBAL DEBUG 3 (__twig0b.alive(),__twig0b.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 2 (__twig0b.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
+DLGLOBAL DEBUG 1 (__twig0b.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (__twig0b.alive(),__twig0b.destroying_onenter(),_branch0.alive())
+DLGLOBAL DEBUG 2 (__twig0b.alive(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
 DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (__twig0b.alive(),__twig0b.destroying_onenter())
-DLGLOBAL DEBUG test(__twig0b){destroying}: Deallocated
 DLGLOBAL DEBUG 1 (__twig0b.alive())
+DLGLOBAL DEBUG test(__twig0b){alive}: Deallocated
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG   root
@@ -1623,11 +1519,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -1636,114 +1528,104 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -1810,20 +1692,16 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
 DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(_branch1)
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -1832,130 +1710,120 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(_branch1)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(_branch1)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 1 (root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 1 (root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch1){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG --- after term cascade:
 DLGLOBAL DEBUG --- all deallocated.
 DLGLOBAL DEBUG scene_alloc()
@@ -1995,183 +1863,170 @@
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(_branch1){destroying}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 2 (_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying(),_branch1.child_gone())
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (2*_branch1.alive(),__twig1b.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
+DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
+DLGLOBAL DEBUG 3 (2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG 2 (_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 1 (_branch1.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(_branch1)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 2 (_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG 3 (_branch1.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.other_gone())
+DLGLOBAL DEBUG 4 (_branch1.alive(),__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying(),_branch1.child_gone())
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
-DLGLOBAL DEBUG test(_branch1){destroying}: No more children
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 3 (_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 4 (_branch1.alive(),__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL DEBUG 2 (_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (2*_branch1.alive(),__twig1a.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
+DLGLOBAL DEBUG test(_branch1){alive}: No more children
+DLGLOBAL DEBUG 3 (2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 1 (_branch1.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(_branch1))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone(
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(_branch1)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(_branch1))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 11 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone(
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 11 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 10 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 9 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_
-DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(_branch1)
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.destroying_onenter(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 8 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.chil
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 7 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 5 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(_branch1)
+DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 4 (_branch1.alive(),_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 3 (_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 1 (_branch1.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 1 (_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG --- all deallocated.
@@ -2222,147 +2077,137 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
 DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
+DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
+DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),_branch1.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
 DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 6 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 12 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_bran
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 6 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 12 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 12 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_bran
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 12 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 11 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 10 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 9 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 8 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 9 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 8 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 7 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 6 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 5 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 4 (__twig1a.cleanup(),2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),_branch1.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 4 (__twig1a.cleanup(),root.alive(),root.destroying_onenter(),root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -2371,18 +2216,14 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 1 (_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 1 (_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG --- after term cascade:
@@ -2424,186 +2265,168 @@
 DLGLOBAL DEBUG test(__twig1a){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (__twig1a.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(__twig1a){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.destroying_onenter())
-DLGLOBAL DEBUG test(__twig1a){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(__twig1a){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(__twig1a){destroying}: pre_term()
-DLGLOBAL DEBUG test(__twig1a){destroying}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup())
-DLGLOBAL DEBUG test(__twig1a){destroying}: cleanup()
-DLGLOBAL DEBUG test(__twig1a){destroying}: scene forgets __twig1a
-DLGLOBAL DEBUG test(__twig1a){destroying}: removing reference __twig1a.other[0] -> root
+DLGLOBAL DEBUG test(__twig1a){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
+DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
+DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
+DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
+DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.other_gone())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
 DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),
+DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup(),
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
 DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
+DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(__twig1a))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 6 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 14 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(__twig1a)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 6 (cause = OSMO_FSM_TERM_PARENT, caused by: test(__twig1a))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 14 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 14 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 14 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 13 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 12 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 11 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup()
-DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup(),
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 10 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branc
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 9 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 8 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 7 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.cleanup(),2*root.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),_branch1.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 6 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(__twig1a)
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(__twig1a)
+DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone())
+DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 4 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.destroying_onenter(),__twig1a.cleanup())
-DLGLOBAL DEBUG test(__twig1a){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.destroying_onenter(),_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.destroying_onenter())
-DLGLOBAL DEBUG test(__twig1a){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG 3 (__twig1a.alive(),__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 2 (__twig1a.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 1 (__twig1a.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (__twig1a.alive(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 1 (__twig1a.alive())
+DLGLOBAL DEBUG test(__twig1a){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG --- all deallocated.
@@ -2689,11 +2512,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -2702,131 +2521,121 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -2864,32 +2673,28 @@
 DLGLOBAL DEBUG test(__twig1b){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (__twig1b.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(__twig1b){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (__twig1b.alive(),__twig1b.destroying_onenter())
-DLGLOBAL DEBUG test(__twig1b){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(__twig1b){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(__twig1b){destroying}: pre_term()
-DLGLOBAL DEBUG test(__twig1b){destroying}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 3 (__twig1b.alive(),__twig1b.destroying_onenter(),__twig1b.cleanup())
-DLGLOBAL DEBUG test(__twig1b){destroying}: cleanup()
-DLGLOBAL DEBUG test(__twig1b){destroying}: scene forgets __twig1b
+DLGLOBAL DEBUG test(__twig1b){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
+DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
+DLGLOBAL DEBUG 2 (__twig1b.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
+DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (__twig1b.alive(),__twig1b.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (__twig1b.alive(),__twig1b.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 5 (__twig1b.alive(),__twig1b.destroying_onenter(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
+DLGLOBAL DEBUG 4 (__twig1b.alive(),__twig1b.cleanup(),_branch1.alive(),_branch1.child_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
 DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
-DLGLOBAL DEBUG 4 (__twig1b.alive(),__twig1b.destroying_onenter(),__twig1b.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 3 (__twig1b.alive(),__twig1b.destroying_onenter(),__twig1b.cleanup())
-DLGLOBAL DEBUG test(__twig1b){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (__twig1b.alive(),__twig1b.destroying_onenter())
+DLGLOBAL DEBUG 3 (__twig1b.alive(),__twig1b.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 2 (__twig1b.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
+DLGLOBAL DEBUG 1 (__twig1b.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 3 (__twig1b.alive(),__twig1b.destroying_onenter(),_branch1.alive())
+DLGLOBAL DEBUG 2 (__twig1b.alive(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 2 (__twig1b.alive(),__twig1b.destroying_onenter())
-DLGLOBAL DEBUG test(__twig1b){destroying}: Deallocated
 DLGLOBAL DEBUG 1 (__twig1b.alive())
+DLGLOBAL DEBUG test(__twig1b){alive}: Deallocated
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG   root
@@ -2917,11 +2722,7 @@
 DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
@@ -2930,131 +2731,121 @@
 DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
 DLGLOBAL DEBUG test(_branch1){alive}: No more children
 DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (__twig1a.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL DEBUG 2 (__twig1a.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(_branch1){destroying}: removing reference _branch1.other[0] -> other
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(_branch1){alive}: removing reference _branch1.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
 DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.other_gone())
 DLGLOBAL DEBUG test(other){alive}: EV_OTHER_GONE: Dropped reference other.other[1] = _branch1
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(root))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 5 (cause = OSMO_FSM_TERM_PARENT, caused by: test(root))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 9 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
-DLGLOBAL DEBUG test(root){destroying}: still exists: child[1]
-DLGLOBAL DEBUG 8 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(root)
-DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 7 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
+DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
+DLGLOBAL DEBUG 6 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 4 (_branch1.cleanup(),other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 2 (_branch1.cleanup(),other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.destroying())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 3 (_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 2 (_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
 DLGLOBAL DEBUG 1 (_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(root)
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(root)
 DLGLOBAL DEBUG 1 (root.cleanup())
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
-DLGLOBAL DEBUG test(root){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(root){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG scene_alloc()
 DLGLOBAL DEBUG test(root){alive}: Allocated
 DLGLOBAL DEBUG test(root){alive}: Allocated
@@ -3101,73 +2892,70 @@
 DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
 DLGLOBAL DEBUG 2 (other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying(),_branch0.child_gone(
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive(),other.other_gone())
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),other.alive())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying(),_branch0.child_gone(
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_branch0.destroying())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.alive(),other.other_gone())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.alive())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
 DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),root.alive())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),root.alive())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
 DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG 2 (other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG 1 (other.cleanup())
 DLGLOBAL DEBUG test(other){alive}: removing reference other.other[1] -> _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_OTHER_GONE
@@ -3176,88 +2964,82 @@
 DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.other_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_OTHER_GONE: Dropped reference _branch1.other[0] = other
 DLGLOBAL DEBUG 2 (other.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(_branch1){destroying}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying(),_branch1.child_gone(
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (other.cleanup(),2*_branch1.alive(),__twig1b.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
+DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.other_gone())
+DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 7 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter(),roo
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive(),root.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),root.alive())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying(),_branch1.child_gone(
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
-DLGLOBAL DEBUG test(_branch1){destroying}: No more children
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_branch1.destroying())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(other)
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (other.cleanup(),2*_branch1.alive(),__twig1a.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
+DLGLOBAL DEBUG test(_branch1){alive}: No more children
+DLGLOBAL DEBUG 4 (other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 6 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying(),root.child_gone())
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),root.destroying())
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG 2 (other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(other)
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 5 (other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 4 (other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 3 (other.cleanup(),_branch1.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 2 (other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG 1 (other.cleanup())
 DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 0 (-)
@@ -3301,183 +3083,170 @@
 DLGLOBAL DEBUG test(other){alive}: Received Event EV_DESTROY
 DLGLOBAL DEBUG 1 (other.alive())
 DLGLOBAL DEBUG test(other){alive}: alive(EV_DESTROY)
-DLGLOBAL DEBUG test(other){alive}: state_chg to destroying
-DLGLOBAL DEBUG 2 (other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(other){destroying}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
-DLGLOBAL DEBUG test(other){destroying}: pre_term()
-DLGLOBAL DEBUG 3 (other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup()
-DLGLOBAL DEBUG test(other){destroying}: scene forgets other
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[0] -> _branch0
+DLGLOBAL DEBUG test(other){alive}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
+DLGLOBAL DEBUG test(other){alive}: pre_term()
+DLGLOBAL DEBUG 2 (other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup()
+DLGLOBAL DEBUG test(other){alive}: scene forgets other
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[0] -> _branch0
 DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.other_gone())
 DLGLOBAL DEBUG test(_branch0){alive}: EV_OTHER_GONE: Dropped reference _branch0.other[0] = other
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG test(_branch0){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch0){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(_branch0){destroying}: pre_term()
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(_branch0){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig0b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0b){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0b){alive}: scene forgets __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
-DLGLOBAL DEBUG test(_branch0){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup(),_
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[1] = __twig0b
+DLGLOBAL DEBUG test(_branch0){alive}: still exists: child[0]
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0b.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),__twig0b.cleanup())
 DLGLOBAL DEBUG test(__twig0b){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0b){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG test(__twig0a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig0a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig0a){alive}: Removing from parent test(_branch0)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig0a){alive}: scene forgets __twig0a
 DLGLOBAL DEBUG test(__twig0a){alive}: removing reference __twig0a.other[0] -> other
-DLGLOBAL DEBUG test(other){destroying}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),o
-DLGLOBAL DEBUG test(other){destroying}: destroying(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),o
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),o
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_
-DLGLOBAL DEBUG test(_branch0){destroying}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
-DLGLOBAL DEBUG test(_branch0){destroying}: No more children
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup(),_
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: Received Event EV_OTHER_GONE
+DLGLOBAL DEBUG 5 (2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(other){alive}: alive(EV_OTHER_GONE)
+DLGLOBAL DEBUG 6 (2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup(),other.other_gone())
+DLGLOBAL DEBUG 5 (2*other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup(),_branch0.child_gone())
+DLGLOBAL DEBUG test(_branch0){alive}: EV_CHILD_GONE: Dropped reference _branch0.child[0] = __twig0a
+DLGLOBAL DEBUG test(_branch0){alive}: No more children
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch0.alive(),__twig0a.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),__twig0a.cleanup())
 DLGLOBAL DEBUG test(__twig0a){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(__twig0a){alive}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG test(_branch0){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch0){destroying}: scene forgets _branch0
+DLGLOBAL DEBUG test(_branch0){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch0){alive}: scene forgets _branch0
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),r
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),r
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive(),root.child_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[0] = _branch0
 DLGLOBAL DEBUG test(root){alive}: still exists: child[1]
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup(),r
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),_branch0.cleanup())
-DLGLOBAL DEBUG test(_branch0){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup(),root.alive())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),_branch0.cleanup())
+DLGLOBAL DEBUG test(_branch0){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter(),root.alive())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch0.alive(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
 DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive(),_branch0.destroying_onenter())
-DLGLOBAL DEBUG test(_branch0){destroying}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch0.alive())
-DLGLOBAL DEBUG 3 (other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: removing reference other.other[1] -> _branch1
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch0.alive())
+DLGLOBAL DEBUG test(_branch0){alive}: Deferring: will deallocate with test(other)
+DLGLOBAL DEBUG 2 (other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: removing reference other.other[1] -> _branch1
 DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.other_gone())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.other_gone())
 DLGLOBAL DEBUG test(_branch1){alive}: EV_OTHER_GONE: Dropped reference _branch1.other[0] = other
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG test(_branch1){alive}: state_chg to destroying
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(_branch1){destroying}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(_branch1){destroying}: pre_term()
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(_branch1){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig1b){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1b){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1b){alive}: scene forgets __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
-DLGLOBAL DEBUG test(_branch1){destroying}: still exists: child[0]
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup(),_
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[1] = __twig1b
+DLGLOBAL DEBUG test(_branch1){alive}: still exists: child[0]
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1b.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),__twig1b.cleanup())
 DLGLOBAL DEBUG test(__twig1b){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1b){alive}: Deferring: will deallocate with test(other)
 DLGLOBAL DEBUG test(__twig1a){alive}: Terminating in cascade, depth 3 (cause = OSMO_FSM_TERM_PARENT, caused by: test(other))
 DLGLOBAL DEBUG test(__twig1a){alive}: pre_term()
 DLGLOBAL DEBUG test(__twig1a){alive}: Removing from parent test(_branch1)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup()
 DLGLOBAL DEBUG test(__twig1a){alive}: scene forgets __twig1a
 DLGLOBAL DEBUG test(__twig1a){alive}: removing reference __twig1a.other[0] -> root
 DLGLOBAL DEBUG test(root){alive}: Received Event EV_OTHER_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
 DLGLOBAL DEBUG test(root){alive}: alive(EV_OTHER_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.other_gone())
 DLGLOBAL DEBUG test(root){alive}: EV_OTHER_GONE: Dropped reference root.other[0] = __twig1a
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
-DLGLOBAL DEBUG test(root){alive}: state_chg to destroying
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying_onenter() from alive
-DLGLOBAL DEBUG test(root){destroying}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
-DLGLOBAL DEBUG test(root){destroying}: pre_term()
-DLGLOBAL DEBUG test(_branch1){destroying}: Ignoring trigger to terminate: already terminating
-DLGLOBAL ERROR test(root){destroying}: Internal error while terminating child FSMs: a child FSM is stuck
-DLGLOBAL DEBUG 9 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
-DLGLOBAL DEBUG test(root){destroying}: cleanup()
-DLGLOBAL DEBUG test(root){destroying}: scene forgets root
-DLGLOBAL DEBUG test(root){destroying}: cleanup() done
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
-DLGLOBAL DEBUG test(root){destroying}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),r
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_
-DLGLOBAL DEBUG test(_branch1){destroying}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
-DLGLOBAL DEBUG test(_branch1){destroying}: No more children
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup(),_
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),__twig1a.cleanup())
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Terminating in cascade, depth 4 (cause = OSMO_FSM_TERM_REGULAR, caused by: test(other))
+DLGLOBAL DEBUG test(root){alive}: pre_term()
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL ERROR test(root){alive}: Internal error while terminating child FSMs: a child FSM is stuck
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive(),root.cleanup())
+DLGLOBAL DEBUG test(root){alive}: cleanup()
+DLGLOBAL DEBUG test(root){alive}: scene forgets root
+DLGLOBAL DEBUG test(root){alive}: cleanup() done
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Deferring: will deallocate with test(other)
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup(),_branch1.child_gone())
+DLGLOBAL DEBUG test(_branch1){alive}: EV_CHILD_GONE: Dropped reference _branch1.child[0] = __twig1a
+DLGLOBAL DEBUG test(_branch1){alive}: No more children
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),2*_branch1.alive(),__twig1a.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),__twig1a.cleanup())
 DLGLOBAL DEBUG test(__twig1a){alive}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
 DLGLOBAL DEBUG test(__twig1a){alive}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG test(_branch1){destroying}: Removing from parent test(root)
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup()
-DLGLOBAL DEBUG test(_branch1){destroying}: scene forgets _branch1
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),r
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG 8 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),r
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
-DLGLOBAL DEBUG test(root){destroying}: No more children
-DLGLOBAL DEBUG 7 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup(),r
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),_branch1.cleanup())
-DLGLOBAL DEBUG test(_branch1){destroying}: cleanup() done
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(root){destroying}: Received Event EV_CHILD_GONE
-DLGLOBAL DEBUG 6 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter(),root.destroying())
-DLGLOBAL DEBUG test(root){destroying}: destroying(EV_CHILD_GONE)
-DLGLOBAL DEBUG test(root){destroying}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
-DLGLOBAL DEBUG 5 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive(),_branch1.destroying_onenter())
-DLGLOBAL DEBUG test(_branch1){destroying}: Deferring: will deallocate with test(other)
-DLGLOBAL DEBUG 4 (other.alive(),other.destroying_onenter(),other.cleanup(),_branch1.alive())
-DLGLOBAL DEBUG 3 (other.alive(),other.destroying_onenter(),other.cleanup())
-DLGLOBAL DEBUG test(other){destroying}: cleanup() done
-DLGLOBAL DEBUG 2 (other.alive(),other.destroying_onenter())
-DLGLOBAL DEBUG test(other){destroying}: Deallocated, including all deferred deallocations
+DLGLOBAL DEBUG test(_branch1){alive}: Removing from parent test(root)
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup()
+DLGLOBAL DEBUG test(_branch1){alive}: scene forgets _branch1
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG 6 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive(),root.child_gone())
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE: Dropped reference root.child[1] = _branch1
+DLGLOBAL DEBUG test(root){alive}: No more children
+DLGLOBAL DEBUG 5 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: Ignoring trigger to terminate: already terminating
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),_branch1.cleanup())
+DLGLOBAL DEBUG test(_branch1){alive}: cleanup() done
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(root){alive}: Received Event EV_CHILD_GONE
+DLGLOBAL DEBUG 4 (other.alive(),other.cleanup(),_branch1.alive(),root.alive())
+DLGLOBAL DEBUG test(root){alive}: alive(EV_CHILD_GONE)
+DLGLOBAL DEBUG test(root){alive}: EV_CHILD_GONE with NULL data, must be a parent_term event. Ignore.
+DLGLOBAL DEBUG 3 (other.alive(),other.cleanup(),_branch1.alive())
+DLGLOBAL DEBUG test(_branch1){alive}: Deferring: will deallocate with test(other)
+DLGLOBAL DEBUG 2 (other.alive(),other.cleanup())
+DLGLOBAL DEBUG test(other){alive}: cleanup() done
 DLGLOBAL DEBUG 1 (other.alive())
+DLGLOBAL DEBUG test(other){alive}: Deallocated, including all deferred deallocations
 DLGLOBAL DEBUG 0 (-)
 DLGLOBAL DEBUG --- after destroy-event cascade:
 DLGLOBAL DEBUG --- all deallocated.