diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index d81d9110819f3409b7b1db5253593e2a1ef528b2..5f18f75e256ed8d8aeea0dff67adcfb00775b03f 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1023,9 +1023,6 @@ void canvas_free(t_canvas *x)
 {
     //fprintf(stderr,"canvas_free %lx\n", (t_int)x);
 
-    if(x->gl_dirty)
-        canvas_dirtyclimb(x, 0);
-
     t_gobj *y;
     int dspstate = canvas_suspend_dsp();
 
diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index 7f806a721942d12811177f6bdba77f15b2e558a6..70c8b04f9ab8e103ec88bfa48cb41fe69e7541b6 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -162,6 +162,9 @@ void glist_delete(t_glist *x, t_gobj *y)
           /* if we are a group, let's call ourselves a drawcommand */
           if (((t_canvas *)y)->gl_svg)
               drawcommand = 1;
+
+            if(((t_canvas *)y)->gl_dirty)
+                canvas_dirtyclimb((t_canvas *)y, 0);
         }
      
         wasdeleting = canvas_setdeleting(canvas, 1);
diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index 6c875164c9ca8ffcaa0423aa8571fc642f4f7a8e..d50b275dbaac6eee4262e437fe7108dd1a980aee 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -2127,9 +2127,9 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis)
                 if(pd_class(&x->te_pd) == canvas_class)
                 {
                     if (((t_canvas *)x)->gl_dirty)
-                        gobj_dirty(x, glist, 1);
+                        gobj_dirty(&x->te_g, glist, 1);
                     else if (((t_canvas *)x)->gl_subdirties)
-                        gobj_dirty(x, glist, 2);
+                        gobj_dirty(&x->te_g, glist, 2);
                 }
             }
         }