diff --git a/src/g_editor.c b/src/g_editor.c
index 7bb75df61b9e29724ebec60f8039a2fbc04cea5b..acbe3ff7376a37c90cfb9d75f4e2ad84acfd7b4a 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -28,8 +28,8 @@ static void canvas_dopaste(t_canvas *x, t_binbuf *b);
 static void canvas_paste(t_canvas *x);
 static void canvas_clearline(t_canvas *x);
 static t_binbuf *copy_binbuf;
-static char *canvas_textcopybuf;
-static int canvas_textcopybufsize;
+//static char *canvas_textcopybuf;
+//static int canvas_textcopybufsize;
 static t_glist *glist_finddirty(t_glist *x);
 static void canvas_reselect(t_canvas *x);
 static void canvas_cut(t_canvas *x);
@@ -1631,7 +1631,10 @@ static void canvas_done_popup(t_canvas *x, t_float which, t_float xpos, t_float
     t_gobj *y=NULL, *oldy=NULL, *oldy_prev=NULL, *oldy_next=NULL, *y_begin, *y_end=NULL;
 	int x1, y1, x2, y2;
 
-	//mark the beginning of the glist for front/back
+	// first deselect any objects that may be already selected
+	glist_noselect(x);
+
+	// mark the beginning of the glist for front/back
 	y_begin = x->gl_list;
 
 	if (which == 3 || which == 4) {
@@ -3018,6 +3021,10 @@ static void canvas_copy(t_canvas *x)
     binbuf_free(copy_binbuf);
 	//fprintf(stderr, "canvas_copy\n");
     copy_binbuf = canvas_docopy(x);
+	if (!x->gl_editor->e_selection)
+		sys_vgui("pdtk_canvas_update_edit_menu .x%lx 0\n", x);
+	else
+		sys_vgui("pdtk_canvas_update_edit_menu .x%lx 1\n", x);
     paste_xyoffset = 1;
     if (x->gl_editor->e_textedfor)
     {
@@ -3025,21 +3032,21 @@ static void canvas_copy(t_canvas *x)
         int bufsize;
         rtext_getseltext(x->gl_editor->e_textedfor, &buf, &bufsize);
 
-#if defined(MSW) || defined(__APPLE__)
-            /* for Mac or Windows, copy the text to the clipboard here */
+//#if defined(MSW) || defined(__APPLE__)
+//            /* for Mac or Windows, copy the text to the clipboard here */
         sys_vgui("clipboard clear\n", bufsize, buf);
         sys_vgui("clipboard append {%.*s}\n", bufsize, buf);
-#else
+//#else
             /* in X windows the selection already went to the
             clipboard when it was made; here we "copy" it to our own buffer
             as well, because, annoyingly, the clipboard will usually be 
             destroyed by the time the user asks to "paste". */
-        if (canvas_textcopybuf)
+        /*if (canvas_textcopybuf)
             t_freebytes(canvas_textcopybuf, canvas_textcopybufsize);
         canvas_textcopybuf = (char *)getbytes(bufsize);
         memcpy(canvas_textcopybuf, buf, bufsize);
-        canvas_textcopybufsize = bufsize;
-#endif
+        canvas_textcopybufsize = bufsize;*/
+//#endif
     }
 }
 
@@ -3256,18 +3263,18 @@ static void canvas_paste(t_canvas *x)
     if (x->gl_editor->e_textedfor)
     {
             /* simulate keystrokes as if the copy buffer were typed in. */
-#if defined(MSW) || defined(__APPLE__)
+//#if defined(MSW) || defined(__APPLE__)
             /* for Mac or Windows,  ask the GUI to send the clipboard down */
         sys_gui("pdtk_pastetext\n");
-#else
+//#else
             /* in X windows we kept the text in our own copy buffer */
-        int i;
+/*        int i;
         for (i = 0; i < canvas_textcopybufsize; i++)
         {
             pd_vmess(&x->gl_gobj.g_pd, gensym("key"), "iii",
                 1, canvas_textcopybuf[i]&0xff, 0);
-        }
-#endif
+        }*/
+//#endif
     }
     else
     {
diff --git a/src/m_pd.h b/src/m_pd.h
index 46955b681b80751f7919113656e44bfc52e86c25..652941ac0f3dc50bc428999f79e3c7e5f06c0b00 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-20110218"
+#define PD_TEST_VERSION "extended-l2ork-20110221"
 
 /* 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 b284be9686c8271e06916aeabcf051faf6c3c219..3e8b36b30d55365d3d55bb3148f179a41d6e95d8 100644
--- a/src/pd.tk
+++ b/src/pd.tk
@@ -224,6 +224,7 @@ if { $tcl_platform(platform) == "windows" }  {
 } else { 
 	# set nicer theme
 	ttk::style theme use purty_linux
+	clipboard clear
 	set window_prefs {}
     set pd_nt 0
     set ctrl_key "Control"
@@ -633,7 +634,7 @@ if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
 }
 
 match_linux_wm [list button .controls.clr_console -text "Clear Console" \
-	-command {.printout.text delete 0.0 end}]
+	-command [concat menu_clear_console]]
 
 pack .controls.inout.in .controls.inout.out -side left -padx 6
 pack .controls.inout -side left -padx 14
@@ -646,7 +647,9 @@ if {[info exists show_console] && $show_console == 1} {
 
 match_linux_wm [list frame .printout]
 text .printout.text -relief sunken -bd 1 -font console_font \
-    -yscrollcommand ".printout.scroll set" -width 70 -highlightthickness 0 -takefocus 0
+    -yscrollcommand ".printout.scroll set" -width 70 \
+	-highlightthickness 0 -takefocus 0 -fg gray20 -state disabled
+#.printout.text tag configure sel -background $linux_wm_hlcolor
 
 # .printout.text insert end "\n\n\n\n\n\n\n\n\n\n"
 match_linux_wm [list scrollbar .printout.scroll -command ".printout.text yview"]
@@ -663,23 +666,26 @@ bind .printout.text <Button> {pdtk_update_root_edit_menu 0}
 bind .printout.text <<Selection>> {pdtk_update_root_edit_menu 1}
 
 proc pdtk_update_root_edit_menu {value} {
+	#pdtk_post "update_root_edit_menu $value\n"
 	if {$value} {
 		set range [.printout.text tag ranges sel]
 		#pdtk_post "[lindex $range 0] -- [lindex $range 1]\n"
 		if {[lindex $range 0] != [lindex $range 1]} {
-			.mbar.edit entryconfigure "Cut" -state normal
+			#.mbar.edit entryconfigure "Cut" -state normal
 			.mbar.edit entryconfigure "Copy" -state normal
 		}
 	} else {
 		#pdtk_post off
-		.mbar.edit entryconfigure "Cut" -state disabled
+		#.mbar.edit entryconfigure "Cut" -state disabled
 		.mbar.edit entryconfigure "Copy" -state disabled
 	}
 }
 
 proc pdtk_post {stuff} {
+	.printout.text configure -state normal
     .printout.text insert end $stuff
     .printout.text yview end-2char
+	.printout.text configure -state disabled
 }
 
 proc pdtk_standardkeybindings {id} {
@@ -699,11 +705,11 @@ proc pdtk_panelkeybindings {id panelname} {
 pdtk_standardkeybindings .
 # hacks to add standard key bindings to the Pd window
 bind . <$ctrl_key-Key-a> {.printout.text tag add sel 1.0 end}
-bind . <$ctrl_key-Key-x> {tk_textCut .printout.text; \
-	.mbar.edit entryconfigure "Paste" -state normal}
-bind . <$ctrl_key-Key-c> {tk_textCopy .printout.text; \
-	.mbar.edit entryconfigure "Paste" -state normal}
-bind . <$ctrl_key-Key-v> {tk_textPaste .printout.text}
+#bind . <$ctrl_key-Key-x> {tk_textCut .printout.text; \
+#	.mbar.edit entryconfigure "Paste" -state normal}
+bind . <$ctrl_key-Key-c> {tk_textCopy .printout.text}
+#	.mbar.edit entryconfigure "Paste" -state normal}
+#bind . <$ctrl_key-Key-v> {tk_textPaste .printout.text}
 bind . <$ctrl_key-Key-w> {menu_quit}
 # kludge to add window control bindings to the Pd Window
 if {$pd_nt == 2} {
@@ -713,8 +719,26 @@ if {$pd_nt == 2} {
 	bind . <Control-Prior>   {menu_raisepreviouswindow} ;# needs Tcl/Tk 8.5
 }
 
+# pass key presses inside main window to patch windows
+proc pdtk_capture_root_window_keys {state key iso shift} {
+	global menu_windowlist
+
+	set first_patch_window_name [lindex $menu_windowlist 0 1]
+	# pdtk_post "$first_patch_window_name\n"
+
+	if { [string length $first_patch_window_name] > 0 } {
+		pdtk_canvas_sendkey $first_patch_window_name.c $state $key $iso $shift
+	}
+}
+
+bind . <Key> {pdtk_capture_root_window_keys 1 %K %A 0}
+bind . <Shift-Key> {pdtk_capture_root_window_keys 1 %K %A 1}
+bind . <KeyRelease> {pdtk_capture_root_window_keys 0 %K %A 0}
+bind . <Control-Key> {pdtk_canvas_ctrlkey %W %K 0}
+bind . <Control-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1}
+
 
-wm title . "Pd"
+wm title . "Pure-Data L2Ork"
 # initial location of Pd window (+x+y)
 wm geometry . +10+35
 . configure -menu .mbar -width 200 -height 150
@@ -995,7 +1019,7 @@ proc menu_raise_console {} {
 
 proc menu_toggle_console {} { .controls.switches.console invoke }
 
-proc menu_clear_console {} {.printout.text delete 0.0 end}
+proc menu_clear_console {} {.printout.text configure -state normal; .printout.text delete 0.0 end; .printout.text configure -state disabled}
 
 ################## the "Quit" menu command #########################
 proc menu_really_quit {} {pd {pd quit;}}
@@ -1240,17 +1264,17 @@ if {$pd_nt != 2} {
 .mbar.edit add separator
 # this should apply to .printout.text
 .mbar.edit add command -label Cut  -accelerator [accel_munge "Ctrl+x"] \
-    -command {tk_textCut .printout.text; .mbar.edit entryconfigure "Paste" -state normal} -state disabled
+    -command {tk_textCut .printout.text} -state disabled
 # this should apply to .printout.text
 .mbar.edit add command -label Copy -accelerator [accel_munge "Ctrl+c"] \
-    -command {tk_textCopy .printout.text; .mbar.edit entryconfigure "Paste" -state normal} -state disabled
+    -command {global copytexttocanvas; tk_textCopy .printout.text; set copytexttocanvas 1; pdtk_canvas_update_paste_menu 1} -state disabled
 .mbar.edit add command -label Paste -accelerator [accel_munge "Ctrl+v"] \
     -command {tk_textPaste .printout.text} -state disabled
 .mbar.edit add command -label Duplicate -accelerator [accel_munge "Ctrl+d"] \
     -state disabled
 # this should apply to .printout.text
 .mbar.edit add command -label {Select all} -accelerator [accel_munge "Ctrl+a"]\
-    -command {.printout.text tag add sel 1.0 end}
+    -command {pdtk_post selall; .printout.text tag add sel 1.0 end}
 .mbar.edit add command -label {Reselect} \
         -accelerator "Ctrl+Enter" -state disabled
 .mbar.edit add separator
@@ -1503,12 +1527,14 @@ proc menu_cut {name} {
 }
 
 proc menu_copy {name} {
+	# pdtk_post menu_copy
 	global copytexttocanvas
 	if {![string match .gfxstub* $name] && ![string match .printout* $name] && ![string match *entry $name]} {
 	    pd [concat $name copy \;]
 		set copytexttocanvas 0
-		clipboard clear
+		# clipboard clear
 	} else {
+		# pdtk_post "this_is_text\n"
 		set copytexttocanvas 1
 	}
 	pdtk_canvas_update_paste_menu 1
@@ -1516,21 +1542,25 @@ proc menu_copy {name} {
 
 proc menu_paste {name} {
 	global copytexttocanvas
-	#pdtk_pastetext
-	#pdtk_post "pasting..."
+	# pdtk_pastetext
+	# pdtk_post "pasting..."
 	if {![string match .gfxstub* $name] && ![string match .printout* $name] && ![string match *entry $name]} {
+		# puts stderr "this is not an entry $copytexttocanvas\n"
 		if {$copytexttocanvas} {
 			pdtk_pastetext
 		} else {
 			pd [concat $name paste \;]
 			pdtk_canvas_getscroll $name.c
 		}
+	} else {
+		# puts stderr "pasting text..."
+		pdtk_pastetext
 	}
 }
 
-bind . <$ctrl_key-Key-x> {menu_cut .printout.text}
-bind . <$ctrl_key-Key-c> {menu_copy .printout.text}
-bind . <$ctrl_key-Key-v> {menu_paste .printout.text}
+#bind . <$ctrl_key-Key-x> {menu_cut .printout.text}
+bind . <$ctrl_key-Key-c> {global copytexttocanvas; tk_textCopy .printout.text; set copytexttocanvas 1; pdtk_canvas_update_paste_menu 1}
+#bind . <$ctrl_key-Key-v> {menu_paste .printout.text}
 
 proc menu_duplicate {name} {
     pd [concat $name duplicate \;]
@@ -1658,6 +1688,8 @@ proc menu_mycnv {name accel} {
 
 # correct edit menu, enabling or disabling undo/redo/cut/copy/paste
 proc menu_fixeditmenu {name} {
+	# pdtk_post "fixeditmenu $name\n"
+
     global pd_undoaction
     global pd_redoaction
     global pd_undocanvas
@@ -2978,6 +3010,8 @@ proc pdtk_canvas_sendkey {name state key iso shift} {
 	global ctrl_l_down
 	global ctrl_r_down
 
+	# pdtk_post "key = $name $state $key $iso $shift\n"
+
 	if {$key == "BackSpace"} {
 		set iso ""
 		set key 8
@@ -3039,8 +3073,20 @@ proc pdtk_canvas_sendkey {name state key iso shift} {
 # if so, invoke edit menu option (whcih 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"
+	global copytexttocanvas
+
 	if {[string match .x* $name]} {
 		$name.m.edit invoke "$action"
+	} else {
+		set tmp ""
+		catch {
+			set tmp [clipboard get]
+		}
+		if { $tmp != "" } {
+			set copytexttocanvas 1
+			pdtk_canvas_update_paste_menu 1
+		}
 	}
 }
 
@@ -3052,6 +3098,7 @@ proc pdtk_canvas_ctrlkey {name key shift} {
     # puts stderr [concat ctrl-key $key $topname $name]
 	# puts stderr [string match .controls* $name] 
 	#.printout.text .controls.* .
+	#pdtk_post canvas_ctrlkey
 
 	if {$name == "." || $name == ".printout.text" || [string match .controls* $name] || [string match .gfxstub* $name]} {
 		set ignore 1	
@@ -4976,7 +5023,9 @@ proc pdtk_canvas_magicglassval {name value} {
 }
 
 proc pdtk_canvas_update_edit_menu {name value} {
-	global global_selection
+	global global_selection global_clipboard
+
+	# pdtk_post "update_edit_menu value=$value clipboard=$global_clipboard\n"
 
 	set global_selection $value
 
@@ -4997,15 +5046,21 @@ proc pdtk_canvas_update_edit_menu {name value} {
 		$name.m.edit entryconfigure "Bring To Front" -state disabled
 		$name.m.edit entryconfigure "Send To Back" -state disabled
 		$name.m.edit entryconfigure "Tidy Up" -state disabled
+    }
 
-    }                                                 
+	if {!$global_clipboard} {
+		$name.m.edit entryconfigure "Paste" -state disabled
+	} else {
+		$name.m.edit entryconfigure "Paste" -state normal
+	}
 }
 
 proc pdtk_canvas_update_paste_menu {value} {
+	# pdtk_post "paste_menu $value\n"
 	global global_clipboard
-	global menu_windowlist
+	# global menu_windowlist
 
-	set global_clipboard $value                                                
+	set global_clipboard $value                                         
 }
 
 ############ pdtk_text_new -- create a new text object #2###########