diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index ef0d1cd2291ea6be0759f3186edd00b2b06c6d0a..8b58ef4db3ac18275bef470efc2ccd83d61124b8 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -71,6 +71,7 @@ extern t_class *text_class;
 
 int do_not_redraw = 0;     // used to optimize redrawing
 int old_displace = 0;	   // for legacy displaces within gop that are not visible to displaceselection
+int ignore_scroll = 0;
 
 int connect_exception = 0; // used when autopatching to bypass check whether one is trying to connect signal with non-signal nlet
 						   // since this is impossible to figure out when the newly created object is an empty one
@@ -3449,7 +3450,9 @@ static void canvas_displaceselection(t_canvas *x, int dx, int dy)
     /* this routine is called whenever a key is pressed or released.  "x"
     may be zero if there's no current canvas.  The first argument is true or
     false for down/up; the second one is either a symbolic key name (e.g.,
-    "Right" or an Ascii key number.  The third is the shift key. */
+    "Right" or an Ascii key number.  The third is the shift key. 
+	In Pd-L2Ork additional argument is to determine whether we're pasting
+	to ignore unnecessary getscroll calls at paste time */
 void canvas_key(t_canvas *x, t_symbol *s, int ac, t_atom *av)
 {
     static t_symbol *keynumsym, *keyupsym, *keynamesym;
@@ -3467,6 +3470,9 @@ void canvas_key(t_canvas *x, t_symbol *s, int ac, t_atom *av)
     
     if (ac < 3)
         return;
+		/* Pd-L2Ork's ignore scroll at paste time */
+	if (ac > 3 && av[3].a_type == A_FLOAT)
+		ignore_scroll = av[3].a_w.w_float;
     if (!x || !x->gl_editor)
         return;
     canvas_undo_already_set_move = 0;
diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index f406175f00f8d55de2476cacad17021a46fc60f6..709302afa7bc261b75db6a9da927cc5ed6529268 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -509,6 +509,8 @@ void rtext_activate(t_rtext *x, int state)
     rtext_senditup(x, SEND_UPDATE, &w, &h, &indx);
 }
 
+extern int ignore_scroll;
+
 void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
 {
     int w = 0, h = 0, indx, i, newsize, ndel;
@@ -528,7 +530,7 @@ void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
             } */
             if (x->x_selstart && (x->x_selstart == x->x_selend)) {
                 u8_dec(x->x_buf, &x->x_selstart);
-				if (glist_isvisible(glist_getcanvas(x->x_glist)))
+				if (glist_isvisible(glist_getcanvas(x->x_glist)) && !ignore_scroll)
 					sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (t_int)glist_getcanvas(x->x_glist));
 			}
 			
@@ -537,7 +539,7 @@ void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
         {
             if (x->x_selend < x->x_bufsize && (x->x_selstart == x->x_selend))
                 u8_inc(x->x_buf, &x->x_selend);
-			if (glist_isvisible(glist_getcanvas(x->x_glist)))
+			if (glist_isvisible(glist_getcanvas(x->x_glist)) && !ignore_scroll)
 				sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (t_int)glist_getcanvas(x->x_glist));
         }
         
@@ -566,7 +568,7 @@ be printable in whatever 8-bit character set we find ourselves. */
             x->x_buf[x->x_selstart] = n;
             x->x_bufsize = newsize;
             x->x_selstart = x->x_selstart + 1;
-			if (glist_isvisible(glist_getcanvas(x->x_glist)))
+			if (glist_isvisible(glist_getcanvas(x->x_glist)) && !ignore_scroll)
 				sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (t_int)glist_getcanvas(x->x_glist));
         }
 		/*--moo: check for unicode codepoints beyond 7-bit ASCII --*/
diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index 1c618975f5773167ba811b85e2f45bd0f3a07f17..2f4a0d80ee8084512b0a04604adb6a6729baa674 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -6300,11 +6300,15 @@ proc pdtk_pastetext {} {
     set pdtk_pastebuffer ""
     catch {global pdtk_pastebuffer; set pdtk_pastebuffer [clipboard get]}
 #    puts stderr [concat paste $pdtk_pastebuffer]
-    for {set i 0} {$i < [string length $pdtk_pastebuffer]} {incr i 1} {
+    for {set i 0} {$i < [expr [string length $pdtk_pastebuffer] - 1]} {incr i 1} {
         set cha [string index $pdtk_pastebuffer $i]
         scan $cha %c keynum
-        pd [concat pd key 1 $keynum 0 \;]
+        pd [concat pd key 1 $keynum 0 1\;]
     }
+	incr i 1
+	set cha [string index $pdtk_pastebuffer $i]
+	scan $cha %c keynum
+	pd [concat pd key 1 $keynum 0 0\;]
 }
 
 ############# open and save dialogs for objects in Pd ##########