diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index 312fd0d..4c5376d 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -95,6 +95,13 @@
 # That should be all.                                                 #
 #######################################################################
 
+for dir in os.curdir, os.environ['HOME']:
+	rcfile = os.path.join(dir, '.newslistrc.py')
+	if os.path.exists(rcfile):
+		print rcfile
+		execfile(rcfile)
+		break
+
 from nntplib import NNTP
 from stat import *
 
diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py
new file mode 100755
index 0000000..b80ce7e
--- /dev/null
+++ b/Tools/scripts/pathfix.py
@@ -0,0 +1,150 @@
+#! /usr/local/bin/python
+
+# Change the #! line occurring in Python scripts.  The new interpreter
+# pathname must be given with a -i option.
+#
+# Command line arguments are files or directories to be processed.
+# Directories are searched recursively for files whose name looks
+# like a python module.
+# Symbolic links are always ignored (except as explicit directory
+# arguments).  Of course, the original file is kept as a back-up
+# (with a "~" attached to its name).
+#
+# Undoubtedly you can do this using find and sed or perl, but this is
+# a nice example of Python code that recurses down a directory tree
+# and uses regular expressions.  Also note several subtleties like
+# preserving the file's mode and avoiding to even write a temp file
+# when no changes are needed for a file.
+#
+# NB: by changing only the function fixfile() you can turn this
+# into a program for a different change to Python programs...
+
+import sys
+import regex
+import os
+from stat import *
+import string
+import getopt
+
+err = sys.stderr.write
+dbg = err
+rep = sys.stdout.write
+
+new_interpreter = None
+
+def main():
+	global new_interpreter
+	usage = ('usage: %s -i /interpreter file-or-directory ...\n' %
+		 sys.argv[0])
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], 'i:')
+	except getopt.error, msg:
+		err(msg + '\n')
+		err(usage)
+		sys.exit(2)
+	for o, a in opts:
+		if o == '-i':
+			new_interpreter = a
+	if not new_interpreter or new_interpreter[0] != '/' or not args:
+		err('-i option or file-or-directory missing\n')
+		err(usage)
+		sys.exit(2)
+	bad = 0
+	for arg in args:
+		if os.path.isdir(arg):
+			if recursedown(arg): bad = 1
+		elif os.path.islink(arg):
+			err(arg + ': will not process symbolic links\n')
+			bad = 1
+		else:
+			if fix(arg): bad = 1
+	sys.exit(bad)
+
+ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
+def ispython(name):
+	return ispythonprog.match(name) >= 0
+
+def recursedown(dirname):
+	dbg('recursedown(' + `dirname` + ')\n')
+	bad = 0
+	try:
+		names = os.listdir(dirname)
+	except os.error, msg:
+		err(dirname + ': cannot list directory: ' + `msg` + '\n')
+		return 1
+	names.sort()
+	subdirs = []
+	for name in names:
+		if name in (os.curdir, os.pardir): continue
+		fullname = os.path.join(dirname, name)
+		if os.path.islink(fullname): pass
+		elif os.path.isdir(fullname):
+			subdirs.append(fullname)
+		elif ispython(name):
+			if fix(fullname): bad = 1
+	for fullname in subdirs:
+		if recursedown(fullname): bad = 1
+	return bad
+
+def fix(filename):
+##	dbg('fix(' + `filename` + ')\n')
+	try:
+		f = open(filename, 'r')
+	except IOError, msg:
+		err(filename + ': cannot open: ' + `msg` + '\n')
+		return 1
+	line = f.readline()
+	fixed = fixline(line)
+	if line == fixed:
+		rep(filename+': no change\n')
+		f.close()
+		return
+	head, tail = os.path.split(filename)
+	tempname = os.path.join(head, '@' + tail)
+	try:
+		g = open(tempname, 'w')
+	except IOError, msg:
+		f.close()
+		err(tempname+': cannot create: '+`msg`+'\n')
+		return 1
+	rep(filename + ': updating\n')
+	g.write(fixed)
+	BUFSIZE = 8*1024
+	while 1:
+		buf = f.read(BUFSIZE)
+		if not buf: break
+		g.write(buf)
+	g.close()
+	f.close()
+
+	# Finishing touch -- move files
+
+	# First copy the file's mode to the temp file
+	try:
+		statbuf = os.stat(filename)
+		os.chmod(tempname, statbuf[ST_MODE] & 07777)
+	except os.error, msg:
+		err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
+	# Then make a backup of the original file as filename~
+	try:
+		os.rename(filename, filename + '~')
+	except os.error, msg:
+		err(filename + ': warning: backup failed (' + `msg` + ')\n')
+	# Now move the temp file to the original file
+	try:
+		os.rename(tempname, filename)
+	except os.error, msg:
+		err(filename + ': rename failed (' + `msg` + ')\n')
+		return 1
+	# Return succes
+	return 0
+
+prog = regex.compile('\(#![ \t]*\)\(/[^ \t\n]*\)\(.*\n\)')
+
+def fixline(line):
+	if prog.match(line) < 0:
+		return line
+	head, tail = prog.group(1, 3)
+	return head + new_interpreter + tail
+
+main()
diff --git a/Tools/scripts/pindent.py b/Tools/scripts/pindent.py
index 35ae271..6432f4c 100755
--- a/Tools/scripts/pindent.py
+++ b/Tools/scripts/pindent.py
@@ -1,4 +1,4 @@
-#! /ufs/guido/bin/sgi/python
+#! /usr/local/bin/python
 #! /usr/local/bin/python
 
 # This file contains a class and a main program that perform two
