diff --git a/Doc/texi2html.py b/Doc/texi2html.py
index 10d955c..a1c0ebd 100644
--- a/Doc/texi2html.py
+++ b/Doc/texi2html.py
@@ -2,7 +2,7 @@
 
 # Convert GNU texinfo files into HTML, one file per node.
 # Based on Texinfo 2.14.
-# Usage: texi2html [-d] [-d] inputfile outputdirectory
+# Usage: texi2html [-d] [-d] [-c] inputfile outputdirectory
 # The input file must be a complete texinfo file, e.g. emacs.texi.
 # This creates many files (one per info node) in the output directory,
 # overwriting existing files of the same name.  All files created have
@@ -17,12 +17,23 @@
 # - handle @exdent properly
 # - add links directly to the proper line from indices
 # - check against the definitive list of @-cmds; we still miss (among others):
-# - @set, @clear, @ifset, @ifclear
 # - @defindex (hard)
 # - @c(omment) in the middle of a line (rarely used)
 # - @this* (not really needed, only used in headers anyway)
 # - @today{} (ever used outside title page?)
 
+# More consistent handling of chapters/sections/etc.
+# Lots of documentation
+# Many more options:
+#	-top	designate top node
+#	-links	customize which types of links are included
+#	-split  split at chapters or sections instead of nodes
+#	-name	Allow different types of filename handling. Non unix systems
+#		will have problems with long node names
+#	...
+# Support the most recent texinfo version and take a good look at HTML 3.0
+# More debugging output (customizable) and more fexible error handling
+# How about icons ?
 
 import os
 import regex
@@ -39,6 +50,81 @@
 	'^\* \([^:]*\):\(:\|[ \t]*\([^\t,\n.]+\)\([^ \t\n]*\)\)[ \t\n]*')
 					# menu item (Yuck!)
 
+
+class Node:
+    __doc__ = """
+    Some of the parser's functionality is separated into this class.
+
+    A Node accumulates its contents, takes care of links to other Nodes
+    and saves itself when it is finished and all links are resolved. """
+    
+    def __init__ (self, dir, name, topname, title, next, prev, up):
+	self.dirname = dir
+	self.name = name
+	if topname:
+	    self.topname = topname
+	else:
+	    self.topname = name
+	self.title = title
+	self.next = next
+	self.prev = prev
+	self.up = up
+	self.lines = []
+	self.type = 0
+	self.cont = ''
+	
+    def write (self, *lines):
+	for line in lines:
+	    self.lines.append (line)
+
+    def flush (self):
+	fp = open (self.dirname + '/' + makefile(self.name), 'w')
+	fp.write (self.prologue)
+	fp.write (self.text)
+	fp.write (self.epilogue)
+	fp.close ()
+
+    
+    def link(self, label, nodename):
+	if nodename:
+	    if string.lower(nodename) == '(dir)':
+		addr = '../dir.html'
+	    else:
+		addr = makefile(nodename)
+	    self.write(label, ': <A HREF="', addr, '" TYPE="', \
+		       label, '">', nodename, '</A>  \n')
+
+    
+    def finalize(self):
+	length = len (self.lines)
+	self.text = string.joinfields (self.lines, '')
+	self.lines = []
+	self.write ('<BR> <HR>\n')
+	if self.cont != self.next:
+	    self.link('Cont', self.cont)
+	self.link('Next', self.next)
+	self.link('Prev', self.prev)
+	self.link('Up', self.up)
+	if self.name <> self.topname:
+	    self.link('Top', self.topname)
+	self.write ('<BR> <HR> <P>\n')
+	links = string.joinfields (self.lines, '')
+	self.lines = []
+	
+	self.prologue = \
+		      '<!DOCTYPE HTML PUBLIC "-//W3O//DTD W3 HTML 2.0//EN">\n' + \
+		      '<!- Converted with texi2html and Python>\n' + \
+		      '<P>\n<HEAD>\n' + \
+		      '<TITLE>' + self.title + '</TITLE>\n' + \
+		      '</HEAD>\n<BODY>\n<P>\n' + \
+		      links
+	
+	if length > 20:
+	    self.epilogue = links + '</BODY>\n'
+	else:
+	    self.epilogue = '</BODY>\n'
+	    
+
 class TexinfoParser:
 
 	# Initialize an instance
@@ -50,6 +136,7 @@
 		self.nodelineno = 0	# Linenumber relative to node
 		self.links = None	# Links from current node
 		self.savetext = None	# If not None, save text head instead
+		self.savestack = []	# If not None, save text head instead
 		self.dirname = 'tmp'	# directory where files are created
 		self.includedir = '.'	# directory to search @include files
 		self.nodename = ''	# name of current node
@@ -59,14 +146,17 @@
 		self.contents = []	# Reset table of contents
 		self.numbering = []	# Reset section numbering counters
 		self.nofill = 0		# Normal operation: fill paragraphs
-		self.goodset=['html']	# Names that should be parsed in ifset
+		self.values={'html': 1} # Names that should be parsed in ifset
 		self.stackinfo={}	# Keep track of state in the stack
 		# XXX The following should be reset per node?!
 		self.footnotes = []	# Reset list of footnotes
 		self.itemarg = None	# Reset command used by @item
 		self.itemnumber = None	# Reset number for @item in @enumerate
 		self.itemindex = None	# Reset item index name
-
+		self.node = None
+		self.nodestack = []
+		self.cont = 0
+		self.includedepth = 0
 	# Set (output) directory name
 	def setdirname(self, dirname):
 		self.dirname = dirname
@@ -132,27 +222,42 @@
 		if self.stack:
 			print '*** Stack not empty at the end'
 			print '***', self.stack
+		if self.includedepth == 0:
+		    while self.nodestack:
+			self.nodestack[-1].finalize ()
+			self.nodestack[-1].flush ()
+			del self.nodestack [-1]
 
 	# Start saving text in a buffer instead of writing it to a file
 	def startsaving(self):
 		if self.savetext <> None:
-			print '*** Recursively saving text, expect trouble'
+			self.savestack.append (self.savetext)
+			# print '*** Recursively saving text, expect trouble'
 		self.savetext = ''
 
 	# Return the text saved so far and start writing to file again
 	def collectsavings(self):
 		savetext = self.savetext
-		self.savetext = None
+		if len (self.savestack) > 0:
+			self.savetext = self.savestack[-1]
+			del self.savestack[-1]
+		else:
+			self.savetext = None
 		return savetext or ''
 
 	# Write text to file, or save it in a buffer, or ignore it
 	def write(self, *args):
-		text = string.joinfields(args, '')
+		try:
+			text = string.joinfields(args, '')
+		except:
+			print args
+			raise TypeError
 		if self.savetext <> None:
 			self.savetext = self.savetext + text
 		elif self.nodefp:
 			self.nodefp.write(text)
-
+		elif self.node:
+		        self.node.write (text)
 	# Complete the current node -- write footnotes and close file
 	def endnode(self):
 		if self.savetext <> None:
@@ -172,7 +277,16 @@
 				self.write ('<HR>\n')
 			self.write('</BODY>\n')
 			self.nodefp.close()
-		self.nodefp = None
+			self.nodefp = None
+		elif self.node:
+		    if not self.cont and \
+		       (not self.node.type or \
+			(self.node.next and self.node.prev and self.node.up)):
+			self.node.finalize ()
+			self.node.flush ()
+		    else:
+			self.nodestack.append (self.node)
+		    self.node = None
 		self.nodename = ''
 
 	# Process a list of lines, expanding embedded @-commands
@@ -341,7 +455,9 @@
 		save_done = self.done
 		save_skip = self.skip
 		save_stack = self.stack
+		self.includedepth = self.includedepth + 1
 		self.parserest(fp, 0)
+		self.includedepth = self.includedepth - 1
 		fp.close()
 		self.done = save_done
 		self.skip = save_skip
@@ -364,7 +480,9 @@
 	def close_TeX(self): pass
 
 	def handle_copyright(self): self.write('(C)')
-
+	def open_copyright(self): self.write('(C)')
+	def close_copyright(self): pass
+		
 	def open_minus(self): self.write('-')
 	def close_minus(self): pass
 
@@ -466,17 +584,19 @@
 	close_i = close_emph
 
 	def open_footnote(self):
-		if self.savetext <> None:
-			print '*** Recursive footnote -- expect weirdness'
+		# if self.savetext <> None:
+		# 	print '*** Recursive footnote -- expect weirdness'
 		id = len(self.footnotes) + 1
 		self.write('<A NAME="footnoteref', `id`, \
 			'" HREF="#footnotetext', `id`, '">(', `id`, ')</A>')
-		self.savetext = ''
+		# self.savetext = ''
+		self.startsaving ()
 
 	def close_footnote(self):
 		id = len(self.footnotes) + 1
-		self.footnotes.append(`id`, self.savetext)
-		self.savetext = None
+		# self.footnotes.append(`id`, self.savetext)
+		self.footnotes.append(`id`, self.collectsavings())
+		# self.savetext = None
 
 	def writefootnotes(self):
 		self.write('<H2>---------- Footnotes ----------</H2>\n')
@@ -534,7 +654,9 @@
 			try:
 				func = getattr(self, 'bgn_' + cmd)
 			except AttributeError:
-				self.unknown_cmd(cmd, args)
+				# don't complain if we are skipping anyway
+				if not self.skip:
+					self.unknown_cmd(cmd, args)
 				return
 			self.stack.append(cmd)
 			func(args)
@@ -593,16 +715,22 @@
 	def bgn_tex(self, args): self.skip = self.skip + 1
 	def end_tex(self): self.skip = self.skip - 1
 
-	def bgn_set(self, args):
-		if args not in self.goodset:
-			self.gooset.append(args)
+	def do_set(self, args):
+		fields = string.splitfields (args, ' ')
+		key = fields[0]
+		if len(fields) == 1:
+			value = 1
+		else:
+			value = string.joinfields (fields[1:], ' ')
+		self.values[key]=value
+		print self.values
 			
-	def bgn_clear(self, args):
-		if args in self.goodset:
-			self.gooset.remove(args)
+	def do_clear(self, args):
+		self.values[args] = None
 			
 	def bgn_ifset(self, args):
-		if args not in self.goodset:
+		if args not in self.values.keys() \
+		   or self.values[args] is None:
 			self.skip = self.skip + 1
 			self.stackinfo[len(self.stack)] = 1
 		else:
@@ -615,14 +743,25 @@
 		del self.stackinfo[len(self.stack) + 1]
 
 	def bgn_ifclear(self, args):
-		if args in self.goodset:
+		if args in self.values.keys() \
+		   and self.values[args] is not None:
 			self.skip = self.skip + 1
 			self.stackinfo[len(self.stack)] = 1
 		else:
 			self.stackinfo[len(self.stack)] = 0
 		
 	end_ifclear = end_ifset
-	
+
+	def open_value(self):
+		self.startsaving()
+
+	def close_value(self):
+		key = self.collectsavings ()
+		if key in self.values.keys():
+			self.write (self.values[key])
+		else:
+			print '*** Undefined value: ', key
+		       
 	# --- Beginning a file ---
 
 	do_finalout = do_comment
@@ -630,20 +769,25 @@
 	do_setfilename = do_comment
 
 	def do_settitle(self, args):
-		self.title = args
-
+		print args
+		self.startsaving()
+		self.expand (args)
+		self.title = self.collectsavings ()
+		print self.title
 	def do_parskip(self, args): pass
 	
 	# --- Ending a file ---
 
 	def do_bye(self, args):
+		self.endnode ()
 		self.done = 1
 
 	# --- Title page ---
 
 	def bgn_titlepage(self, args): self.skip = self.skip + 1
 	def end_titlepage(self): self.skip = self.skip - 1
-
+	def do_shorttitlepage(self, args): pass
+	
 	def do_center(self, args):
 		# Actually not used outside title page...
 		self.write('<H1>')
@@ -685,24 +829,28 @@
 		else:
 			if self.debugging: print '--- writing', file
 		self.filenames[file] = 1
-		self.nodefp = open(file, 'w')
+		# self.nodefp = open(file, 'w')
 		self.nodename = name
+		if self.cont and self.nodestack:
+		    self.nodestack[-1].cont = self.nodename
 		if not self.topname: self.topname = name
 		title = name
 		if self.title: title = title + ' -- ' + self.title
 		# No idea what this means, but this is what latex2html writes
-		self.write('<!DOCTYPE HTML PUBLIC "-//W3O//DTD W3 HTML 2.0//EN">\n')
-		self.write('<!- Converted with texi2html and Python>\n')
-		self.write ('<P>\n<HEAD>\n')
-		self.write('<TITLE>', title, '</TITLE>\n')
-		self.write ('</HEAD>\n<BODY>\n<P>\n<BR> <HR>\n')
-		self.link('Next', next)
-		self.link('Prev', prev)
-		self.link('Up', up)
-		if self.nodename <> self.topname:
-			self.link('Top', self.topname)
-		self.write ('<BR> <HR> <P>\n')
-
+		# self.write('<!DOCTYPE HTML PUBLIC "-//W3O//DTD W3 HTML 2.0//EN">\n')
+		# self.write('<!- Converted with texi2html and Python>\n')
+		# self.write ('<P>\n<HEAD>\n')
+		# self.write('<TITLE>', title, '</TITLE>\n')
+		# self.write ('</HEAD>\n<BODY>\n<P>\n<BR> <HR>\n')
+		# self.link('Next', next)
+		# self.link('Prev', prev)
+		# self.link('Up', up)
+		# if self.nodename <> self.topname:
+		# 	self.link('Top', self.topname)
+		# self.write ('<BR> <HR> <P>\n')
+		self.node = Node (self.dirname, self.nodename, self.topname, \
+				  title, next, prev, up)
+		
 	def link(self, label, nodename):
 		if nodename:
 			if string.lower(nodename) == '(dir)':
@@ -714,12 +862,37 @@
 
 	# --- Sectioning commands ---
 
+	def popstack (self, type):
+	    if (self.node):
+		self.node.type = type
+		while self.nodestack:
+		    if self.nodestack[-1].type > type:
+			self.nodestack[-1].finalize ()
+			self.nodestack[-1].flush ()
+			del self.nodestack [-1]
+		    elif self.nodestack[-1].type == type:
+			if not self.nodestack[-1].next:
+			    self.nodestack[-1].next = self.node.name
+			if not self.node.prev:
+			    self.node.prev = self.nodestack[-1].name
+			self.nodestack[-1].finalize ()
+			self.nodestack[-1].flush ()
+			del self.nodestack [-1]
+		    else:
+			if type > 1 and not self.node.up:
+			    self.node.up = self.nodestack[-1].name
+			break
+
 	def do_chapter(self, args):
 		self.heading('H1', args, 0)
+		self.popstack (1)
+
 	def do_unnumbered(self, args):
 		self.heading('H1', args, -1)
+		self.popstack (1)
 	def do_appendix(self, args):
 		self.heading('H1', args, -1)
+		self.popstack (1)
 	def do_top(self, args):
 		self.heading('H1', args, -1)
 	def do_chapheading(self, args):
@@ -729,29 +902,39 @@
 
 	def do_section(self, args):
 		self.heading('H1', args, 1)
+		self.popstack (2)
+
 	def do_unnumberedsec(self, args):
 		self.heading('H1', args, -1)
+		self.popstack (2)
 	def do_appendixsec(self, args):
 		self.heading('H1', args, -1)
+		self.popstack (2)
 	do_appendixsection = do_appendixsec
 	def do_heading(self, args):
 		self.heading('H1', args, -1)
 
 	def do_subsection(self, args):
 		self.heading('H2', args, 2)
+		self.popstack (3)
 	def do_unnumberedsubsec(self, args):
 		self.heading('H2', args, -1)
+		self.popstack (3)
 	def do_appendixsubsec(self, args):
 		self.heading('H2', args, -1)
+		self.popstack (3)
 	def do_subheading(self, args):
 		self.heading('H2', args, -1)
 
 	def do_subsubsection(self, args):
 		self.heading('H3', args, 3)
+		self.popstack (4)
 	def do_unnumberedsubsubsec(self, args):
 		self.heading('H3', args, -1)
+		self.popstack (4)
 	def do_appendixsubsubsec(self, args):
 		self.heading('H3', args, -1)
+		self.popstack (4)
 	def do_subsubheading(self, args):
 		self.heading('H3', args, -1)
 
@@ -773,8 +956,8 @@
 			print '---', args
 
 	def do_contents(self, args):
-		pass
-		# self.listcontents('Table of Contents', 999)
+	        # pass
+		self.listcontents('Table of Contents', 999)
 
 	def do_shortcontents(self, args):
 		pass
@@ -821,14 +1004,8 @@
 	# --- Function and variable definitions ---
 
 	def bgn_deffn(self, args):
-		self.write('<DL><DT>')
-		words = splitwords(args, 2)
-		[category, name], rest = words[:2], words[2:]
-		self.expand('@b{' + name + '}')
-		for word in rest: self.expand(' ' + makevar(word))
-		self.expand(' -- ' + category)
-		self.write('<DD>\n')
-		self.index('fn', name)
+		self.write('<DL>')
+		self.do_deffnx (args)
 
 	def end_deffn(self):
 		self.write('</DL>\n')
@@ -845,15 +1022,24 @@
 
 	def bgn_defun(self, args): self.bgn_deffn('Function ' + args)
 	end_defun = end_deffn
+	def do_defunx(self, args): self.do_deffnx('Function ' + args)
 
 	def bgn_defmac(self, args): self.bgn_deffn('Macro ' + args)
 	end_defmac = end_deffn
+	def do_defmacx(self, args): self.do_deffnx('Macro ' + args)
 
 	def bgn_defspec(self, args): self.bgn_deffn('{Special Form} ' + args)
 	end_defspec = end_deffn
+	def do_defspecx(self, args): self.do_deffnx('{Special Form} ' + args)
 
 	def bgn_defvr(self, args):
-		self.write('<DL><DT>')
+		self.write('<DL>')
+		self.do_defvrx (args)
+
+	end_defvr = end_deffn
+
+	def do_defvrx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 2)
 		[category, name], rest = words[:2], words[2:]
 		self.expand('@code{' + name + '}')
@@ -863,18 +1049,24 @@
 		self.write('<DD>\n')
 		self.index('vr', name)
 
-	end_defvr = end_deffn
-
 	def bgn_defvar(self, args): self.bgn_defvr('Variable ' + args)
 	end_defvar = end_defvr
+	def do_defvarx(self, args): self.do_defvrx('Variable ' + args)
 
 	def bgn_defopt(self, args): self.bgn_defvr('{User Option} ' + args)
 	end_defopt = end_defvr
+	def do_defoptx(self, args): self.do_defvrx('{User Option} ' + args)
 
 	# --- Ditto for typed languages ---
 
 	def bgn_deftypefn(self, args):
-		self.write('<DL><DT>')
+		self.write('<DL>')
+		self.do_deftypefnx (args)
+	
+	end_deftypefn = end_deffn
+
+	def do_deftypefnx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 3)
 		[category, datatype, name], rest = words[:3], words[3:]
 		self.expand('@code{' + datatype + '} @b{' + name + '}')
@@ -883,15 +1075,21 @@
 		self.write('<DD>\n')
 		self.index('fn', name)
 
-	end_deftypefn = end_deffn
 
 	def bgn_deftypefun(self, args): self.bgn_deftypefn('Function ' + args)
 	end_deftypefun = end_deftypefn
+	def do_deftypefunx(self, args): self.do_deftypefnx('Function ' + args)
 
 	def bgn_deftypevr(self, args):
+		self.write('<DL>')
+		self.do_deftypevrx (args)
+	
+	end_deftypevr = end_deftypefn
+
+	def do_deftypevrx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 3)
 		[category, datatype, name], rest = words[:3], words[3:]
-		self.write('<DL><DT>')
 		self.expand('@code{' + datatype + '} @b{' + name + '}')
 		# If there are too many arguments, show them
 		for word in rest: self.expand(' ' + word)
@@ -899,18 +1097,24 @@
 		self.write('<DD>\n')
 		self.index('fn', name)
 
-	end_deftypevr = end_deftypefn
-
 	def bgn_deftypevar(self, args):
 		self.bgn_deftypevr('Variable ' + args)
 	end_deftypevar = end_deftypevr
+	def do_deftypevarx(self, args):
+		self.do_deftypevrx('Variable ' + args)
 
 	# --- Ditto for object-oriented languages ---
 
 	def bgn_defcv(self, args):
+		self.write('<DL>')
+		self.do_defcvx(args)
+
+	end_defcv = end_deftypevr
+
+	def do_defcvx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 3)
 		[category, classname, name], rest = words[:3], words[3:]
-		self.write('<DL><DT>')
 		self.expand('@b{' + name + '}')
 		# If there are too many arguments, show them
 		for word in rest: self.expand(' ' + word)
@@ -918,14 +1122,20 @@
 		self.write('<DD>\n')
 		self.index('vr', name + ' @r{of ' + classname + '}')
 
-	end_defcv = end_deftypevr
-
 	def bgn_defivar(self, args):
 		self.bgn_defcv('{Instance Variable} ' + args)
 	end_defivar = end_defcv
+	def do_defivarx(self, args):
+		self.do_defcvx('{Instance Variable} ' + args)
 
 	def bgn_defop(self, args):
-		self.write('<DL><DT>')
+		self.write('<DL>')
+		self.do_defopx (args)
+
+	end_defop = end_defcv
+
+	def do_defopx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 3)
 		[category, classname, name], rest = words[:3], words[3:]
 		self.expand('@b{' + name + '}')
@@ -934,16 +1144,22 @@
 		self.write('<DD>\n')
 		self.index('fn', name + ' @r{on ' + classname + '}')
 
-	end_defop = end_defcv
-
 	def bgn_defmethod(self, args):
 		self.bgn_defop('Method ' + args)
 	end_defmethod = end_defop
+	def do_defmethodx(self, args):
+		self.do_defopx('Method ' + args)
 
 	# --- Ditto for data types ---
 
 	def bgn_deftp(self, args):
-		self.write('<DL><DT>')
+		self.write('<DL>')
+		self.do_deftpx(args)
+
+	end_deftp = end_defcv
+
+	def do_deftpx(self, args):
+		self.write('<DT>')
 		words = splitwords(args, 2)
 		[category, name], rest = words[:2], words[2:]
 		self.expand('@b{' + name + '}')
@@ -952,8 +1168,6 @@
 		self.write('<DD>\n')
 		self.index('tp', name)
 
-	end_deftp = end_defcv
-
 	# --- Making Lists and Tables
 
 	def bgn_enumerate(self, args):
@@ -1211,15 +1425,18 @@
 
 
 # Characters that are perfectly safe in filenames and hyperlinks
-goodchars = string.letters + string.digits + '!@-_=+.'
+goodchars = string.letters + string.digits + '!@-=+.'
 
-# Replace characters that aren't perfectly safe by underscores
+# Replace characters that aren't perfectly safe by dashes
+# Underscores are bad since Cern HTTPD treats them as delimiters for
+# encoding times, so you get mismatches if you compress your files:
+# a.html.gz will map to a_b.html.gz
 def fixfunnychars(addr):
 	i = 0
 	while i < len(addr):
 		c = addr[i]
 		if c not in goodchars:
-			c = '_'
+			c = '-'
 			addr = addr[:i] + c + addr[i+1:]
 		i = i + len(c)
 	return addr
@@ -1252,8 +1469,11 @@
 	while sys.argv[1:2] == ['-d']:
 		parser.debugging = parser.debugging + 1
 		del sys.argv[1:2]
+	if sys.argv[1] == '-c':
+	    parser.cont = 1
+	    del sys.argv[1]
 	if len(sys.argv) <> 3:
-		print 'usage: texi2html [-d] [-d] inputfile outputdirectory'
+		print 'usage: texi2html [-d] [-d] [-c] inputfile outputdirectory'
 		sys.exit(2)
 	file = sys.argv[1]
 	parser.setdirname(sys.argv[2])
@@ -1272,3 +1492,9 @@
 
 
 test()
+
+# Emacs local variables
+# 
+# Local Variables:
+# py-indent-offset: 8
+# End:
