diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index a2162894e4ad22703a149ef8f31082e8350c3e34..760113de3bfc8358e49111ee050b72f50d9b890e 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -91,6 +91,8 @@ void glist_delete(t_glist *x, t_gobj *y)
 		t_canvas *canvas = glist_getcanvas(x);
 		int drawcommand = class_isdrawcommand(y->g_pd);
 		int wasdeleting;
+		t_rtext *rt = NULL;
+		int late_rtext_free = 0;
 
 		if (pd_class(&y->g_pd) == canvas_class) {
 		  /* JMZ: send a closebang to the canvas */
@@ -136,11 +138,24 @@ void glist_delete(t_glist *x, t_gobj *y)
 		        glist_getcanvas(x)->gl_name)), 2);
 		if (glist_isvisible(canvas))
 		    gobj_vis(y, x, 0);
-		if (x->gl_editor && (ob = pd_checkobject(&y->g_pd)))
+		if (x->gl_editor && (ob = pd_checkobject(&y->g_pd))) {
 		    //rtext_new(x, ob);
-			rtext_free(glist_findrtext(x, ob));
+			rt = glist_findrtext(x, ob);
+			if (rt) {
+				if (pd_class(&y->g_pd) != canvas_class) {
+					//fprintf(stderr,"glist_delete calls rtext_free %lx %d %d %d\n",
+						//glist_findrtext(x, ob),
+						//(pd_class(&y->g_pd) != canvas_class ? 1 : 0),
+						//(!x->gl_isgraph ? 1 : 0),
+						//(!x->gl_owner ? 1 : 0));
+					  rtext_free(rt);
+				} else {
+					late_rtext_free = 1;
+				}
+			}
+		}
 		if (x->gl_list == y) {
-			if (y->g_next)		
+			if (y->g_next)
 				x->gl_list = y->g_next;
 			else
 				x->gl_list = NULL;
@@ -163,6 +178,10 @@ void glist_delete(t_glist *x, t_gobj *y)
 		        glist_getcanvas(x)->gl_name)), 1);
 		canvas_setdeleting(canvas, wasdeleting);
 		x->gl_valid = ++glist_valid;
+		if (late_rtext_free) {
+			fprintf(stderr,"glist_delete late_rtext_free\n");
+			rtext_free(rt);
+		}
 	}
 }