diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h
index c161a7af8261f89cdedc8b66da6bc4fa7e0b32dc..b4be1fa4b370344edad666011a8ae3537dbbd386 100644
--- a/pd/src/g_canvas.h
+++ b/pd/src/g_canvas.h
@@ -262,6 +262,8 @@ struct _glist
 #define gl_gobj gl_obj.te_g
 #define gl_pd gl_gobj.g_pd
 
+typedef void (*t_canvas_iterator)(t_canvas *x, void *data);
+
 /*-------------------universal preset stuff---------------------*/
 // for the universal preset_node ability (see g_editor.c doconnect/disconnect functions)
 // this is where all the classes capable of being controlled via preset should be defined
diff --git a/pd/src/g_clone.c b/pd/src/g_clone.c
index c58c33f3dbca45775e1279a10c30ad1d8335ec20..21963c81a7f4a5489ca11904c0a4124caeec02ef 100644
--- a/pd/src/g_clone.c
+++ b/pd/src/g_clone.c
@@ -75,6 +75,14 @@ int clone_match(t_pd *z, t_symbol *name, t_symbol *dir)
         canvas_getdir(x->x_vec[0].c_gl) == dir);
 }
 
+void clone_iterate(t_pd *z, t_canvas_iterator it, void* data)
+{
+    t_clone *x = (t_clone *)z;
+    int i;
+    for(i = 0; i < x->x_n; i++)
+        it(x->x_vec[i].c_gl, data);
+}
+
 int clone_isab(t_pd *z)
 {
     t_clone *x = (t_clone *)z;
@@ -89,22 +97,6 @@ int clone_matchab(t_pd *z, t_ab_definition *source)
     return (clone_isab(z) && x->x_vec[0].c_gl->gl_absource == source);
 }
 
-int clone_getncopies(t_pd *z)
-{
-    t_clone *x = (t_clone *)z;
-    return (x->x_n);
-}
-
-t_glist **clone_getglists(t_pd *z)
-{
-    t_clone *x = (t_clone *)z;
-    t_glist **glists = (t_glist *)getbytes(sizeof(t_glist *)*x->x_n);
-    int i;
-    for(i = 0; i < x->x_n; i++)
-        glists[i] = x->x_vec[i].c_gl;
-    return glists;
-}
-
 void obj_sendinlet(t_object *x, int n, t_symbol *s, int argc, t_atom *argv);
 
 static void clone_in_list(t_in *x, t_symbol *s, int argc, t_atom *argv)
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index bd1da84ddfe14d139262d52ce5781648132ff823..6a89835f42defc507a7bba43d809ca2cc76f789f 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -1313,6 +1313,15 @@ static void glist_doreload(t_glist *gl, t_symbol *name, t_symbol *dir,
             canvas_isabstraction((t_canvas *)g) &&
                 ((t_canvas *)g)->gl_name == name &&
                     canvas_getdir((t_canvas *)g) == dir);
+
+        if(remakeit && ((t_canvas *)g)->gl_dirty)
+        /* set dirty to 0 to remove the dirty markings*/
+        {
+            glist_amreloadingabstractions = 0;
+            canvas_dirty((t_canvas *)g, 0);
+            glist_amreloadingabstractions = 1;
+        }
+
             /* also remake it if it's a "clone" with that name */
         if (pd_class(&g->g_pd) == clone_class &&
             clone_match(&g->g_pd, name, dir))
@@ -1348,13 +1357,6 @@ static void glist_doreload(t_glist *gl, t_symbol *name, t_symbol *dir,
                 found = 1;
             }
             glist_select(gl, g);
-            if(((t_canvas *)g)->gl_dirty)
-            /* set dirty to 0 to remove the dirty markings*/
-            {
-                glist_amreloadingabstractions = 0;
-                canvas_dirty((t_canvas *)g, 0);
-                glist_amreloadingabstractions = 1;
-            }
             //canvas_setundo(gl, canvas_undo_cut,
             //    canvas_undo_set_cut(gl, UCUT_CLEAR), "clear");
             //canvas_undo_add(gl, 3, "clear",
@@ -1408,11 +1410,16 @@ void canvas_reload(t_symbol *name, t_symbol *dir, t_gobj *except)
     canvas_resume_dsp(dspwas);
 }
 
+typedef struct _reload_ab_data
+{
+    t_ab_definition *a;
+    t_gobj *e;
+} t_reload_ab_data;
 
+static void glist_doreload_ab_packed(t_canvas *x, t_reload_ab_data *data);
+void clone_iterate(t_pd *z, t_canvas_iterator it, void* data);
 int clone_isab(t_pd *z);
 int clone_matchab(t_pd *z, t_ab_definition *source);
-int clone_getncopies(t_pd *z);
-t_glist **clone_getglists(t_pd *z);
 
 /* recursive ab reload method */
 static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e)
@@ -1426,6 +1433,14 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e)
         remakeit = (g != e && pd_class(&g->g_pd) == canvas_class && canvas_isabstraction((t_canvas *)g)
             && ((t_canvas *)g)->gl_isab && ((t_canvas *)g)->gl_absource == a);
 
+        if(remakeit && ((t_canvas *)g)->gl_dirty)
+        /* set dirty to 0 to remove the dirty markings*/
+        {
+            glist_amreloadingabstractions = 0;
+            canvas_dirty((t_canvas *)g, 0);
+            glist_amreloadingabstractions = 1;
+        }
+
         remakeit = remakeit || (pd_class(&g->g_pd) == clone_class && clone_matchab(&g->g_pd, a));
 
         if(remakeit)
@@ -1437,13 +1452,6 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e)
                 found = 1;
             }
             glist_select(x, g);
-            if(((t_canvas *)g)->gl_dirty)
-            /* set dirty to 0 to remove the dirty markings*/
-            {
-                glist_amreloadingabstractions = 0;
-                canvas_dirty((t_canvas *)g, 0);
-                glist_amreloadingabstractions = 1;
-            }
         }
         else if(g == e)
             canvas_initbang((t_canvas *)g);
@@ -1465,17 +1473,20 @@ static void glist_doreload_ab(t_canvas *x, t_ab_definition *a, t_gobj *e)
         if(pd_class(&g->g_pd) == clone_class
             && clone_isab(&g->g_pd) && !clone_matchab(&g->g_pd, a))
         {
-            int numglists = clone_getncopies(&g->g_pd), j;
-            t_glist **glists = clone_getglists(&g->g_pd);
-            for(j = 0; j < numglists; j++)
-                glist_doreload_ab((t_canvas *)glists[j], a, e);
-            freebytes(glists, sizeof(t_glist *)*numglists);
+            t_reload_ab_data d;
+            d.a = a; d.e = e;
+            clone_iterate(&g->g_pd, glist_doreload_ab_packed, &d);
         }
 
         g = g->g_next;
     }
 }
 
+static void glist_doreload_ab_packed(t_canvas *x, t_reload_ab_data *data)
+{
+    glist_doreload_ab(x, data->a, data->e);
+}
+
 t_canvas *canvas_getrootfor_ab(t_canvas *x);
 
 /* reload ab instances */