diff --git a/Demo/scripts/makedir.py b/Demo/scripts/makedir.py
new file mode 100755
index 0000000..b08e455
--- /dev/null
+++ b/Demo/scripts/makedir.py
@@ -0,0 +1,20 @@
+#! /usr/local/python
+
+# Like mkdir, but also make intermediate directories if necessary.
+# It is not an error if the given directory already exists (as long
+# as it is a directory).
+# Errors are not treated specially -- you just get a Python exception.
+
+import sys, os
+
+def main():
+	for p in sys.argv[1:]:
+		makedirs(p)
+
+def makedirs(p):
+	if not os.path.isdir(p):
+		head, tail = os.path.split(p)
+		makedirs(head)
+		os.mkdir(p, 0777)
+
+main()
diff --git a/Demo/scripts/mkrcs.py b/Demo/scripts/mkrcs.py
new file mode 100755
index 0000000..dc8dffb
--- /dev/null
+++ b/Demo/scripts/mkrcs.py
@@ -0,0 +1,61 @@
+#! /ufs/guido/bin/sgi/python
+#! /usr/local/python
+
+# A rather specialized script to make sure that a symbolic link named
+# RCS exists pointing to a real RCS directory in a parallel tree
+# referenced as RCStree in an ancestor directory.
+# (I use this because I like my RCS files to reside on a physically
+# different machine).
+
+import os
+
+def main():
+	rcstree = 'RCStree'
+	rcs = 'RCS'
+	if os.path.islink(rcs):
+		print `rcs`, 'is a symlink to', `os.readlink(rcs)`
+		return
+	if os.path.isdir(rcs):
+		print `rcs`, 'is an ordinary directory'
+		return
+	if os.path.exists(rcs):
+		print `rcs`, 'is a file?!?!'
+		return
+	#
+	p = os.getcwd()
+	up = ''
+	down = ''
+	# Invariants:
+	# (1) join(p, down) is the current directory
+	# (2) up is the same directory as p
+	# Ergo:
+	# (3) join(up, down) is the current directory
+	#print 'p =', `p`
+	while not os.path.isdir(os.path.join(p, rcstree)):
+		head, tail = os.path.split(p)
+		#print 'head =', `head`, '; tail =', `tail`
+		if not tail:
+			print 'Sorry, no ancestor dir contains', `rcstree`
+			return
+		p = head
+		up = os.path.join(os.pardir, up)
+		down = os.path.join(tail, down)
+		#print 'p =', `p`, '; up =', `up`, '; down =', `down`
+	there = os.path.join(up, rcstree)
+	there = os.path.join(there, down)
+	there = os.path.join(there, rcs)
+	if os.path.isdir(there):
+		print `there`, 'already exists'
+	else:
+		print 'making', `there`
+		makedirs(there)
+	print 'making symlink', `rcs`, '->', `there`
+	os.symlink(there, rcs)
+
+def makedirs(p):
+	if not os.path.isdir(p):
+		head, tail = os.path.split(p)
+		makedirs(head)
+		os.mkdir(p, 0777)
+
+main()
diff --git a/Demo/sockets/broadcast.py b/Demo/sockets/broadcast.py
new file mode 100755
index 0000000..9ed900f
--- /dev/null
+++ b/Demo/sockets/broadcast.py
@@ -0,0 +1,17 @@
+# Send UDP broadcast packets
+
+MYPORT = 50000
+
+import sys, time
+from socket import *
+
+s = socket(AF_INET, SOCK_DGRAM)
+s.bind('', 0)
+s.allowbroadcast(1)
+
+while 1:
+	data = `time.time()` + '\n'
+	s.sendto(data, ('<broadcast>', MYPORT))
+	time.sleep(2)
+
+	
diff --git a/Demo/sockets/ftp.py b/Demo/sockets/ftp.py
new file mode 100755
index 0000000..ff15642
--- /dev/null
+++ b/Demo/sockets/ftp.py
@@ -0,0 +1,132 @@
+# A simple FTP client.
+#
+# The information to write this program was gathered from RFC 959,
+# but this is not a complete implementation!  Yet it shows how a simple
+# FTP client can be built, and you are welcome to extend it to suit
+# it to your needs...
+
+
+import sys, posix, string
+from socket import *
+
+
+BUFSIZE = 1024
+
+# Default port numbers used by the FTP protocol.
+#
+FTP_PORT = 21
+FTP_DATA_PORT = FTP_PORT - 1
+
+# Change the data port to something not needing root permissions.
+#
+FTP_DATA_PORT = FTP_DATA_PORT + 50000
+
+
+# Main program (called at the end of this file).
+#
+def main():
+	hostname = sys.argv[1]
+	control(hostname)
+
+
+# Control process (user interface and user protocol interpreter).
+#
+def control(hostname):
+	#
+	# Create control connection
+	#
+	s = socket(AF_INET, SOCK_STREAM)
+	s.connect(hostname, FTP_PORT)
+	f = s.makefile('r') # Reading the replies is easier from a file...
+	#
+	# Control loop
+	#
+	r = None
+	while 1:
+		code = getreply(f)
+		if code in ('221', 'EOF'): break
+		if code == '150':
+			getdata(r)
+			code = getreply(f)
+			r = None
+		if not r:
+			r = newdataport(s, f)
+		cmd = getcommand()
+		if not cmd: break
+		s.send(cmd + '\r\n')
+
+
+# Create a new data port and send a PORT command to the server for it.
+# (Cycle through a number of ports to avoid problems with reusing
+# a port within a short time.)
+#
+cycle = [0]
+#
+def newdataport(s, f):
+	port = cycle[0]
+	cycle[0] = (port+1) % 16
+	port = port + FTP_DATA_PORT
+	r = socket(AF_INET, SOCK_STREAM)
+	r.bind(gethostbyname(gethostname()), port)
+	r.listen(0)
+	sendportcmd(s, f, port)
+	return r
+
+
+# Send an appropriate port command.
+#
+def sendportcmd(s, f, port):
+	hostname = gethostname()
+	hostaddr = gethostbyname(hostname)
+	hbytes = string.splitfields(hostaddr, '.')
+	pbytes = [`port/256`, `port%256`]
+	bytes = hbytes + pbytes
+	cmd = 'PORT ' + string.joinfields(bytes, ',')
+	s.send(cmd + '\r\n')
+	code = getreply(f)
+
+
+# Process an ftp reply and return the 3-digit reply code (as a string).
+# The reply should be a line of text starting with a 3-digit number.
+# If the 4th char is '-', it is a multi-line reply and is
+# terminate by a line starting with the same 3-digit number.
+# Any text while receiving the reply is echoed to the file.
+#
+def getreply(f):
+	line = f.readline()
+	if not line: return 'EOF'
+	print line,
+	code = line[:3]
+	if line[3:4] == '-':
+		while 1:
+			line = f.readline()
+			if not line: break # Really an error
+			print line,
+			if line[:3] == code: break
+	return code
+
+
+# Get the data from the data connection.
+#
+def getdata(r):
+	print '(accepting data connection)'
+	conn, host = r.accept()
+	print '(data connection accepted)'
+	while 1:
+		data = conn.recv(BUFSIZE)
+		if not data: break
+		sys.stdout.write(data)
+	print '(end of data connection)'
+
+# Get a command from the user.
+#
+def getcommand():
+	try:
+		return raw_input('ftp> ')
+	except EOFError:
+		return ''
+
+
+# Call the main program.
+#
+main()
diff --git a/Demo/sockets/radio.py b/Demo/sockets/radio.py
new file mode 100755
index 0000000..4bb55ff
--- /dev/null
+++ b/Demo/sockets/radio.py
@@ -0,0 +1,13 @@
+# Receive UDP packets transmitted by a broadcasting service
+
+MYPORT = 50000
+
+import sys
+from socket import *
+
+s = socket(AF_INET, SOCK_DGRAM)
+s.bind('', MYPORT)
+
+while 1:
+	data = s.recv(1500)
+	sys.stdout.write(data)
