diff --git a/Demo/tkinter/guido/kill.py b/Demo/tkinter/guido/kill.py
new file mode 100755
index 0000000..f7a70fa
--- /dev/null
+++ b/Demo/tkinter/guido/kill.py
@@ -0,0 +1,119 @@
+#!/usr/local/bin/tkpython
+# Tkinter interface to Linux `ps' command.
+
+from Tkinter import *
+from string import splitfields
+from string import split
+
+class BarButton(Menubutton):
+	def __init__(self, master=None, cnf={}):
+		Menubutton.__init__(self, master)
+		self.pack({'side': 'left'})
+		self.config(cnf)
+		self.menu = Menu(self, {'name': 'menu'})
+		self['menu'] = self.menu		
+
+class Kill(Frame):
+	# List of (name, option, pid_column)
+	format_list = [('Default', '', 0),
+		       ('Long', '-l', 2),
+		       ('User', '-u', 1),
+		       ('Jobs', '-j', 1),
+		       ('Signal', '-s', 1),
+		       ('Memory', '-m', 0),
+		       ('VM', '-v', 0),
+		       ('Hex', '-X', 0)]
+	def kill(self, selected):
+		c = self.format_list[self.format.get()][2]
+		pid = split(selected)[c]
+		self.tk.call('exec', 'kill', '-9', pid)
+		self.do_update()
+	def do_update(self):
+		name, option, column = self.format_list[self.format.get()]
+		s = self.tk.call('exec', 'ps', '-w', option)
+		list = splitfields(s, '\n')
+		self.header.set(list[0])
+		del list[0]
+		y = self.frame.vscroll.get()[2]
+		self.frame.list.delete(0, AtEnd())
+		for line in list:
+			self.frame.list.insert(0, line)
+		self.frame.list.yview(y)
+	def do_motion(self, e):
+		e.widget.select_from(e.widget.nearest(e.y))
+	def do_leave(self, e):
+		e.widget.select_clear()
+	def do_1(self, e):
+		self.kill(e.widget.get(e.widget.nearest(e.y)))
+	def __init__(self, master=None, cnf={}):
+		Frame.__init__(self, master, cnf)
+		self.pack({'expand': 'yes', 'fill': 'both'})
+		self.bar = Frame(
+			self,
+			{'name': 'bar',
+			 'relief': 'raised',
+			 'bd': 2,
+			 Pack: {'side': 'top',
+				'fill': 'x'}})
+		self.bar.file = BarButton(self.bar, {'text': 'File'})
+		self.bar.file.menu.add_command(
+			{'label': 'Quit', 'command': self.quit})
+		self.bar.view = BarButton(self.bar, {'text': 'View'})
+		self.format = IntVar(self)
+		self.format.set(2)
+		for num in range(len(self.format_list)):
+			self.bar.view.menu.add_radiobutton(
+				{'label': self.format_list[num][0], 
+				 'command': self.do_update,
+				 'variable': self.format,
+				 'value': num})
+		#self.bar.view.menu.add_separator()
+		#XXX ...
+		self.bar.tk_menuBar(self.bar.file, self.bar.view)
+		self.frame = Frame(
+			self, 
+			{'relief': 'raised', 'bd': 2,
+			 Pack: {'side': 'top',
+				'expand': 'yes',
+				'fill': 'both'}})
+		self.header = StringVar(self)
+		self.frame.label = Label(
+			self.frame, 
+			{'relief': 'flat',
+			 'anchor': 'nw',
+			 'borderwidth': 0,
+			 'textvariable': self.header,
+			 Pack: {'side': 'top', 
+			 	'fill': 'x'}})
+		self.frame.vscroll = Scrollbar(
+			self.frame,
+			{'orient': 'vertical'})
+		self.frame.list = Listbox(
+			self.frame, 
+			{'relief': 'sunken',
+			 'selectbackground': '#eed5b7',
+			 'selectborderwidth': 0,
+			 'yscroll': self.frame.vscroll.set})
+		self.frame.vscroll['command'] = self.frame.list.yview
+		self.frame.vscroll.pack({'side': 'right', 'fill': 'y'})
+		self.frame.list.pack(
+			{'side': 'top',
+			 'expand': 'yes',
+			 'fill': 'both'})
+		self.update = Button(
+			self,
+			{'text': 'Update',
+			 'command': self.do_update,
+			 Pack: {'expand': 'yes',
+				'fill': 'x'}})
+		self.frame.list.bind('<Motion>', self.do_motion)
+		self.frame.list.bind('<Leave>', self.do_leave)
+		self.frame.list.bind('<1>', self.do_1)
+		self.do_update()
+
+if __name__ == '__main__':
+	kill = Kill(None, {'bd': 5})
+	kill.winfo_toplevel().title('Tkinter Process Killer')
+	kill.winfo_toplevel().minsize(1, 1)
+	kill.mainloop()
+
diff --git a/Lib/lib-tk/Dialog.py b/Lib/lib-tk/Dialog.py
new file mode 100644
index 0000000..28222ec
--- /dev/null
+++ b/Lib/lib-tk/Dialog.py
@@ -0,0 +1,38 @@
+# Dialog.py -- Tkinter interface to the tk_dialog script.
+from Tkinter import *
+
+class Dialog(Widget):
+	def __init__(self, master=None, cnf={}):
+		Widget._setup(self, master, cnf)
+		self.num = apply(self.tk.call,
+				 ('tk_dialog', self._w,
+				  cnf['title'], cnf['text'], 
+				  cnf['bitmap'], cnf['default'])
+				 + cnf['strings'])
+		try: Widget.destroy(self)
+		except TclError: pass
+	def destroy(self): pass
+
+def _test():
+	d = Dialog(None, {'title': 'File Modified',
+			  'text':
+			  'File "Python.h" has been modified'
+			  ' since the last time it was saved.'
+			  ' Do you want to save it before'
+			  ' exiting the application.',
+			  'bitmap': 'warning',
+			  'default': 0,
+			  'strings': ('Save File', 
+				      'Discard Changes', 
+				      'Return to Editor')})
+	print d.num
+
+
+if __name__ == '__main__':
+	t = Button(None, {'text': 'Test',
+			  'command': _test,
+			  Pack: {}})
+	q = Button(None, {'text': 'Quit',
+			  'command': t.quit,
+			  Pack: {}})
+	t.mainloop()
diff --git a/Lib/tkinter/Dialog.py b/Lib/tkinter/Dialog.py
new file mode 100755
index 0000000..28222ec
--- /dev/null
+++ b/Lib/tkinter/Dialog.py
@@ -0,0 +1,38 @@
+# Dialog.py -- Tkinter interface to the tk_dialog script.
+from Tkinter import *
+
+class Dialog(Widget):
+	def __init__(self, master=None, cnf={}):
+		Widget._setup(self, master, cnf)
+		self.num = apply(self.tk.call,
+				 ('tk_dialog', self._w,
+				  cnf['title'], cnf['text'], 
+				  cnf['bitmap'], cnf['default'])
+				 + cnf['strings'])
+		try: Widget.destroy(self)
+		except TclError: pass
+	def destroy(self): pass
+
+def _test():
+	d = Dialog(None, {'title': 'File Modified',
+			  'text':
+			  'File "Python.h" has been modified'
+			  ' since the last time it was saved.'
+			  ' Do you want to save it before'
+			  ' exiting the application.',
+			  'bitmap': 'warning',
+			  'default': 0,
+			  'strings': ('Save File', 
+				      'Discard Changes', 
+				      'Return to Editor')})
+	print d.num
+
+
+if __name__ == '__main__':
+	t = Button(None, {'text': 'Test',
+			  'command': _test,
+			  Pack: {}})
+	q = Button(None, {'text': 'Quit',
+			  'command': t.quit,
+			  Pack: {}})
+	t.mainloop()
diff --git a/Modules/tkappinit.c b/Modules/tkappinit.c
new file mode 100644
index 0000000..daff9e5
--- /dev/null
+++ b/Modules/tkappinit.c
@@ -0,0 +1,36 @@
+/* appinit.c -- Tcl and Tk application initialization. */
+
+#include <tcl.h>
+#include <tk.h>
+
+int
+Tcl_AppInit (interp)
+     Tcl_Interp *interp;
+{
+  Tk_Window main;
+
+  main = Tk_MainWindow(interp);
+
+  if (Tcl_Init (interp) == TCL_ERROR)
+    return TCL_ERROR;
+  if (Tk_Init (interp) == TCL_ERROR)
+    return TCL_ERROR;
+
+#ifdef WITH_MOREBUTTONS
+  {
+    extern Tcl_CmdProc studButtonCmd;
+    extern Tcl_CmdProc triButtonCmd;
+
+    Tcl_CreateCommand(interp, "studbutton", studButtonCmd,
+		    (ClientData) main, NULL);
+    Tcl_CreateCommand(interp, "tributton", triButtonCmd,
+		      (ClientData) main, NULL);
+  }
+#endif
+#ifdef WITH_XXX
+
+#endif
+
+  return TCL_OK;
+}
+
