diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 4f484772fbba28e8c84f68f6692b1054ff49b3b7..f2c717241d750fd33322245a1cd63c4fbd401110 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1926,6 +1926,9 @@ static t_pd *do_create_ab(t_ab_definition *abdef, int argc, t_atom *argv)
     canvas_popabstraction((t_canvas *)(s__X.s_thing));
     canvas_setargs(0, 0);
 
+    canvas_vis((t_canvas *)newest, !glist_amreloadingabstractions 
+                                    && binbuf_getnatom(abdef->ad_source) == 3);
+
     return(newest);
 }
 
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index fb6cf734533ef0fd527f21baf81040b9c9ee1a22..c78cc7b14c0282181bfd0aa2ba9257bf9a0c7c30 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -1426,6 +1426,8 @@ void canvas_reload_ab_rec(t_canvas *x, t_ab_definition *a, t_gobj *e)
             }
             glist_select(x, g);
         }
+        else if(g == e)
+            canvas_initbang((t_canvas *)g);
         g = g->g_next;
     }
     if (found)
diff --git a/pd/src/g_readwrite.c b/pd/src/g_readwrite.c
index 2a37cedf74fd9cf76ff1dd29355d469940cbfcd6..9c591dbf8c1cbae251a7c4ba182964370fb01a04 100644
--- a/pd/src/g_readwrite.c
+++ b/pd/src/g_readwrite.c
@@ -1011,7 +1011,8 @@ static void canvas_menusaveas(t_canvas *x, t_floatarg fdestroy)
                 x2->gl_name->s_name : "title"),
             canvas_getdir(x2)->s_name,
             fdestroy != 0);
-    else canvas_save_ab(x2, fdestroy);
+    else if(x->gl_dirty)
+        canvas_save_ab(x2, fdestroy);
 }
 
 static void canvas_menusave(t_canvas *x, t_floatarg fdestroy)
@@ -1026,7 +1027,8 @@ static void canvas_menusave(t_canvas *x, t_floatarg fdestroy)
                 canvas_savetofile(x2, x2->gl_name, canvas_getdir(x2), fdestroy);
         else canvas_menusaveas(x2, fdestroy);
     }
-    else canvas_save_ab(x2, fdestroy);
+    else if(x->gl_dirty)
+        canvas_save_ab(x2, fdestroy);
 }
 
 static void canvas_menuprint(t_canvas *x)