diff --git a/Lib/imghdr.py b/Lib/imghdr.py
new file mode 100644
index 0000000..b653cde
--- /dev/null
+++ b/Lib/imghdr.py
@@ -0,0 +1,98 @@
+# Recognizing image files based on their first few bytes.
+
+
+#-------------------------#
+# Recognize sound headers #
+#-------------------------#
+
+def what(filename):
+	f = open(filename, 'r')
+	h = f.read(32)
+	for tf in tests:
+		res = tf(h, f)
+		if res:
+			return res
+	return None
+
+
+#---------------------------------#
+# Subroutines per image file type #
+#---------------------------------#
+
+tests = []
+
+def test_rgb(h, f):
+	# SGI image library
+	if h[:2] == '\001\332':
+		return 'rgb'
+
+tests.append(test_rgb)
+
+def test_gif(h, f):
+	# GIF ('87 and '89 variants)
+	if h[:6] in ('GIF87a', 'GIF89a'):
+		return 'gif'
+
+tests.append(test_gif)
+
+def test_pnm(h, f):
+	# PBM, PGM, PPM (portable {bit,gray,pix}map; together portable anymap)
+	if h[0] == 'P' and h[1] in '123456' and h[2] in ' \t\n\r':
+		return 'pnm'
+
+tests.append(test_pnm)
+
+def test_tiff(h, f):
+	# TIFF (can be in Motorola or Intel byte order)
+	if h[:2] in ('MM', 'II'):
+		return 'tiff'
+
+tests.append(test_tiff)
+
+def test_rast(h, f):
+	# Sun raster file
+	if h[:4] == '\x59\xA6\x6A\x95':
+		return 'rast'
+
+tests.append(test_rast)
+
+
+#--------------------#
+# Small test program #
+#--------------------#
+
+def test():
+	import sys
+	recursive = 0
+	if sys.argv[1:] and sys.argv[1] == '-r':
+		del sys.argv[1:2]
+		recursive = 1
+	try:
+		if sys.argv[1:]:
+			testall(sys.argv[1:], recursive, 1)
+		else:
+			testall(['.'], recursive, 1)
+	except KeyboardInterrupt:
+		sys.stderr.write('\n[Interrupted]\n')
+		sys.exit(1)
+
+def testall(list, recursive, toplevel):
+	import sys
+	import os
+	for filename in list:
+		if os.path.isdir(filename):
+			print filename + '/:',
+			if recursive or toplevel:
+				print 'recursing down:'
+				import glob
+				names = glob.glob(os.path.join(filename, '*'))
+				testall(names, recursive, 0)
+			else:
+				print '*** directory (use -r) ***'
+		else:
+			print filename + ':',
+			sys.stdout.flush()
+			try:
+				print what(filename)
+			except IOError:
+				print '*** not found ***'
