diff --git a/pd/src/g_array.c b/pd/src/g_array.c
index 9d7dd780925c0ff9edda44afbbdbb302260cf4f6..ebf6f7c352750e87718059bdc577bcd5d68105a6 100644
--- a/pd/src/g_array.c
+++ b/pd/src/g_array.c
@@ -94,7 +94,7 @@ void array_resize(t_array *x, int n)
 
 static void array_resize_and_redraw(t_array *array, t_glist *glist, int n)
 {
-    fprintf(stderr,"array_resize_and_redraw\n");
+    //fprintf(stderr,"array_resize_and_redraw\n");
     t_array *a2 = array;
     int vis = glist_isvisible(glist);
     while (a2->a_gp.gp_stub->gs_which == GP_ARRAY)
@@ -273,29 +273,75 @@ int garray_joc(t_garray *x)
     return (x->x_joc);
 }
 
-    /* if there is one garray in a graph, reset the graph's coordinates
+    /* helper function for fittograph to see if the same GOP has multiple
+        arrays in which case take length of the largest one */
+static int garray_get_largest_array(t_garray *x)
+{
+    t_gobj *g;
+    t_array *a;
+    int an = 0;
+    int length = 0;
+    for (g = x->x_glist->gl_list; g; g = g->g_next)
+    {
+        if (pd_class(&g->g_pd) == garray_class)
+        {
+            a = garray_getarray((t_garray *)g);
+            //if ((t_garray *)g != x)
+            //{
+            //    an = (x->x_style == PLOTSTYLE_POINTS
+            //        || x->x_style == PLOTSTYLE_BARS
+            //        || a->a_n == 1 ? a->a_n : a->a_n-1);
+            //    if (an > length)
+            //        length = an;               
+            //}
+            //else
+            //{
+                a = garray_getarray((t_garray *)g);
+                if (a->a_n > length)
+                    length = a->a_n;
+            //}
+        }
+    }
+    return(length);
+}
+
+    /* reset the graph's coordinates
         to fit a new size and style for the garray */
-    // flag options -1 = don't resize or redraw, 0 = resize, 1 = resize and redraw
+    /* in pd-l2ork we use this for all situations, both one or more
+        arrays to ensure that they are always drawn within boundaries. */
+    /* flag options:
+        -1 = don't resize or redraw, just send bounds message to scalars
+         0 = bounds, and also resize
+         1 = bounds, resize, and redraw */
 void garray_fittograph(t_garray *x, int n, int flag)
 {
-    //fprintf(stderr,"garray_fittograph %d %d\n", n, flag);
+    int max_length = garray_get_largest_array(x);
+    fprintf(stderr,"garray_fittograph n=%d flag=%d | max_length=%d\n", n, flag, max_length);
     // here we check for x->x_glist validity because when creating
     // a new array from the menu gl is null at the first garray_vis call
     if (!x->x_glist)
         return;
     t_array *array = garray_getarray(x);
+    t_garray *tmp;
     t_glist *gl = x->x_glist;
-    if (gl->gl_list == &x->x_gobj && !x->x_gobj.g_next)
+    //if (gl->gl_list == &x->x_gobj && !x->x_gobj.g_next)
+
+    t_gobj *g;
+    for (g = gl->gl_list; g; g = g->g_next)
     {
-        //fprintf(stderr,"loop\n");
-        vmess(&gl->gl_pd, gensym("bounds"), "ffff",
-            0., gl->gl_y1, (double)
-                (x->x_style == PLOTSTYLE_POINTS || x->x_style == PLOTSTYLE_BARS
-                    || n == 1 ? n : n-1),
-                    gl->gl_y2);
-                /* close any dialogs that might have the wrong info now... 
-                TODO: make changes dynamic to avoid this as it causes Apply to
-                close the properties which is annoying */
+        if (pd_class(&g->g_pd) == garray_class)
+        {
+            //fprintf(stderr,"found array\n");
+            tmp = (t_garray *)g;
+            vmess(&gl->gl_pd, gensym("bounds"), "ffff",
+                0., gl->gl_y1, (double)
+                    (tmp->x_style == PLOTSTYLE_POINTS || tmp->x_style == PLOTSTYLE_BARS
+                        || max_length == 1 ? max_length : max_length-1),
+                        gl->gl_y2);
+        }
+        /* close any dialogs that might have the wrong info now... 
+        TODO: make changes dynamic to avoid this as it causes Apply to
+        close the properties which is annoying */
         gfxstub_deleteforkey(gl);
     }
     if (flag >= 0)
@@ -1279,13 +1325,11 @@ static void garray_vis(t_gobj *z, t_glist *glist, int vis)
         int n = (x->x_style == PLOTSTYLE_POINTS ||
             x->x_style == PLOTSTYLE_BARS || ne == 1 ? ne : ne-1);
         //fprintf(stderr,"garray_vis glist->gl_x2=%g n=%d a->a_n=%d\n", glist->gl_x2, n, a->a_n);
-        if (glist->gl_x2 != n) {
-            glist->gl_x2 = n;
-            // this causes infinite recursion when changing array size from dialog
-            do_not_redraw = 1;
-            garray_fittograph(x, n, 0);
-            do_not_redraw = 0;
-        }
+        //if (glist->gl_x2 != n) {
+        glist->gl_x2 = n;
+        do_not_redraw = 1;
+        garray_fittograph(x, n, -1);
+        do_not_redraw = 0;
     }
     gobj_vis(&x->x_scalar->sc_gobj, glist, vis);
     //if (((t_glist *)z)->gl_isgraph)
diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index ccbd5d3530e3b2e3b10136341769db97ae1e41d5..914becbd5c9e056119ecbede5c0308a168210de1 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -607,8 +607,8 @@ static void graph_bounds(t_glist *x, t_floatarg x1, t_floatarg y1,
         x->gl_x2 = x2;
         x->gl_y1 = y1;
         x->gl_y2 = y2;
-        //if (!do_not_redraw)
-        glist_redraw(x);
+        if (!do_not_redraw)
+            glist_redraw(x);
     }
 }
 
diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index 6508bc1c53f065b5a5fea03675eea875fd0eff71..8e4e1e74b925ec82258554bd0db6f2d0195a53ec 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -4197,6 +4197,7 @@ proc pdtk_canvas_mouseup {name x y b} {
 # we use this to ensure that all gop children are selected for
 # optimized displace and other operations without having to redraw
 # canvas on every operation
+# (this could be further improved by using &&)
 proc pdtk_select_all_gop_widgets {name gop state} {
 	#puts stderr "pdtk_select_all_gop_widgets $name $gop $state"
 	foreach item [$name.c find all] {