diff --git a/ext/fox16/FXRuby.cpp b/ext/fox16/FXRuby.cpp
index 8f5e7dd633a2df60aea3a0b846ce21d7e64eecd0..faf67c682dd6f0b64c8cb5973600647200d005e0 100644
--- a/ext/fox16/FXRuby.cpp
+++ b/ext/fox16/FXRuby.cpp
@@ -1536,7 +1536,7 @@ FXwchar FXRbCallWCharMethod(const FXObject* recv, ID func){
 FXRbMenuCommand::~FXRbMenuCommand(){
   FXAccelTable *table;
   FXWindow *owner;
-  if(acckey){
+  if(acckey && !FXRbIsInGC(this)){
     owner=getShell()->getOwner();
     if(owner){
       table=owner->getAccelTable();
@@ -1552,7 +1552,7 @@ FXRbMenuCommand::~FXRbMenuCommand(){
 FXRbMenuCheck::~FXRbMenuCheck(){
   FXAccelTable *table;
   FXWindow *owner;
-  if(acckey){
+  if(acckey && !FXRbIsInGC(this)){
     owner=getShell()->getOwner();
     if(owner){
       table=owner->getAccelTable();
@@ -1568,7 +1568,7 @@ FXRbMenuCheck::~FXRbMenuCheck(){
 FXRbMenuRadio::~FXRbMenuRadio(){
   FXAccelTable *table;
   FXWindow *owner;
-  if(acckey){
+  if(acckey && !FXRbIsInGC(this)){
     owner=getShell()->getOwner();
     if(owner){
       table=owner->getAccelTable();
diff --git a/ext/fox16/markfuncs.cpp b/ext/fox16/markfuncs.cpp
index 87b75f609b137391bde31498760f16a99d2aeb12..040ea3b81263b492537b11a38350b127332b20c2 100644
--- a/ext/fox16/markfuncs.cpp
+++ b/ext/fox16/markfuncs.cpp
@@ -53,9 +53,16 @@ void FXRbObject::markfunc(FXObject* obj){
   FXTRACE((100,"%s::markfunc(%p)\n",obj?obj->getClassName():"FXRbObject",obj));
   }
 
-static void FXRbSetInGCRecursive(FXWindow *window, bool enabled){
+static void FXRbSetInGCParentsRecursive(FXWindow *window, bool enabled){
   FXRbSetInGC( window, true );
-  if(window->getParent()) FXRbSetInGCRecursive( window->getParent(), enabled );
+  if(window->getParent()) FXRbSetInGCParentsRecursive( window->getParent(), enabled );
+  }
+
+static void FXRbSetInGCChildrenRecursive(FXWindow *window, bool enabled){
+  FXRbSetInGC( window, true );
+  for(FXWindow* child=window->getFirst(); child; child=child->getNext()){
+    FXRbSetInGCChildrenRecursive( child, enabled );
+    }
   }
 
 
@@ -78,9 +85,9 @@ void FXRbObject::freefunc(FXObject* self){
       // The parent window should also be scheduled to be free'd. In the other case,
       // the child window would have been marked as used.
       if(self->isMemberOf(FXMETACLASS(FXWindow))){
-        if(FXWindow *parent = dynamic_cast<FXWindow*>(self)->getParent()){
-          FXRbSetInGCRecursive( parent, true );
-          }
+        FXWindow *window = dynamic_cast<FXWindow*>(self);
+        FXRbSetInGCParentsRecursive( window, true );
+        FXRbSetInGCChildrenRecursive( window, true );
         }
       delete self;
       }