diff --git a/Demo/sgi/video/Vcopy.py b/Demo/sgi/video/Vcopy.py
new file mode 100755
index 0000000..f92dfdd
--- /dev/null
+++ b/Demo/sgi/video/Vcopy.py
@@ -0,0 +1,134 @@
+# Copy a video file, interactively, frame-by-frame.
+
+import sys
+import getopt
+from gl import *
+from DEVICE import *
+import VFile
+import string
+import imageop
+
+def report(time, iframe):
+	print 'Frame', iframe, ': t =', time
+
+def usage():
+	sys.stderr.write('usage: Vcopy [-t type] [-m treshold] [-a] infile outfile\n')
+	sys.stderr.write('-t Convert to other type\n')
+	sys.stderr.write('-a Automatic\n')
+	sys.stderr.write('-m Convert grey to mono with treshold\n')
+	sys.stderr.write('-d Convert grey to mono with dithering\n')
+	sys.exit(2)
+
+def help():
+	print 'Command summary:'
+	print 'n   get next image from input'
+	print 'w   write current image to output'
+
+def main():
+	foreground()
+	opts, args = getopt.getopt(sys.argv[1:], 't:am:d')
+	if len(args) <> 2:
+		usage()
+	[ifile, ofile] = args
+	print 'open film ', ifile
+	ifilm = VFile.VinFile().init(ifile)
+	print 'open output ', ofile
+	ofilm = VFile.VoutFile().init(ofile)
+	
+	ofilm.setinfo(ifilm.getinfo())
+
+	use_grabber = 0
+	continuous = 0
+	tomono = 0
+	tomonodither = 0
+	for o, a in opts:
+		if o == '-t':
+			ofilm.format = a
+			use_grabber = 1
+		if o == '-a':
+			continuous = 1
+		if o == '-m':
+			if ifilm.format <> 'grey':
+				print '-m only supported for greyscale'
+				sys.exit(1)
+			tomono = 1
+			treshold = string.atoi(a)
+			ofilm.format = 'mono'
+		if o == '-d':
+			if ifilm.format <> 'grey':
+				print '-m only supported for greyscale'
+				sys.exit(1)
+			tomonodither = 1
+			ofilm.format = 'mono'
+			
+	ofilm.writeheader()
+	#
+	prefsize(ifilm.width, ifilm.height)
+	w = winopen(ifile)
+	qdevice(KEYBD)
+	qdevice(ESCKEY)
+	qdevice(WINQUIT)
+	qdevice(WINSHUT)
+	print 'qdevice calls done'
+	#
+	help()
+	#
+	time, data, cdata = ifilm.getnextframe()
+	ifilm.showframe(data, cdata)
+	iframe = 1
+	report(time, iframe)
+	#
+	while 1:
+		if continuous:
+			dev = KEYBD
+		else:
+			dev, val = qread()
+		if dev in (ESCKEY, WINQUIT, WINSHUT):
+			break
+		if dev == REDRAW:
+			reshapeviewport()
+		elif dev == KEYBD:
+			if continuous:
+				c = '0'
+			else:
+				c = chr(val)
+			#XXX Debug
+			if c == 'R':
+				c3i(255,0,0)
+				clear()
+			if c == 'G':
+				c3i(0,255,0)
+				clear()
+			if c == 'B':
+				c3i(0,0,255)
+				clear()
+			if c == 'w' or continuous:
+				if use_grabber:
+					data, cdata = ofilm.grabframe()
+				if tomono:
+					data = imageop.grey2mono(data, \
+						  ifilm.width, ifilm.height, \
+						  treshold)
+				if tomonodither:
+					data = imageop.dither2mono(data, \
+						  ifilm.width, ifilm.height)
+				ofilm.writeframe(time, data, cdata)
+				print 'Frame', iframe, 'written.'
+			if c == 'n' or continuous:
+				try:
+					time,data,cdata = ifilm.getnextframe()
+					ifilm.showframe(data, cdata)
+					iframe = iframe+1
+					report(time, iframe)
+				except EOFError:
+					print 'EOF'
+					if continuous:
+						break
+					ringbell()
+		elif dev == INPUTCHANGE:
+			pass
+		else:
+			print '(dev, val) =', (dev, val)
+	ofilm.close()
+
+main()
