diff --git a/src/g_editor.c b/src/g_editor.c
index be6654a883720d903afc1ee9bd031f4e00204347..57ec3978a9c4c0539af50928f3445af49eea2a0f 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -458,6 +458,7 @@ void canvas_noundo(t_canvas *x)
 
 static void canvas_undo(t_canvas *x)
 {
+	//fprintf(stderr,"canvas_undo\n");
     if (x != canvas_undo_canvas)
         bug("canvas_undo 1");
     else if (canvas_undo_whatnext != UNDO_UNDO)
@@ -635,10 +636,12 @@ static void *canvas_undo_set_cut(t_canvas *x, int mode)
 
 static void canvas_undo_cut(t_canvas *x, void *z, int action)
 {
+	//fprintf(stderr, "canvas_undo_cut canvas=%d buf=%d action=%d\n", (int)x, (int)z, action);
     t_undo_cut *buf = z;
     int mode = buf->u_mode;
     if (action == UNDO_UNDO)
     {
+		//fprintf(stderr,"UNDO_UNDO\n");
         if (mode == UCUT_CUT) {
 			//fprintf(stderr, "UCUT_CUT\n");
             canvas_dopaste(x, copy_binbuf);
@@ -673,6 +676,7 @@ static void canvas_undo_cut(t_canvas *x, void *z, int action)
     }
     else if (action == UNDO_REDO)
     {
+		//fprintf(stderr,"UNDO_REDO\n");
         if (mode == UCUT_CUT || mode == UCUT_CLEAR)
             canvas_doclear(x);
         else if (mode == UCUT_TEXT)
@@ -690,6 +694,7 @@ static void canvas_undo_cut(t_canvas *x, void *z, int action)
     }
     else if (action == UNDO_FREE)
     {
+		//fprintf(stderr,"UNDO_FREE\n");
         if (buf->u_objectbuf)
             binbuf_free(buf->u_objectbuf);
         if (buf->u_reconnectbuf)
@@ -3247,12 +3252,14 @@ static void glist_donewloadbangs(t_glist *x)
 
 static void canvas_paste_xyoffset(t_canvas *x)
 {
-    //t_selection *sel;
-    //for (sel = x->gl_editor->e_selection; sel; sel = sel->sel_next)
-        //gobj_displace(sel->sel_what, x, paste_xyoffset*10, paste_xyoffset*10);
-	canvas_displaceselection(x, 10, 10);
-    //paste_xyoffset++;
-	//fprintf(stderr,"xyoffset %d\n",paste_xyoffset);
+    t_selection *sel;
+    for (sel = x->gl_editor->e_selection; sel; sel = sel->sel_next)
+        gobj_displace(sel->sel_what, x, paste_xyoffset*10, paste_xyoffset*10);
+	// alternative one-line implementation that
+	// replaces the entire function
+	//canvas_displaceselection(x, 10, 10);
+
+    //paste_xyoffset++; //a part of original way
 }
 
 static void canvas_paste_atmouse(t_canvas *x)
@@ -3305,8 +3312,8 @@ static void canvas_dopaste(t_canvas *x, t_binbuf *b)
 	//if we have something selected in another canvas
 	if (c_selection && c_selection != x)
 		glist_noselect(c_selection);
-	//else is we are not duplicating but pasting see if we can autopatch
-	else if (canvas_undo_name[0] != 'd') {
+	//else is we are pasting see if we can autopatch
+	else if (canvas_undo_name && !strcmp(canvas_undo_name, "paste")) {
 		canvas_howputnew(x, &connectme, &xpix, &ypix, &indx, &nobj);
     	//glist_noselect(x);
 	}
@@ -3325,14 +3332,8 @@ static void canvas_dopaste(t_canvas *x, t_binbuf *b)
 
 	/* select newly created objects */
     for (g2 = x->gl_list, count = 0; g2; g2 = g2->g_next, count++)
-        /*if (count == nbox) {
-			// delete bogus object we created in canvas_docopy in order to circumvent tcl/tk's failure
-			//   to provide "unique" id to every new instance of an object
-            glist_delete(x, g2);
-		} else*/ if (count >= nbox) {
+		if (count >= nbox)
             glist_select(x, g2);
-			//fprintf(stderr,"object=.x%lx glist_getcanvas(x)=.x%lx\n", (t_int)g2, (t_int)glist_getcanvas((t_glist*)g2) );
-		}
 
     paste_canvas = 0;
     canvas_resume_dsp(dspstate);
@@ -3343,20 +3344,28 @@ static void canvas_dopaste(t_canvas *x, t_binbuf *b)
 
 		//is this universally safe? I think so
 		t_text *z = (t_text *)x->gl_editor->e_selection->sel_what;
-		z->te_xpix = xpix;
-		z->te_ypix = ypix;
-
-		//this would be an alternative way but how would we then figure out delta?
-		//canvas_displaceselection(x, xpix, ypix);
+		//fprintf(stderr,"%d %d %d %d\n", z->te_xpix, z->te_ypix, xpix, ypix);
+
+		//calculate delta (since displace is always relative)
+		int delta_x = xpix - z->te_xpix;
+		int delta_y = ypix - z->te_ypix;
+
+		//now displace it but without undo
+		//(by spoofing canvas_undo_already_set_move)
+		canvas_undo_already_set_move = 1;
+ 		canvas_displaceselection(x, delta_x, delta_y);
+		//reset canvas_undo_already_set_move
+		canvas_undo_already_set_move = 0;
 	}
-	else if (canvas_undo_name[0] != 'd') {
+	else if (canvas_undo_name && !strcmp(canvas_undo_name, "paste") ) {
 		canvas_paste_atmouse(x);
+		//fprintf(stderr,"doing a paste\n");
 	}
 
     canvas_dirty(x, 1);
-	if (!canvas_undo_name || canvas_undo_name[0] != 'd') {
+	/*if (!canvas_undo_name || canvas_undo_name[0] != 'd') {
 		canvas_redraw(x);
-	}
+	}*/
     sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x);
     glist_donewloadbangs(x);
 }
diff --git a/src/g_graph.c b/src/g_graph.c
index 499c0742ffa38c7792fef79837be65949afa3c6c..3ac48c68ac35fa8bf38ac6b41da882e459f011b9 100644
--- a/src/g_graph.c
+++ b/src/g_graph.c
@@ -987,6 +987,12 @@ static void graph_displace(t_gobj *z, t_glist *glist, int dx, int dy)
     {
         x->gl_obj.te_xpix += dx;
         x->gl_obj.te_ypix += dy;
+		/*char tag[80];
+		sprintf(tag, "%s", rtext_gettag(glist_findrtext((x->gl_owner ? x->gl_owner: x), &x->gl_obj)));
+        sys_vgui(".x%lx.c move %s %d %d\n",
+            glist_getcanvas(x->gl_owner), tag, dx, dy);
+        sys_vgui(".x%lx.c move %sR %d %d\n",
+            glist_getcanvas(x->gl_owner), tag, dx, dy);*/
         glist_redraw(x);
 		gobj_select(z, glist, 1);
         canvas_fixlinesfor(glist_getcanvas(glist), &x->gl_obj);
diff --git a/src/g_text.c b/src/g_text.c
index 5fbd17be7dcad05c984ebc4ba15c17dd4e769f03..c29fba941c30618d6347ab9b39b6f66351eb19af 100644
--- a/src/g_text.c
+++ b/src/g_text.c
@@ -146,8 +146,16 @@ void canvas_howputnew(t_canvas *x, int *connectp, int *xpixp, int *ypixp,
     int *indexp, int *totalp)
 {
     int xpix, ypix, indx = 0, nobj = 0, n2, x1, x2, y1, y2;
-    int connectme = (x->gl_editor->e_selection &&
-        !x->gl_editor->e_selection->sel_next && !sys_noautopatch);
+	int connectme = 0;
+	t_gobj *selected;
+
+	if (x->gl_editor->e_selection &&
+        !x->gl_editor->e_selection->sel_next &&
+		!sys_noautopatch) {
+			selected = x->gl_editor->e_selection->sel_what;
+			t_object *ob = pd_checkobject(&selected->g_pd);
+    		connectme = (obj_noutlets(ob) ? 1 : 0);
+	}
     if (connectme)
     {
         t_gobj *g, *selected = x->gl_editor->e_selection->sel_what;
diff --git a/src/m_binbuf.c b/src/m_binbuf.c
index e0283fda8f923be5371d148302daeffb5a9a3899..d39e18821e5532bab424439f94fb40f5a98e680c 100644
--- a/src/m_binbuf.c
+++ b/src/m_binbuf.c
@@ -610,7 +610,7 @@ void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv)
     int nargs, maxnargs = 0;
 
 	//first we need to check if the list of arguments has $@
-	//fprintf(stderr,"ac=%d\n", ac);
+	//fprintf(stderr,"binbuf=%d target=%d argc=%d argv=%d ac=%d\n", (int)x, (int)target, (int)ac, argc, (int)argv);
 	int count;
 	for (count = 0; count < ac; count++) {
 		//fprintf(stderr, "count %d\n", count);
diff --git a/src/m_pd.h b/src/m_pd.h
index 76edfdf6145cd094816992b81cafabd6b53f5a55..f48f6ca817b1b6d12b2dc7024d9ff8ef29643a0a 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -11,7 +11,7 @@ extern "C" {
 #define PD_MAJOR_VERSION 0
 #define PD_MINOR_VERSION 42
 #define PD_BUGFIX_VERSION 5
-#define PD_TEST_VERSION "extended-l2ork-20110418"
+#define PD_TEST_VERSION "extended-l2ork-20110419"
 
 /* old name for "MSW" flag -- we have to take it for the sake of many old
 "nmakefiles" for externs, which will define NT and not MSW */
diff --git a/src/pd.tk b/src/pd.tk
index 119b6c85a1f8ce84b66f4ebccb50839442ae3ff8..3fa4db7f11c249ef859057e25cc99cf05362a095 100644
--- a/src/pd.tk
+++ b/src/pd.tk
@@ -3046,8 +3046,8 @@ proc pdtk_canvas_sendkey {name state key iso shift} {
 	pd [canvastosym $name] key $state $key $shift \;
 }
 
-# only do actions if this is a canvas. if so
-# if so, invoke edit menu option (whcih will work
+# only do actions if this is a canvas.
+# if so, invoke edit menu option (which will work
 # only if the actual option is currently enabled)
 proc pdtk_canvas_edit_menu_actions {name action} {
 	# pdtk_post "edit_menu_actions $name $action\n"