diff --git a/Demo/scripts/README b/Demo/scripts/README
index 5b5e88d..e7443da 100644
--- a/Demo/scripts/README
+++ b/Demo/scripts/README
@@ -21,7 +21,6 @@
 fixps.py		Fix Python scripts' first line (if #!)
 fixcid.py		Massive identifier substitution on C source files
 fixheader.py		Add some cpp magic to a C include file
-freeze.py		Convert a Python script into a free-standing binary
 from.py			Summarize mailbox
 ftpstats.py		Summarize ftp daemon log file
 ifdef.py		Remove #if(n)def groups from C sources
@@ -31,6 +30,7 @@
 markov.py		Markov chain simulation of words or characters
 mboxconvvert.py		Convert MH or MMDF mailboxes to unix mailbox format
 methfix.py		Fix old method syntax def f(self, (a1, ..., aN)):
+morse.py		Produce morse code (audible or on AIFF file)
 mkreal.py		Turn a symbolic link into a real file or directory
 mpzpi.py		test mpz -- print digits of pi (compare pi.py)
 objgraph.py		Print object graph from nm output on a library
@@ -41,7 +41,9 @@
 pp.py			Emulate some Perl command line options
 primes.py		Print prime numbers
 ptags.py		Create vi tags file for Python modules
+script.py		Equivalent to BSD script(1) -- by Steen Lumholt
 suff.py			Sort a list of files by suffix
+sum5.py			Print md5 checksums of files
 unbirthday.py		Print unbirthday count
 which.py		Find a program in $PATH
 xxci.py			Wrapper for rcsdiff and ci
diff --git a/Demo/scripts/morse.py b/Demo/scripts/morse.py
new file mode 100755
index 0000000..2cea83e
--- /dev/null
+++ b/Demo/scripts/morse.py
@@ -0,0 +1,149 @@
+# DAH should be three DOTs.
+# Space between DOTs and DAHs should be one DOT.
+# Space between two letters should be one DAH.
+# Space between two words should be DOT DAH DAH.
+
+import sys, math, audiodev
+
+DOT = 30
+DAH = 3 * DOT
+OCTAVE = 2				# 1 == 441 Hz, 2 == 882 Hz, ...
+
+morsetab = {
+	'A': '.-',		'a': '.-',
+	'B': '-...',		'b': '-...',
+	'C': '-.-.',		'c': '-.-.',
+	'D': '-..',		'd': '-..',
+	'E': '.',		'e': '.',
+	'F': '..-.',		'f': '..-.',
+	'G': '--.',		'g': '--.',
+	'H': '....',		'h': '....',
+	'I': '..',		'i': '..',
+	'J': '.---',		'j': '.---',
+	'K': '-.-',		'k': '-.-',
+	'L': '.-..',		'l': '.-..',
+	'M': '--',		'm': '--',
+	'N': '-.',		'n': '-.',
+	'O': '---',		'o': '---',
+	'P': '.--.',		'p': '.--.',
+	'Q': '--.-',		'q': '--.-',
+	'R': '.-.',		'r': '.-.',
+	'S': '...',		's': '...',
+	'T': '-',		't': '-',
+	'U': '..-',		'u': '..-',
+	'V': '...-',		'v': '...-',
+	'W': '.--',		'w': '.--',
+	'X': '-..-',		'x': '-..-',
+	'Y': '-.--',		'y': '-.--',
+	'Z': '--..',		'z': '--..',
+	'0': '-----',
+	'1': '.----',
+	'2': '..---',
+	'3': '...--',
+	'4': '....-',
+	'5': '.....',
+	'6': '-....',
+	'7': '--...',
+	'8': '---..',
+	'9': '----.',
+	',': '--..--',
+	'.': '.-.-.-',
+	'?': '..--..',
+	';': '-.-.-.',
+	':': '---...',
+	"'": '.----.',
+	'-': '-....-',
+	'/': '-..-.',
+	'(': '-.--.-',
+	')': '-.--.-',
+	'_': '..--.-',
+	' ': ' '
+}
+
+# If we play at 44.1 kHz (which we do), then if we produce one sine
+# wave in 100 samples, we get a tone of 441 Hz.  If we produce two
+# sine waves in these 100 samples, we get a tone of 882 Hz.  882 Hz
+# appears to be a nice one for playing morse code.
+def mkwave(octave):
+	global sinewave, nowave
+	sinewave = ''
+	for i in range(100):
+		val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000)
+		sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255)
+	nowave = '\0' * 200
+
+mkwave(OCTAVE)
+
+def main():
+	import getopt, string
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], 'o:p:')
+	except getopt.error:
+		sys.stderr.write('Usage ' + sys.argv[0] +
+				 ' [ -o outfile ] [ args ] ...\n')
+		sys.exit(1)
+	dev = None
+	for o, a in opts:
+		if o == '-o':
+			import aifc
+			dev = aifc.open(a, 'w')
+			dev.setframerate(44100)
+			dev.setsampwidth(2)
+			dev.setnchannels(1)
+		if o == '-p':
+			mkwave(string.atoi(a))
+	if not dev:
+		import audiodev
+		dev = audiodev.AudioDev()
+		dev.setoutrate(44100)
+		dev.setsampwidth(2)
+		dev.setnchannels(1)
+		dev.close = dev.stop
+		dev.writeframesraw = dev.writeframes
+	if args:
+		line = string.join(args)
+	else:
+		line = sys.stdin.readline()
+	while line:
+		mline = morse(line)
+		play(mline, dev)
+		if hasattr(dev, 'wait'):
+			dev.wait()
+		if not args:
+			line = sys.stdin.readline()
+		else:
+			line = ''
+	dev.close()
+
+# Convert a string to morse code with \001 between the characters in
+# the string.
+def morse(line):
+	res = ''
+	for c in line:
+		try:
+			res = res + morsetab[c] + '\001'
+		except KeyError:
+			pass
+	return res
+
+# Play a line of morse code.
+def play(line, dev):
+	for c in line:
+		if c == '.':
+			sine(dev, DOT)
+		elif c == '-':
+			sine(dev, DAH)
+		else:			# space
+			pause(dev, DAH + DOT)
+		pause(dev, DOT)
+
+def sine(dev, length):
+	for i in range(length):
+		dev.writeframesraw(sinewave)
+
+def pause(dev, length):
+	for i in range(length):
+		dev.writeframesraw(nowave)
+
+if __name__ == '__main__' or sys.argv[0] == __name__:
+	main()
diff --git a/Demo/scripts/script.py b/Demo/scripts/script.py
new file mode 100755
index 0000000..04e7ecb
--- /dev/null
+++ b/Demo/scripts/script.py
@@ -0,0 +1,33 @@
+#! /usr/local/bin/python
+# script.py -- Make typescript of terminal session.
+# Usage:
+#	-a	Append to typescript.
+#	-p	Use Python as shell.
+# Author: Steen Lumholt.
+
+
+import os, time, sys
+import pty
+
+def read(fd):
+	data = os.read(fd, 1024)
+	file.write(data)
+	return data
+
+shell = 'sh'
+filename = 'typescript'
+mode = 'w'
+if os.environ.has_key('SHELL'):
+	shell = os.environ['SHELL']
+if '-a' in sys.argv:
+	mode = 'a'
+if '-p' in sys.argv:
+	shell = 'python'
+
+file = open(filename, mode)
+
+sys.stdout.write('Script started, file is %s\n' % filename)
+file.write('Script started on %s\n' % time.ctime(time.time()))
+pty.spawn(shell, read)
+file.write('Script done on %s\n' % time.ctime(time.time()))
+sys.stdout.write('Script done, file is %s\n' % filename)
