diff --git a/Doc/partparse.py b/Doc/partparse.py
index fd71ff6..8fdd95b 100644
--- a/Doc/partparse.py
+++ b/Doc/partparse.py
@@ -17,11 +17,20 @@
 #     I don't want to be the schmuck who ends up re-writting it!
 #
 # -fld
+#
+# (sometime later...)
+#
+#  Ok, I've re-worked substantial chunks of this.  It's only getting worse.
+#     It just might be gone before the next source release.  (Yeah!)
+#
+# -fld
 
 import sys, string, regex, getopt, os
 
 from types import IntType, ListType, StringType, TupleType
 
+release_version = sys.version[:3]
+
 # Different parse modes for phase 1
 MODE_REGULAR = 0
 MODE_VERBATIM = 1
@@ -829,7 +838,7 @@
 # ignore these commands
 ignoredcommands = ('bcode', 'ecode', 'hline', 'small', '/')
 # map commands like these to themselves as plaintext
-wordsselves = ('UNIX', 'ABC', 'C', 'ASCII', 'EOF', 'LaTeX')
+wordsselves = ('UNIX', 'ABC', 'C', 'ASCII', 'EOF', 'LaTeX', 'POSIX')
 # \{ --> {,  \} --> }, etc
 themselves = ('{', '}', ',', '.', '@', ' ', '\n') + wordsselves
 # these ones also themselves (see argargs macro in myformat.sty)
@@ -837,7 +846,7 @@
 # this is how *I* would show the difference between emph and strong
 #  code 1 means: fold to uppercase
 markcmds = {'code': ('', ''), 'var': 1, 'emph': ('_', '_'),
-	  'strong': ('*', '*')}
+	    'strong': ('*', '*')}
 
 # recognise patter {\FONTCHANGE-CMD TEXT} to \MAPPED-FC-CMD{TEXT}
 fontchanges = {'rm': 'r', 'it': 'i', 'em': 'emph', 'bf': 'b', 'tt': 't'}
@@ -1033,7 +1042,7 @@
 ## this routine will be called on \begin{funcdesc}{NAME}{ARGS}
 ##   or \funcline{NAME}{ARGS}
 ##
-def do_funcdesc(length, buf, pp, i):
+def do_funcdesc(length, buf, pp, i, index=1):
     startpoint = i-1
     ch = pp[startpoint]
     wh = ch.where
@@ -1114,9 +1123,8 @@
 	cat_class = 'exception'
 	class_class = string.join(idxsi[2:])
     elif idxsi == ['built-in', 'exception', 'base', 'class']:
-	command = 'defcv'
-	cat_class = 'exception'
-	class_class = "exception base class"
+	command = 'defvr'
+	cat_class = 'exception base class'
     else:
 	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
 
@@ -1136,7 +1144,7 @@
     return length, i
 
 ## same for datadesc or dataline...
-def do_datadesc(length, buf, pp, i):
+def do_datadesc(length, buf, pp, i, index=1):
     startpoint = i-1
     ch = pp[startpoint]
     wh = ch.where
@@ -1146,24 +1154,17 @@
     length = length - (newi-i)
 
     idxsi = hist.indexsubitem	# words
-    command = ''
-    cat_class = ''
+    command = 'defcv'
+    cat_class = 'data'
     class_class = ''
     if idxsi[-1] in ('attribute', 'option'):
-	command = 'defcv'
 	cat_class = idxsi[-1]
 	class_class = string.join(idxsi[:-1])
     elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-	command = 'defcv'
-	cat_class = 'data'
 	class_class = string.join(idxsi[1:])
     elif len(idxsi) == 4 and idxsi[:3] == ['data', 'in', 'module']:
-	command = 'defcv'
-	cat_class = 'data'
 	class_class = string.join(idxsi[2:])
     else:
-	command = 'defcv'
-	cat_class = 'data'
 	class_class = string.join(idxsi)
 
     ch.chtype = chunk_type[CSLINE]
@@ -1194,8 +1195,7 @@
     ch.chtype = CSLINE
     ch.data = "deffn"
 
-    cslinearg = [#chunk(GROUP, wh, [chunk(PLAIN, wh, "exception")]),
-		 chunk(PLAIN, wh, 'exception '),
+    cslinearg = [chunk(PLAIN, wh, 'byte\ code\ instruction'),
 		 chunk(GROUP, wh, [chunk(PLAIN, wh, "byte code instruction")]),
 		 chunk(PLAIN, wh, ' '),
 		 dataname,
@@ -1263,26 +1263,35 @@
 
 	if ch.chtype == chunk_type[GROUP]:
 	    # check for {\em ...} constructs
-	    if ch.data and \
-	       ch.data[0].chtype == chunk_type[CSNAME] and \
-	       fontchanges.has_key(s(buf, ch.data[0].data)):
-		k = s(buf, ch.data[0].data)
-		del ch.data[0]
+	    data = ch.data
+	    if data and \
+	       data[0].chtype == chunk_type[CSNAME] and \
+	       fontchanges.has_key(s(buf, data[0].data)):
+		k = s(buf, data[0].data)
+		del data[0]
 		pp.insert(i-1, chunk(CSNAME, ch.where, fontchanges[k]))
 		length, i = length+1, i+1
 
-	    elif ch.data:
-		k = s(buf, ch.data[0].data)
-		if k == "fulllineitems":
-		    del ch.data[0]
-		    data = ch.data
-		    pp[i-1:i] = data
-		    i = i - 1
-		    length = length + len(data) - 1
-		    continue
+	    elif data:
+		if len(data) \
+		   and data[0].chtype == chunk_type[GROUP] \
+		   and len(data[0].data) \
+		   and data[0].data[0].chtype == chunk_type[CSNAME] \
+		   and s(buf, data[0].data[0].data) == 'e':
+		    data[0] = data[0].data[0]
+		    print "invoking \\e magic group transform..."
+		else:
+## 		    print "GROUP -- ch.data[0].data =", ch.data[0].data
+		    k = s(buf, data[0].data)
+		    if k == "fulllineitems":
+			del data[0]
+			pp[i-1:i] = data
+			i = i - 1
+			length = length + len(data) - 1
+			continue
 
 	    # recursively parse the contents of the group
-	    changeit(buf, ch.data)
+	    changeit(buf, data)
 
 	elif ch.chtype == chunk_type[IF]:
 	    # \if...
@@ -1325,24 +1334,27 @@
 			  chunk(GROUP, ch.where, [])]
 		length, i = length+2, i+2
 
-	    elif envname == 'itemize':
+	    elif envname in ('itemize', 'list'):
 		if hist.itemizenesting > len(itemizesymbols):
 		    raise error, 'too deep itemize nesting'
+		if envname == 'list':
+		    del pp[i:i+2]
+		    length = length - 2
 		ingroupch = [chunk(CSNAME, ch.where,
-			  itemizesymbols[hist.itemizenesting])]
+				   itemizesymbols[hist.itemizenesting])]
 		hist.itemizenesting = hist.itemizenesting + 1
 		pp[i:i] = [chunk(CSLINE, ch.where, 'itemize'),
-			  chunk(GROUP, ch.where, ingroupch)]
+			   chunk(GROUP, ch.where, ingroupch)]
 		length, i = length+2, i+2
 
 	    elif envname == 'enumerate':
 		if hist.enumeratenesting > len(enumeratesymbols):
 		    raise error, 'too deep enumerate nesting'
 		ingroupch = [chunk(PLAIN, ch.where,
-			  enumeratesymbols[hist.enumeratenesting])]
+				   enumeratesymbols[hist.enumeratenesting])]
 		hist.enumeratenesting = hist.enumeratenesting + 1
 		pp[i:i] = [chunk(CSLINE, ch.where, 'enumerate'),
-			  chunk(GROUP, ch.where, ingroupch)]
+			   chunk(GROUP, ch.where, ingroupch)]
 		length, i = length+2, i+2
 
 	    elif envname == 'description':
@@ -1408,20 +1420,22 @@
 		    raise 'STILL, SOMETHING wrong', `i`
 
 
-	    elif envname == 'funcdesc':
+	    elif envname in ('funcdesc', 'funcdescni'):
 		pp.insert(i, chunk(PLAIN, ch.where, ''))
 		i, length = i+1, length+1
-		length, i = do_funcdesc(length, buf, pp, i)
+		length, i = do_funcdesc(length, buf, pp, i,
+					envname=="funcdesc")
 
 	    elif envname == 'excdesc':
 		pp.insert(i, chunk(PLAIN, ch.where, ''))
 		i, length = i+1, length+1
 		length, i = do_excdesc(length, buf, pp, i)
 
-	    elif envname == 'datadesc':
+	    elif envname in ('datadesc', 'datadescni'):
 		pp.insert(i, chunk(PLAIN, ch.where, ''))
 		i, length = i+1, length+1
-		length, i = do_datadesc(length, buf, pp, i)
+		length, i = do_datadesc(length, buf, pp, i,
+					envname=="datadesc")
 
 	    elif envname == 'opcodedesc':
 		pp.insert(i, chunk(PLAIN, ch.where, ''))
@@ -1458,7 +1472,7 @@
 			   chunk(GROUP, ch.where, [
 			       chunk(PLAIN, ch.where, 'example')])]
 		i, length = i+2, length+2
-	    elif envname == 'itemize':
+	    elif envname in ('itemize', 'list'):
 		hist.itemizenesting = hist.itemizenesting - 1
 		pp[i:i] = [chunk(CSLINE, ch.where, 'end'),
 			   chunk(GROUP, ch.where, [
@@ -1483,7 +1497,8 @@
 		pp.insert(i, chunk(DENDLINE, ch.where, '\n'))
 		i, length = i+1, length+1
 
-	    elif envname in ('funcdesc', 'excdesc', 'datadesc'):
+	    elif envname in ('funcdesc', 'excdesc', 'datadesc',
+			     'funcdescni', 'datadescni'):
 		pp[i:i] = [chunk(CSLINE, ch.where, 'end'),
 			   chunk(GROUP, ch.where, [
 			       chunk(PLAIN, ch.where, hist.command)])]
@@ -1546,30 +1561,41 @@
 		# \, --> , \[ --> [, \] --> ]
 		ch.chtype = chunk_type[PLAIN]
 
-	    elif s_buf_data == 'renewcommand':
-		# \renewcommand{\indexsubitem}....
-		i, length = i-1, length-1
-		del pp[i]
-		length, newi = getnextarg(length, buf, pp, i)
-		if newi-i == 1 \
-			  and i < length \
-			  and pp[i].chtype == chunk_type[CSNAME] \
-			  and s(buf, pp[i].data) == 'indexsubitem':
-		    del pp[i:newi]
-		    length = length - (newi-i)
-		    length, newi = getnextarg(length, buf, pp, i)
-		    text = flattext(buf, pp[i:newi])
-		    if text[:1] != '(' or text[-1:] != ')':
-			raise error, \
-			      'expected indexsubitem enclosed in parenteses'
-		    words = string.split(text[1:-1])
-		    hist.indexsubitem = words
-## 		    print 'set hist.indexsubitem =', words
-		    del text, words
-		else:
-		    print 'WARNING: renewcommand with unsupported arg removed'
-		del pp[i:newi]
-		length = length - (newi-i)
+	    elif s_buf_data == 'setindexsubitem':
+		stuff = pp[i].data
+		if len(stuff) != 1:
+		    raise error, "parameter to \\setindexsubitem{} too long"
+		if pp[i].chtype != chunk_type[GROUP]:
+		    raise error, "bad chunk type following \\setindexsubitem" \
+			  "\nexpected GROUP, got " + str(ch.chtype)
+		text = s(buf, stuff[0].data)
+		if text[:1] != '(' or text[-1:] != ')':
+		    raise error, \
+			  'expected indexsubitem enclosed in parenteses'
+		hist.indexsubitem = string.split(text[1:-1])
+		del stuff, text
+		del pp[i-1:i+1]
+		i = i - 1
+		length = length - 2
+
+	    elif s_buf_data == 'newcommand':
+		print "ignoring definition of \\" + s(buf, pp[i].data[0].data)
+		del pp[i-1:i+2]
+		i = i - 1
+		length = length - 3
+
+	    elif s_buf_data == 'mbox':
+		stuff = pp[i].data
+		pp[i-1:i+1] = stuff
+		i = i - 1
+		length = length + len(stuff) - 2
+
+	    elif s_buf_data == 'version':
+		ch.chtype = chunk_type[PLAIN]
+		ch.data = release_version
+
+	    elif s_buf_data == 'program':
+		ch.data = "strong"
 
 	    elif s_buf_data == "fulllineitems":
 		del pp[i-1]
@@ -1641,7 +1667,7 @@
 		    pp.insert(i, chunk(GROUP, ch.where, []))
 		    i, length = i+1, length+1
 	    elif s_buf_data in themselves:
-		# \UNIX --> UNIX
+		# \UNIX --> &UNIX;
 		ch.chtype = chunk_type[PLAIN]
 		if i != length \
 			  and pp[i].chtype == chunk_type[GROUP] \
@@ -1651,6 +1677,12 @@
 	    elif s_buf_data in for_texi:
 		pass
 
+	    elif s_buf_data == 'manpage':
+		ch.data = 'emph'
+		sect = s(buf, pp[i+1].data[0].data)
+		pp[i+1].data = "(%s)" % sect
+		pp[i+1].chtype = chunk_type[PLAIN]
+
 	    elif s_buf_data == 'e':
 		# "\e" --> "\"
 		ch.data = '\\'
@@ -1661,10 +1693,6 @@
 		# @item @<cts. of itemargmacro>{a1}
 		#  a2 [ -- a3]
 		#
-		##print 'LINEIIIIII!!!!!!!'
-##				wobj = Wobj()
-##				dumpit(buf, wobj.write, pp[i-1:i+5])
-##				print '--->' + wobj.data + '<----'
 		if not hist.inenv:
 		    raise error, 'no environment for lineiii'
 		if (hist.inenv[0] != 'tableiii') and \
@@ -1679,10 +1707,6 @@
 			     chunk(GROUP, 0, pp[i:newi])]
 		del pp[i:newi]
 		length = length - (newi-i)
-##				print 'ITEM ARG: --->',
-##				wobj = Wobj()
-##				dumpit(buf, wobj.write, ingroupch)
-##				print wobj.data, '<---'
 		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
 		grouppos = i
 		i, length = i+1, length+1
@@ -1693,11 +1717,6 @@
 		    pp.insert(i, chunk(PLAIN, ch.where, '  ---  '))
 		    i = newi + 1
 		    length = length + 1
-##					pp[grouppos].data = pp[grouppos].data \
-##						  + [chunk(PLAIN, ch.where, '  ')] \
-##						  + pp[i:newi]
-##					del pp[i:newi]
-##					length = length - (newi-i)
 		if length != len(pp):
 		    raise 'IN LINEIII IS THE ERR', `i`
 
@@ -1708,7 +1727,8 @@
 		## also: remove commas and quotes
 		ch.chtype = chunk_type[CSLINE]
 		length, newi = getnextarg(length, buf, pp, i)
-		afternodenamecmd = next_command_p(length, buf, pp, newi, 'nodename')
+		afternodenamecmd = next_command_p(length, buf,
+						  pp, newi, 'nodename')
 		if afternodenamecmd < 0:
 		    cp1 = crcopy(pp[i:newi])
 		    pp[i:newi] = [chunk(GROUP, ch.where, pp[i:newi])]
@@ -1716,7 +1736,8 @@
 		    text = flattext(buf, cp1)
 		    text = invent_node_names(text)
 		else:
-		    length, endarg = getnextarg(length, buf, pp, afternodenamecmd)
+		    length, endarg = getnextarg(length, buf,
+						pp, afternodenamecmd)
 		    cp1 = crcopy(pp[afternodenamecmd:endarg])
 		    del pp[newi:endarg]
 		    length = length - (endarg-newi)
@@ -1726,7 +1747,6 @@
 		    text = flattext(buf, cp1)
 		if text[-1] == '.':
 		    text = text[:-1]
-##				print 'FLATTEXT:', `text`
 		if text in hist.nodenames:
 		    print 'WARNING: node name ' + `text` + ' already used'
 		    out.doublenodes.append(text)
@@ -1900,7 +1920,7 @@
 		ch.data = 'cindex'
 		length, newi = getnextarg(length, buf, pp, i)
 		ingroupch = [chunk(CSNAME, wh, 'code'),
-			  chunk(GROUP, wh, pp[i:newi])]
+			     chunk(GROUP, wh, pp[i:newi])]
 
 		del pp[i:newi]
 		length = length - (newi-i)
@@ -2045,14 +2065,14 @@
 			  chunk(GROUP, ch.where, ingroupch)]
 		i, length = i+2, length+2
 
-## 	    elif s_buf_data == 'indexsubitem':
-## 		ch.data = flattext(buf, [ch])
-## 		ch.chtype = chunk_type[PLAIN]
-
 	    elif s_buf_data == 'seemodule':
 		ch.data = "code"
+		# this is needed for just one of the input files... -sigh-
+		while pp[i+1].chtype == chunk_type[COMMENT]:
+		    i = i + 1
 		data = pp[i+1].data
-		data.insert(0, chunk(PLAIN, ch.where, " ("))
+		oparen = chunk(PLAIN, ch.where, " (")
+		data.insert(0, oparen)
 		data.append(chunk(PLAIN, ch.where, ")"))
 		pp[i+1:i+2] = data
 		length = length + len(data) - 1
@@ -2068,9 +2088,14 @@
 		ch.chtype = PLAIN
 		ch.data = "    "
 
-	    elif s_buf_data in ('noindent', 'indexsubitem'):
+	    elif s_buf_data in ('noindent', 'indexsubitem', 'footnote'):
 		pass
 
+	    elif s_buf_data in ('url', 'module', 'function', 'cfunction',
+				'keyword', 'method', 'exception', 'constant',
+				'email', 'class'):
+		ch.data = "code"
+
 	    elif s_buf_data == 'label':
 		name = s(buf, pp[i].data[0].data)
 		del pp[i-1:i+1]
@@ -2078,6 +2103,17 @@
 		i = i - 1
 		label_nodes[name] = hist.nodenames[-1]
 
+	    elif s_buf_data == 'rfc':
+		ch.chtype = chunk_type[PLAIN]
+		ch.data = "RFC " + s(buf, pp[i].data[0].data)
+		del pp[i]
+		length = length - 1
+
+	    elif s_buf_data == 'Large':
+		del pp[i-1]
+		i = i - 1
+		length = length - 1
+
 	    elif s_buf_data == 'ref':
 		name = s(buf, pp[i].data[0].data)
 		if label_nodes.has_key(name):
@@ -2220,12 +2256,13 @@
 
 
 def main():
+    global release_version
     outfile = None
     headerfile = 'texipre.dat'
     trailerfile = 'texipost.dat'
 
     try:
-	opts, args = getopt.getopt(sys.argv[1:], 'o:h:t:')
+	opts, args = getopt.getopt(sys.argv[1:], 'o:h:t:v:')
     except getopt.error:
 	args = []
 
@@ -2238,6 +2275,7 @@
 	if opt == '-o': outfile = arg
 	if opt == '-h': headerfile = arg
 	if opt == '-t': trailerfile = arg
+	if opt == '-v': release_version = arg
 
     if not outfile:
 	root, ext = os.path.splitext(args[0])
