diff --git a/src/g_editor.c b/src/g_editor.c
index 1da6418e40d67e2eaa9605197f804ddc388b9812..71e027727f7375bfdd2f5410b56e99683ac830c9 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -3706,12 +3706,19 @@ static t_binbuf *canvas_docopy(t_canvas *x)
     return (b);
 }
 
+static void canvas_reset_copyfromexternalbuffer(t_canvas *x)
+{
+	copyfromexternalbuffer = 0;
+}
+
+int abort_when_pasting_from_external_buffer = 0;
+
 static void canvas_copyfromexternalbuffer(t_canvas *x, t_symbol *s, int ac, t_atom *av)
 {
 	if (!x->gl_editor)
 		return;
 
-	if (ac == 0) {
+	if (!ac && !copyfromexternalbuffer) {
 		//fprintf(stderr,"init\n");
 		copyfromexternalbuffer = 1;
 		screenx1 = 0;
@@ -3721,12 +3728,13 @@ static void canvas_copyfromexternalbuffer(t_canvas *x, t_symbol *s, int ac, t_at
 		copiedfont = 0;
 		binbuf_free(copy_binbuf);
 		copy_binbuf = binbuf_new();
-	} else if (copyfromexternalbuffer) {
+	} else if (ac && copyfromexternalbuffer) {
 		//fprintf(stderr,"fill %d\n", ac);
-		if (av[0].a_type == A_SYMBOL && strcmp(av[0].a_w.w_symbol->s_name, "#N")) {
+		if (av[0].a_type == A_SYMBOL && strcmp(av[0].a_w.w_symbol->s_name, "#N") || copyfromexternalbuffer != 1) {
 			binbuf_add(copy_binbuf, ac, av);
 			binbuf_addsemi(copy_binbuf);
-		} else if (ac == 7) {
+			copyfromexternalbuffer++;
+		} else if (copyfromexternalbuffer == 1 && av[0].a_type == A_SYMBOL && !strcmp(av[0].a_w.w_symbol->s_name, "#N") && ac == 7) {
 			int check = 0;
 			//if the canvas is empty resize window size and position here...
 			//fprintf(stderr,"copying canvas properties for copyfromexternalbuffer\n");
@@ -3746,15 +3754,19 @@ static void canvas_copyfromexternalbuffer(t_canvas *x, t_symbol *s, int ac, t_at
 				screeny2 = av[5].a_w.w_float;
 				check++;
 			}
-			if (av[5].a_type == A_FLOAT) {
+			if (av[6].a_type == A_FLOAT) {
 				copiedfont = av[6].a_w.w_float;
 				check++;
 			}
 			if (check != 5) {
 				post("error copying: copyfromexternalbuffer: canvas info has invalid data\n");
 				copyfromexternalbuffer = 0;
+			} else {
+				copyfromexternalbuffer++;
 			}
 		}
+	} else if (!ac && copyfromexternalbuffer) {
+		//here we can do things after the copying process has been completed. currently we don't need this.
 	}
 }
 
@@ -4101,7 +4113,12 @@ static void canvas_dopaste(t_canvas *x, t_binbuf *b)
 		canvas_redraw(x);
 	}*/
     sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x);
-    glist_donewloadbangs(x);
+	if (!abort_when_pasting_from_external_buffer) {
+	    glist_donewloadbangs(x);
+	} else {
+		error("failed pasting correctly from external buffer, likely due to incomplete text selection (a.k.a. user error). hopefully you saved your work... please get ready to crash...");
+	}
+	abort_when_pasting_from_external_buffer = 0;
 }
 
 static void canvas_paste(t_canvas *x)
@@ -4621,6 +4638,8 @@ void g_editor_setup(void)
         gensym("arraydialog"), A_GIMME, A_NULL);
     class_addmethod(canvas_class, (t_method)canvas_copyfromexternalbuffer,
         gensym("copyfromexternalbuffer"), A_GIMME, A_NULL);
+    class_addmethod(canvas_class, (t_method)canvas_reset_copyfromexternalbuffer,
+        gensym("reset_copyfromexternalbuffer"), A_NULL);
 
 /* -------------- connect method used in reading files ------------------ */
     class_addmethod(canvas_class, (t_method)canvas_connect,
diff --git a/src/g_text.c b/src/g_text.c
index bd9e04944cdfdedb18b7f0acb854e5153a0e1553..9d4bed9c7bc712d4b726d92a69141c453be048fe 100644
--- a/src/g_text.c
+++ b/src/g_text.c
@@ -1824,7 +1824,7 @@ void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize, int pos)
 			binbuf_gettext(x->te_binbuf, &c1, &i1);
 			binbuf_gettext(b, &c2, &i2);
 			if (strcmp(c1, c2)) {
-				fprintf(stderr,"text_setto calls canvas_undo_add\n");
+				//fprintf(stderr,"text_setto calls canvas_undo_add\n");
 				canvas_undo_add(glist_getcanvas(glist), 10, "recreate",
 					(void *)canvas_undo_set_recreate(glist_getcanvas(glist), &x->te_g, pos));
 		        int xwas = x->te_xpix, ywas = x->te_ypix;
diff --git a/src/m_pd.c b/src/m_pd.c
index 951e8dd2b8275c6b420a24541d83612a0f0886fc..0a0e4006b2fee739993384e50af772b7a7d2eed5 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -339,9 +339,14 @@ void pd_pushsym(t_pd *x)
     s__X.s_thing = x;
 }
 
+extern int abort_when_pasting_from_external_buffer;
+
 void pd_popsym(t_pd *x)
 {
-    if (!gstack_head || s__X.s_thing != x) bug("gstack_pop");
+    if (!gstack_head || s__X.s_thing != x) {
+		abort_when_pasting_from_external_buffer = 1;
+		bug("gstack_pop");
+	}
     else
     {
         t_gstack *headwas = gstack_head;
diff --git a/src/pd.tk b/src/pd.tk
index 506e18381de3212d0ce89dc38c140535a17efee0..c95cad5c8b753d05ad64bcb7e4eddff69ecd8ac0 100644
--- a/src/pd.tk
+++ b/src/pd.tk
@@ -1786,7 +1786,9 @@ proc menu_fixeditmenu {name} {
 			if { [string compare $last_clipboard $current_clipboard] } {
 				set data [split $current_clipboard "\n"]
 				set first 0
+				pd [concat $name reset_copyfromexternalbuffer\;]
 				foreach line $data { 
+					#puts stderr "pd.tk sends: $line\n"
 					if { !$first } {
 						pd [concat $name copyfromexternalbuffer\;]
 						pd [concat $name copyfromexternalbuffer $line\;]
@@ -1797,6 +1799,7 @@ proc menu_fixeditmenu {name} {
 				}
 				set global_clipboard 1
 				set last_clipboard $current_clipboard
+				pd [concat $name copyfromexternalbuffer\;]
 				pdtk_canvas_update_edit_menu $name 1
 			}
 		}