diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index 04255eb7be3849059952fc2c8e4b7761388ba7e0..6f2ed069119c03cab3c4f1dc47f5775c3db22c04 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -570,7 +570,7 @@ static void scalar_doredraw(t_gobj *client, t_glist *glist)
 		//fprintf(stderr,"yes\n");
 		sys_vgui("pdtk_select_all_gop_widgets .x%lx %lx %d\n", glist_getcanvas(glist), glist, 1);
 	}
-    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", glist);
+    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", glist_getcanvas(glist));
 }
 
 void scalar_redraw(t_scalar *x, t_glist *glist)
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index f539941f3426ff0692282c91504d690850df9206..c83d10166d50e4c8f571c4ae1722f84b434b5131 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1237,6 +1237,9 @@ void draw_doupdate(t_draw *x, t_canvas *c, t_symbol *s)
 {
     t_gobj *g;
     t_template *template;
+    t_canvas *visible = c;
+    while(visible->gl_isgraph && visible->gl_owner)
+        visible = visible->gl_owner;
     int isgroup = (x->x_drawtype == gensym("group"));
     for (g = c->gl_list; g; g = g->g_next)
     {
@@ -1248,9 +1251,6 @@ void draw_doupdate(t_draw *x, t_canvas *c, t_symbol *s)
         {
             t_word *data = ((t_scalar *)g)->sc_vec;
             char str[MAXPDSTRING];
-            t_canvas *visible = c;
-            while(visible->gl_isgraph && visible->gl_owner)
-                visible = visible->gl_owner;
             if (s == gensym("fill"))
             {
                 char *fill;
@@ -1341,13 +1341,12 @@ void draw_doupdate(t_draw *x, t_canvas *c, t_symbol *s)
                 sys_vgui(".x%lx.c itemconfigure .draw%lx.%lx %s\n",
                    visible, x, data, str);
             }
+            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", visible);
         }
         if (g->g_pd == canvas_class) {
             draw_doupdate(x, (t_glist *)g, s);
-            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (t_glist *)g);
         }
     }
-    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", c);
 }
 
 extern t_canvas *canvas_list;
@@ -1718,6 +1717,9 @@ void draw_doupdatetransform(t_draw *x, t_canvas *c)
     draw_mset(mtx2, 0, 0, 0, 0, 0, 0);
     t_gobj *g;
     t_template *template;
+    t_canvas *visible = c;
+    while(visible->gl_isgraph && visible->gl_owner)
+        visible = visible->gl_owner;
 
     /* we'll probably get a different bbox now, so we
        will calculate a new one the next time we call
@@ -1739,9 +1741,6 @@ void draw_doupdatetransform(t_draw *x, t_canvas *c)
             t_float m1, m2, m3, m4, m5, m6;
             draw_parsetransform(x, template, ((t_scalar *)g)->sc_vec,
                 &m1, &m2, &m3, &m4, &m5, &m6);
-            t_canvas *visible = c;
-            while(visible->gl_isgraph && visible->gl_owner)
-                visible = visible->gl_owner;
             if (x->x_drawtype == gensym("group"))
                 sys_vgui(".x%lx.c itemconfigure .dgroup%lx -matrix "
                     "{ {%g %g} {%g %g} {%g %g} }\n",
@@ -1759,13 +1758,12 @@ void draw_doupdatetransform(t_draw *x, t_canvas *c)
                 scalar_drawselectrect((t_scalar *)g, c, 0);
                 scalar_drawselectrect((t_scalar *)g, c, 1);
             }
+            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", visible);
         }
         if (g->g_pd == canvas_class) {
             draw_doupdatetransform(x, (t_glist *)g);
-            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (t_glist *)g);
         }
     }
-    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", c);
 }
 
 void draw_queueupdatetransform(t_gobj *g, t_glist *glist)
diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index 7ebbe165c59d8241add1562edcb74120c4ef2278..fdb2ea3bce7c2be28992d18e530c926c6b97ac55 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -3406,12 +3406,13 @@ proc pdtk_canvas_new {name width height geometry editable} {
 	set ::canvasheight($name) 0
 }
 
+set SCROLL_OPACITY 0.33
 set HSCROLL_PAD_L 6
 set HSCROLL_PAD_R 13
 set VSCROLL_PAD_U 6
 set VSCROLL_PAD_D 13
 set SCROLL_PAD_EDGE 5
-set SCROLL_THICKNESS 5
+set SCROLL_THICKNESS 6
 set scrollbar_color "#555"
 
 proc pdtk_canvas_draw_scrollbars {name} {
@@ -3423,6 +3424,7 @@ proc pdtk_canvas_draw_scrollbars {name} {
 	global VSCROLL_PAD_D
 	global SCROLL_PAD_EDGE
 	global SCROLL_THICKNESS
+	global SCROLL_OPACITY
 	set name [string trimright $name .c]
 	catch {
 		$name.c delete xscroll
@@ -3440,7 +3442,7 @@ proc pdtk_canvas_draw_scrollbars {name} {
 			set scrolly1 [expr [$name.c canvasy 0] + [winfo height $name.c] - $SCROLL_PAD_EDGE]
 			set scrollx2 [expr $scrollx1 + $width]
 			#puts stderr "$vx1 $vx2 $npix $width $loffset $scrollx1 $scrollx2"
-			set hscroll [$name.c create polyline $scrollx1 $scrolly1 $scrollx2 $scrolly1 -stroke $scrollbar_color -strokewidth $SCROLL_THICKNESS -strokeopacity 0.25 -tags xscroll -strokelinecap round]
+			set hscroll [$name.c create polyline $scrollx1 $scrolly1 $scrollx2 $scrolly1 -stroke $scrollbar_color -strokewidth $SCROLL_THICKNESS -strokeopacity $SCROLL_OPACITY -tags xscroll -strokelinecap round]
 			$name.c addtag noscroll withtag xscroll
 			#$name.c bind $hscroll <Button-1> {pdtk_canvas_scroll_horizontal_click %W %x %y %b 0}
 			$name.c bind $hscroll <Enter> {pdtk_canvas_enter_scrollbar %W %x %y}
@@ -3460,7 +3462,7 @@ proc pdtk_canvas_draw_scrollbars {name} {
 			set scrolly1 [expr [$name.c canvasy 0] + $VSCROLL_PAD_U +$toffset]
 			set scrolly2 [expr $scrolly1 + $height]
 			#puts stderr "$vy1 $vy2 $npix $height $toffset $scrolly1 $scrolly2"
-			set vscroll [$name.c create polyline $scrollx1 $scrolly1 $scrollx1 $scrolly2 -stroke $scrollbar_color -strokewidth $SCROLL_THICKNESS -strokeopacity 0.25 -tags yscroll -strokelinecap round]
+			set vscroll [$name.c create polyline $scrollx1 $scrolly1 $scrollx1 $scrolly2 -stroke $scrollbar_color -strokewidth $SCROLL_THICKNESS -strokeopacity $SCROLL_OPACITY -tags yscroll -strokelinecap round]
 			$name.c addtag noscroll withtag yscroll
 			#$name.c bind $vscroll <Button-1> {pdtk_canvas_scroll_vertical_click %W %x %y %b 0}
 			$name.c bind $vscroll <Enter> {pdtk_canvas_enter_scrollbar %W %x %y}
@@ -4204,11 +4206,13 @@ proc pdtk_canvas_do_getscroll {name} {
     global pdtk_canvas_mouseup_ymaxval
 	#global ::update_tick([winfo parent $name])
 
-	#puts stderr "pdtk_canvas_getscroll $name"
-
     # kludge since this gets called sometimes after a canvas is destroyed
     if {![winfo exists $name]} {return}
 
+    set parentname [winfo parent $name]
+    #puts stderr "pdtk_canvas_getscroll $name $::scroll($parentname)"
+	if {$::scroll($parentname) == 0} {return}
+
     # for use with tick mechanism
 	#if {$::update_tick([winfo parent $name]) == 1} {return}
 	#after 100 set ::update_tick([winfo parent $name]) 0
@@ -4303,8 +4307,6 @@ proc pdtk_canvas_do_getscroll {name} {
 
 	#puts stderr "$x1 $x2 $y1 $y2"
 
-	set parentname [winfo parent $name]
-
 	if {$x1 != 1.0e30} {
 
 		set xminval 0