diff --git a/src/m_pd.c b/src/m_pd.c
index 6fab5855f16fcb887532a3f65d4ec848a3d03fe7..45c08bd90a741357d28f24ebe2fa268ccc8bdfbb 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -177,63 +177,69 @@ static void bindlist_cleanup(t_bindlist *x)
 
 static void bindlist_bang(t_bindlist *x)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_bang(e->e_who);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
 static void bindlist_float(t_bindlist *x, t_float f)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_float(e->e_who, f);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
 static void bindlist_symbol(t_bindlist *x, t_symbol *s)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_symbol(e->e_who, s);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
 static void bindlist_pointer(t_bindlist *x, t_gpointer *gp)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_pointer(e->e_who, gp);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
 static void bindlist_list(t_bindlist *x, t_symbol *s,
     int argc, t_atom *argv)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_list(e->e_who, s, argc, argv);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
 static void bindlist_anything(t_bindlist *x, t_symbol *s,
     int argc, t_atom *argv)
 {
-	change_bindlist_via_graph = 1;
     t_bindelem *e;
+	change_bindlist_via_graph = 1;
     for (e = x->b_list; e; e = e->e_next)
         if (e->e_who != NULL) pd_typedmess(e->e_who, s, argc, argv);
-	bindlist_cleanup(x);
+	if (change_bindlist_via_graph > 1)
+		bindlist_cleanup(x);
 	change_bindlist_via_graph = 0;
 }
 
@@ -309,9 +315,10 @@ void pd_unbind(t_pd *x, t_symbol *s)
         t_bindelem *e, *e2;
         if ((e = b->b_list)->e_who == x)
         {
-			if (change_bindlist_via_graph)
+			if (change_bindlist_via_graph) {
+				change_bindlist_via_graph++;
 				e->e_who = NULL;
-			else {
+			} else {
             	b->b_list = e->e_next;
             	freebytes(e, sizeof(t_bindelem));
 			}
@@ -320,9 +327,10 @@ void pd_unbind(t_pd *x, t_symbol *s)
         else for (e = b->b_list; e2 = e->e_next; e = e2)
             if (e2->e_who == x)
         {
-			if (change_bindlist_via_graph) 
+			if (change_bindlist_via_graph) {
+				change_bindlist_via_graph++;
 				e2->e_who = NULL;
-			else {
+			} else {
 		        e->e_next = e2->e_next;
 		        freebytes(e2, sizeof(t_bindelem));
 			}