diff --git a/src/g_canvas.c b/src/g_canvas.c
index 1615f84e2ee93e4d527e52bb562d3be96b2e2db3..aa06ac10ce51ea4a42de0baebe72abfc86b5f861 100644
--- a/src/g_canvas.c
+++ b/src/g_canvas.c
@@ -344,7 +344,7 @@ void glist_init(t_glist *x)
 }
 
 /* global var used by pd_new() to work with redundant memory, originally defined in m_pd.c */
-extern int canvas_check_duplicate;
+//extern int canvas_check_duplicate;
 
     /* make a new glist.  It will either be a "root" canvas or else
     it appears as a "text" object in another window (canvas_getcurrent() 
@@ -357,6 +357,7 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv)
 
 	//if (x->gl_owner && x->gl_env) {
 
+/*
 	t_redundant_mem *new_rm = (t_redundant_mem *)t_getbytes(sizeof(*new_rm));
 	//new_rm->rm_what = (int)getbytes(1);
 	if (rm_start == NULL) {
@@ -376,9 +377,10 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv)
 	}
 	//}
 
-	canvas_check_duplicate = -1;
+
+	canvas_check_duplicate = -1;*/
     t_canvas *x = (t_canvas *)pd_new(canvas_class);
-	rm_end->rm_canvas = x;
+	//rm_end->rm_canvas = x;
     t_canvas *owner = canvas_getcurrent();
     t_symbol *s = &s_;
     int vis = 0, width = GLIST_DEFCANVASWIDTH, height = GLIST_DEFCANVASHEIGHT;
@@ -919,6 +921,9 @@ void canvas_free(t_canvas *x)
     if (x == glist_getcanvas(x))
         canvas_vis(x, 0);
 
+	if (x->gl_editor)
+		canvas_destroy_editor(x);
+
     if (strcmp(x->gl_name->s_name, "Pd")) {
 		//fprintf(stderr,"canvas_free calling pd_unbind\n");
         pd_unbind(&x->gl_pd, canvas_makebindsym(x->gl_name));
diff --git a/src/g_canvas.h b/src/g_canvas.h
index 57a2ca893cf2f0ff7733b6c2dac2e6d568197f8f..c30b6da0303d1268add1f459425b2067f58b2b8a 100644
--- a/src/g_canvas.h
+++ b/src/g_canvas.h
@@ -45,8 +45,7 @@ extern "C" {
 	instantiated inside canvas_new since the bug only affects new
 	canvases/abstractions rather than individual objects. the queue
 	is destructed in m_glob.c quit call (when pd exits) */
-
-
+/*
 typedef struct _redundant_mem
 {
     //int rm_what;
@@ -56,7 +55,7 @@ typedef struct _redundant_mem
 
 t_redundant_mem *rm_start;
 t_redundant_mem *rm_end;
-
+*/
   
 /* --------------------- geometry ---------------------------- */
 #define IOWIDTH 7       /* width of an inlet/outlet in pixels */
diff --git a/src/m_pd.c b/src/m_pd.c
index dd9589cdd2639480c58b72fbee3fa88c6b54a1bb..951e8dd2b8275c6b420a24541d83612a0f0886fc 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -11,10 +11,11 @@
 
     /* FIXME no out-of-memory testing yet! */
 
-int canvas_check_duplicate = 0;
+/*int canvas_check_duplicate = 0;
 
 extern t_redundant_mem *rm_start;
 extern t_redundant_mem *rm_end;
+*/
 
 t_pd *pd_new(t_class *c)
 {
@@ -45,7 +46,7 @@ t_pd *pd_new(t_class *c)
 
 	//int random_extra = 0;
 	//int random_offset = 1;
-
+/*
 	while (canvas_check_duplicate != 0) {
 
 		if (canvas_check_duplicate == -1) {
@@ -78,21 +79,22 @@ t_pd *pd_new(t_class *c)
 		}
 
 		//fprintf(stderr,"done alloc %d\n", canvas_check_duplicate);
-		/*if (canvas_check_duplicate == 1) {
-			//fprintf(stderr,"duplicate\n");
-			if (!random_extra)
-				t_freebytes(x, sizeof(c->c_size));
-			else
-				t_freebytes(x, sizeof(c->c_size+random_extra));
-		}
-
-		if (!canvas_check_duplicate && random_extra) {
-			x = (t_pd *)t_resizebytes(x, c->c_size+random_extra, c->c_size);
-			break;
-		}*/
+		//if (canvas_check_duplicate == 1) {
+		//	//fprintf(stderr,"duplicate\n");
+		//	if (!random_extra)
+		//		t_freebytes(x, sizeof(c->c_size));
+		//	else
+		//		t_freebytes(x, sizeof(c->c_size+random_extra));
+		//}
+		//
+		//if (!canvas_check_duplicate && random_extra) {
+		//	x = (t_pd *)t_resizebytes(x, c->c_size+random_extra, c->c_size);
+		//	break;
+		//}
 	}
 
-    if (!x) x = (t_pd *)t_getbytes(c->c_size);
+    if (!x) x = (t_pd *)t_getbytes(c->c_size);*/
+	x = (t_pd *)t_getbytes(c->c_size);
     *x = c;
     if (c->c_patchable)
     {