diff --git a/src/g_editor.c b/src/g_editor.c
index 9191553fa90d3118d0a9ff4e366e1f898f4730f2..bf45c682510afe0eecf7bb29b2aa93d9b391de7e 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -1049,7 +1049,7 @@ void *canvas_undo_set_apply(t_canvas *x, int n)
 	if (!x->gl_edit)
 		canvas_editmode(x, 1);
 	obj = glist_nth(x, n);
-	if (!glist_isselected(x, obj))
+	if (obj && !glist_isselected(x, obj))
 		glist_select(x, obj);
     int nnotsel= glist_selectionindex(x, 0, 0); /* get number of all items for the offset below */
     buf = (t_undo_apply *)getbytes(sizeof(*buf));
diff --git a/src/g_graph.c b/src/g_graph.c
index 42bcfd9e02cfae6a836e6abaacaa46a07e9e4220..529ad5e783c284c94ce59b52f7db736e3724ac46 100644
--- a/src/g_graph.c
+++ b/src/g_graph.c
@@ -1052,19 +1052,11 @@ static void graph_displace_withtag(t_gobj *z, t_glist *glist, int dx, int dy)
 {
     t_glist *x = (t_glist *)z;
     if (!x->gl_isgraph)
-        text_widgetbehavior.w_displacefn(z, glist, dx, dy);
+        text_widgetbehavior.w_displacefnwtag(z, glist, dx, dy);
     else
     {
         x->gl_obj.te_xpix += dx;
         x->gl_obj.te_ypix += dy;
-		/*char tag[80];
-		sprintf(tag, "%s", rtext_gettag(glist_findrtext((x->gl_owner ? x->gl_owner: x), &x->gl_obj)));
-        sys_vgui(".x%lx.c move %s %d %d\n",
-            glist_getcanvas(x->gl_owner), tag, dx, dy);
-        sys_vgui(".x%lx.c move %sR %d %d\n",
-            glist_getcanvas(x->gl_owner), tag, dx, dy);*/
-        //glist_redraw(x);
-		//gobj_select(z, glist, 1);
         canvas_fixlinesfor(glist_getcanvas(glist), &x->gl_obj);
     }
 }
@@ -1092,16 +1084,23 @@ static void graph_displace(t_gobj *z, t_glist *glist, int dx, int dy)
 
 static void graph_select(t_gobj *z, t_glist *glist, int state)
 {
-	//fprintf(stderr,"graph_select\n");
+	//fprintf(stderr,"graph_select .x%lx...\n", (t_int)z);
     t_glist *x = (t_glist *)z;
     if (!x->gl_isgraph)
         text_widgetbehavior.w_selectfn(z, glist, state);
-    else if(glist_istoplevel(glist))
+    else //if(glist_istoplevel(glist))
     {
+		//fprintf(stderr,"...yes\n");
         t_rtext *y = glist_findrtext(glist, &x->gl_obj);
         if (canvas_showtext(x))
             rtext_select(y, state);
-        sys_vgui(".x%lx.c itemconfigure %sR -fill %s\n", glist, 
+		t_glist *canvas;
+		if (!glist_istoplevel(glist)) {
+			canvas = glist_getcanvas(glist);
+		} else {
+			canvas = glist;
+		}
+        sys_vgui(".x%lx.c itemconfigure %sR -fill %s\n", canvas, 
                  rtext_gettag(y), (state? "$select_color" : "$graph_outline"));
 /*
         sys_vgui(".x%lx.c itemconfigure graph%lx -fill %s\n",
@@ -1109,13 +1108,13 @@ static void graph_select(t_gobj *z, t_glist *glist, int state)
                  (state? "$select_color" : "$graph_outline"));
 */
         sys_vgui(".x%lx.c itemconfigure %s -fill %s\n",
-                 glist, rtext_gettag(y), 
+                 canvas, rtext_gettag(y), 
                  (state? "$select_color" : "black"));
 		t_gobj *g;
 		if (x->gl_list)
 			for (g = x->gl_list; g; g = g->g_next)
 				gobj_select(g, x, state);
-		sys_vgui("pdtk_select_all_gop_widgets .x%lx %s %d\n", glist, rtext_gettag(glist_findrtext(glist, &x->gl_obj)), state);
+		sys_vgui("pdtk_select_all_gop_widgets .x%lx %s %d\n", canvas, rtext_gettag(glist_findrtext(glist, &x->gl_obj)), state);
     }
 }
 
diff --git a/src/g_scalar.c b/src/g_scalar.c
index 0896eec172b44aba84859ba97ccf00f1ff154475..b6a7e19cdbaa1e6ef9223351b81d293361b1fe8f 100644
--- a/src/g_scalar.c
+++ b/src/g_scalar.c
@@ -204,7 +204,7 @@ static void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
         scalar_getrect(&x->sc_gobj, glist, &x1, &y1, &x2, &y2);
         x1--; x2++; y1--; y2++;
         sys_vgui(".x%lx.c create line %d %d %d %d %d %d %d %d %d %d \
-            -width 0 -fill $select_color -tags select%lx\n",
+            -width 0 -fill $select_color -tags {select%lx selected}\n",
                 glist_getcanvas(glist), x1, y1, x1, y2, x2, y2, x2, y1, x1, y1,
                 x);
     }
diff --git a/src/g_template.c b/src/g_template.c
index c6dcadd3f002fd32716205dbb8c8e1a4a614a844..e7279d92b3c3a89e0a2d03bfc6d028a2ba92b364 100644
--- a/src/g_template.c
+++ b/src/g_template.c
@@ -1173,14 +1173,16 @@ static void curve_vis(t_gobj *z, t_glist *glist,
                 fill, outline);
             else sys_vgui("-fill %s\\\n", outline);
             if (flags & BEZ) sys_vgui("-smooth 1\\\n");
-            sys_vgui("-tags curve%lx\n", data);
+            sys_vgui("-tags .x%lx%s.curve%lx\n", glist_getcanvas(glist), 
+				(glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))),data);
         }
         else post("warning: curves need at least two points to be graphed");
     }
     else
     {
-        if (n > 1) sys_vgui(".x%lx.c delete curve%lx\n",
-            glist_getcanvas(glist), data);      
+        if (n > 1) sys_vgui(".x%lx.c delete .x%lx%s.curve%lx\n",
+            glist_getcanvas(glist), glist_getcanvas(glist), 
+			(glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))),data);      
     }
 }
 
@@ -1646,6 +1648,7 @@ static void plot_vis(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int tovis)
 {
+	//fprintf(stderr,"plot_vis %lx %lx %lx %s\n", (t_int)z, (t_int)glist, (t_int)glist_getcanvas(glist), rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj)));
     t_plot *x = (t_plot *)z;
     int elemsize, yonset, wonset, xonset, i;
     t_canvas *elemtemplatecanvas;
@@ -1717,13 +1720,14 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                 {
 					//we subtract 1 from y to keep it in sync with the rest of the types of templates
                     sys_vgui(
-".x%lx.c create rectangle %d %d %d %d -fill black -width 0  -tags plot%lx\n",
+".x%lx.c create rectangle %d %d %d %d -fill black -width 0  -tags .x%lx%s.plot%lx\n",
                         glist_getcanvas(glist),
                         ixpix, (int)glist_ytopixels(glist, 
                             basey + fielddesc_cvttocoord(yfielddesc, minyval)) - 1,
                         inextx, (int)(glist_ytopixels(glist, 
                             basey + fielddesc_cvttocoord(yfielddesc, maxyval))
-                                + linewidth) - 1, data);
+                                + linewidth) - 1, glist_getcanvas(glist), 
+						(glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);
                     ndrawn++;
                     minyval = 1e20;
                     maxyval = -1e20;
@@ -1816,7 +1820,8 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                     outline, outline);
                 if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n");
 
-                sys_vgui("-tags plot%lx\n", data);
+                sys_vgui("-tags .x%lx%s.plot%lx\n", glist_getcanvas(glist), 
+					(glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);
             }
             else if (linewidth > 0)
             {
@@ -1859,7 +1864,7 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                 sys_vgui("-fill %s\\\n", outline);
                 if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n");
 
-                sys_vgui("-tags plot%lx\n", data);
+                sys_vgui("-tags .x%lx%s.plot%lx\n", glist_getcanvas(glist), (glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);
             }
         }
             /* We're done with the outline; now draw all the points.
@@ -1911,8 +1916,8 @@ static void plot_vis(t_gobj *z, t_glist *glist,
             }
         }
             /* and then the trace */
-        sys_vgui(".x%lx.c delete plot%lx\n",
-            glist_getcanvas(glist), data);      
+        sys_vgui(".x%lx.c delete .x%lx%s.plot%lx\n",
+            glist_getcanvas(glist), glist_getcanvas(glist), (glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);      
     }
 }
 
@@ -2139,9 +2144,11 @@ static void drawnumber_vis(t_gobj *z, t_glist *glist,
                 glist_getcanvas(glist), xloc, yloc, colorstring, buf);
         sys_vgui(" -font {{%s} %d %s}", sys_font,
 				 sys_hostfontsize(glist_getfont(glist)), sys_fontweight);
-        sys_vgui(" -tags drawnumber%lx\n", data);
+        sys_vgui(" -tags .x%lx%s.drawnumber%lx\n", 
+			glist_getcanvas(glist), (glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);
     }
-    else sys_vgui(".x%lx.c delete drawnumber%lx\n", glist_getcanvas(glist), data);
+    else sys_vgui(".x%lx.c delete .x%lx%s.drawnumber%lx\n", glist_getcanvas(glist), 
+		glist_getcanvas(glist), (glist_istoplevel(glist) ? "bogus" : rtext_gettag(glist_findrtext(glist_getcanvas(glist), &glist->gl_obj))), data);
 }
 
 static t_float drawnumber_motion_ycumulative;
diff --git a/src/g_text.c b/src/g_text.c
index 0d57d6302dad0c69372f6703ab1b32918e9e1187..23c54a35de41917bff14059219417612b232b674 100644
--- a/src/g_text.c
+++ b/src/g_text.c
@@ -1150,6 +1150,7 @@ static void text_getrect(t_gobj *z, t_glist *glist,
 static void text_displace(t_gobj *z, t_glist *glist,
     int dx, int dy)
 {
+	//fprintf(stderr,"text_displace\n");
     t_text *x = (t_text *)z;
     x->te_xpix += dx;
     x->te_ypix += dy;
@@ -1166,14 +1167,15 @@ static void text_displace(t_gobj *z, t_glist *glist,
 static void text_displace_withtag(t_gobj *z, t_glist *glist,
     int dx, int dy)
 {
+	//fprintf(stderr,"text_displace_withtag\n");
     t_text *x = (t_text *)z;
     x->te_xpix += dx;
     x->te_ypix += dy;
     if (glist_isvisible(glist))
     {
         t_rtext *y = glist_findrtext(glist, x);
-        text_drawborder_withtag(x, glist, rtext_gettag(y),
-            rtext_width(y), rtext_height(y), 0);
+        //text_drawborder_withtag(x, glist, rtext_gettag(y),
+        //    rtext_width(y), rtext_height(y), 0);
         canvas_fixlinesfor(glist_getcanvas(glist), x);
 		/*if this is a subpatcher in which case we may be possibly moving nlets around
 		  which in turn requires that we redraw parent's nlets */
diff --git a/src/pd.tk b/src/pd.tk
index 466297293935a92c85bea36926eecd7dedcfe51d..cf9cb19dde937bf40ccb6d9f6533a12e045a7a27 100644
--- a/src/pd.tk
+++ b/src/pd.tk
@@ -2897,7 +2897,7 @@ proc pdtk_canvas_mouseup {name x y b} {
 #}
 
 proc pdtk_select_all_gop_widgets {name gop state} {
-	#puts stderr "======================$name"
+	#puts stderr "======================$name $gop"
 	foreach item [$name.c find all] {
 		#puts stderr [$name.c gettags $item]
 		foreach tag [$name.c gettags $item] {