From d4bdeb54df648007d9a2b4a9ec5c2ef3b84f1a3b Mon Sep 17 00:00:00 2001
From: mueller <mueller@afe2bf4a-e733-0410-8a33-86f594647bc7>
Date: Wed, 15 Dec 1999 19:36:24 +0000
Subject: mods for doxygen-0.49-991003

---
 INSTALL                |  70 ++++++--
 Makefile.in            |  28 +--
 README                 |   4 +-
 VERSION                |   2 +-
 configure              |  66 +++++---
 doc/Doxyfile           |  16 +-
 doc/Makefile.in        |  12 ++
 doc/Makefile.latex     |  18 +-
 doc/Makefile.win.in    |  13 ++
 doc/commands.doc       | 124 +++++++++++++-
 doc/config.doc         | 215 +++++++++++++++++++++--
 doc/doxygen.sty        |  13 ++
 doc/doxygen_manual.tex |  22 ++-
 doc/doxygen_usage.doc  |   6 +-
 doc/faq.doc            |  20 ++-
 doc/index.doc          |   7 +-
 doc/language.doc       |  29 ++++
 doc/output.doc         |  48 ++++++
 doc/starting.doc       |  12 +-
 doc/trouble.doc        |   4 +-
 examples/Makefile.in   |   2 +-
 src/classdef.cpp       |  38 +++--
 src/classdef.h         |  10 +-
 src/code.l             |   6 +-
 src/config.h           |   4 +
 src/config.l           |  62 ++++++-
 src/declinfo.l         |   4 +-
 src/definition.cpp     |  14 ++
 src/definition.h       |  14 +-
 src/doxygen.cpp        | 402 +++++++++++++++++++++++++++++--------------
 src/doxygen.h          |   1 +
 src/entry.cpp          |   2 +
 src/entry.h            |   3 +
 src/filedef.cpp        |  14 +-
 src/filename.h         |   1 +
 src/formula.h          |   1 +
 src/groupdef.cpp       |  17 +-
 src/htmlgen.cpp        |  45 ++++-
 src/htmlgen.h          |  28 +--
 src/index.cpp          | 201 +++++++++++++++++-----
 src/index.h            |   1 +
 src/language.cpp       |   4 +
 src/latexgen.cpp       | 272 +++++++++++++++++++++--------
 src/latexgen.h         |  27 +--
 src/mangen.cpp         |   8 +-
 src/mangen.h           |  20 ++-
 src/memberdef.cpp      | 171 ++++++++++++-------
 src/memberdef.h        |   6 +-
 src/membergroup.cpp    |   4 +-
 src/memberlist.cpp     |   4 +-
 src/membername.h       |   2 +
 src/namespacedef.cpp   |   8 +-
 src/namespacedef.h     |   2 +
 src/outputgen.h        |  21 ++-
 src/outputlist.cpp     |   8 +-
 src/outputlist.h       |  48 +++---
 src/pre.l              |   4 +-
 src/scanner.l          | 191 +++++++++++++++++----
 src/section.h          |   1 +
 src/tag.l              |   2 +-
 src/translator.h       |  25 ++-
 src/translator_es.h    |   2 +-
 src/translator_fr.h    | 452 ++++++++++++++++++++++++++++++++++++++++++++++---
 src/translator_it.h    |  49 +++++-
 src/translator_nl.h    |  49 ++++++
 src/translator_se.h    |  73 ++++++--
 src/util.cpp           |  88 +++++++---
 src/util.h             |   6 +-
 68 files changed, 2516 insertions(+), 630 deletions(-)
 create mode 100644 doc/output.doc

diff --git a/INSTALL b/INSTALL
index 2ba7798..9f4d753 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-DOXYGEN Version 0.49-990901
+DOXYGEN Version 0.49-991003
 
 CONTENTS
 --------
@@ -8,14 +8,15 @@ CONTENTS
       * HTML related problems
       * LaTeX related problems
       * HP-UX / Digital UNIX problems
+      * gcc 2.7.2.x related problems
 
 INSTALLATION INSTRUCTIONS FOR UNIX:
 -----------------------------------
 
 1.  Unpack the archive, unless you already have:
    
-     gunzip doxygen-0.49-990901.src.tar.gz    # uncompress the archive
-     tar xf doxygen-0.49-990901.src.tar       # unpack it
+     gunzip doxygen-0.49-991003.src.tar.gz    # uncompress the archive
+     tar xf doxygen-0.49-991003.src.tar       # unpack it
 
 2.  Run the configure script:
  
@@ -26,6 +27,9 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
     interpreter. It will report what it finds. Use configure --help 
     to see how to override or change the default or detected settings.
 
+    If you have downloaded the binary distribution, you can proceed 
+    with step 6 now.
+
 3.  Compile the program by running make:
 
      make
@@ -34,14 +38,14 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
     doxytag, and doxysearch) should be available in the bin directory of the 
     distribution.
 
-5.  Generate the user manual (optional, will also be done in step 6).
+4.  Generate the user manual (optional, will also be done in step 6).
     
      make docs
 
-    to let doxygen generate the HTML and LaTeX documentation.
+    To let doxygen generate the HTML and LaTeX documentation.
     (you will need the stream editor `sed' for this)
 
-     make ps
+5.   make ps
 
     to generate a postscript version of the manual. 
     (you will need latex and dvips for this)
@@ -58,14 +62,17 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
 
      make install
 
-    Binaries are install to the directory <prefix>/bin 
-    Documentation and examples to the directory <prefix>/share/doxygen
+    Binaries are installed in the directory <prefix>/bin 
+    Documentation and examples in the directory <prefix>/doc/doxygen
+
+    <prefix> defaults to /usr but can be changed with the --prefix
+    option of the configure script. 
 
 INSTALLATION INSTRUCTIONS FOR WINDOWS:
 --------------------------------------
 
 Currently, only Microsoft Visual C++ (version 5.0) is supported. 
-(For other platforms you may need to edit the perl script in wintools/make.pl
+(For other compilers you may need to edit the perl script in wintools/make.pl
 a bit). Let me know what you had to change if you got Doxygen working with 
 another windows compiler. 
 
@@ -80,9 +87,10 @@ You will need to install the windows/dos versions of following tools:
 - Qt-1.xx (Qt-2.xx should also work, but I didn't test it for Windows) 
   (Hint: only the tools section is required, so you can use the free 
    X-windows version as well!)
+  You can get it at http://www.troll.no
 - Microsoft Visual C++ (I only tested with version 5.0).
   Use the vcvars32.bat to set the environment variables 
-  (if not selected to do this automatically during installation).
+  (if you did not select to do this automatically during installation).
 - To generate LaTeX documentation or formulas in HTML you need the tools: 
   latex, dvips and gswin32 
   To get these working under Windows install the fpTeX distribution
@@ -96,15 +104,17 @@ You will need to install the windows/dos versions of following tools:
   `objects' and `bin' manually in the root of the distribution before 
   compiling.
 
-Make sure all tools are accessible from the command-line (add them to the
-PATH environment if needed).
+Open a dos box.
+Make sure all tools (i.e. nmake, latex, gswin32, dvips, sed, flex, bison, 
+cl, rm and perl), are accessible from the command-line (add them to the
+PATH environment variable if needed).
 
-Open a dos box, goto the doxygen root dir and type:
+goto the doxygen root dir and type:
 
 make.bat
 
 This should build the executables doxygen.exe, doxytag.exe, and doxysearch.exe
-(The compiler should not produce any warnings or errors).
+(The compiler should not produce any serious warnings or errors).
 
 To build the examples type:
 
@@ -125,8 +135,8 @@ The manual should now be here latex/doxygen_manual.ps
 KNOWN CONFIGURATION PROBLEMS
 
 QT RELATED PROBLEMS:
-- Qt-2.01 contains a bug that 
-
+- Qt-2.01 contains a bug that makes some special characters appear as 
+  question marks (?) in the HTML output.
 
 HTML RELATED PROBLEMS:
 - the indent continuously increases.
@@ -168,7 +178,31 @@ HP-UX / DIGITAL UNIX PROBLEMS:
     defined (__sparc) || defined (__sgi) || defined (__osf__)
     #include <alloca.h>
 
-  This seems to be a problem with bison, but I don't know how to fix it.
+  Alternatively, one could fix the problem at the bison side.
+  Here is patch for bison.simple (provided by Andre Johansen):
+ 
+------------------------------------------------------------------------------
+--- bison.simple~       Tue Nov 18 11:45:53 1997
++++ bison.simple        Mon Jan 26 15:10:26 1998
+@@ -27,7 +27,7 @@
+ #ifdef __GNUC__
+ #define alloca __builtin_alloca
+ #else /* not GNU C.  */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || defined (__alpha)
+ #include <alloca.h>
+ #else /* not sparc */
+ #if defined (MSDOS) && !defined (__TURBOC__)
+------------------------------------------------------------------------------
+
+GCC 2.7.2.X PROBLEMS
+
+Old versions of the GNU compiler have problems with constant strings
+containing characters with ascii codes >127. Therefore the compiler will
+fail to compile some of the translator_xx.h files. 
+A workaround, if you are planning to use the English translation only, 
+is to configure doxygen with the --english-only option.  
+
 -----------------------------------------------------------------------------
 
 That's it!
@@ -180,4 +214,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (01 September 1999)
+Dimitri van Heesch (03 October 1999)
diff --git a/Makefile.in b/Makefile.in
index 4555685..15e5caf 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -19,17 +19,18 @@ distclean: clean
 
 install:
 	$(INSTTOOL) -d $(INSTALL)/bin
-	$(INSTTOOL) -d $(INSTALL)/share/doxygen/doc
-	$(INSTTOOL) -d $(INSTALL)/share/doxygen/examples
+	$(INSTTOOL) -d $(INSTALL)/doc/doxygen
+	$(INSTTOOL) -d $(INSTALL)/doc/doxygen
 	$(INSTTOOL) -m 755 bin/doxy* $(INSTALL)/bin
-	cp -r doc $(INSTALL)/share/doxygen
-	cp -r examples $(INSTALL)/share/doxygen
-	echo "DOXYGEN  = $(INSTALL)" > $(INSTALL)/share/doxygen/doc/Makefile
-	echo "DOXYDOCS = $(INSTALL)/share/doxygen" >> $(INSTALL)/share/doxygen/doc/Makefile
-	echo "VERSION  = $(VERSION)" >> $(INSTALL)/share/doxygen/doc/Makefile
-	cat doc/Makefile.in >> $(INSTALL)/share/doxygen/doc/Makefile
-	cd $(INSTALL)/share/doxygen/examples ; $(MAKE)
-	cd $(INSTALL)/share/doxygen/doc ; $(MAKE)
+	cp -r doc $(INSTALL)/doc/doxygen
+	cp -r examples $(INSTALL)/doc/doxygen
+	echo "DOXYGEN  = $(INSTALL)" > $(INSTALL)/doc/doxygen/doc/Makefile
+	echo "DOXYDOCS = .." >> $(INSTALL)/doc/doxygen/doc/Makefile
+	echo "VERSION  = $(VERSION)" >> $(INSTALL)/doc/doxygen/doc/Makefile
+	cat doc/Makefile.in >> $(INSTALL)/doc/doxygen/doc/Makefile
+	cd $(INSTALL)/doc/doxygen/examples ; $(MAKE)
+	cd $(INSTALL)/doc/doxygen/doc ; $(MAKE)
+	rm -rf $(INSTALL)/doc/doxygen/doc
 
 docs: FORCE
 	cd examples ; $(MAKE)
@@ -38,10 +39,13 @@ docs: FORCE
 ps: docs
 	cd latex ; $(MAKE)
 
+pdf: docs
+	cd latex ; $(MAKE)
+
 archive: distclean
 	tar zcvf dx`date +%y%m%d`.tgz tmake doc wintools examples bin objects \
-	       src configure Makefile.in Makefile.win.in INSTALL make.bat \
-	       LANGUAGE.HOWTO LICENSE PLATFORMS VERSION
+	       src configure configure.bin Makefile.in Makefile.win.in INSTALL \
+	       make.bat LANGUAGE.HOWTO LICENSE PLATFORMS VERSION
 
 src/version.cpp: Makefile
 	echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp
diff --git a/README b/README
index 40f4bb0..5f0b489 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 0.49-990901
+DOXYGEN Version 0.49-991003
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (01 September 1999)
+Dimitri van Heesch (03 October 1999)
diff --git a/VERSION b/VERSION
index fe12281..9709962 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.49-990901
+0.49-991003
diff --git a/configure b/configure
index 0abdb00..c14212c 100755
--- a/configure
+++ b/configure
@@ -21,10 +21,11 @@ f_shared=YES
 f_make=NO
 f_perl=NO
 f_plf_auto=NO
-f_prefix=/usr/local
+f_prefix=/usr
 f_insttool=install
+f_english=NO
 
-while test -n "$1"; do
+while test -n "$1";  do
   case $1 in
     --prefix)
        shift; f_prefix=$1
@@ -41,6 +42,9 @@ while test -n "$1"; do
     --debug)
        f_debug=YES
        ;;
+    --english-only)
+       f_english=YES
+       ;;
     --platform)
        shift; f_platform=$1
        ;;
@@ -68,33 +72,35 @@ done
 if test "$f_help" = y; then
   cat <<EOF
 Usage: $0 [--help] [--shared] [--static] [--release] [--debug] 
-          [--perl name] [--make name] [--platform target] [--prefix]
-          [--install]
+          [--perl name] [--make name] [--platform target] [--prefix dir]
+          [--install name] [--english-only]
 
-Options: 
+Options:ll 
 
-  --help              Print this message
+  --help                Print this help
 
-  --shared | --static Build using shared or static linking
-		      [default: shared]
+  --shared | --static   Build using shared or static linking
+		        [default: shared]
 
-  --release | --debug Build for release or debug 
-		      [default: release]
+  --release | --debug   Build for release or debug 
+		        [default: release]
 
-  --perl name         Use \`name' as the name of the perl interpreter 
-		      [default: autodetect]
+  --perl name           Use \`name' as the name of the perl interpreter 
+		        [default: autodetect]
 
-  --make name         Use \`name' as the name of the GNU make tool
-		      [default: autodetect]
+  --make name           Use \`name' as the name of the GNU make tool
+		        [default: autodetect]
 
-  --platform target   Do not detect platform but use \`target' instead.
-                      See PLATFORMS for a list of possibilities
+  --platform target     Do not detect platform but use \`target' instead.
+                        See PLATFORMS for a list of possibilities
 
-  --prefix dir        Installation prefix directory
-                      [default: /usr/local]
+  --prefix dir          Installation prefix directory
+                        [default: /usr]
   
-  --install name      name of the GNU install tool
-                      [default: install]
+  --install name        Use \`name' as the name of the GNU install tool
+                        [default: install]
+
+  --english-only        Include support for English only.
 
 EOF
   test "$f_error" = y && exit 1
@@ -196,11 +202,11 @@ if test -z "$QTDIR"; then
   echo "check your Qt installation!"
   exit 2
 else
-  if ! test -d "$QTDIR/lib"; then
+  if test ! -d "$QTDIR/lib"; then
     echo "QTDIR is set, but library directory does not exist!"
     exit 2
   fi
-  if ! test -d "$QTDIR/include"; then
+  if test ! -d "$QTDIR/include"; then
     echo "QTDIR is set, but include directory does not exist!"
     exit 2
   fi
@@ -218,8 +224,10 @@ if test "$f_make" = NO; then
   for i in $make_names; do
     for j in $make_dirs; do
       if test -x "$j/$i"; then
-        make_prog="$j/$i"
-        break 2
+        if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then
+          make_prog="$j/$i"
+          break 2
+        fi
       fi
     done
   done
@@ -281,18 +289,24 @@ RM        = rm -f
 VERSION   = `cat VERSION`
 INSTALL   = $f_prefix
 INSTTOOL  = $f_insttool
-DOXYDOCS  = $PWD
+DOXYDOCS  = ..
 
 export TMAKEPATH
 EOF
 
 touch .tmakeconfig
 if test "$f_shared" = NO; then
-cat > .tmakeconfig <<EOF
+  cat >> .tmakeconfig <<EOF
 TMAKE_LFLAGS = -static
 EOF
 fi
 
+if test "$f_english" = YES; then
+  cat >> .tmakeconfig << EOF
+TMAKE_CXXFLAGS = -DENGLISH_ONLY
+EOF
+fi
+
 for i in Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in ; do
      SRC=$i
      DST=`echo $i|sed 's%\(.*\).in$%\1%'`
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 859702b..c7f9138 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -1,3 +1,16 @@
+#
+# $Id$
+#
+# Copyright (C) 1997-1999 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby 
+# granted. No representations are made about the suitability of this software 
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# All output generated with Doxygen is not covered by this license.
+
 PROJECT_NAME     = 
 OUTPUT_DIRECTORY = ..
 HTML_HEADER      =
@@ -14,7 +27,7 @@ ENABLE_PREPROCESSING = NO
 INPUT            = index.doc install.doc starting.doc faq.doc trouble.doc \
 		   history.doc features.doc \
 		   doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \
-                   installdox_usage.doc autolink.doc \
+                   installdox_usage.doc output.doc autolink.doc \
 		   config.doc commands.doc htmlcmds.doc language.doc
 FILE_PATTERNS    = *.cpp *.h *.doc
 EXAMPLE_PATH     = ../examples
@@ -29,3 +42,4 @@ DOC_URL          =
 DOC_ABSPATH      =
 BIN_ABSPATH      = /usr/local/bin/
 EXT_DOC_PATHS    =
+PDF_HYPERLINKS   = YES
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 3b2d01c..29a3151 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,3 +1,15 @@
+#
+# $Id$
+#
+# Copyright (C) 1997-1999 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby 
+# granted. No representations are made about the suitability of this software 
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# All output generated with Doxygen is not covered by this license.
 
 all: FORCE
 	DOXYGEN_DOCDIR=$(DOXYDOCS); \
diff --git a/doc/Makefile.latex b/doc/Makefile.latex
index 7ab03a3..bd902df 100644
--- a/doc/Makefile.latex
+++ b/doc/Makefile.latex
@@ -1,4 +1,20 @@
-all: doxygen_manual.ps
+#
+# $Id$
+#
+# Copyright (C) 1997-1999 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby 
+# granted. No representations are made about the suitability of this software 
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# All output generated with Doxygen is not covered by this license.
+
+all: doxygen_manual.pdf
+
+doxygen_manual.pdf: doxygen_manual.ps
+	ps2pdf doxygen_manual.ps doxygen_manual.pdf
 
 doxygen_manual.ps: doxygen_manual.dvi
 	dvips -o doxygen_manual.ps doxygen_manual.dvi
diff --git a/doc/Makefile.win.in b/doc/Makefile.win.in
index e870a81..ed64837 100644
--- a/doc/Makefile.win.in
+++ b/doc/Makefile.win.in
@@ -1,3 +1,16 @@
+#
+# $Id$
+#
+# Copyright (C) 1997-1999 by Dimitri van Heesch.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation under the terms of the GNU General Public License is hereby 
+# granted. No representations are made about the suitability of this software 
+# for any purpose. It is provided "as is" without express or implied warranty.
+# See the GNU General Public License for more details.
+#
+# All output generated with Doxygen is not covered by this license.
+
 all: FORCE
 	set DOXYGEN_DOCDIR=file:///$(DOXYGEN)
 	set VERSION=$(VERSION)
diff --git a/doc/commands.doc b/doc/commands.doc
index 5965aaf..d391c2c 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -70,12 +70,14 @@ documentation:
 <li> \refitem cmdfile \file 
 <li> \refitem cmdfn \fn 
 <li> \refitem cmdhtmlonly \htmlonly
+<li> \refitem cmdimage \image 
 <li> \refitem cmdinclude \include 
 <li> \refitem cmdingroup \ingroup 
 <li> \refitem cmdinternal \internal
 <li> \refitem cmdlatexonly \latexonly
 <li> \refitem cmdline \line 
 <li> \refitem cmdlink \link 
+<li> \refitem cmdmainpage \mainpage 
 <li> \refitem cmdnamespace \namespace
 <li> \refitem cmdoverload \overload 
 <li> \refitem cmdpage \page 
@@ -84,6 +86,7 @@ documentation:
 <li> \refitem cmdref \ref 
 <li> \refitem cmdrelates \relates 
 <li> \refitem cmdreturn \return 
+<li> \refitem cmdretval \retval
 <li> \refitem cmdsa \sa 
 <li> \refitem cmdsection \section 
 <li> \refitem cmdskip \skip 
@@ -287,6 +290,38 @@ Doxygen. Unrecognized commands are treated as normal text.
   All text after a \c \internal command is ignored.
 
 <hr>
+\subsection cmdmainpage \mainpage [(title)]
+
+  \addindex \mainpage
+
+  If the \\mainpage command is placed in a comment block the 
+  block is used to customize the index page (in HTML) or
+  the first chapter (in \f$\mbox{\LaTeX}\f$). 
+
+  The title argument is optional and replaces the default title that
+  doxygen normally generates.
+
+  Here is an example:
+\verbatim
+/*! \mainpage My Personal Index Page
+ *
+ * \section intro Introduction
+ *
+ * This is the introduction.
+ *
+ * \section install Installation
+ *
+ * \subsection step1 Step 1: Opening the box
+ *  
+ * etc...
+ */
+\endverbatim
+
+ \sa section \ref cmdsection "\\section", 
+     section \ref cmdsubsection "\\subsection" and 
+     section \ref cmdpage "\\page".
+
+<hr>
 \subsection cmdnamespace \namespace <name> 
 
   \addindex \namespace
@@ -338,6 +373,15 @@ Doxygen. Unrecognized commands are treated as normal text.
   Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a> 
   for the corresponding HTML documentation that is generated by Doxygen.
   \endhtmlonly
+
+  \par notice: 
+     The \<name\> argument consists of a combination of letters and number
+     digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or 
+     mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you 
+     should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable 
+     only if your file system is case sensitive. Otherwise (and for better 
+     portability) you should use all lower case letters (e.g. \c mypage1) 
+     for \<name\> in all references to the page.
   
   \sa section \ref cmdsection "\\section", section 
               \ref cmdsubsection "\\subsection", and section 
@@ -543,6 +587,23 @@ Doxygen. Unrecognized commands are treated as normal text.
   
   \sa Section \ref cmdjdreturn "@return".
 
+
+<hr>
+\subsection cmdretval \retval <return value> { description }
+
+  \addindex \retval
+  Starts a return value for a function with name 
+  \<return value\>. Followed by a description of the return value. 
+  The text of the paragraph that forms the description has no special
+  internal structure. All visual enhancement commands may be used inside the 
+  paragraph.
+  Multiple adjacent \\retval commands will be joined into a single paragraph.
+  Each return value description will start on a new line.
+  The \\retval description ends when a blank line or some other 
+  sectioning command is encountered. 
+
+  \sa Section \ref cmdjdretval "@retval".
+
 <hr>
 \subsection cmdsa \sa { references }
 
@@ -690,11 +751,17 @@ Doxygen. Unrecognized commands are treated as normal text.
 
   \addindex \dontinclude
   This command can be used to parse a source file without actually 
-  including it. Any class and member declarations inside the code 
+  verbatim including it in the documentation (as the \\include command does). 
+  This is useful if you want to divide the source file into smaller pieces and
+  add documentation between the pieces.
+  Source files or directories can be specified using the \c EXAMPLE_PATH tag 
+  of Doxygen's configuration file.
+
+  The class and member declarations and definitions inside the code fragment
   are `remembered' during the parsing of the comment block that contained 
   the \\dontinclude command. 
 
-  For line by line description of source files, one or more lines 
+  For line by line descriptions of source files, one or more lines 
   of the example can be displayed using the \\line, \\skip, \\skipline, and 
   \\until commands. An internal pointer is used for these commands. The
   \\dontinclude command sets the pointer to the first line of the example.
@@ -717,8 +784,8 @@ Doxygen. Unrecognized commands are treated as normal text.
   \addindex \include
   This command can be used to include a source file as a block of code.
   The command takes the name of an include file as an argument. 
-  Include files or directories can be specified using the 
-  \c INCLUDE_PATH tag of Doxygen's configuration file.
+  Source files or directories can be specified using the 
+  \c EXAMPLE_PATH tag of Doxygen's configuration file.
 
   Using the \\include command is equivalent to inserting the file into 
   the documentation block and surrounding it 
@@ -728,10 +795,9 @@ Doxygen. Unrecognized commands are treated as normal text.
   duplication in case of example blocks that consist of multiple
   source and header files.
 
-  For line by line description of source files, one or more lines 
-  of the example can be displayed using the \\line, \\skip, \\skipline, and 
-  \\until commands. An internal pointer is used for these command. The
-  \\include command sets the pointer to the first line of the example.
+  For a line by line description of a source files use the 
+  \\dontinclude command in combination with the \\line, \\skip, \\skipline, 
+  and \\until commands. 
 
   \sa section \ref cmdexample "\\example" and \ref cmddontinclude "\\dontinclude".
 
@@ -967,6 +1033,45 @@ Doxygen. Unrecognized commands are treated as normal text.
               \ref cmdlatexonly "\\latexonly".
 
 <hr>
+\subsection cmdimage \image <format> <file> [<sizeindication>=<size>]
+
+  \addindex \image
+  Inserts an image into the documentation. This command is format
+  specific, so if you want to insert an image for more than one
+  format you'll have to repeat this command for each format.
+
+  The first argument specifies the output format. Currently, the 
+  following values are supported: \c html and \c latex.
+  
+  The second argument specifies the path and file name of the image. 
+  If a relative path is used, this will be relative to the directory to 
+  which the output of the particular format is written. 
+  For the html format you may also 
+  specify an URL. If the name contains spaces you'll have to put 
+  quotes (") around it.
+  
+  The third argument can be used to specify the width or height of the
+  image. This is only useful for \f$\mbox{\LaTeX}\f$ output
+  (i.e. format=latex). \c sizeindication can be either
+  \c width or \c height. The size should be a valid 
+  size specifier in \f$\mbox{\LaTeX}\f$ (for example <code>10cm</code> or 
+  <code>6in</code>).
+
+\verbatim
+  /*! Here is a snapshot of my new application:
+   *  \image html ../images/application.jpg
+   *  \image latex ../images/application.eps width=10cm
+   */
+\endverbatim
+
+  \warning The image format for HTML is limited to what your
+           browser supports. For \f$\mbox{\LaTeX}\f$ the image format
+           must be an encapsulated postscipt (eps).
+           <br><br>
+           Doxygen does not check if an image exists or if it is in
+           the correct format. So \e you have to make sure this is the case!
+
+<hr>
 \subsection cmdlatexonly \latexonly
 
   \addindex \latexonly
@@ -1078,6 +1183,9 @@ The following command JavaDoc command are support.
 \subsection cmdjdreturn @return { description of the return value }
   \addindex @return
   Equivalent to \\return (see section \ref cmdreturn "\\return").
+\subsection cmdjdretval @retval <return value name> { return value description }
+  \addindex @retval
+  Equivalent to \\retval (see section \ref cmdretval "\\retval").
 \subsection cmdjdsee @see { references }
   \addindex @see
   Equivalent to \\sa (see section \ref cmdsa "\\sa").
diff --git a/doc/config.doc b/doc/config.doc
index f238ad1..66eb694 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -25,7 +25,7 @@ recursive-descent parser that is built into \c doxygen.
 The file may contain tabs and newlines for formatting purposes.
 The statements in the file are case-sensitive.
 Comments may be placed anywhere within the file (except within quotes).
-Comments begin with the \c # character and end at the end of the 
+Comments begin with the \# character and end at the end of the 
 line.
 
 The file essentially consists of a list of assignment statements.
@@ -38,11 +38,95 @@ as the last character of a line.
 Environment variables can expanded using the pattern \c $(ENV_VARIABLE_NAME).
 
 The configuration options can be divided into several categories.
-Below is a list of tags that are recognized for each category.
+Below is an alphabetical index of the tags that are recognized 
+followed by the descriptions of the tags grouped by category.
+
+\htmlonly
+<multicol cols=3>
+<ul>
+\endhtmlonly
+\latexonly
+\footnotesize
+\begin{multicols}{3}
+\begin{CompactList}
+\endlatexonly
+<li> \refitem cfg_allexternals ALLEXTERNALS 
+<li> \refitem cfg_alphabetical_index ALPHABETICAL_INDEX 
+<li> \refitem cfg_bin_abspath BIN_ABSPATH 
+<li> \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC 
+<li> \refitem cfg_case_sense_names CASE_SENSE_NAMES 
+<li> \refitem cfg_cgi_name CGI_NAME 
+<li> \refitem cfg_cgi_url CGI_URL 
+<li> \refitem cfg_class_diagrams CLASS_DIAGRAMS 
+<li> \refitem cfg_compact_latex COMPACT_LATEX 
+<li> \refitem cfg_disable_index DISABLE_INDEX 
+<li> \refitem cfg_doc_abspath DOC_ABSPATH 
+<li> \refitem cfg_doc_url DOC_URL
+<li> \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
+<li> \refitem cfg_example_path EXAMPLE_PATH
+<li> \refitem cfg_exclude EXCLUDE
+<li> \refitem cfg_exclude_patterns EXCLUDE_PATTERNS
+<li> \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
+<li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS
+<li> \refitem cfg_extra_packages EXTRA_PACKAGES
+<li> \refitem cfg_extract_all EXTRACT_ALL
+<li> \refitem cfg_extract_private EXTRACT_PRIVATE
+<li> \refitem cfg_file_patterns FILE_PATTERNS
+<li> \refitem cfg_full_path_names FULL_PATH_NAMES
+<li> \refitem cfg_generate_html GENERATE_HTML
+<li> \refitem cfg_generate_htmlhelp GENERATE_HTMLHELP
+<li> \refitem cfg_generate_latex GENERATE_LATEX
+<li> \refitem cfg_generate_man GENERATE_MAN
+<li> \refitem cfg_generate_tagfile GENERATE_TAGFILE
+<li> \refitem cfg_hide_undoc_classes HIDE_UNDOC_CLASSES
+<li> \refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
+<li> \refitem cfg_html_align_members HTML_ALIGN_MEMBERS
+<li> \refitem cfg_html_footer HTML_FOOTER
+<li> \refitem cfg_html_header HTML_HEADER
+<li> \refitem cfg_html_output HTML_OUTPUT
+<li> \refitem cfg_include_path INCLUDE_PATH
+<li> \refitem cfg_inherit_docs INHERIT_DOCS
+<li> \refitem cfg_inline_info INLINE_INFO
+<li> \refitem cfg_input INPUT
+<li> \refitem cfg_input_filter INPUT_FILTER
+<li> \refitem cfg_internal_docs INTERNAL_DOCS
+<li> \refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
+<li> \refitem cfg_latex_header LATEX_HEADER
+<li> \refitem cfg_latex_output LATEX_OUTPUT
+<li> \refitem cfg_macro_expansion MACRO_EXPANSION
+<li> \refitem cfg_man_extension MAN_EXTENSION
+<li> \refitem cfg_man_output MAN_OUTPUT
+<li> \refitem cfg_output_directory OUTPUT_DIRECTORY
+<li> \refitem cfg_output_language OUTPUT_LANGUAGE
+<li> \refitem cfg_paper_type PAPER_TYPE
+<li> \refitem cfg_perl_path PERL_PATH
+<li> \refitem cfg_predefined PREDEFINED
+<li> \refitem cfg_project_name PROJECT_NAME
+<li> \refitem cfg_project_number PROJECT_NUMBER
+<li> \refitem cfg_quiet QUIET
+<li> \refitem cfg_recursive RECURSIVE
+<li> \refitem cfg_repeat_brief REPEAT_BRIEF
+<li> \refitem cfg_search_includes SEARCH_INCLUDES
+<li> \refitem cfg_searchengine SEARCHENGINE
+<li> \refitem cfg_source_browser SOURCE_BROWSER
+<li> \refitem cfg_strip_from_path STRIP_FROM_PATH
+<li> \refitem cfg_tagfiles TAGFILES
+<li> \refitem cfg_verbatim_headers VERBATIM_HEADERS
+<li> \refitem cfg_warnings WARNINGS
+\htmlonly
+</ul>
+</multicol>
+\endhtmlonly
+\latexonly
+\end{CompactList}
+\end{multicols}
+\normalsize
+\endlatexonly
 
 \subsection config_general General options
 <dl>
 
+\anchor cfg_project_name
 <dt>\c PROJECT_NAME <dd>
  \addindex PROJECT_NAME
  The \c PROJECT_NAME tag is a single word (or a sequence of words
@@ -50,12 +134,14 @@ Below is a list of tags that are recognized for each category.
  documentation is generated. This name is used in the title of most 
  generated pages and in a few other places.
 
+\anchor cfg_project_number
 <dt>\c PROJECT_NUMBER <dd>
  \addindex PROJECT_NUMBER
  The \c PROJECT_NUMBER tag can be used to enter a project or revision number.
  This could be handy for archiving the generated documentation or
  if some version control system is used.
 
+\anchor cfg_output_directory
 <dt>\c OUTPUT_DIRECTORY <dd> 
  \addindex OUTPUT_DIRECTORY
  The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
@@ -63,6 +149,7 @@ Below is a list of tags that are recognized for each category.
  If a relative path is entered, it will be relative to the location 
  where doxygen was started. If left blank the current directory will be used.
 
+\anchor cfg_output_language
 <dt>\c OUTPUT_LANGUAGE <dd>
  \addindex OUTPUT_LANGUAGE
  The \c OUTPUT_LANGUAGE tag is used to specify the language in which all
@@ -71,6 +158,7 @@ Below is a list of tags that are recognized for each category.
  The default language is English, other supported languages are:
  Dutch, French, Italian, Czech, Swedish, German and Japanese.
 
+\anchor cfg_quiet
 <dt>\c QUIET <dd>
  \addindex QUIET
  The \c QUIET tag can be used to turn on/off the messages that are generated
@@ -78,6 +166,7 @@ Below is a list of tags that are recognized for each category.
  where \c YES implies that the messages are off.
  If left blank \c NO is used.
 
+\anchor cfg_warnings
 <dt>\c WARNINGS <dd>
  \addindex WARNINGS
  The \c WARNINGS tag can be used to turn on/off the warning messages that are
@@ -86,6 +175,7 @@ Below is a list of tags that are recognized for each category.
 
  \b Tip: Turn warnings on while writing the documentation.
 
+\anchor cfg_disable_index
 <dt>\c DISABLE_INDEX <dd>
  \addindex DISABLE_INDEX
  If you want full control over the layout of the generated HTML pages it
@@ -94,6 +184,7 @@ Below is a list of tags that are recognized for each category.
  top of each page. A value of NO (the default) enables the index and the
  value YES disables it.
 
+\anchor cfg_extract_all
 <dt>\c EXTRACT_ALL <dd>
  \addindex EXTRACT_ALL
  If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be
@@ -102,11 +193,13 @@ Below is a list of tags that are recognized for each category.
  \b Notice: This will also disable the warnings about undocumented members 
  that are normally produced when \c WARNINGS is set to \c YES
 
+\anchor cfg_extract_private
 <dt>\c EXTRACT_PRIVATE <dd>
  \addindex EXTRACT_PRIVATE
  If the \c EXTRACT_PRIVATE tag is set to \c YES all
  documentation for private members will be extracted as well.
 
+\anchor cfg_hide_undoc_members
 <dt>\c HIDE_UNDOC_MEMBERS <dd>
  \addindex HIDE_UNDOC_MEMBERS
  If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, Doxygen will hide all
@@ -114,6 +207,7 @@ Below is a list of tags that are recognized for each category.
  If set to \c NO (the default) these members will be included in the
  various overviews, but no documentation section is generated.
 
+\anchor cfg_hide_undoc_classes
 <dt>\c HIDE_UNDOC_CLASSES <dd>
  \addindex HIDE_UNDOC_CLASSES
  If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, Doxygen will hide all
@@ -121,6 +215,7 @@ Below is a list of tags that are recognized for each category.
  If set to \c NO (the default) these classes will be included in the
  various overviews.
 
+\anchor cfg_brief_member_desc
 <dt>\c BRIEF_MEMBER_DESC <dd>
  \addindex BRIEF_MEMBER_DESC
  If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) Doxygen will
@@ -128,6 +223,7 @@ Below is a list of tags that are recognized for each category.
  the file and class documentation (similar to JavaDoc).
  Set to NO to disable this.
 
+\anchor cfg_internal_docs
 <dt>\c INTERNAL_DOCS <dd>
  \addindex INTERNAL_DOCS
  The \c INTERNAL_DOCS tag determines if documentation
@@ -135,6 +231,7 @@ Below is a list of tags that are recognized for each category.
  to \c NO (the default) then the documentation will be excluded.
  Set it to \c YES to include the internal documentation.
 
+\anchor cfg_repeat_brief
 <dt>\c REPEAT_BRIEF <dd>
  \addindex REPEAT_BRIEF
  If the \c REPEAT_BRIEF tag is set to \c YES (the default) Doxygen will 
@@ -145,12 +242,14 @@ Below is a list of tags that are recognized for each category.
  If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the 
  brief descriptions will be completely suppressed.
 
+\anchor cfg_full_path_names
 <dt>\c FULL_PATH_NAMES <dd>
  \addindex FULL_PATH_NAMES
  If the \c FULL_PATH_NAMES tag is set to \c YES Doxygen will prepend the full
  path before files name in the file list and in the header files. If set
  to NO the shortest path that makes the file name unique will be used
 
+\anchor cfg_strip_from_path
 <dt>\c STRIP_FROM_PATH <dd>
  \addindex STRIP_FROM_PATH
  If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag
@@ -158,18 +257,21 @@ Below is a list of tags that are recognized for each category.
  only done if one of the specified strings matches the left-hand part of the 
  path.
 
+\anchor cfg_class_diagrams
 <dt>\c CLASS_DIAGRAMS <dd>
  \addindex CLASS_DIAGRAMS
  If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) Doxygen will
- generate a class diagram (in Html and LaTeX) for classes with base or
+ generate a class diagram (in Html and \f$\mbox{\LaTeX}\f$) for classes with base or
  super classes. Setting the tag to \c NO turns the diagrams off.
 
+\anchor cfg_source_browser
 <dt>\c SOURCE_BROWSER <dd>
  \addindex SOURCE_BROWSER
  If the \c SOURCE_BROWSER tag is set to \c YES than the body of a member or
  function will be appended as a block of code to the documentation of.
  that member or function.
 
+\anchor cfg_case_sense_names
 <dt>\c CASE_SENSE_NAMES <dd>
  \addindex CASE_SENSE_NAMES
  If the \c CASE_SENSE_NAMES tag is set to \c NO (the default) then Doxygen
@@ -178,25 +280,40 @@ Below is a list of tags that are recognized for each category.
  classes or files whose names only differ in case and if your file system
  supports case sensitive file names.
 
+\anchor cfg_verbatim_headers
 <dt>\c VERBATIM_HEADERS <dd>
  \addindex VERBATIM_HEADERS
-  If the VERBATIM_HEADERS tag is set the YES (the default) then Doxygen\n";
-  will generate a verbatim copy of the header file for each class for\n";
-  which an include is specified. Set to NO to disable this.\n";
+  If the \c VERBATIM_HEADERS tag is set the \c YES (the default) then Doxygen
+  will generate a verbatim copy of the header file for each class for
+  which an include is specified. Set to NO to disable this.
   \sa Section \ref cmdclass "\\class".
 
+\anchor cfg_javadoc_autobrief
 <dt>\c JAVADOC_AUTOBRIEF <dd>
  \addinex JAVADOC_AUTOBRIEF
-  If the JAVADOC_NO_AUTOBRIEF is set to YES (the default) then Doxygen
+  If the \c JAVADOC_NO_AUTOBRIEF is set to \c YES (the default) then Doxygen
   will interpret the first line (until the first dot) of a JavaDoc-style
   comment as the brief description. If set to NO, the Javadoc-style will
   behave just like the Qt-style comments.
 
+\anchor cfg_inherit_docs
+<dt>\c INHERIT_DOCS <dd>
+ \addindex INHERIT_DOCS
+ If the \c INHERIT_DOCS tag is set to \c YES (the default) then an undocumented
+ member inherits the documentation from any documented member that it
+ reimplements.
+
+\anchor cfg_inline_info
+<dt> INLINE_INFO <dd>
+ If the \c INLINE_INFO tag is set to \c YES (the default) then a tag [inline]
+ is inserted in the documentation for inline members.
+
 </dl>
 
 \subsection config_input Input related options
 <dl>
 
+\anchor cfg_input
 <dt>\c INPUT <dd>
  \addindex INPUT
  The \c INPUT tag is used to specify the files and/or directories that contain 
@@ -206,6 +323,7 @@ Below is a list of tags that are recognized for each category.
 
  \b Notice: This tag (and only this tag) is \e required.
 
+\anchor cfg_file_patterns
 <dt>\c FILE_PATTERNS <dd>
  \addindex FILE_PATTERNS
  If the value of the \c INPUT tag contains directories, you can use the 
@@ -214,31 +332,35 @@ Below is a list of tags that are recognized for each category.
  in the directories. If left blank all files are included 
  (i.e. wildcard <tt>*</tt>).
 
+\anchor cfg_recursive
 <dt>\c RECURSIVE <dd>
  \addindex RECURSIVE
  The \c RECURSIVE tag can be used to specify whether or not subdirectories
  should be searched for input files as well. Possible values are \c YES 
  and \c NO.  If left blank \c NO is used.
 
+\anchor cfg_exclude
 <dt>\c EXCLUDE <dd>
  \addindex EXCLUDE
  The \c EXCLUDE tag can be used to specify files and/or directories that should
  excluded from the \c INPUT source files. This way you can easily exclude a
  subdirectory from a directory tree whose root is specified with the \c INPUT tag.
 
+\anchor cfg_exclude_patterns
 <dt>\c EXCLUDE_PATTERNS <dd>
  \addindex EXCLUDE_PATTERNS
  If the value of the INPUT tag contains directories, you can use the
  \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
  certain files from those directories.
 
-
+\anchor cfg_example_path
 <dt>\c EXAMPLE_PATH <dd>
  \addindex EXAMPLE_PATH
  The \c EXAMPLE_PATH tag can be used to specify one or more files or
  directories that contain example code fragments that are included (see
  the \\include command in section \ref cmdinclude "\\include").
 
+\anchor cfg_input_filter
 <dt>\c INPUT_FILTER <dd>
  \addindex INPUT_FILTER
  The \c INPUT_FILTER tag can be used to specify a program that doxygen should
@@ -257,17 +379,20 @@ Below is a list of tags that are recognized for each category.
 \subsection html_output HTML related options
 <dl>
 
+\anchor cfg_generate_html
 <dt>\c GENERATE_HTML <dd>
  \addindex GENERATE_HTML
  If the \c GENERATE_HTML tag is set to \c YES (the default) Doxygen will
  generate HTML output
 
+\anchor cfg_html_output
 <dt>\c HTML_OUTPUT <dd>
  \addindex HTML_OUTPUT
  The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
  If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
  put in front of it. If left blank `html' will be used as the default path.
 
+\anchor cfg_html_header
 <dt>\c HTML_HEADER <dd>      
  \addindex HTML_HEADER
  The \c HTML_HEADER tag can be used to specify a user defined HTML 
@@ -289,6 +414,7 @@ Below is a list of tags that are recognized for each category.
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, or only the current date. 
    
+\anchor cfg_html_footer
 <dt>\c HTML_FOOTER <dd>
  \addindex HTML_FOOTER
  The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for 
@@ -305,6 +431,7 @@ Below is a list of tags that are recognized for each category.
  Doxygen will replace them by respectively 
  the title of the page, the current date and time, or only the current date. 
 
+\anchor cfg_html_align_members
 <dt>\c HTML_ALIGN_MEMBERS <dd>
 
 If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes,
@@ -315,6 +442,7 @@ NO a bullet list will be used.
 Setting this tag to NO will become obsolete in the future, since I only
 intent to support and test the aligned representation.
 
+\anchor cfg_generate_htmlhelp
 <dt>\c GENERATE_HTMLHELP <dd>
 
 If the \c GENERATE_HTMLHELP tag is set to \c YES, 
@@ -337,6 +465,7 @@ and you can search for words in the documentation
 (which basically renders \c doxysearch obsolete on Windows). 
 The HTML workshop also contains a viewer for compressed HTML files.
 
+\anchor cfg_alphabetical_index
 <dt>\c ALPHABETICAL_INDEX <dd>
 
 If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
@@ -348,23 +477,28 @@ a lot of classes, structs, unions or interfaces.
 \subsection latex_output LaTeX related options
 <dl>
 
+\anchor cfg_generate_latex
 <dt>\c GENERATE_LATEX <dd>
  \addindex GENERATE_LATEX
  If the \c GENERATE_LATEX tag is set to \c YES (the default) Doxygen will
  generate Latex output.
 
+\anchor cfg_latex_output
 <dt>\c LATEX_OUTPUT <dd>
  \addindex LATEX_OUTPUT
- The \c LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+ The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$ 
+ docs will be put.
  If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
  put in front of it. If left blank `latex' will be used as the default path.
 
+\anchor cfg_compact_latex
 <dt>\c COMPACT_LATEX <dd>
  \addindex COMPACT_LATEX
  If the \c COMPACT_LATEX tag is set to \c YES Doxygen generates more compact
- LaTeX documents. This may be useful for small projects and may help to
+ \f$\mbox{\LaTeX}\f$ documents. This may be useful for small projects and may help to
  save some trees in general.
 
+\anchor cfg_paper_type
 <dt>\c PAPER_TYPE <dd>
  \addindex PAPER_TYPE
  The PAPER_TYPE tag can be used to set the paper type that is used
@@ -378,25 +512,64 @@ a lot of classes, structs, unions or interfaces.
  </ul> 
  If left blank a4wide will be used.
 
+\anchor cfg_extra_packages
 <dt>\c EXTRA_PACKAGES <dd>
  \addindex EXTRA_PACKAGES
- The EXTRA_PACKAGES tag can be used to specify one or more LaTeX 
- package names that should be included in the LaTeX output.
+ The EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$ 
+ package names that should be included in the \f$\mbox{\LaTeX}\f$ output.
  To get the times font for instance you can specify 
 \verbatim
 EXTRA_PACKAGES = times
 \endverbatim
  If left blank no extra packages will be included.
+
+\anchor cfg_latex_header
+<dt>\c LATEX_HEADER <dd>
+ \addindex LATEX_HEADER
+ The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ 
+ header for the generated latex document. The header should contain everything 
+ until the first chapter. If it is left blank doxygen will generate a 
+ standard header, which looks as follows for the default 
+ configuration settings:
+
+\verbatim
+\documentclass[a4paper]{book}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyheadings}
+\usepackage{epsfig}
+\usepackage{float}
+\usepackage{doxygen}
+\makeindex
+\setcounter{tocdepth}{1}
+\setlength{\footrulewidth}{0.4pt}
+\begin{document}
+\title{Reference Manual}
+\author{Generated by Doxygen}
+\date{Thu Sep 30 19:58:32 1999}
+\maketitle
+\pagenumbering{roman}
+\clearemptydoublepage
+\tableofcontents
+\clearemptydoublepage
+\pagenumbering{arabic}
+\endverbatim
+ 
+ \par Notice: 
+   Only use a user defined header if you know what you are doing!
+
 </dl>
 
 \subsection man_output Man page related options
 <dl>
 
+\anchor cfg_generate_man
 <dt>\c GENERATE_MAN <dd>
  \addindex GENERATE_MAN
  If the \c GENERATE_MAN tag is set to \c YES (the default) Doxygen will
  generate man pages for classes and files.
 
+\anchor cfg_man_output
 <dt>\c MAN_OUTPUT <dd>
  \addindex MAN_OUTPUT
  The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
@@ -405,6 +578,7 @@ EXTRA_PACKAGES = times
  A directory man3 will be created inside the directory specified by 
  \c MAN_OUTPUT.
 
+\anchor cfg_man_extension
 <dt>\c MAN_EXTENSION <dd>
  \addindex MAX_EXTENSION
  The MAN_EXTENSION tag determines the extension that is added to
@@ -414,29 +588,34 @@ EXTRA_PACKAGES = times
 \subsection config_prepro Preprocessor related options
 <dl>
 
+\anchor cfg_enable_preprocessing
 <dt>\c ENABLE_PREPROCESSING <dd>
  \addindex ENABLE_PREPROCESSING
  If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) Doxygen will
  evaluate all C-preprocessor directives found in the sources and include
  files. 
 
+\anchor cfg_macro_expansion
 <dt>\c MACRO_EXPANSION <dd>
  \addindex MACRO_EXPANSION
  If the \c MACRO_EXPANSION tag is set to \c YES Doxygen will expand all macro
  names in the source code. If set to \c NO (the default) only conditional 
  compilation will be performed.
 
+\anchor cfg_search_includes
 <dt>\c SEARCH_INCLUDES <dd>
  \addindex SEARCH_INCLUDES 
  If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files
  in the \c INCLUDE_PATH (see below) will be search if a \#include is found.
 
+\anchor cfg_include_path
 <dt>\c INCLUDE_PATH <dd>
  \addindex INCLUDE_PATH
  The \c INCLUDE_PATH tag can be used to specify one or more directories that
  contain include files that are not input files but should be processed by
  the preprocessor.
 
+\anchor cfg_predefined
 <dt>\c PREDEFINED <dd>
  \addindex PREDEFINED
  The \c PREDEFINED tag can be used to specify one or more macro names that
@@ -445,6 +624,7 @@ EXTRA_PACKAGES = times
  <code>name</code> or <code>name=definition</code> (no spaces). 
  If the definition and the = are omitted =1 is assumed.
 
+\anchor cfg_expand_only_predef
 <dt>\c EXPAND_ONLY_PREDEF <dd>
  \addindex EXPAND_ONLY_PREDEF
  If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
@@ -456,6 +636,7 @@ EXTRA_PACKAGES = times
 \subsection config_extref External reference options
 <dl>
 
+\anchor cfg_tagfiles
 <dt>\c TAGFILES <dd> 
  \addindex TAGFILES
  The \c TAGFILES tag can be used to specify one or more tagfiles. 
@@ -467,6 +648,7 @@ EXTRA_PACKAGES = times
   in the directory in which doxygen is run, you must also specify the
   path to the tagfile here.
 
+\anchor cfg_generate_tagfile
 <dt>\c GENERATE_TAGFILE <dd>
  \addindex GENERATE_TAGFILE
  When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
@@ -474,12 +656,14 @@ EXTRA_PACKAGES = times
  See section \ref doxytag_usage for more information about the usage of 
  tag files.
 
+\anchor cfg_allexternals
 <dt>\c ALLEXTERNALS <dd>
  \addindex ALLEXTERNALS
  if the \c ALLEXTERNALS tag is set to \c YES all external class will be listed
  in the class index. If set to \c NO only the inherited external classes
  will be listed.
 
+\anchor cfg_perl_path
 <dt>\c PERL_PATH <dd>
  \addindex PERL_PATH
  The \c PERL_PATH should be the absolute path and name of the perl script
@@ -489,6 +673,7 @@ EXTRA_PACKAGES = times
 \subsection config_search Search engine options
 <dl>
 
+\anchor cfg_searchengine
 <dt>\c SEARCHENGINE <dd>
  \addindex SEARCHENGINE
  The \c SEARCHENGINE tag specifies whether or not a 
@@ -496,18 +681,21 @@ EXTRA_PACKAGES = times
  If set to \c NO or left blank, the values of all other tags in this section 
  will be ignored.
 
+\anchor cfg_cgi_name
 <dt>\c CGI_NAME <dd>
  \addindex CGI_NAME
  The \c CGI_NAME tag should be the name of the CGI script that
  starts the search engine (<tt>doxysearch</tt>) with the correct parameters.
  A script with this name will be generated by doxygen.
 
+\anchor cfg_cgi_url
 <dt>\c CGI_URL <dd>
  \addindex CGI_URL
  The \c CGI_URL tag should be the absolute URL to the directory where the
  cgi binaries are located. See the documentation of your http daemon for 
  details.
 
+\anchor cfg_doc_url
 <dt>\c DOC_URL <dd>
  \addindex DOC_URL
  The \c DOC_URL tag should be the absolute URL to the directory where the
@@ -515,17 +703,20 @@ EXTRA_PACKAGES = times
  documentation, with <tt>file://</tt> prepended to it, will be used. 
  This is correct for local viewing only.
 
+\anchor cfg_doc_abspath
 <dt>\c DOC_ABSPATH <dd>
  \addindex DOC_ABSPATH
  The \c DOC_ABSPATH tag should be the absolute path to the directory where the
  documentation is located. If left blank the directory on the local machine
  will be used.
 
+\anchor cfg_bin_abspath
 <dt>\c BIN_ABSPATH <dd>     
  \addindex BIN_ABSPATH
  The \c BIN_ABSPATH tag must point to the directory where the doxysearch binary
  is installed.
 
+\anchor cfg_ext_doc_paths
 <dt>\c EXT_DOC_PATHS <dd>  
  \addindex EXT_DOC_PATHS
  The \c EXT_DOC_PATHS tag can be used to specify one or more paths to 
diff --git a/doc/doxygen.sty b/doc/doxygen.sty
index 33835f0..5e53104 100644
--- a/doc/doxygen.sty
+++ b/doc/doxygen.sty
@@ -1,3 +1,16 @@
+%
+% $Id$
+%
+% Copyright (C) 1997-1999 by Dimitri van Heesch.
+%
+% Permission to use, copy, modify, and distribute this software and its
+% documentation under the terms of the GNU General Public License is hereby 
+% granted. No representations are made about the suitability of this software 
+% for any purpose. It is provided "as is" without express or implied warranty.
+% See the GNU General Public License for more details.
+%
+% All output generated with Doxygen is not covered by this license.
+
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesPackage{doxygen}
 \RequirePackage{calc}
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index bb8d599..01223c4 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -1,10 +1,29 @@
-\documentclass[a4paper]{article}
+%
+% $Id$
+%
+% Copyright (C) 1997-1999 by Dimitri van Heesch.
+%
+% Permission to use, copy, modify, and distribute this software and its
+% documentation under the terms of the GNU General Public License is hereby 
+% granted. No representations are made about the suitability of this software 
+% for any purpose. It is provided "as is" without express or implied warranty.
+% See the GNU General Public License for more details.
+%
+% All output generated with Doxygen is not covered by this license.
+
+\documentclass[a4paper,ps2pdf]{article}
 \usepackage{a4wide}
 \usepackage{makeidx}
 \usepackage{fancyheadings}
 \usepackage{epsf}
 \usepackage{doxygen}
 \usepackage{multicol}
+\usepackage{times}
+\usepackage[backref=true,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue
+           ]{hyperref}
 \makeindex
 \setcounter{tocdepth}{1}
 \setlength{\footrulewidth}{0.4pt}
@@ -35,6 +54,7 @@ Written by Dimitri van Heesch\\[2ex]
 \input{doxytag_usage}
 \input{doxysearch_usage}
 \input{installdox_usage}
+\input{output}
 \input{autolink}
 \input{config}
 \input{commands}
diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc
index e6fee75..b9f98b3 100644
--- a/doc/doxygen_usage.doc
+++ b/doc/doxygen_usage.doc
@@ -41,7 +41,11 @@ doxygen <config_file>
 \endverbatim
 </ol>
 
-If you also want a search engine to be generated, you should look
+The \c -s option is optional and can be used suppress the description that 
+doxygen normally generates for each tag. Try to use this option if you send 
+me configuration files!
+
+If you also want to use the search engine, you should look
 at section \ref doxysearch_usage. 
 
 */
diff --git a/doc/faq.doc b/doc/faq.doc
index c730289..3d936fe 100644
--- a/doc/faq.doc
+++ b/doc/faq.doc
@@ -18,12 +18,19 @@
 <ol>
 <li><b>How do get information on the index page in HTML?</b>
 <p>
-There is no real support for title pages at the moment. But you can
-override the default index page, by using the following comment block:
+You should use the \\mainpage command inside a comment block like this:
 \verbatim
-/*! \page index My Personal Index Page
+/*! \mainpage My Personal Index Page
  *
- * This is my index personal index page.
+ * \section intro Introduction
+ *
+ * This is the introduction.
+ *
+ * \section install Installation
+ *
+ * \subsection step1 Step 1: Opening the box
+ *  
+ * etc...
  */
 \endverbatim
 
@@ -44,6 +51,11 @@ around the blocks that should be hidden and put:
 \endverbatim
 in the config file then all blocks should be skipped by Doxygen as long
 as <code>PREPROCESSING = YES</code>.
+
+<li><b>How can I make doxygen ignore nasty macro's? </b>
+
+Look at section \ref preprocessing for the answer.
+
 </ol>
 */
 
diff --git a/doc/index.doc b/doc/index.doc
index 7a321db..dc12600 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -41,7 +41,8 @@ All output generated by Doxygen is not covered by this license.
 Doxygen is a documentation system for C and C++. It can generate an on-line 
 class browser (in HTML) and/or an off-line reference manual 
 (in \f$\mbox{\LaTeX}\f$) from a set 
-of documented source files. The documentation is extracted directly from the 
+of documented source files. There is also some support for generating 
+man pages. The documentation is extracted directly from the 
 sources. Doxygen is developed on a <a href="http://www.linux.org">Linux</a> 
 platform, but it runs on most other UNIX flavors as well. 
 An executable for Windows 95/NT is also available.
@@ -78,6 +79,8 @@ The second part forms a reference manual:
 <li>Section \ref doxysearch_usage shows how to use the \c doxysearch program. 
 <li>Section \ref installdox_usage shows how to use the \c installdox
                  script that is generated by Doxygen if you use tag files. 
+<li>Section \ref output shows how to generate the various output formats
+                 supported by Doxygen.
 <li>Section \ref autolink shows how to put links to files, classes, 
                  and members in the documentation.
 <li>Section \ref config shows how to fine-tune doxygen, so it 
@@ -177,6 +180,8 @@ Matthias Baas,
 Walter Mueller, 
 William van Dieten,
 Joshua Jensen,
+Patrick Aberts,
+Jacques Tremblay,
 and many others for suggestions, patches and bug reports.
 </ul>
 */
diff --git a/doc/language.doc b/doc/language.doc
index f05dce3..2440a08 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -152,6 +152,31 @@ Here is a list of the languages and their current maintainers:
   </TR>
   <TR BGCOLOR="#ffffff">
       <TD>
+        Finnish
+      </TD>
+      <TD>
+        Olli Korhonen
+      </TD>
+      <TD>
+        <a href="mailto:Olli.Korhonen@ccc.fi">
+                        Olli.Korhonen@ccc.fi</a>
+      </TD>
+  </TR>
+  <TR BGCOLOR="#ffffff">
+      <TD>
+        Russian
+      </TD>
+      <TD>
+        Vladimir Vodolazkiy
+      </TD>
+      <TD>
+        <a href="mailto:voldemarus@geocities.com">
+                        voldemarus@geocities.com</a>
+      </TD>
+  </TR>
+
+  <TR BGCOLOR="#ffffff">
+      <TD>
         Dutch
       </TD>  
       <TD>
@@ -192,6 +217,10 @@ Here is a list of the languages and their current maintainers:
   \hline
   Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\
   \hline
+  Finish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
+  \hline
+  Russian & Vladimir Vodolazkiy & {\tt voldemarus@geocities.com} \\
+  \hline
   Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\
   \hline
 \end{tabular}
diff --git a/doc/output.doc b/doc/output.doc
new file mode 100644
index 0000000..1e8da9e
--- /dev/null
+++ b/doc/output.doc
@@ -0,0 +1,48 @@
+/******************************************************************************
+ *
+ * $Id$
+ *
+ * Copyright (C) 1997-1999 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * All output generated with Doxygen is not covered by this license.
+ *
+ */
+/*! \page output.html
+
+\section output Output Formats
+
+\addindex output formats
+
+The following output formats are \e directly supported by doxygen:
+<dl>
+<dt><b>HTML</b>
+<dd>Generated if GENERATE_HTML is set to YES in the configuration file.
+<dt>\f$\mbox{\LaTeX}\f$
+<dd>Generated if GENERATE_LATEX is set to YES in the configuration file.
+<dt><b>Man pages</b>
+<dd>Generated if GENERATE_MAN is set to YES in the configuration file.
+</dl>
+
+The following output formats are \e indirectly supported by doxygen:
+<dl>
+<dt><b>Compressed HTML</b> (a.k.a. Windows 98 help)
+<dd>Generated by Microsoft's HTML Help workshop from the HTML output if 
+    \c GENERATE_HTMLHELP is set to \c YES.
+<dt><b>Postscript</b>
+<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by 
+    running <code>make ps</code> in the output directory.
+    For the best results \c PDF_HYPERLINKS should be set to \c NO.
+<dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
+<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
+    running <code>make pdf</code> in the output directory.
+    In order to get hyperlinks in the pdf file, 
+    \c PDF_HYPERLINKS should be set to \c YES.
+</dl>
+
+*/
diff --git a/doc/starting.doc b/doc/starting.doc
index bbb23bd..e89f717 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -203,7 +203,7 @@ The one-line comments should contain a brief description,
 whereas the multi-line comment blocks contain a more detailed description.
 The brief descriptions are included in the member overview of a class, 
 namespace or file and are printed using a small italic font 
-(this description can be omitted by setting \c BRIEF_MEMBER_DESC to \c NO in 
+(this description can be omitted by setting \c BRIEF_STDMETHOD_DESC to \c NO in 
 the config file). By default the brief descriptions are also the first 
 sentence of the detailed description 
 (this can be changed by setting the \c REPEAT_BRIEF tag to \c NO). 
@@ -443,7 +443,7 @@ after preprocessing becomes:
 \endverbatim
 
 Notice that doxygen will now expand \e all macro definitions 
-(recursively if needed). This is often too much, therefore doxygen also 
+(recursively if needed). This is often too much. Therefore, doxygen also 
 allows you to expand only those defines that you explicitly 
 specify. For this you have to set the \c EXPAND_ONLY_PREDEF tag to \c YES
 and specify the macro definitions after the \c PREDEFINED tag.  
@@ -462,9 +462,9 @@ of an abstract base class called \c IUnknown:
 /*! The IUnknown interface */
 DECLARE_INTERFACE(IUnknown)
 {
-  MEMBER(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE;
-  MEMBER(ULONG,AddRef) (THIS) PURE;
-  MEMBER(ULONG,Release) (THIS) PURE;
+  STDMETHOD(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE;
+  STDMETHOD(ULONG,AddRef) (THIS) PURE;
+  STDMETHOD(ULONG,Release) (THIS) PURE;
 };
 \endverbatim
 
@@ -479,7 +479,7 @@ ENABLE_PREPROCESSING = YES
 MACRO_EXPANSION      = YES
 EXPAND_ONLY_PREDEF   = YES
 PREDEFINED           = "DECLARE_INTERFACE(name)=class name" \
-                       "MEMBER(result,name)=virtual result name" \
+                       "STDMETHOD(result,name)=virtual result name" \
                        "PURE= = 0" \
                        THIS_= \
                        THIS= \
diff --git a/doc/trouble.doc b/doc/trouble.doc
index 5f130ec..f02914b 100644
--- a/doc/trouble.doc
+++ b/doc/trouble.doc
@@ -48,8 +48,8 @@
   int *(a[20]);
 \endverbatim
   then doxygen will remove the braces and correctly parse the result.
-<li>Not all names in code fragments that are include in the documentation
-    are replaced by links (for instance when using SOURCE_BROWSER = YES). 
+<li>Not all names in code fragments that are included in the documentation
+    are replaced by links (for instance when using \c SOURCE_BROWSER = \c YES). 
     For a part this is because the code parser isn't smart enough at the
     moment. I'll try to improve this in the future. But even with these
     improvements not everthing can be properly linked to the corresponding
diff --git a/examples/Makefile.in b/examples/Makefile.in
index fcf7c83..5bff80e 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -75,7 +75,7 @@ autolink/html/index.html: autolink.cpp autolink.cfg
 
 tag/html/index.html: tag.cpp tag.cfg 
 	$(DOXYGEN)/bin/doxygen tag.cfg
-	sed -e "1,1s.perl.$(PERL).g" tag/html/installdox >tag/html/installdox.perl
+	sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
 	cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
 
 restypedef/html/index.html: restypedef.cpp restypedef.cfg 
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 5d7c980..457a06b 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -232,11 +232,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
   } 
   pageTitle+=pageType+" Reference";
   startFile(ol,fileName,pageTitle);
-  startTitle(ol);
+  startTitle(ol,getOutputFileBase());
   //ol.docify(name()+" "+pageType.right(pageType.length()-1)+" ");
   //parseText(ol,theTranslator->trReference());
   parseText(ol,theTranslator->trCompoundReference(name(),compType));
-  endTitle(ol,name());
+  endTitle(ol,getOutputFileBase(),name());
 
   // write brief description
   OutputList briefOutput(&ol); 
@@ -694,9 +694,9 @@ void ClassDef::writeMemberList(OutputList &ol)
   // do not generate Latex output
   ol.disableAllBut(OutputGenerator::Html);
   startFile(ol,memListFileName,theTranslator->trMemberList());
-  startTitle(ol);
+  startTitle(ol,0);
   parseText(ol,name()+" "+theTranslator->trMemberList());
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   parseText(ol,theTranslator->trThisIsTheListOfAllMembers());
   ol.writeObjectLink(getReference(),fileName,0,name());
   parseText(ol,theTranslator->trIncludingInheritedMembers());
@@ -746,7 +746,8 @@ void ClassDef::writeMemberList(OutputList &ol)
           ol.writeListItem();
           ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
               md->anchor(),name);
-          if ( md->isFunction() || md->isSignal() || md->isSlot() ) 
+          if ( md->isFunction() || md->isSignal() || md->isSlot() ||
+               (md->isFriend() && md->argsString())) 
             ol.docify(md->argsString());
           else if (md->isEnumerate())
             parseText(ol," "+theTranslator->trEnumName());
@@ -786,7 +787,8 @@ void ClassDef::writeMemberList(OutputList &ol)
           memberWritten=TRUE;
         }
         if ((protect!=Public || md->isStatic() || virt!=Normal || 
-             md->isFriend() || md->isRelated()
+             md->isFriend() || md->isRelated() || 
+             (md->isInline() && Config::inlineInfoFlag)
             )
             && memberWritten)
         {
@@ -797,6 +799,8 @@ void ClassDef::writeMemberList(OutputList &ol)
           else if (md->isRelated()) sl.append("related");
           else
           {
+            if (Config::inlineInfoFlag && md->isInline())        
+                                       sl.append("inline");
             if (protect==Protected)    sl.append("protected");
             else if (protect==Private) sl.append("private");
             if (virt==Virtual)         sl.append("virtual");
@@ -831,11 +835,11 @@ void ClassDef::writeIncludeFile(OutputList &ol)
   //printf("incFile=%s\n",incFile->absFilePath().data());
   ol.disableAllBut(OutputGenerator::Html);
   startFile(ol,fileName+"-include",name()+" Include File");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString n=incName.copy();
   if (incName.isNull()) n=incFile->name();
   parseText(ol,n);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   parseText(ol,theTranslator->trVerbatimText(incFile->name()));
   ol.writeRuler();
   ol.startCodeFragment();
@@ -992,15 +996,25 @@ bool ClassDef::hasNonReferenceSuperClass()
 //  htmlHelp->decContentsDepth();
 //}
 
-void ClassDef::writeDeclaration(OutputList &ol)
+void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md)
 {
   //ol.insertMemberAlign();
+  //printf("ClassName=`%s'\n",name().data());
   switch(compType)
   {
-    case Class:  ol.docify("class {");  break;
-    case Struct: ol.docify("struct {"); break;
-    default:     ol.docify("union {");  break; 
+    case Class:  ol.docify("class"); break;
+    case Struct: ol.docify("struct"); break;
+    default:     ol.docify("union");  break; 
   } 
+  int ri=name().findRev("::");
+  if (ri==-1) ri=name().length();
+  QCString cn=name().right(name().length()-ri-2);
+  if (!cn.isEmpty() && cn.at(0)!='@' && md)
+  { 
+    ol.docify(" ");
+    ol.writeObjectLink(0,0,md->anchor(),cn);
+  }
+  ol.docify(" {");
   ol.endMemberItem(FALSE,0,0,FALSE); // TODO: pass correct group parameters
 
   // insert members of this class
diff --git a/src/classdef.h b/src/classdef.h
index ed2aa9d..afdcffb 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -39,6 +39,7 @@ class BaseClassList;
 class MemberInfoList;
 class MemberInfoDict;
 class NamespaceDef;
+class MemberDef;
 
 class ClassDef : public Definition
 {
@@ -76,7 +77,7 @@ class ClassDef : public Definition
     void writeMemberList(OutputList &ol);
     void writeIncludeFile(OutputList &ol);
     //void writeMembersToContents();
-    void writeDeclaration(OutputList &ol);
+    void writeDeclaration(OutputList &ol,MemberDef *md);
     bool addExample(const char *anchor,const char *name, const char *file);
     bool hasExamples();
     //void writeExample(OutputList &ol);
@@ -84,9 +85,9 @@ class ClassDef : public Definition
     Protection protection() const { return prot; }
     /*! a link to this class is possible within this project */
     bool isLinkableInProject() 
-    { int i = name().findRev("::");
-      if (i==-1) i=0; else i+=2;
-      return !name().isEmpty() && name().at(i)!='@' && 
+    { //int i = name().findRev("::");
+      //if (i==-1) i=0; else i+=2;
+      return !name().isEmpty() && name().find('@')==-1 && 
              (prot!=Private || Config::extractPrivateFlag) &&
              hasDocumentation() && !isReference();
     }
@@ -167,6 +168,7 @@ struct BaseClassDef
 class BaseClassList : public QList<BaseClassDef>
 {
   public:
+   ~BaseClassList() {}
     int compareItems(GCI item1,GCI item2)
     {
       ClassDef *c1=((BaseClassDef *)item1)->classDef;
diff --git a/src/code.l b/src/code.l
index 962b328..2a60f6c 100644
--- a/src/code.l
+++ b/src/code.l
@@ -213,7 +213,10 @@ static bool getLink(const char *className,
       //                                  exampleFile.data());
       if (md->addExample(anchor,exampleName,exampleFile))
       {
+	bool latexEnabled = result.isEnabled(OutputGenerator::Latex);
+	if (latexEnabled) result.disable(OutputGenerator::Latex);
 	result.writeAnchor(anchor);
+	if (latexEnabled) result.enable(OutputGenerator::Latex);
 	anchorCount++;
       }
     }
@@ -222,6 +225,7 @@ static bool getLink(const char *className,
 
     if (d)
     {
+      //printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data());
       result.writeCodeLink(d->getReference(),d->getOutputFileBase(),
 	                   md->anchor(),memberName);
       return TRUE;
@@ -384,7 +388,7 @@ ID	[a-z_A-Z][a-z_A-Z0-9]*
 					  if ((fd=findFileDef(&inputNameDict,yytext,ambig)) &&
 					      fd->isLinkable())
 					  {
-					    code->writeCodeLink(0,fd->getOutputFileBase(),0,yytext);
+					    code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext);
 					  }
 					  else
 					  {
diff --git a/src/config.h b/src/config.h
index 9d04582..2bc8ce5 100644
--- a/src/config.h
+++ b/src/config.h
@@ -39,6 +39,7 @@ struct Config
   static QCString manOutputDir;       // the directory to put the man pages
   static QCString outputLanguage;     // the output language
   static QCString headerFile;         // the name of the personal HTML header 
+  static QCString latexHeaderFile;    // the name of the personal LaTeX header 
   static QCString footerFile;         // the name of the personal HTML footer 
   static QCString cgiName;            // the name of the CGI binary           
   static QCString cgiURL;             // the absolute URL to the CGI binary   
@@ -91,6 +92,9 @@ struct Config
   static bool     autoBriefFlag;      // javadoc comments behaves as Qt comments.
   static bool     htmlHelpFlag;       // should html help files be generated?
   static bool     alphaIndexFlag;     // should an alphabetical index be generated?
+  static bool     pdfHyperFlag;       // generate latex prepared creating hyperlinked pdfs.
+  static bool     inheritDocsFlag;    // inheritance of documentation enabled? 
+  static bool     inlineInfoFlag;     // show info about inline members?
 };
 
 #endif
diff --git a/src/config.l b/src/config.l
index 515de4d..1e420c2 100644
--- a/src/config.l
+++ b/src/config.l
@@ -71,6 +71,7 @@ QCString Config::latexOutputDir;
 QCString Config::manOutputDir;          
 QCString Config::outputLanguage;
 QCString Config::headerFile;          
+QCString Config::latexHeaderFile;          
 QCString Config::footerFile;          
 QCString Config::cgiName;          
 QCString Config::cgiURL;          
@@ -111,6 +112,7 @@ bool     Config::caseSensitiveNames  = FALSE;
 bool     Config::includeSourceFlag   = FALSE;
 bool     Config::htmlHelpFlag        = FALSE;
 bool     Config::alphaIndexFlag      = FALSE;
+bool     Config::pdfHyperFlag        = FALSE;
 bool     Config::autoBriefFlag       = TRUE;
 bool     Config::warningFlag         = TRUE; 
 bool     Config::generateHtml        = TRUE;
@@ -123,6 +125,8 @@ bool     Config::classDiagramFlag    = TRUE;
 bool     Config::repeatBriefFlag     = TRUE;
 bool     Config::verbatimHeaderFlag  = TRUE;
 bool     Config::htmlAlignMemberFlag = TRUE;
+bool     Config::inheritDocsFlag     = TRUE;
+bool     Config::inlineInfoFlag      = TRUE;
   
 /* -----------------------------------------------------------------
  *
@@ -180,6 +184,7 @@ static int yyread(char *buf,int max_size)
 <Start>"LATEX_OUTPUT"[ \t]*"="		{ BEGIN(GetString);  s=&Config::latexOutputDir;   }
 <Start>"HTML_HEADER"[ \t]*"="	        { BEGIN(GetString);  s=&Config::headerFile;       }
 <Start>"HTML_FOOTER"[ \t]*"="	        { BEGIN(GetString);  s=&Config::footerFile;       }
+<Start>"LATEX_HEADER"[ \t]*"="	        { BEGIN(GetString);  s=&Config::latexHeaderFile;  }
 <Start>"CGI_NAME"[ \t]*"="              { BEGIN(GetString);  s=&Config::cgiName;          }
 <Start>"CGI_URL"[ \t]*"="               { BEGIN(GetString);  s=&Config::cgiURL;           }
 <Start>"DOC_URL"[ \t]*"="		{ BEGIN(GetString);  s=&Config::docURL;           }
@@ -232,6 +237,9 @@ static int yyread(char *buf,int max_size)
 <Start>"JAVADOC_AUTOBRIEF"[ \t]*"="     { BEGIN(GetBool);    b=&Config::autoBriefFlag; }
 <Start>"GENERATE_HTMLHELP"[ \t]*"="     { BEGIN(GetBool);    b=&Config::htmlHelpFlag; }
 <Start>"ALPHABETICAL_INDEX"[ \t]*"="    { BEGIN(GetBool);    b=&Config::alphaIndexFlag; }
+<Start>"PDF_HYPERLINKS"[ \t]*"="	{ BEGIN(GetBool);    b=&Config::pdfHyperFlag; }
+<Start>"INHERIT_DOCS"[ \t]*"="	        { BEGIN(GetBool);    b=&Config::inheritDocsFlag; }
+<Start>"INLINE_INFO"[ \t]*"="	        { BEGIN(GetBool);    b=&Config::inlineInfoFlag; }
 <Start>[a-z_A-Z0-9]+			{ err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); }
 <GetString,GetBool>\n			{ yyLineNr++; BEGIN(Start); }
 <GetStrList>\n				{ 
@@ -375,6 +383,7 @@ void Config::init()
   Config::manOutputDir ="man";          
   Config::outputLanguage = "English";
   Config::headerFile.resize(0);          
+  Config::latexHeaderFile.resize(0);          
   Config::footerFile.resize(0);          
   Config::cgiName = "search.cgi";          
   Config::cgiURL.resize(0);          
@@ -415,6 +424,7 @@ void Config::init()
   Config::includeSourceFlag   = FALSE;
   Config::htmlHelpFlag        = FALSE;
   Config::alphaIndexFlag      = FALSE;
+  Config::pdfHyperFlag        = FALSE;
   Config::warningFlag         = TRUE; 
   Config::generateHtml        = TRUE;
   Config::generateLatex       = TRUE;
@@ -427,6 +437,8 @@ void Config::init()
   Config::verbatimHeaderFlag  = TRUE;
   Config::htmlAlignMemberFlag = TRUE;
   Config::autoBriefFlag       = TRUE;
+  Config::inheritDocsFlag     = TRUE;
+  Config::inlineInfoFlag      = TRUE;
 }
 
 void writeTemplateConfig(QFile *f,bool sl)
@@ -636,7 +648,7 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
-    t << "# If the JAVADOC_NO_AUTOBRIEF is set to YES (the default) then Doxygen\n";
+    t << "# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen\n";
     t << "# will interpret the first line (until the first dot) of a JavaDoc-style\n";
     t << "# comment as the brief description. If set to NO, the Javadoc-style will\n";
     t << "# behave just like the Qt-style comments.\n";
@@ -646,6 +658,23 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
+    t << "# if the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n";
+    t << "# member inherits the documentation from any documented member that it\n";
+    t << "# reimplements.\n";
+    t << "\n";
+  }
+  t << "INHERIT_DOCS         = YES\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# if the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n";
+    t << "# is inserted in the documentation for inline members.\n";
+    t << "\n";
+  }
+  t << "INLINE_INFO          = YES\n";
+  if (!sl)
+  {
+    t << "\n";
   }
   t << "#---------------------------------------------------------------------------\n";
   t << "# configuration options related to the input files\n";
@@ -841,6 +870,26 @@ void writeTemplateConfig(QFile *f,bool sl)
   if (!sl)
   {
     t << "\n";
+    t << "# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n";
+    t << "# the generated latex document. The header should contain everything until\n";
+    t << "# the first chapter. If it is left blank doxygen will generate a \n";
+    t << "# standard header. Notice: only use this tag if you know what you are doing!\n";
+    t << "\n";
+  }
+  t << "LATEX_HEADER          =\n";
+  if (!sl)
+  {
+    t << "\n";
+    t << "# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n";
+    t << "# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n";
+    t << "# contain links (just like the HTML output) instead of page references\n";
+    t << "# This makes the output suitable for online browsing using a pdf viewer.\n";
+    t << "\n";
+  }
+  t << "PDF_HYPERLINKS       = NO\n";
+  if (!sl)
+  {
+    t << "\n";
   }
   t << "#---------------------------------------------------------------------------\n";
   t << "# configuration options related to the man page output\n";
@@ -1177,6 +1226,17 @@ void checkConfig()
       exit(1);
     }
   }
+  // Test to see if LaTeX header is valid
+  if (Config::latexHeaderFile.length()>0)
+  {
+    QFileInfo fi(Config::latexHeaderFile);
+    if (!fi.exists())
+    {
+      err("Error: tag LATEX_HEADER: header file `%s' "
+	  "does not exist\n",Config::latexHeaderFile.data());
+      exit(1);
+    }
+  }
   // check include path
   char *s=Config::includePath.first();
   while (s)
diff --git a/src/declinfo.l b/src/declinfo.l
index df5c2ea..c071192 100644
--- a/src/declinfo.l
+++ b/src/declinfo.l
@@ -171,11 +171,11 @@ ID	[a-z_A-Z][a-z_A-Z0-9]*
 <Template>.			{
   				  name+=*yytext;
   				}
-<Operator>{B}*"()"{B}*"<>"{B}*/"("	{
+<Operator>{B}*"("{B}*")"{B}*"<>"{B}*/"("	{
   				  name+="() <>";
 				  BEGIN(ReadArgs);
   				}
-<Operator>{B}*"()"{B}*/"("	{
+<Operator>{B}*"("{B}*")"{B}*/"("	{
   				  name+="()";
 				  BEGIN(ReadArgs);
   				}
diff --git a/src/definition.cpp b/src/definition.cpp
index 4474113..59c9ac9 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -73,3 +73,17 @@ void Definition::addSectionsToDefinition(QList<QCString> *anchorList)
     s=anchorList->next();
   }
 }
+
+void Definition::setBriefDescription(const char *b) 
+{ 
+  brief=QCString(b).stripWhiteSpace(); 
+  int bl=brief.length(); 
+  if (bl>0) // add puntuation if needed
+  {
+    switch(brief.at(bl-1))
+    {
+      case '.': case '!': case '?': break;
+      default: brief+='.'; break;
+    }
+  }
+}
diff --git a/src/definition.h b/src/definition.h
index 40e8316..87b3c18 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -50,19 +50,7 @@ class Definition
     /*! sets the brief description of this definition to \a b.
      *  A dot is added to the sentence if not available.
      */
-    void setBriefDescription(const char *b) 
-      { 
-        brief=((QCString) b).stripWhiteSpace(); 
-        int bl=brief.length(); 
-        if (bl>0) // add puntuation if needed
-        {
-          switch(brief.at(bl-1))
-          {
-            case '.': case '!': case '?': break;
-            default: brief+='.'; break;
-          }
-        }
-      }
+    void setBriefDescription(const char *b);
     /*! returns TRUE iff the definition is documented */
     virtual bool hasDocumentation() 
       { return !doc.isNull() || !brief.isNull() || Config::extractAllFlag; }
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 01ac9b6..9c0a97b 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -90,6 +90,8 @@ FormulaDict    formulaNameDict(1009);   // dictionary of the label name of all f
                                         // a member group
 
 OutputList     *outputList;           // list of output generating objects
+
+PageInfo       *mainPage=0;
   
 //bool           unrelatedFunctionsUsed;
 
@@ -357,8 +359,10 @@ static bool addNamespace(Entry *root,ClassDef *cd)
       if (e->section==Entry::NAMESPACE_SEC)
       {
         NamespaceDef *nd=0;
-        if (!e->name.isEmpty() && e->name.at(0)!='@' &&
-            (nd=namespaceDict[e->name])
+        //printf("addNameSpace() trying: %s\n",e->name.data());
+        QCString nsName = stripAnnonymousNamespaceScope(e->name);
+        if (!nsName.isEmpty() && nsName.at(0)!='@' &&
+            (nd=namespaceDict[nsName])
            )
         {
           cd->setNamespace(nd);
@@ -393,7 +397,7 @@ void buildClassList(Entry *root)
     }
     else 
     {
-      fullName=stripAnnonymousScope(fullName);
+      fullName=stripAnnonymousNamespaceScope(fullName);
       //printf("new class with name %s\n",fullName.data());
 
       bool ambig;
@@ -506,14 +510,8 @@ void buildNamespaceList(Entry *root)
        root->name.length()>0
      )
   {
-    QCString fullName=root->name.copy();
-    if (fullName.length()==0)
-    {
-      // this should not be called
-      warn("Warning: invalid namespace found in file %s at %d\n",
-                  root->fileName.data(),root->startLine);
-    }
-    else 
+    QCString fullName=stripAnnonymousNamespaceScope(root->name.copy());
+    if (fullName.length()>0)
     {
       //printf("Found namespace %s in %s at line %d\n",root->name.data(),
       //        root->fileName.data(), root->startLine);
@@ -596,6 +594,8 @@ void buildNamespaceList(Entry *root)
   }
 }
 
+//----------------------------------------------------------------------
+
 static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
     MemberDef::MemberType mtype,const QCString &scope,const QCString &name,
     bool fromAnnScope,int indentDepth,MemberDef *fromAnnMemb)
@@ -642,7 +642,8 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
     MemberDef *md=mn->first();
     while (md)
     {
-      if (md->memberClass()==cd) // member already in the scope
+      if (md->memberClass()==cd && root->type==md->typeString()) 
+        // member already in the scope
       {
         addMemberDocs(root,md,def,FALSE);
         return md;
@@ -668,9 +669,6 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
   // add the member to the global list
   if (mn)
   {
-    //printf("Member already found! %s\n",md->name());
-    //addMemberDocs(root,mn->first(),def,FALSE);
-    //delete md;
     mn->inSort(md);
   }
   else // new variable name
@@ -690,6 +688,107 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd,
 }
 
 //----------------------------------------------------------------------
+
+static MemberDef *addVariableToFile(Entry *root,MemberDef::MemberType mtype,
+       const QCString &scope,const QCString &name,
+       bool fromAnnScope,int indentDepth,MemberDef *fromAnnMemb)
+{
+  Debug::print(Debug::Variables,0,
+      "  global variable:\n"
+      "    type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
+      root->type.data(),
+      scope.data(), 
+      name.data(),
+      root->args.data(),
+      root->protection
+              );
+
+  // new global variable, enum value or typedef
+  MemberDef *md=new MemberDef(root->type,name,root->args,0,
+      Public, Normal,root->stat,FALSE,
+      mtype,0,0);
+  md->setDefFile(root->fileName);
+  md->setDefLine(root->startLine);
+  md->setDocumentation(root->doc);
+  md->setBriefDescription(root->brief);
+  md->addSectionsToDefinition(root->anchors);
+  md->setFromAnnonymousScope(fromAnnScope);
+  md->setFromAnnonymousMember(fromAnnMemb);
+  md->setIndentDepth(indentDepth);
+
+  // see if the function is inside a namespace
+  NamespaceDef *nd = 0;
+  if (scope.length()>0)
+  {
+    nd = namespaceDict[scope];
+  }
+  if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+  {
+    nd->insertMember(md); 
+    md->setNamespace(nd);
+  }
+  else
+  {
+    // find file definition
+    FileDef *fd=0;
+    bool ambig;
+    if (root->fileName.length()>0 && 
+        (fd=findFileDef(&inputNameDict,root->fileName,ambig))
+       )
+    {
+      fd->insertMember(md);
+      md->setFileDef(fd); 
+    }
+  }
+
+  QCString def;
+  // determine the definition of the global variable
+  if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
+    // variable is inside a namespace, so put the scope before the name
+  {
+    if (root->type.length()>0)
+    {
+      def=root->type+" "+nd->name()+"::"+name+root->args;
+    }
+    else
+    {
+      def=nd->name()+"::"+name+root->args;
+    }
+  }
+  else
+  {
+    if (root->type.length()>0)
+    {
+      if (name.at(0)=='@') // dummy variable representing annonymous union
+        def=root->type;
+      else
+        def=root->type+" "+name+root->args;
+    }
+    else
+    {
+      def=name+root->args;
+    }
+  }
+  if (def.left(7)=="static ") def=def.right(def.length()-7);
+  md->setDefinition(def);
+
+  MemberName *mn = 0;
+  // add member definition to the list of globals 
+  if ((mn=functionNameDict[name]))
+  {
+    mn->inSort(md);
+  }
+  else
+  {
+    mn = new MemberName(name);
+    mn->inSort(md);
+    functionNameDict.insert(name,mn);
+    functionNameList.inSort(mn);
+  }
+  return md;
+}
+
+//----------------------------------------------------------------------
 // Searches the Entry tree for Variable documentation sections.
 // If found they are stored in their class or in the global list.
 
@@ -698,7 +797,7 @@ void buildVarList(Entry *root)
   QRegExp re("([^)]*)");
   int i=-1;
   if (root->name.length()>0 &&
-      root->type!="class" &&
+      root->type!="class" && root->type!="interface" &&
       (
        (root->section==Entry::VARIABLE_SEC 
        ) ||
@@ -751,7 +850,8 @@ void buildVarList(Entry *root)
     Entry *p = root->parent;
     while ((p->section & Entry::SCOPE_MASK))
     {
-      QCString scopeName = stripAnnonymousScope(p->name);
+      //QCString scopeName = stripAnnonymousScope(p->name);
+      QCString scopeName = p->name.copy();
       if (!scopeName.isEmpty())
       {
         scope.prepend(scopeName);
@@ -769,6 +869,10 @@ void buildVarList(Entry *root)
     //  scope=scope.left(i);
     //}
     
+    MemberDef::MemberType mtype;
+    QCString type=root->type.stripWhiteSpace();
+    ClassDef *cd=0;
+
     int ni;
     if ((ni=root->name.findRev("::"))!=-1) goto nextMember;
                /* skip this member, because it is a 
@@ -778,9 +882,6 @@ void buildVarList(Entry *root)
                 * inserted in the correct list!
                 */
 
-    MemberDef::MemberType mtype;
-//    NamespaceDef *nd = 0;
-    QCString type=root->type.stripWhiteSpace();
     if (type=="@") 
       mtype=MemberDef::EnumValue;
     else if (type.left(8)=="typedef ") 
@@ -790,17 +891,34 @@ void buildVarList(Entry *root)
     else
       mtype=MemberDef::Variable;
 
-    ClassDef *cd=0;
+    //printf("name=`%s' scope=%s\n",name.data(),scope.data());
+    QCString classScope=stripAnnonymousNamespaceScope(scope);
+    QCString annScopePrefix=scope.left(scope.length()-classScope.length());
+    scope=classScope;
     if (scope.length()>0 && name.length()>0 && (cd=getClass(scope)))
     {
       MemberDef *md=0;
       // if cd is an annonymous scope we insert the member 
       // into a non-annonymous scope as well.
       int indentDepth=0;
-      if (scope.find('@')!=-1)
+      int si=scope.find('@');
+      if (si!=-1)
       {
-        QCString pScope = scope.copy();
+        //printf("name=`%s' scope=%s\n",name.data(),scope.data());
+        QCString pScope;
         ClassDef *pcd=0;
+        pScope = scope.left(QMAX(si-2,0));
+        indentDepth = scope.right(scope.length()-si).contains("::")+1;
+#if 0
+        // Find the last annonymous scope while search from right to left
+        // Keep track of the number of scope names we skipped.
+        while ((i=pScope.findRev("::"))!=-1 && (int)pScope.length()>i+2 && 
+                  pScope.at(i+2)!='@'
+              ) 
+        {
+          pScope=pScope.left(i);
+          indentDepth++;
+        }
         while ((i=pScope.findRev("::"))!=-1 && (int)pScope.length()>i+2 && 
                   pScope.at(i+2)=='@'
               ) 
@@ -808,102 +926,37 @@ void buildVarList(Entry *root)
           pScope=pScope.left(i);
           indentDepth++;
         }
-        if ((pcd=getClass(pScope)))
+        if (pScope.length()>0 && pScope.at(0)=='@')
+        {
+          pScope.resize(0);
+          indentDepth++;
+        }
+#endif
+        if (!pScope.isEmpty())
+          pScope.prepend(annScopePrefix);
+        else if (annScopePrefix.length()>2)
+          pScope=annScopePrefix.left(annScopePrefix.length()-2);
+        //printf("pScope=`%s'\n",pScope.data());
+        if (!name.isEmpty() && name.at(0)!='@')
         {
-          //printf("Inserting member in parent scope!\n");
-          md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0);
+          if (pScope.length()>0 && (pcd=getClass(pScope)))
+          {
+            //printf("Inserting member in parent scope!\n");
+            md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0);
+          }
+          else // annonymous scope inside namespace or file => put variable in the global scope
+          {
+            //printf("Inserting member in global scope %s!\n",pScope.data());
+            md=addVariableToFile(root,mtype,pScope,name,!pScope.isEmpty(),indentDepth,0); 
+          }
         }
       } 
       addVariableToClass(root,cd,mtype,scope,name,FALSE,indentDepth,md);
     }
     else if (name.length()>0) // global variable
     {
-      Debug::print(Debug::Variables,0,
-                   "  global variable:\n"
-                   "    type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d\n",
-                   root->type.data(),
-                   scope.data(), 
-                   name.data(),
-                   root->args.data(),
-                   root->protection
-                  );
-      
-      // new global variable, enum value or typedef
-      MemberDef *md=new MemberDef(root->type,name,root->args,0,
-                           Public, Normal,root->stat,FALSE,
-                           mtype,0,0);
-      md->setDefFile(root->fileName);
-      md->setDefLine(root->startLine);
-      md->setDocumentation(root->doc);
-      md->setBriefDescription(root->brief);
-      md->addSectionsToDefinition(root->anchors);
-      QCString def;
-
-      // see if the function is inside a namespace
-      NamespaceDef *nd = 0;
-      if (scope.length()>0)
-      {
-        nd = namespaceDict[scope];
-      }
-      if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
-      {
-        nd->insertMember(md); 
-        md->setNamespace(nd);
-      }
-      else
-      {
-        // find file definition
-        FileDef *fd=0;
-        bool ambig;
-        if (root->fileName.length()>0 && 
-            (fd=findFileDef(&inputNameDict,root->fileName,ambig))
-           )
-        {
-          fd->insertMember(md);
-          md->setFileDef(fd); 
-        }
-      }
-      
-      // determine the definition of the global variable
-      if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') 
-         // variable is inside a namespace, so put the scope before the name
-      {
-        if (root->type.length()>0)
-        {
-          def=root->type+" "+nd->name()+"::"+name+root->args;
-        }
-        else
-        {
-          def=nd->name()+"::"+name+root->args;
-        }
-      }
-      else
-      {
-        if (root->type.length()>0)
-        {
-          def=root->type+" "+name+root->args;
-        }
-        else
-        {
-          def=name+root->args;
-        }
-      }
-      if (def.left(7)=="static ") def=def.right(def.length()-7);
-      md->setDefinition(def);
-
-      MemberName *mn;
-      // add member definition to the list of globals 
-      if ((mn=functionNameDict[name]))
-      {
-        mn->inSort(md);
-      }
-      else
-      {
-        mn = new MemberName(name);
-        mn->inSort(md);
-        functionNameDict.insert(name,mn);
-        functionNameList.inSort(mn);
-      }
+      //printf("Inserting member in global scope %s!\n",scope.data());
+      addVariableToFile(root,mtype,scope,name,FALSE,0,0);
     }
   }
 nextMember:
@@ -948,7 +1001,7 @@ void buildMemberList(Entry *root)
       //printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
       //    root->parent->name.data(),getClass(root->parent->name),
       //    root->type.find(re,0));
-      QCString scope=stripAnnonymousScope(root->parent->name.copy());
+      QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy());
       int i;
       if (root->parent && 
           root->parent->name.length()>0 &&
@@ -1002,6 +1055,7 @@ void buildMemberList(Entry *root)
         md->setBriefDescription(root->brief);
         md->setBody(root->body);
         md->setGroupId(root->mGrpId);
+        md->setInline(root->inLine);
         //md->setScopeTemplateArguments(root->tArgList);
         md->addSectionsToDefinition(root->anchors);
         QCString def;
@@ -1095,7 +1149,7 @@ void buildMemberList(Entry *root)
                root->name.find("::")==-1 &&
                root->relates.length()==0 &&
                root->type.left(7)!="extern " &&
-               root->type.left(8)!="typedef "
+               root->type.left(8)!="typedef " 
               )
       // no member => unrelated function 
       {
@@ -1151,6 +1205,7 @@ void buildMemberList(Entry *root)
           md->setBody(root->body);
           md->addSectionsToDefinition(root->anchors);
           md->setGroupId(root->mGrpId);
+          md->setInline(root->inLine);
           QCString def;
           if (root->type.length()>0)
           {
@@ -1369,7 +1424,9 @@ void computeClassRelations(Entry *root)
      )
   {
     ClassDef *cd;
-    if ((cd=getClass(root->name)))
+    QCString bName=stripAnnonymousNamespaceScope(root->name);
+    //printf("Class %s\n",bName.data());
+    if ((cd=getClass(bName)))
     {
       //printf("Class %s %d\n",cd->name().data(),root->extends->count());
       if (!cd->visited)
@@ -1423,7 +1480,7 @@ void computeClassRelations(Entry *root)
               ClassDef *baseClass=getClass(baseClassName);
               //printf("baseClass %s of %s found (%s and %s)\n",
               //      baseClassName.data(),
-              //      root->name.data(),
+              //      bName.data(),
               //      (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
               //      (bi->virt==Normal)?"normal":"virtual"
               //      );
@@ -1481,7 +1538,7 @@ void computeClassRelations(Entry *root)
         } // class has no base classes
       } // else class is already found
     }
-    else if (root->name.right(2)!="::")
+    else if (bName.right(2)!="::")
     {
       if (root->name.length()>0 && root->name[0]!='@')
         warn("Warning: Compound %s\n"
@@ -1605,6 +1662,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
   }
   md->setDefFile(root->fileName);
   md->setDefLine(root->startLine);
+  if (root->inLine && !md->isInline()) md->setInline(TRUE);
   md->addSectionsToDefinition(root->anchors);
   if (cd) cd->insertUsedFile(root->fileName);
   if (root->mGrpId!=-1)
@@ -1823,10 +1881,12 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
                 bool isFunc)
 {
   Debug::print(Debug::FindMembers,0,
-               "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s memberSpec=%s\n",
+               "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
+               "isFunc=%d mGrpId=%d tArgList=%p=\"%s\" scopeSpec=%s "
+               "memberSpec=%s inLine=%d\n",
                root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId,
                root->tArgList,tempArgListToString(root->tArgList).data(),
-               root->scopeSpec.data(),root->memberSpec.data()
+               root->scopeSpec.data(),root->memberSpec.data(),root->inLine
               );
   if (Config::includeSourceFlag && !root->body.isEmpty())
   {
@@ -1851,6 +1911,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
     funcDecl=funcDecl.right(funcDecl.length()-7);
     isFriend=TRUE;
   }
+  if (funcDecl.left(7)=="inline ")
+  {
+    funcDecl=funcDecl.right(funcDecl.length()-7);
+    root->inLine=TRUE;
+  }
   
   // delete any ; from the function declaration
   int sep;
@@ -2229,6 +2294,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
             }
             if (matching) 
             {
+              //printf("addMemberDocs root->inLine=%d md->isInline()=%d\n",
+              //         root->inLine,md->isInline());
               addMemberDocs(root,md,funcDecl,overloaded);
               count++;
             }
@@ -2309,6 +2376,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           md->setPrototype(root->proto);
           md->addSectionsToDefinition(root->anchors);
           md->setBody(root->body);
+          md->setInline(root->inLine);
           mn->inSort(md);
           cd->insertMember(md);
           cd->insertUsedFile(root->fileName);
@@ -2374,6 +2442,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
           md->setDefLine(root->startLine);
           md->setPrototype(root->proto);
           md->setBody(root->body);
+          md->setInline(root->inLine);
           md->addSectionsToDefinition(root->anchors);
           mn->inSort(md);
           cd->insertMember(md);
@@ -2421,8 +2490,8 @@ void findMemberDocumentation(Entry *root)
   int i,l;
   QRegExp re("([a-zA-Z0-9: ]*\\*+[ \\*]*");
   Debug::print(Debug::FindMembers,0,
-         "root->type=`%s' root->name=`%s' root->args=`%s' section=%x\n",
-          root->type.data(),root->name.data(),root->args.data(),root->section
+         "root->type=`%s' root->name=`%s' root->args=`%s' section=%x root->inLine=%d\n",
+          root->type.data(),root->name.data(),root->args.data(),root->section,root->inLine
          );
   bool isFunc=TRUE;
   if ((i=re.match(root->type,0,&l))!=-1) // func variable/typedef to func ptr
@@ -2458,6 +2527,7 @@ void findMemberDocumentation(Entry *root)
     (root->section==Entry::FUNCTION_SEC && 
       (!root->doc.isEmpty() || !root->brief.isEmpty() || 
        !root->body.isEmpty() || root->mGrpId!=-1 /*|| Config::extractAllFlag*/
+       || root->inLine
       )
     )
   {
@@ -3149,6 +3219,39 @@ void generateClassDocs()
 
 //----------------------------------------------------------------------------
 
+void inheritDocumentation()
+{
+  MemberNameListIterator mnli(memberNameList);
+  MemberName *mn;
+  //int count=0;
+  for (;(mn=mnli.current());++mnli)
+  {
+    MemberNameIterator mni(*mn);
+    MemberDef *md;
+    for (;(md=mni.current());++mni)
+    {
+      //printf("%04d Member `%s'\n",count++,md->name().data());
+      if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
+      { // no documentation yet
+        MemberDef *bmd = md->reimplements();
+        while (bmd && bmd->documentation().isEmpty() && 
+                      bmd->briefDescription().isEmpty()
+              )
+        { // search up the inheritance tree for a documentation member
+          bmd = bmd->reimplements();
+        }
+        if (bmd) // copy the documentation from the reimplemented member
+        {
+          md->setDocumentation(bmd->documentation());
+          md->setBriefDescription(bmd->briefDescription());
+        }
+      }
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+
 void findDefineDocumentation(Entry *root)
 {
   if ((root->section==Entry::DEFINEDOC_SEC ||
@@ -3286,6 +3389,30 @@ void buildPageList(Entry *root)
   }
 }
 
+void findMainPage(Entry *root)
+{
+  if (root->section == Entry::MAINPAGEDOC_SEC)
+  {
+    if (mainPage==0)
+    {
+      //printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
+      mainPage = new PageInfo("index", root->doc,
+                        root->args.stripWhiteSpace());
+    }
+    else
+    {
+      warn("Warning: found more than one \\mainpage comment block!\n Skipping the "
+           "block at line %d of %s\n",root->startLine,root->fileName.data());
+    }
+  }
+  EntryListIterator eli(*root->sublist);
+  Entry *e;
+  for (;(e=eli.current());++eli)
+  {
+    findMainPage(e);
+  }
+}
+
 //----------------------------------------------------------------------------
 
 void resolveUserReferences()
@@ -3309,6 +3436,25 @@ void resolveUserReferences()
 //----------------------------------------------------------------------------
 // generate all separate documentation pages
 
+//void generateMainPageDocs()
+//{
+//  if (mainPage)
+//  {
+//    msg("Generating docs for the main page\n",mainPage->name.data());
+//    outputList->disable(OutputGenerator::Man);
+//   startFile(*outputList,mainPage->name,mainPage->title);
+//    SectionInfo *si=0;
+//    if (mainPage->title.length()>0 && mainPage->name.length()>0 &&
+//        (si=sectionDict[mainPage->name])!=0)
+//    {
+//      outputList->writeSection(si->label,si->title,FALSE);
+//    }
+//    parseDoc(*outputList,0,0,mainPage->doc);
+//    endFile(*outputList);
+//    outputList->enable(OutputGenerator::Man);
+//  }
+//}
+
 void generatePageDocs()
 {
   PageInfo *pi=pageList.first();
@@ -3661,7 +3807,7 @@ bool patternMatch(QFileInfo *fi,QStrList *patList)
 #else                // unix
       QRegExp re(pattern,TRUE,TRUE);  // case sensitive match
 #endif
-      found = found || re.match(fi->fileName())!=-1;
+      found = found || re.match(fi->fileName())!=-1 || re.match(fi->filePath())!=-1;
       pattern=patList->next();
     }
   }
@@ -3766,9 +3912,10 @@ void readFiles(BufStr &output)
       copyAndFilterFile(fileName,output);
     }
 
+    output.addChar('\n'); /* to prevent problems under Windows ? */
+
     s=inputFiles.next();
     //printf("-------> adding new line\n");
-    output.addChar('\n'); /* to prevent problems under Windows ? */
   }
 //  *p++='\0';
   output.addChar(0);
@@ -4232,6 +4379,9 @@ int main(int argc,char **argv)
   
   msg("Building page list...\n");
   buildPageList(root);
+
+  msg("Search for main page...\n");
+  findMainPage(root);
   
 //  msg("Adding compounds to file pages...\n");
 //  findClassDefsInFiles(root);
@@ -4283,6 +4433,12 @@ int main(int argc,char **argv)
   computeMemberGroupDocumentation();
   
   //unrelatedFunctionsUsed=hasUnrelatedFunctions();
+
+  if (Config::inheritDocsFlag)
+  {
+    msg("Inheriting documentation...\n");
+    inheritDocumentation();
+  }
   
   /**************************************************************************
    *                        Generate documentation                          *
diff --git a/src/doxygen.h b/src/doxygen.h
index 00803c0..d22d55a 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -113,6 +113,7 @@ extern NamespaceDict namespaceDict;
 extern FormulaList formulaList;
 extern FormulaDict formulaDict;
 extern FormulaDict formulaNameDict;
+extern PageInfo *mainPage;
 
 extern int annotatedClasses;
 extern int hierarchyClasses;
diff --git a/src/entry.cpp b/src/entry.cpp
index c330f8b..e66e584 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -65,6 +65,7 @@ Entry::Entry(const Entry &e)
   fileName    = e.fileName.copy();
   startLine   = e.startLine;
   mGrpId      = e.mGrpId;
+  inLine      = e.inLine;
   sublist     = new QList<Entry>;
   sublist->setAutoDelete(TRUE);
   extends     = new QList<BaseInfo>;
@@ -207,6 +208,7 @@ void Entry::reset()
   slot    = FALSE;
   stat    = FALSE;
   proto   = FALSE;
+  inLine  = FALSE;
   protection = Public;
   sublist->clear();
   extends->clear();
diff --git a/src/entry.h b/src/entry.h
index 18ee013..faf54bb 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -62,6 +62,7 @@ struct Argument
 class ArgumentList : public QList<Argument> 
 {
   public:
+   ~ArgumentList() {}
     ArgumentList() : QList<Argument>(), 
                      constSpecifier(FALSE),
                      volatileSpecifier(FALSE),
@@ -106,6 +107,7 @@ class Entry
       NAMESPACEDOC_SEC = 0x02000000,
       INTERFACE_SEC    = 0x04000000,
       INTERFACEDOC_SEC = 0x08000000,
+      MAINPAGEDOC_SEC  = 0x10000000,
       COMPOUND_MASK    = CLASS_SEC | STRUCT_SEC | UNION_SEC | INTERFACE_SEC,
       COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | INTERFACEDOC_SEC,
       SCOPE_MASK       = COMPOUND_MASK | NAMESPACE_SEC,
@@ -126,6 +128,7 @@ class Entry
     bool slot;                // a Qt slot ?
     bool stat;                // static ?
     bool proto;               // prototype ?
+    bool inLine;              // inline ?
     Specifier    virt;        // virtualness of the entry 
     Entry       *parent;      // parent node in the tree
     QCString	 type;        // member type 
diff --git a/src/filedef.cpp b/src/filedef.cpp
index f038e2e..d4caa71 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -37,6 +37,7 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref)
   path=p;
   filepath=path+nm;
   filename=nameToFile(nm);
+  diskname=filename.copy();
   setReference(ref);
   memList      = new MemberList;
   classList     = new ClassList;
@@ -72,9 +73,9 @@ void FileDef::writeDocumentation(OutputList &ol)
   
   QCString pageTitle=name()+" File Reference";
   startFile(ol,diskname,pageTitle);
-  startTitle(ol);
+  startTitle(ol,getOutputFileBase());
   parseText(ol,theTranslator->trFileReference(name()));
-  endTitle(ol,name());
+  endTitle(ol,getOutputFileBase(),name());
   //ol.newParagraph();
   
   if (Config::genTagFile.length()>0) tagFile << "&" << name() << ":\n";
@@ -184,8 +185,8 @@ void FileDef::writeDocumentation(OutputList &ol)
         ol.endMemberItem(FALSE,0,0,FALSE);
       }
       cd=classList->next();
-      if (found) ol.endMemberList();
     }
+    if (found) ol.endMemberList();
   }
   
   memList->writeDeclarations(ol,0,0,this,0,0);
@@ -265,14 +266,11 @@ void FileDef::writeDocumentation(OutputList &ol)
     memList->writeDocumentation(ol,name(),MemberDef::EnumValue);
   }
 
-  int cnt;
-  if ( (cnt=memList->funcCount()>0) )
+  if ( memList->funcCount()>0 )
   {
     ol.writeRuler();
     ol.startGroupHeader();
-    QCString cntString;
-    cntString.sprintf(" (%d)",cnt);
-    parseText(ol,theTranslator->trFunctionDocumentation()+cntString);
+    parseText(ol,theTranslator->trFunctionDocumentation());
     ol.endGroupHeader();
     memList->writeDocumentation(ol,name(),MemberDef::Function);
   }
diff --git a/src/filename.h b/src/filename.h
index cb39ce5..a7deffe 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -59,6 +59,7 @@ class FileNameDict : public QDict<FileName>
 {
   public:
     FileNameDict(uint size) : QDict<FileName>(size) {}
+   ~FileNameDict() {}
 };
 
 #endif
diff --git a/src/formula.h b/src/formula.h
index 9edd583..8f38433 100644
--- a/src/formula.h
+++ b/src/formula.h
@@ -52,6 +52,7 @@ class FormulaDict : public QDict<Formula>
   public:
     FormulaDict(uint size) : 
       QDict<Formula>(size) {}
+   ~FormulaDict() {}
 };
 
 #endif
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 6f0133a..846bb58 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -78,9 +78,9 @@ void GroupDef::writeDocumentation(OutputList &ol)
 {
   ol.disable(OutputGenerator::Man);
   startFile(ol,fileName,title);
-  startTitle(ol);
+  startTitle(ol,getOutputFileBase());
   ol.docify(title);
-  endTitle(ol,name());
+  endTitle(ol,getOutputFileBase(),name());
 
   //brief=brief.stripWhiteSpace();
   //int bl=brief.length();
@@ -112,13 +112,18 @@ void GroupDef::writeDocumentation(OutputList &ol)
   }
   if (classList->count()>0)
   {
-    ol.startMemberHeader();
-    parseText(ol,theTranslator->trCompounds());
-    ol.endMemberHeader();
-    ol.startIndexList();
     ClassDef *cd=classList->first();
+    bool found=FALSE;
     while (cd)
     {
+      if (!found)
+      {
+        ol.startMemberHeader();
+        parseText(ol,theTranslator->trCompounds());
+        ol.endMemberHeader();
+        ol.startIndexList();
+        found=TRUE;
+      }
       QCString type;
       switch (cd->compoundType())
       {
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 53b20b9..76c1832 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -170,17 +170,25 @@ void HtmlGenerator::writeStyleInfo(int part)
     t << "DL.el { margin-left: -1cm }" << endl;
     t << "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }" << endl;
     t << "DIV.in { margin-left: 16 }" << endl;
+    t << "DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }" << endl;
     t << "A.gl:link { color: #ffffff }" << endl;
     t << "A.gl:visited { color: #ffffff }" << endl;
     t << "A.gl { text-decoration: none; font-weight: bold; background-color: " << GROUP_COLOR << " }" << endl;
+    t << "TD.md { background-color: #f2f2ff }" << endl;
     t << endl;
     endPlainFile();
   }
 }
 
-void HtmlGenerator::writeDoxyAnchor(const char *,const char *anchor, const char *name)
+void HtmlGenerator::startDoxyAnchor(const char *,const char *,
+                                    const char *anchor, const char *name)
+{
+  t << "<a name=\"" << anchor << "\" doxytag=\"" << name << "\">";
+}
+
+void HtmlGenerator::endDoxyAnchor()
 {
-  t << "<a name=\"" << anchor << "\" doxytag=\"" << name << "\"></a>";
+  t << "</a>" << endl;
 }
 
 void HtmlGenerator::newParagraph()
@@ -601,17 +609,40 @@ void HtmlGenerator::endIndexList()
   //}
 }
 
-void HtmlGenerator::startAlfabeticalIndexList()
+void HtmlGenerator::startAlphabeticalIndexList()
 {
-  t << "<multicol cols=5><dl compact>" << endl;
+  t << "<table width=95% border=0 cellspacing=0 cellpadding=0>" << endl;
 }
 
-void HtmlGenerator::endAlfabeticalIndexList()
+void HtmlGenerator::endAlphabeticalIndexList()
 {
-  t << "</dl></multicol>" << endl;
+  t << "</table>" << endl;
 }
 
 void HtmlGenerator::writeIndexHeading(const char *s)
 {
-  t << "<dt><b><big>" << s << "</big></b><dd>" << endl;
+  //t << "<dt><b><big>" << s << "</big></b><dd>" << endl;
+  t << "<div class=\"ah\"><font color=\"white\"><b>&nbsp;&nbsp;" << s 
+    << "&nbsp;&nbsp;</b></font></div>";
+}
+
+void HtmlGenerator::writeImage(const char *name,const char *,const char *)
+{
+  QCString baseName=name;
+  int i;
+  if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
+  {
+    baseName=baseName.right(baseName.length()-i); 
+  }
+  t << "<img src=" << name << " alt=\"" << baseName << "\">" << endl;
+}
+
+void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *) 
+{ 
+  t << endl << "<p><table width=100%% cellpadding=2 cellspacing=0 border=0><tr><td class=\"md\"><b>" << endl; 
+}
+
+void HtmlGenerator::endMemberDoc()     
+{ 
+  t << endl << "</b></td></tr></table>" << endl; 
 }
diff --git a/src/htmlgen.h b/src/htmlgen.h
index f742761..01d8903 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -54,8 +54,8 @@ class HtmlGenerator : public OutputGenerator
     void startProjectNumber();
     void endProjectNumber();
     void writeStyleInfo(int part);
-    void startTitleHead() { startTitle(); }
-    void endTitleHead(const char *) { endTitle(); }
+    void startTitleHead(const char *) { startTitle(); }
+    void endTitleHead(const char *,const char *) { endTitle(); }
     void startTitle() { t << "<h1>"; }
     void endTitle() { t << "</h1>"; }
     
@@ -67,8 +67,8 @@ class HtmlGenerator : public OutputGenerator
     void endItemList()    { t << "</ul>" << endl; }
     void startEnumList()  { t << "<ol>"  << endl; }
     void endEnumList()    { t << "</ol>" << endl; }
-    void startAlfabeticalIndexList();
-    void endAlfabeticalIndexList();
+    void startAlphabeticalIndexList();
+    void endAlphabeticalIndexList();
     void writeIndexHeading(const char *s);
     void writeIndexItem(const char *ref,const char *file,const char *name);
     void docify(const char *text);
@@ -120,13 +120,15 @@ class HtmlGenerator : public OutputGenerator
     void endDescItem()      { t << "<dd>"; }
     void lineBreak() { t << "<br>" << endl; }
     void writeChar(char c);
-    void startMemberDoc(const char *,const char *,const char *) 
-                            { t << endl << "<h3>"; }
-    void endMemberDoc()     { t << "</h3>" << endl; }
-    void writeDoxyAnchor(const char *clName,const char *anchor,
-                         const char *name);
+    void startMemberDoc(const char *,const char *,const char *,const char *);
+    void endMemberDoc(); 
+    //void writeDoxyAnchor(const char *fName,const char *clName,
+    //                     const char *anchor,const char *name);
+    void startDoxyAnchor(const char *fName,const char *clName,
+                         const char *anchor,const char *name);
+    void endDoxyAnchor();
     void writeLatexSpacing() {}
-    void writeLatexLabel(const char *,const char *) {}
+    //void writeLatexLabel(const char *,const char *) {}
     void writeStartAnnoItem(const char *type,const char *file,
                             const char *path,const char *name);
     void writeEndAnnoItem(const char *) { t << endl; }
@@ -144,7 +146,7 @@ class HtmlGenerator : public OutputGenerator
     void endSuperscript()     { t << "</sup>"; }
     void startTable(int)      { t << "<table border=1 cellspacing=3 cellpadding=3>"; }
     void endTable()           { t << "</table>" << endl; }
-    void nextTableRow()       { t << endl << "<tr><td>"; }
+    void nextTableRow()       { t << "<tr><td>"; }
     void endTableRow()        { t << "</tr>" << endl; }
     void nextTableColumn()    { t << "<td>"; }
     void endTableColumn()     { t << "</td>"; }
@@ -171,11 +173,13 @@ class HtmlGenerator : public OutputGenerator
     void endClassDiagram(ClassDiagram &,const char *,const char *);
     void startColorFont(uchar r,uchar g,uchar b);
     void endColorFont();
-    void writePageRef(const char *,const char *) {}
+    void startPageRef() {}
+    void endPageRef(const char *,const char *) {}
     void startQuickIndexItem(const char *,const char *);
     void endQuickIndexItem();
     void writeFormula(const char *,const char *);
     void writeNonBreakableSpace() { t << "&nbsp;&nbsp;&nbsp;"; }
+    void writeImage(const char *,const char *,const char *);
     
     //static void docifyStatic(QTextStream &t,const char *str);
     
diff --git a/src/index.cpp b/src/index.cpp
index 3ad97d9..2df55a1 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -275,10 +275,10 @@ void writeHierarchicalIndex(OutputList &ol)
   if (hierarchyClasses==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"hierarchy","Hierarchical Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trClassHierarchy();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   if (Config::generateHtml && Config::htmlHelpFlag)
   {
@@ -318,10 +318,10 @@ void writeFileIndex(OutputList &ol)
   if (documentedFiles==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"files","File Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trFileList();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
   if (hasHtmlHelp)
@@ -410,10 +410,10 @@ void writeNamespaceIndex(OutputList &ol)
   if (documentedNamespaces==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"namespaces","Namespace Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trNamespaceList();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
   if (hasHtmlHelp)
@@ -536,31 +536,126 @@ void writeAnnotatedClassList(OutputList &ol)
 
 //----------------------------------------------------------------------------
 
-void writeAlfabeticalClassList(OutputList &ol)
+// write an alphabetical index of all class with a header for each letter
+void writeAlphabeticalClassList(OutputList &ol)
 {
-  ol.startAlfabeticalIndexList(); 
-  //ClassDef *cd=classList.first();
-  //while (cd)
+  ol.startAlphabeticalIndexList(); 
+
+  // first count the number of headers
   ClassListIterator cli(classList);
   ClassDef *cd;
   char startLetter=0;
+  int headerItems=0;
   for (;(cd=cli.current());++cli)
   {
     if (cd->isLinkableInProject())
     {
+      if (cd->name().at(0)!=startLetter) // new begin letter => new header
+      {
+        startLetter=cd->name().at(0);
+        headerItems++;
+      }
+    }
+  }
+
+  // the number of columns in the table
+  const int columns = 5;
+
+  int i,j;
+  int totalItems = headerItems + annotatedClasses;            // number of items in the table
+  int rows = (totalItems + columns - 1)/columns;              // number of rows in the table
+  int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
+
+  //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
+  //    headerItems,totalItems,columns,rows,itemsInLastRow);
+
+  // create one class list for each column 
+  ClassList *colList = new ClassList[columns];
+
+  // fill the columns with the class list (row elements in each column,
+  // expect for the columns with number >= itemsInLastRow, which get on
+  // item less.
+  int col=0,row=0;
+  //int icount=0;
+  startLetter=0;
+  for (cli.toFirst();(cd=cli.current());++cli)
+  {
+    if (cd->isLinkableInProject())
+    {
       if (cd->name().at(0)!=startLetter)
       {
+        // insert a new header using a dummy class pointer.
         startLetter=cd->name().at(0);
-        char s[2]; s[0]=startLetter; s[1]=0;
-        ol.writeIndexHeading(s);
+        colList[col].append((ClassDef *)8); // insert dummy for the header
+        row++;
+        if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) 
+        { 
+          // if the header is the last item in the row, we add an extra
+          // row to make it easier to find the text of the header (this
+          // is then contained in the next cell)
+          colList[col].append(cd); 
+          col++; 
+          row=0; 
+        }
       }
-      ol.writeObjectLink(cd->getReference(),
-                         cd->getOutputFileBase(),0,cd->name());
-      ol.lineBreak();
+      // add the class definition to the correct column list
+      colList[col].append(cd);
+      row++;
+      if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) { col++; row=0; }
     }
-    cd=classList.next(); 
   }
-  ol.endAlfabeticalIndexList();
+
+  // create iterators for each column
+  ClassListIterator **colIterators = new ClassListIterator*[columns];
+  for (i=0;i<columns;i++)
+  {
+    colIterators[i] = new ClassListIterator(colList[i]);
+  }
+
+  // generate table
+  for (i=0;i<rows;i++) // forarch table row
+  {
+    ol.nextTableRow();
+    // the last column may contain less items then the others
+    int colsInRow = (i<rows-1) ? columns : itemsInLastRow; 
+    //printf("row [%d]\n",i);
+    for (j=0;j<colsInRow;j++) // foreach table column
+    {
+      ClassDef *cd = colIterators[j]->current();
+      //printf("columns [%d] cd=%p\n",j,cd);
+      if (cd==(ClassDef *)8) // the class pointer is really a header
+      {
+        cd=++(*colIterators[j]); // get the next item
+        if (cd)
+        {
+          //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
+          startLetter=cd->name().at(0);
+          char s[2]; s[0]=startLetter; s[1]=0;
+          ol.writeIndexHeading(s);
+        }
+      }
+      else if (cd) // a real class, insert a link
+      {
+        ol.writeObjectLink(cd->getReference(),
+                           cd->getOutputFileBase(),0,cd->name());
+        ol.writeNonBreakableSpace();
+        //printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
+        ++(*colIterators[j]);
+      }
+      ol.endTableColumn();
+      if (j<colsInRow-1) ol.nextTableColumn();
+    }
+    ol.endTableRow();
+  }
+  ol.endAlphabeticalIndexList();
+
+  // release the temporary memory
+  for (i=0;i<columns;i++)
+  {
+    delete colIterators[i];
+  }
+  delete[] colIterators;
+  delete[] colList;
 }
 
 //----------------------------------------------------------------------------
@@ -569,11 +664,11 @@ void writeAlphabeticalIndex(OutputList &ol)
 {
   ol.disableAllBut(OutputGenerator::Html);
   if (annotatedClasses==0) return;
-  startFile(ol,"classes.html","Alfabetical index");
-  startTitle(ol);
+  startFile(ol,"classes.html","Alphabetical index");
+  startTitle(ol,0);
   parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex());
-  endTitle(ol,0);
-  writeAlfabeticalClassList(ol);
+  endTitle(ol,0,0);
+  writeAlphabeticalClassList(ol);
   endFile(ol);
   ol.enableAll();
 }
@@ -587,10 +682,10 @@ void writeAnnotatedIndex(OutputList &ol)
   //if (classList.count()==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"annotated","Annotated Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trCompoundList();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   if (Config::generateHtml && Config::htmlHelpFlag)
   {
@@ -728,9 +823,9 @@ void writeMemberIndex(OutputList &ol)
   ol.disable(OutputGenerator::Man);
   ol.disable(OutputGenerator::Latex);
   startFile(ol,"functions","Compound Member Index");
-  startTitle(ol);
+  startTitle(ol,0);
   parseText(ol,Config::projectName+" "+theTranslator->trCompoundMembers());
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   parseText(ol,theTranslator->trCompoundMembersDescription(Config::extractAllFlag));
   writeMemberList(ol);
   endFile(ol);
@@ -921,9 +1016,9 @@ void writeFileMemberIndex(OutputList &ol)
   ol.disable(OutputGenerator::Man);
   ol.disable(OutputGenerator::Latex);
   startFile(ol,"globals","File Member Index");
-  startTitle(ol);
+  startTitle(ol,0);
   parseText(ol,Config::projectName+" "+theTranslator->trFileMembers());
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag));
   writeFileMemberList(ol);
   endFile(ol);
@@ -939,9 +1034,9 @@ void writeNamespaceMemberIndex(OutputList &ol)
   ol.disable(OutputGenerator::Man);
   ol.disable(OutputGenerator::Latex);
   startFile(ol,"namespacemembers","Namespace Member Index");
-  startTitle(ol);
+  startTitle(ol,0);
   parseText(ol,Config::projectName+" "+theTranslator->trNamespaceMembers());
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   parseText(ol,theTranslator->trNamespaceMemberDescription(Config::extractAllFlag));
   writeNamespaceMemberList(ol);
   endFile(ol);
@@ -1007,10 +1102,10 @@ void writeHeaderIndex(OutputList &ol)
   ol.disable(OutputGenerator::Man);
   ol.disable(OutputGenerator::Latex);
   startFile(ol,"headers","Header File Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trHeaderFiles();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   if (Config::generateHtml && Config::htmlHelpFlag)
   {
@@ -1036,10 +1131,10 @@ void writeExampleIndex(OutputList &ol)
   if (exampleList.count()==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"examples","Example Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trExamples();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
   if (hasHtmlHelp)
@@ -1084,10 +1179,10 @@ void writePageIndex(OutputList &ol)
   if (pageList.count()==0) return;
   ol.disable(OutputGenerator::Man);
   startFile(ol,"pages","Page Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trRelatedPages();
   ol.docify(title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
   if (hasHtmlHelp)
@@ -1173,10 +1268,10 @@ void writeGroupIndex(OutputList &ol)
   if (documentedGroups==0) return; 
   ol.disable(OutputGenerator::Man);
   startFile(ol,"modules","Module Index");
-  startTitle(ol);
+  startTitle(ol,0);
   QCString title = Config::projectName+" "+theTranslator->trModules();
   parseText(ol,title);
-  endTitle(ol,0);
+  endTitle(ol,0,0);
   HtmlHelp *htmlHelp = 0;
   bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
   if (hasHtmlHelp)
@@ -1212,9 +1307,16 @@ void writeIndex(OutputList &ol)
   ol.disable(OutputGenerator::Latex);
   ol.startFile("index","Main Index",FALSE);
   if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE);
-  ol.startTitleHead();
-  parseText(ol,projPrefix+theTranslator->trDocumentation());
-  ol.endTitleHead(0);
+  ol.startTitleHead(0);
+  if (mainPage && !mainPage->title.isEmpty())
+  {
+    parseDoc(ol,0,0,mainPage->title);
+  }
+  else
+  {
+    parseText(ol,projPrefix+theTranslator->trDocumentation());
+  }
+  ol.endTitleHead(0,0);
   ol.newParagraph();
   if (!Config::projectNumber.isEmpty())
   {
@@ -1223,6 +1325,12 @@ void writeIndex(OutputList &ol)
     ol.endProjectNumber();
   }
   if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
+
+  if (mainPage)
+  {
+    parseDoc(ol,0,0,mainPage->doc);
+  }
+  
   endFile(ol);
   ol.disable(OutputGenerator::Html);
   
@@ -1241,6 +1349,19 @@ void writeIndex(OutputList &ol)
   ol.startIndexSection(isTitlePageAuthor);
   parseText(ol,theTranslator->trGeneratedBy());
   ol.endIndexSection(isTitlePageAuthor);
+  if (mainPage)
+  {
+    ol.startIndexSection(isMainPage);
+    if (!mainPage->title.isEmpty())
+    {
+      parseDoc(ol,0,0,mainPage->title);
+    }
+    else
+    {
+      parseText(ol,projPrefix+theTranslator->trMainPage());
+    }
+    ol.endIndexSection(isMainPage);
+  }
   if (documentedGroups>0)
   {
     ol.startIndexSection(isModuleIndex);
diff --git a/src/index.h b/src/index.h
index ad17339..a3b3816 100644
--- a/src/index.h
+++ b/src/index.h
@@ -25,6 +25,7 @@ enum IndexSections
 {
   isTitlePageStart,
   isTitlePageAuthor,
+  isMainPage,
   isModuleIndex,
   isNamespaceIndex,
   isClassHierarchyIndex,
diff --git a/src/language.cpp b/src/language.cpp
index cee63a8..a04b18e 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -15,6 +15,7 @@
  */
 
 #include "language.h"
+#if !defined(ENGLISH_ONLY)
 #include "translator_nl.h"
 #include "translator_se.h"
 #include "translator_cz.h"
@@ -23,6 +24,7 @@
 #include "translator_de.h"
 #include "translator_jp.h"
 #include "translator_es.h"
+#endif
 
 #define L_EQUAL(a) !stricmp(langName,a)
 
@@ -34,6 +36,7 @@ bool setTranslator(const char *langName)
   {
     theTranslator=new Translator;
   }
+#if !defined(ENGLISH_ONLY)
   else if (L_EQUAL("dutch"))
   {
     theTranslator=new TranslatorDutch;
@@ -66,6 +69,7 @@ bool setTranslator(const char *langName)
   {
     theTranslator=new TranslatorSpanish;
   }
+#endif
   else // use the default language (i.e. english)
   {
     theTranslator=new Translator;
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 3834871..9ac5cac 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -26,6 +26,25 @@
 #include "diagram.h"
 #include "language.h"
 
+static QCString filterTitle(const char *s)
+{
+  QCString tmp=s,result;
+  uint i;for (i=0;i<tmp.length();i++)
+  {
+    char c=tmp.at(i);
+    switch(c)
+    {
+      case '#': result+="\\#";  break;
+      case '"': result+="\\\""; break;
+      case '%': result+="\\%";  break;
+      case '[': result+="{";    break;
+      case ']': result+="}";    break;
+      default:  result+=c;      break;
+    }
+  }
+  return result;  
+}
+
 //static QCString escapeLabelName(const QCString &s)
 //{
 //  QCString result;
@@ -49,6 +68,7 @@ LatexGenerator::LatexGenerator()
 {
   dir=Config::latexOutputDir;
   col=0;
+  //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
   insideTabbing=FALSE;
 }
 
@@ -66,8 +86,17 @@ void LatexGenerator::append(const OutputGenerator *g)
 {
   t << g->getContents();
   col+=((LatexGenerator *)g)->col;
+  insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
+  //printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
+  //    insideTabbing ? "TRUE" : "FALSE" );
 }
 
+OutputGenerator *LatexGenerator::copy()
+{
+  LatexGenerator *result = new LatexGenerator;
+  result->insideTabbing=insideTabbing;
+  return result;
+}
 
 void LatexGenerator::init()
 {
@@ -91,6 +120,9 @@ void LatexGenerator::init()
     << endl
     << "ps: refman.ps" << endl
     << endl
+    << "pdf: ps" << endl
+    << "\tps2pdf refman.ps refman.pdf" << endl
+    << endl
     << "refman.ps: refman.dvi" << endl
     << "\tdvips -o refman.ps refman.dvi" << endl
     << endl
@@ -102,7 +134,7 @@ void LatexGenerator::init()
     << "\techo \"Rerunning latex....\"" << endl
     << "\tlatex refman.tex" << endl
     << "clean:" << endl
-    << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log" << endl;
+    << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl;
 }
 
 void LatexGenerator::startFile(const char *name,const char *,bool)
@@ -134,42 +166,67 @@ void LatexGenerator::startIndexSection(IndexSections is)
   {
     case isTitlePageStart:
       {
-        if (Config::paperType=="a4wide") paperName="a4"; else paperName=Config::paperType;
-        t << "\\documentclass[" << paperName << "paper]{";
-        if (Config::compactLatexFlag) t << "article"; else t << "book";
-        t << "}\n";
-        if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n";
-        t << "\\usepackage{makeidx}\n"
-          "\\usepackage{fancyheadings}\n"
-          "\\usepackage{epsf}\n"
-          "\\usepackage{float}\n"
-          "\\usepackage{doxygen}\n";
-        if (!theTranslator->latexBabelPackage().isEmpty())
+        if (Config::latexHeaderFile.isEmpty())
         {
-          t << "\\usepackage{" << theTranslator->latexBabelPackage() << "}\n";
+          if (Config::paperType=="a4wide") paperName="a4"; else paperName=Config::paperType;
+          t << "\\documentclass[" << paperName << "paper";
+          if (Config::pdfHyperFlag) t << ",ps2pdf";
+          t << "]{";
+          if (Config::compactLatexFlag) t << "article"; else t << "book";
+          t << "}\n";
+          if (Config::paperType=="a4wide") t << "\\usepackage{a4wide}\n";
+          t << "\\usepackage{makeidx}\n"
+            "\\usepackage{fancyheadings}\n"
+            "\\usepackage{epsfig}\n"
+            "\\usepackage{float}\n"
+            "\\usepackage{doxygen}\n";
+          if (Config::pdfHyperFlag) 
+          {
+            t << "\\usepackage{times}" << endl
+              << "\\usepackage[backref=true," << endl
+              << "            pagebackref=true," << endl
+              << "            colorlinks=true," << endl
+              << "            linkcolor=blue" << endl
+              << "           ]{hyperref}" << endl;
+          }
+          if (!theTranslator->latexBabelPackage().isEmpty())
+          {
+            t << "\\usepackage{" << theTranslator->latexBabelPackage() << "}\n";
+          }
+          const char *s=Config::extraPackageList.first();
+          while (s)
+          {
+            t << "\\usepackage{" << s << "}\n";
+            s=Config::extraPackageList.next();
+          }
+          t << "\\makeindex\n"
+            "\\setcounter{tocdepth}{1}\n"
+            "\\setlength{\\footrulewidth}{0.4pt}\n"
+            "\\begin{document}\n"
+            "\\title{";
+          //docify(projectName);
+          //t << " Reference Manual";
+          //if (!projectNumber.isEmpty()) 
+          //{
+          //  t << "\\\\[1ex]\\large "; 
+          //  docify(projectNumber);
+          //}
         }
-        const char *s=Config::extraPackageList.first();
-        while (s)
+        else
         {
-          t << "\\usepackage{" << s << "}\n";
-          s=Config::extraPackageList.next();
+          t << fileToString(Config::latexHeaderFile);
         }
-        t << "\\makeindex\n"
-          "\\setcounter{tocdepth}{1}\n"
-          "\\setlength{\\footrulewidth}{0.4pt}\n"
-          "\\begin{document}\n"
-          "\\title{";
-        //docify(projectName);
-        //t << " Reference Manual";
-        //if (!projectNumber.isEmpty()) 
-        //{
-        //  t << "\\\\[1ex]\\large "; 
-        //  docify(projectNumber);
-        //}
       }
       break;
     case isTitlePageAuthor:
-      t << "}\n\\author{";
+      if (Config::latexHeaderFile.isEmpty())
+      {
+        t << "}\n\\author{";
+      }
+      break;
+    case isMainPage:
+      if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
+      t << "{"; //Introduction}\n"
       break;
     case isModuleIndex:
       if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
@@ -288,14 +345,20 @@ void LatexGenerator::endIndexSection(IndexSections is)
     case isTitlePageStart:
       break;
     case isTitlePageAuthor:
-      t << " Doxygen}\n"
-        "\\date{" << dateToString(TRUE) << "}\n"
-        "\\maketitle\n"
-        "\\pagenumbering{roman}\n";
-      if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
-      t << "\\tableofcontents\n";
-      if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
-      t << "\\pagenumbering{arabic}\n";
+      if (Config::latexHeaderFile.isEmpty())
+      {
+        t << " Doxygen}\n"
+          "\\date{" << dateToString(TRUE) << "}\n"
+          "\\maketitle\n"
+          "\\pagenumbering{roman}\n";
+        if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
+        t << "\\tableofcontents\n";
+        if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n";
+        t << "\\pagenumbering{arabic}\n";
+      }
+      break;
+    case isMainPage:
+      t << "}\n\\input{index}\n";
       break;
     case isModuleIndex:
       t << "}\n\\input{modules}\n";
@@ -495,14 +558,14 @@ void LatexGenerator::writeStyleInfo(int part)
       break;
     case 2:
       {
-        t << " Dimitri van Heesch \\copyright 1997-1999}]{}\n";
+        t << " Dimitri van Heesch (c) 1997-1999}]{}\n";
         //QCString dtString=dateToString(FALSE);
         t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
       }
       break;
     case 4:
       {
-        t << " Dimitri van Heesch \\copyright 1997-1999}}\n";
+        t << " Dimitri van Heesch (c) 1997-1999}}\n";
         t << "\\cfoot{}\n";
         t << "\\newenvironment{CompactList}\n";
         t << "{\\begin{list}{}{\n";
@@ -553,19 +616,6 @@ void LatexGenerator::writeStyleInfo(int part)
   }
 }
 
-void LatexGenerator::endTitleHead(const char *name)
-{
-  t << "}" << endl;
-  if (name)
-  {
-    t << "\\label{" << name << "}\\index{" 
-      << name << "@{";
-    docify(name);
-    t << "}}";
-  }
-  t << endl;
-}
-
 void LatexGenerator::newParagraph()
 {
   t << endl << endl;
@@ -584,7 +634,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
   {
     t << "\\contentsline{section}{";
     docify(name);
-    t << "}{\\pageref{" << name << "}}" << endl;
+    t << "}{\\pageref{" << name << "}}{}" << endl;
   }
   else
     docify(name);
@@ -620,7 +670,7 @@ void LatexGenerator::writeStartAnnoItem(const char *,const char *,
 
 void LatexGenerator::writeEndAnnoItem(const char *name)
 {
-  t << "}{\\pageref{" << name << "}}" << endl;
+  t << "}{\\pageref{" << name << "}}{}" << endl;
 }
 
 //void LatexGenerator::writeClassLink(const char *,const char *,
@@ -631,17 +681,34 @@ void LatexGenerator::writeEndAnnoItem(const char *name)
 //  t << "}"; 
 //}
 
-void LatexGenerator::writeObjectLink(const char *, const char *,
-                                     const char *, const char *text)
+void LatexGenerator::writeObjectLink(const char *ref, const char *f,
+                                     const char *anchor, const char *text)
 {
-  t << "{\\bf ";
-  docify(text);
-  t << "}"; 
+  if (!ref && Config::pdfHyperFlag)
+  {
+    t << "\\hyperlink{";
+    if (f) t << f;
+    if (anchor) t << "_" << anchor; 
+    t << "}{";
+    docify(text);
+    t << "}";
+  }
+  else
+  {
+    t << "{\\bf ";
+    docify(text);
+    t << "}";
+  } 
+}
+
+void LatexGenerator::startPageRef()
+{
+  t << " {\\rm (";
 }
 
-void LatexGenerator::writePageRef(const char *clname, const char *anchor)
+void LatexGenerator::endPageRef(const char *clname, const char *anchor)
 {
-  t << " {\\rm (p.~\\pageref{";
+  t << "~\\pageref{";
   if (clname) t << clname; 
   if (anchor) t << "_" << anchor;
   t << "})}";
@@ -654,6 +721,30 @@ void LatexGenerator::writeCodeLink(const char *,const char *,
   col+=strlen(name);
 }
 
+void LatexGenerator::startTitleHead(const char *fileName)
+{
+  if (Config::pdfHyperFlag && fileName)
+  {
+    t << "\\hypertarget{" << fileName << "}{" << endl;
+  }
+  if (Config::compactLatexFlag) t << "\\subsection{"; else t << "\\section{"; 
+}
+
+void LatexGenerator::endTitleHead(const char *fileName,const char *name)
+{
+  t << "}" << endl;
+  if (name)
+  {
+    t << "\\label{" << name << "}\\index{" 
+      << name << "@{";
+    docify(name);
+    t << "}}" << endl;
+    if (Config::pdfHyperFlag && fileName)
+    {
+      t << "}" << endl;
+    }
+  }
+}
 
 void LatexGenerator::startTitle()
 {
@@ -671,7 +762,9 @@ void LatexGenerator::endGroupHeader()
 }
 
 void LatexGenerator::startMemberDoc(const char *clname,
-                                    const char *memname,const char *)
+                                    const char *memname,
+                                    const char *,
+                                    const char *title)
 { 
   t << "\\index{";
   if (clname)
@@ -695,23 +788,41 @@ void LatexGenerator::startMemberDoc(const char *clname,
   }
   t << "}" << endl;
   //
-  if (Config::compactLatexFlag) t << "\\subsubsection{"; else t << "\\subsection{";
-  t << "\\setlength{\\rightskip}{0pt plus 5cm}";
+  if (Config::compactLatexFlag) t << "\\subsubsection"; else t << "\\subsection";
+  if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]";
+  t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
 }
 
-void LatexGenerator::writeDoxyAnchor(const char *clname,const char *anchor,const char *)
+void LatexGenerator::startDoxyAnchor(const char *fName,const char *clname,
+                                     const char *anchor,const char *)
 {
   t << "\\label{";
   if (clname) t << clname;
   if (anchor) t << "_" << anchor;
   t << "}" << endl;
+  if (Config::pdfHyperFlag)
+  {
+    t << "\\hypertarget{";
+    if (fName) t << fName;
+    if (anchor) t << "_" << anchor;
+    t << "}{" << endl;
+  }
 }
 
-void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
+void LatexGenerator::endDoxyAnchor()
 {
-  writeDoxyAnchor(clName,anchor,0);
+  if (Config::pdfHyperFlag)
+  {
+    t << "}" << endl;
+  }
 }
 
+
+//void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
+//{
+//  writeDoxyAnchor(0,clName,anchor,0);
+//}
+
 void LatexGenerator::addToIndex(const char *s1,const char *s2)
 {
   if (s1)
@@ -748,7 +859,7 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab,
 {
   t << "\\contentsline{section}{";
   docify(title);
-  t << "}{\\ref{" << lab << "}}" << endl;
+  t << "}{\\ref{" << lab << "}}{}" << endl;
 }
 
 void LatexGenerator::writeSectionRefAnchor(const char *,const char *lab,
@@ -793,8 +904,16 @@ void LatexGenerator::docify(const char *str)
         case '>':  t << "$>$";           break;
         case '|':  t << "$|$";           break;
         case '~':  t << "$\\sim$";       break;
+        case '[':  if (Config::pdfHyperFlag) 
+                     t << "\\mbox{[}"; 
+                   else 
+                     t << "[";
+                   break;
         case ']':  if (pc=='[') t << "$\\,$";
-                   t << "]";             
+                   if (Config::pdfHyperFlag)
+                     t << "\\mbox{]}";
+                   else
+                     t << "]";             
                    break;
         case '-':  if (*p=='>') 
                      { t << " $\\rightarrow$ "; p++; }
@@ -966,6 +1085,7 @@ void LatexGenerator::startMemberItem(bool,int annType)
       default: 
         t << "\\begin{tabbing}" << endl;
         t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl;
+        //printf("LatexGenerator::startMemberItem() insideTabbing=TRUE\n");
         insideTabbing=TRUE;
         break;
     }
@@ -974,9 +1094,10 @@ void LatexGenerator::startMemberItem(bool,int annType)
 
 void LatexGenerator::endMemberItem(bool,const char *,const char *,bool endItem) 
 {
-  if (endItem)
+  if (insideTabbing && endItem)
   {
     t << endl << "\\end{tabbing}";
+    //printf("LatexGenerator::endMemberItem() insideTabbing=FALSE\n");
     insideTabbing=FALSE;
   }
   if (insideTabbing)
@@ -1006,3 +1127,12 @@ void LatexGenerator::endMemberList()
     t << "\\end{CompactItemize}"   << endl; 
 }
 
+void LatexGenerator::writeImage(const char *name,const char *w,const char *h)
+{
+  t << "\\mbox{\\epsfig{file=" << name;
+  if (w)
+    t << "," << w; 
+  else if (h)
+    t << "," << h;
+  t << "}}" << endl;
+}
diff --git a/src/latexgen.h b/src/latexgen.h
index 06f8ea8..e736491 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -27,7 +27,7 @@ class LatexGenerator : public OutputGenerator
     LatexGenerator();
    ~LatexGenerator();
 
-    OutputGenerator *copy() { return new LatexGenerator; }
+    OutputGenerator *copy();
     //OutputGenerator *clone() { return new LatexGenerator(*this); }
     void append(const OutputGenerator *o);
     void enable() { active=TRUE; }
@@ -50,9 +50,9 @@ class LatexGenerator : public OutputGenerator
     void startProjectNumber();
     void endProjectNumber() {}
     void writeStyleInfo(int part);
-    void startTitleHead() { startTitle(); }
+    void startTitleHead(const char *);
     void startTitle();
-    void endTitleHead(const char *name);
+    void endTitleHead(const char *,const char *name);
     void endTitle()   { t << "}"; }
 
     void newParagraph();
@@ -63,8 +63,8 @@ class LatexGenerator : public OutputGenerator
     void endItemList()    { t << "\\end{CompactItemize}"   << endl; }
     void startEnumList()  { t << "\\begin{enumerate}"      << endl; }
     void endEnumList()    { t << "\\end{enumerate}"        << endl; }
-    void startAlfabeticalIndexList() {}
-    void endAlfabeticalIndexList() {} 
+    void startAlphabeticalIndexList() {}
+    void endAlphabeticalIndexList() {} 
     void writeIndexHeading(const char *) {}
     void writeIndexItem(const char *ref,const char *file,const char *name);
     void docify(const char *text);
@@ -96,7 +96,7 @@ class LatexGenerator : public OutputGenerator
     void memberGroupSeparator() {}
     void insertMemberAlign() {}
 
-    void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}"; }
+    void writeRuler() { t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}" << endl; }
     void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; }
     void startCodeFragment() { t << "\\small\\begin{verbatim}"; }
     void endCodeFragment()   { t << "\\end{verbatim}\\normalsize " << endl; }
@@ -111,12 +111,13 @@ class LatexGenerator : public OutputGenerator
     void startDescItem()    { t << "\\item["; }
     void endDescItem()      { t << "]" << endl; }
     void lineBreak() { t << "\\par\n"; }
-    void startMemberDoc(const char *,const char *,const char *);
+    void startMemberDoc(const char *,const char *,const char *,const char *);
     void endMemberDoc() { t << "}"; }
-    void writeDoxyAnchor(const char *,const char *,const char *);
+    void startDoxyAnchor(const char *,const char *,const char *,const char *);
+    void endDoxyAnchor();
     void writeChar(char c);
     void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
-    void writeLatexLabel(const char *scope,const char *anchor);
+    //void writeLatexLabel(const char *scope,const char *anchor);
     void writeStartAnnoItem(const char *type,const char *file, 
                             const char *path,const char *name);
     void writeEndAnnoItem(const char *name);
@@ -157,10 +158,10 @@ class LatexGenerator : public OutputGenerator
     void writeTilde(char c)  { t << "\\~{"  << c << "}"; }
     void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; }
     void endMemberDescription() { t << "\\item\\end{CompactList}"; }
-    void startDescList()     { t << "\\begin{Desc}\\item["; }
+    void startDescList()     { t << "\\begin{Desc}\n\\item["; }
     void endDescTitle()      { t << "]"; }
     void writeDescItem()     { t << "\\par" << endl; }
-    void endDescList()       { t << "\\end{Desc}"; }
+    void endDescList()       { t << "\\end{Desc}" << endl; }
     void writeSection(const char *,const char *,bool);
     void writeSectionRef(const char *,const char *,const char *);
     void writeSectionRefItem(const char *,const char *,const char *);
@@ -174,11 +175,13 @@ class LatexGenerator : public OutputGenerator
     void endClassDiagram(ClassDiagram &,const char *,const char *);
     void startColorFont(uchar,uchar,uchar) {}
     void endColorFont()   {}
-    void writePageRef(const char *,const char *);
+    void startPageRef();
+    void endPageRef(const char *,const char *);
     void startQuickIndexItem(const char *,const char *) {}
     void endQuickIndexItem() {}
     void writeFormula(const char *,const char *);
     void writeNonBreakableSpace();
+    void writeImage(const char *,const char *,const char *);
     
     //static void docifyStatic(QTextStream &t,const char *str);
     
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 963460b..ec2b8ce 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -92,11 +92,7 @@ void ManGenerator::endFile()
   endPlainFile();
 }
 
-void ManGenerator::writeDoxyAnchor(const char *, const char *,const char *)
-{
-}
-
-void ManGenerator::endTitleHead(const char *name)
+void ManGenerator::endTitleHead(const char *,const char *name)
 {
   t << ".TH " << name << " 3 \"" << dateToString(FALSE) << "\" \"";
   if (Config::projectName.isEmpty()) 
@@ -284,7 +280,7 @@ void ManGenerator::endCodeFragment()
   col=0;
 }
 
-void ManGenerator::startMemberDoc(const char *,const char *,const char *) 
+void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *) 
 { 
   if (!firstCol) t << endl;
   t << ".SS "; 
diff --git a/src/mangen.h b/src/mangen.h
index 0df3268..ad512e4 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -50,8 +50,8 @@ class ManGenerator : public OutputGenerator
     void startProjectNumber() {}
     void endProjectNumber() {}
     void writeStyleInfo(int) {}
-    void startTitleHead() {}
-    void endTitleHead(const char *);
+    void startTitleHead(const char *) {}
+    void endTitleHead(const char *,const char *);
     void startTitle();
     void endTitle() {}
     
@@ -63,8 +63,8 @@ class ManGenerator : public OutputGenerator
     void endItemList()    {}
     void startEnumList()  {}
     void endEnumList()    {}
-    void startAlfabeticalIndexList() {}
-    void endAlfabeticalIndexList() {} 
+    void startAlphabeticalIndexList() {}
+    void endAlphabeticalIndexList() {} 
     void writeIndexHeading(const char *) {}
     void writeIndexItem(const char *ref,const char *file,const char *name);
     void docify(const char *text);
@@ -110,11 +110,13 @@ class ManGenerator : public OutputGenerator
     void endDescItem();
     void lineBreak() { t << "\n.br" << endl; }
     void writeChar(char c);
-    void startMemberDoc(const char *,const char *,const char *);
+    void startMemberDoc(const char *,const char *,const char *,const char *);
     void endMemberDoc() {}
-    void writeDoxyAnchor(const char *clName,const char *anchor,const char *name);
+    void startDoxyAnchor(const char *,const char *,
+                         const char *,const char *) {}
+    void endDoxyAnchor() {}
     void writeLatexSpacing() {}
-    void writeLatexLabel(const char *,const char *) {}
+    //void writeLatexLabel(const char *,const char *) {}
     void writeStartAnnoItem(const char *type,const char *file,
                             const char *path,const char *name);
     void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
@@ -162,11 +164,13 @@ class ManGenerator : public OutputGenerator
     void endClassDiagram(ClassDiagram &,const char *,const char *) {}
     void startColorFont(uchar,uchar,uchar) {}
     void endColorFont()   {}
-    void writePageRef(const char *,const char *) {}
+    void startPageRef() {}
+    void endPageRef(const char *,const char *) {}
     void startQuickIndexItem(const char *,const char *) {}
     void endQuickIndexItem() {}
     void writeFormula(const char *,const char *) {}
     void writeNonBreakableSpace() { t << "  "; }
+    void writeImage(const char *,const char *,const char *) {}
     
   private:
     bool firstCol;
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 34061f0..ec70870 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -235,8 +235,10 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
   eUsed=FALSE;
   proto=FALSE;
   annScope=FALSE;
+  inLine=FALSE;
   annMemb=0;
   annUsed=FALSE;
+  annShown=FALSE;
   indDepth=0;
   docEnumValues=FALSE;
   // copy function template arguments (if any)
@@ -500,27 +502,47 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
     
     // search for the last annonymous scope in the member type
     ClassDef *annoClassDef=0;
-    while (i!=-1 && cname.find(type.mid(i,l))!=-1)
-    {
-      i=r.match(type,i+l,&l);
-    }
-    if (i!=-1) 
+    //while (i!=-1 && cname.find(type.mid(i,l))!=-1)
+    //{
+    //  i=r.match(type,i+l,&l);
+    //}
+    int il=i-1,ir=i+l;
+    if (i!=-1) // found annonymous scope in type
     {
-      // get the definition of the annonymous class that is 
-      // the type of this member
-      annoClassDef=getClass(cname+"::"+type.mid(i,l));
+      // extract annonymous scope
+      while (il>=0 && (isId(type.at(il)) || type.at(il)==':' || type.at(il)=='@')) il--;
+      if (il>0) il++;
+      while (ir<(int)type.length() && (isId(type.at(ir)) || type.at(ir)==':' || type.at(ir)=='@')) ir++;
+
+      //QCString annName = type.mid(i,l);
+      QCString annName = type.mid(il,ir-il);
+      
+      // if inside a class or namespace try to prepend the scope name
+      if ((cd || nd) && annName.left(cname.length())!=cname) 
+      {
+        QCString ts=stripAnnonymousNamespaceScope(cname+"::"+annName);
+        //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+        annoClassDef=getClass(ts);
+      }
+      // if not found yet, try without scope name
+      if (annoClassDef==0)
+      {
+        QCString ts=stripAnnonymousNamespaceScope(annName);
+        //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+        annoClassDef=getClass(ts);
+      }
     }
 
     // start a new member declaration
-    ol.startMemberItem(gId!=-1,((i!=-1) || annMemb) ? 1 : 0);
-
+    ol.startMemberItem(gId!=-1,(annoClassDef || annMemb) ? 1 : 0);
+    
     // If there is no detailed description we need to write the anchor here.
     bool detailsVisible = detailsAreVisible();
     if (!detailsVisible && !Config::extractAllFlag && !annMemb)
     {
       QCString doxyName=name().copy();
       if (!cname.isEmpty()) doxyName.prepend(cname+"::");
-      ol.writeDoxyAnchor(cname,anchor(),doxyName);
+      ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
       ol.addToIndex(name(),cname);
       ol.addToIndex(cname,name());
       if (hasHtmlHelp)
@@ -538,12 +560,8 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
     //  ol.writeLatexLabel(cname,anchor());
     //}
 
-    if (tArgList)
-    {
-      writeTemplatePrefix(ol,tArgList,FALSE);
-    }
-    
-    if (i!=-1 || annMemb)
+    //printf("member name=%s indDepth=%d\n",name().data(),indDepth);
+    if (annoClassDef || annMemb)
     {
       int j;
       for (j=0;j<indDepth;j++) 
@@ -552,6 +570,11 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
       }
     }
     
+    if (tArgList)
+    {
+      writeTemplatePrefix(ol,tArgList,FALSE);
+    }
+    
     if (i!=-1)
     {
       //printf("scopeName=`%s' annonymous=`%s'\n",
@@ -560,15 +583,23 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
       if (annoClassDef)
       {
         //printf("class found!\n");
-        annoClassDef->writeDeclaration(ol);
+        annoClassDef->writeDeclaration(ol,annMemb);
         ol.startMemberItem(gId!=-1,2);
         int j;
         for (j=0;j<indDepth;j++) 
         {
           ol.writeNonBreakableSpace();
         }
+        QCString varName=type.right(type.length()-ir).stripWhiteSpace();
         ol.docify("}");
-        ol.docify(type.right(type.length()-i-l).stripWhiteSpace());
+        if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) 
+        {
+          ol.docify(";"); 
+        }
+        else 
+        {
+          ol.docify(varName);
+        }
       }
       else
       {
@@ -605,35 +636,43 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
       ol.insertMemberAlign();
     
     // write name
-    if (grpId!=-1)
+    if (!name().isEmpty() && name().at(0)!='@')
     {
-      if (annMemb)
+      if (grpId!=-1)
       {
-        //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
-        annMemb->writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
-        annMemb->annUsed=annUsed=TRUE;
+        if (annMemb)
+        {
+          //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
+          annMemb->writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
+          annMemb->annUsed=annUsed=TRUE;
+        }
+        else
+          writeLink(ol,0,0,0,memberGroup);
+        //ol.writeBoldString(name()); 
       }
-      else
-        writeLink(ol,0,0,0,memberGroup);
-      //ol.writeBoldString(name()); 
-    }
-    else if (isLinkable())
-    {
-      if (annMemb)
+      else if (isLinkable())
       {
-        //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
-        annMemb->writeLink(ol,annMemb->memberClass(),nd,fd,inGroup ? memberGroup : 0);
-        annMemb->annUsed=annUsed=TRUE;
+        if (annMemb)
+        {
+          //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
+          annMemb->writeLink(ol,
+              annMemb->memberClass(),
+              annMemb->getNamespace(),
+              annMemb->getFileDef(),
+              inGroup ? memberGroup : 0
+                            );
+          annMemb->annUsed=annUsed=TRUE;
+        }
+        else
+          //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
+          writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
+      }
+      else // there is a brief member description and brief member 
+        // descriptions are enabled or there is no detailed description.
+      {
+        if (annMemb) annMemb->annUsed=annUsed=TRUE;
+        ol.writeBoldString(name());
       }
-      else
-        //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
-        writeLink(ol,cd,nd,fd,inGroup ? memberGroup : 0);
-    }
-    else // there is a brief member description and brief member 
-         // descriptions are enabled or there is no detailed description.
-    {
-      if (annMemb) annMemb->annUsed=annUsed=TRUE;
-      ol.writeBoldString(name());
     }
 
     // if member template specifiers are not part of the name, but they are
@@ -657,8 +696,14 @@ void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,Fi
       ol.docify(excpString());
     }
 
-    ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef!=0 && indDepth==0);
+    if (!detailsVisible && !Config::extractAllFlag && !annMemb)
+    {
+      ol.endDoxyAnchor();
+    }
 
+    ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef!=0 && indDepth==0);
+    
+    //ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
     // write brief description
     if (!briefDescription().isEmpty() && Config::briefMemDescFlag && 
         gId==-1 && !inGroup && !annMemb)
@@ -743,27 +788,28 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
       {
         if (vmd->isEnumerate() && def.mid(i,l)==vmd->name())
         {
-          ol.startMemberDoc(cname,name(),anchor());
+          ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
+          ol.startMemberDoc(cname,name(),anchor(),name());
           if (hasHtmlHelp)
           {
             htmlHelp->addIndexItem(cname,name(),cfname,anchor());
           }
-          ol.writeDoxyAnchor(cname,anchor(),doxyName);
           linkifyText(ol,scopeName,name(),def.left(i));
           ol+=*vmd->enumDecl();
           linkifyText(ol,scopeName,name(),def.right(def.length()-i-l));
+          //ol.endDoxyAnchor();
           found=TRUE;
         }
       }
       if (!found) // anonymous compound
       {
         //printf("Annonymous compound `%s'\n",cname.data());
-        ol.startMemberDoc(cname,name(),anchor());
+        ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
+        ol.startMemberDoc(cname,name(),anchor(),name());
         if (hasHtmlHelp)
         {
           htmlHelp->addIndexItem(cname,name(),cfname,anchor());
         }
-        ol.writeDoxyAnchor(cname,anchor(),doxyName);
         // strip annonymous compound names from definition
         int si=def.find(' '),pi,ei=i+l;
         if (si==-1) si=0;
@@ -772,17 +818,19 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
         ol.docify(def.left(si));
         ol.docify(" { ... } ");
         // last ei characters of def contain pointer/reference specifiers
+        int ni=def.findRev("::");
+        if (ni>=ei) ei=ni+2;
         linkifyText(ol,scopeName,name(),def.right(def.length()-ei));
       }
     }
     else
     {
-      ol.startMemberDoc(cname,name(),anchor());
+      ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
+      ol.startMemberDoc(cname,name(),anchor(),name());
       if (hasHtmlHelp)
       {
         htmlHelp->addIndexItem(cname,name(),cfname,anchor());
       }
-      ol.writeDoxyAnchor(cname,anchor(),doxyName);
 
       ArgumentList *scopeAl=scopeDefTemplateArguments();
       if (scopeAl==0 && cd) scopeAl=cd->templateArguments(); 
@@ -840,7 +888,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
 
     if (isStatic() || protection()!=Public || 
         virt!=Normal || isSignal() || isFriend() || 
-        isRelated() || isSlot()
+        isRelated() || isSlot() || 
+        (isInline() && Config::inlineInfoFlag)
        )
     {
       // write the member specifier list
@@ -852,6 +901,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
       else if (isRelated()) sl.append("related");
       else
       {
+        if      (Config::inlineInfoFlag && isInline())              
+                                          sl.append("inline");
         if      (isStatic())              sl.append("static");
         if      (protection()==Protected) sl.append("protected");
         else if (protection()==Private)   sl.append("private");
@@ -871,6 +922,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
       ol.endTypewriter();
     }
     ol.endMemberDoc();
+    ol.endDoxyAnchor();
     ol.startIndent();
     ol.newParagraph();
 
@@ -915,7 +967,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
               ol.endBold();
               ol.startItemList();
             }
-            ol.writeDoxyAnchor(cname,fmd->anchor(),fmd->name());
             ol.addToIndex(fmd->name(),cname);
             ol.addToIndex(cname,fmd->name());
             if (Config::generateHtml && Config::htmlHelpFlag)
@@ -923,10 +974,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
               HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor());
             }
             ol.writeListItem();
+            ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name());
             first=FALSE;
             ol.startBold();
             ol.docify(fmd->name());
             ol.endBold();
+            ol.endDoxyAnchor();
             ol.newParagraph();
 
             if (!fmd->briefDescription().isEmpty())
@@ -979,18 +1032,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
           {
             ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
                 bmd->anchor(),bcd->name());
-            if ( bcd->isLinkableInProject()) 
+            if ( bcd->isLinkableInProject() && !Config::pdfHyperFlag ) 
             {
-              ol.writePageRef(bcd->name(),bmd->anchor());
+              writePageRef(ol,bcd->name(),bmd->anchor());
             }
           }
           else
           {
             ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
                 0,bcd->name());
-            if (bcd->isLinkableInProject())
+            if (bcd->isLinkableInProject() && !Config::pdfHyperFlag )
             {
-              ol.writePageRef(bcd->name(),0);
+              writePageRef(ol,bcd->name(),0);
             }
           }
           parseText(ol,reimplFromLine.right(
@@ -1041,7 +1094,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
 
           count=0;
           // find the entryIndex-th documented entry in the inheritance list.
-          for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->memberClass());++mli)
+          for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->memberClass());--mli)
           {
             if ( bmd->isLinkable() && bcd->isLinkable()) 
             {
@@ -1058,9 +1111,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco
             //{
             ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
                 bmd->anchor(),bcd->name());
-            if (bcd->isLinkableInProject()) 
+            if (bcd->isLinkableInProject() && !Config::pdfHyperFlag ) 
             {
-              ol.writePageRef(bcd->name(),bmd->anchor());
+              writePageRef(ol,bcd->name(),bmd->anchor());
             }
             //}
             //else
diff --git a/src/memberdef.h b/src/memberdef.h
index 68d9ad8..8570f1f 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -84,12 +84,14 @@ class MemberDef : public Definition
     void setFileDec(FileDef *fd)         { fileDec=fd; }
     void setAnchor(const char *a)        { anc=a; }
     void setProtection(Protection p)     { prot=p; }
-    void setBody(const QCString &b)       { body=b; }
+    void setBody(const QCString &b)      { body=b; }
+    void setInline(bool in)              { inLine=in; }
     FileDef *getFileDef()                { return fileDef; }
     FileDef *getFileDec()                { return fileDec; }
     void setMemberClass(ClassDef *cd)    { classDef=cd; }
     bool isRelated() const               { return related; }
     bool isStatic() const                { return stat; }
+    bool isInline() const                { return inLine; }
     bool hasDocumentation()  // overrides hasDocumentation in definition.h
       { return Definition::hasDocumentation() || !body.isEmpty(); }
 
@@ -212,12 +214,14 @@ class MemberDef : public Definition
     Protection prot;          // protection type [Public/Protected/Private]
     bool    related;          // is this a member that is only related to a class
     bool    stat;             // is it a static function?
+    bool    inLine;           // is it an inline function?
     MemberType mtype;         // returns the kind of member
     bool eUsed;               // is the enumerate already placed in a list
     bool proto;               // is it a prototype;
     bool docEnumValues;       // is an enum with documented enum values.
     bool annScope;
     bool annUsed;
+    bool annShown;
     int  indDepth;
     MemberDef *annMemb;
     ArgumentList *argList;    // argument list of this member
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 883bfe2..2ed41fb 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -62,9 +62,9 @@ void MemberGroup::writeDocumentation(OutputList &ol)
   }
   ol.disable(OutputGenerator::Man);
   startFile(ol,fileName,title);
-  startTitle(ol);
+  startTitle(ol,getOutputFileBase());
   ol.docify(title);
-  endTitle(ol,name());
+  endTitle(ol,getOutputFileBase(),name());
   
 
   OutputList briefOutput(&ol);
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 4f6bad9..bdca206 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -256,11 +256,11 @@ void MemberList::writePlainDeclarations(OutputList &ol,ClassDef *cd,
             //     )
             //    )
             //   )
-            if (md->hasDocumentation() || md->hasDocumentedEnumValues())
+            if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
             {
               if (Config::genTagFile.length()>0)
                 tagFile << md->name() << " " << md->anchor() 
-                  << " \"" << md->argsString() << "\"";
+                  << " \"\"" << endl;
               md->writeLink(typeDecl,cd,nd,fd,0);
             }
             else
diff --git a/src/membername.h b/src/membername.h
index a9454f9..5d5d55b 100644
--- a/src/membername.h
+++ b/src/membername.h
@@ -86,6 +86,7 @@ class MemberNameInfoIterator : public QListIterator<MemberInfo>
 class MemberNameInfoList : public QList<MemberNameInfo>
 {
   public:
+   ~MemberNameInfoList() {}
     int compareItems(GCI item1,GCI item2) 
     { return stricmp(
                      ((MemberNameInfo *)item1)->memberName(),
@@ -98,6 +99,7 @@ class MemberNameInfoDict : public QDict<MemberNameInfo>
 {
   public:
     MemberNameInfoDict(int size) : QDict<MemberNameInfo>(size) {}
+   ~MemberNameInfoDict() {}
 };
 
 class MemberNameInfoListIterator : public QListIterator<MemberNameInfo>
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index d8388a0..19ed1c4 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -63,10 +63,10 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
 {
   QCString pageTitle=name()+" Namespace Reference";
   startFile(ol,fileName,pageTitle);
-  startTitle(ol);
+  startTitle(ol,getOutputFileBase());
   //ol.docify(pageTitle);
   parseText(ol,theTranslator->trNamespaceReference(name()));
-  endTitle(ol,name());
+  endTitle(ol,getOutputFileBase(),name());
   
   if (Config::genTagFile.length()>0) tagFile << "%" << name() << ":\n";
   
@@ -94,7 +94,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     bool found=FALSE;
     while (cd)
     {
-      if (cd->isLinkable())
+      if (cd->name().find('@')==-1)
       {
         if (!found)
         {
@@ -120,7 +120,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
         }
         ol.writeString(" ");
         ol.insertMemberAlign();
-        if (cd->hasDocumentation()) 
+        if (cd->isLinkable()) 
         {
           ol.writeObjectLink(cd->getReference(),
                              cd->getOutputFileBase(),
diff --git a/src/namespacedef.h b/src/namespacedef.h
index e68fa3f..b34c65b 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -76,6 +76,7 @@ class NamespaceDef : public Definition
 class NamespaceList : public QList<NamespaceDef>
 { 
   public:
+   ~NamespaceList() {}
     int compareItems(GCI item1,GCI item2)
     {
       return strcmp(((NamespaceDef *)item1)->name(),
@@ -95,6 +96,7 @@ class NamespaceDict : public QDict<NamespaceDef>
 {
   public:
     NamespaceDict(int size) : QDict<NamespaceDef>(size) {}
+   ~NamespaceDict() {}
 };
 
 #endif
diff --git a/src/outputgen.h b/src/outputgen.h
index 778705c..8ff6a92 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -53,8 +53,8 @@ class OutputGenerator
     virtual void startProjectNumber() = 0;
     virtual void endProjectNumber() = 0;
     virtual void writeStyleInfo(int part) = 0;
-    virtual void startTitleHead() = 0;
-    virtual void endTitleHead(const char *name) = 0;
+    virtual void startTitleHead(const char *) = 0;
+    virtual void endTitleHead(const char *fileName,const char *name) = 0;
     virtual void startTitle() = 0;
     virtual void endTitle()   = 0;
     virtual void newParagraph()   = 0;
@@ -67,8 +67,8 @@ class OutputGenerator
     virtual void endEnumList()    = 0;
     virtual void startBold()      = 0;
     virtual void endBold()        = 0;
-    virtual void startAlfabeticalIndexList() = 0;
-    virtual void endAlfabeticalIndexList() = 0;
+    virtual void startAlphabeticalIndexList() = 0;
+    virtual void endAlphabeticalIndexList() = 0;
     virtual void writeIndexHeading(const char *s) = 0;
     virtual void writeIndexItem(const char *ref,const char *file,
                                 const char *text) = 0;
@@ -109,11 +109,14 @@ class OutputGenerator
     virtual void startEmphasis() = 0;
     virtual void endEmphasis() = 0;
     virtual void writeChar(char c) = 0;
-    virtual void startMemberDoc(const char *,const char *,const char *) = 0;
+    virtual void startMemberDoc(const char *,const char *,
+                                const char *,const char *) = 0;
     virtual void endMemberDoc() = 0;
-    virtual void writeDoxyAnchor(const char *clName,const char *anchor,const char *name) = 0;
+    virtual void startDoxyAnchor(const char *fileName,const char *clName,
+                                 const char *anchor,const char *name) = 0;
+    virtual void endDoxyAnchor() = 0;
     virtual void writeLatexSpacing() = 0;
-    virtual void writeLatexLabel(const char *clName,const char *anchor) = 0;
+    //virtual void writeLatexLabel(const char *clName,const char *anchor) = 0;
     virtual void writeStartAnnoItem(const char *type,const char *file,
                                     const char *path,const char *name) = 0;
     virtual void writeEndAnnoItem(const char *name) = 0;
@@ -166,11 +169,13 @@ class OutputGenerator
     virtual void endClassDiagram(ClassDiagram &,const char *,const char *) = 0;
     virtual void startColorFont(uchar r,uchar g,uchar b) = 0;
     virtual void endColorFont() = 0;
-    virtual void writePageRef(const char *,const char *) = 0;
+    virtual void startPageRef() = 0;
+    virtual void endPageRef(const char *,const char *) = 0;
     virtual void startQuickIndexItem(const char *s,const char *l) = 0;
     virtual void endQuickIndexItem() = 0;
     virtual void writeFormula(const char *,const char *) = 0;
     virtual void writeNonBreakableSpace() = 0;
+    virtual void writeImage(const char *,const char *,const char *) = 0;
     
     void clear() { b.close(); a.resize(0); b.setBuffer(a); 
                    b.open(IO_WriteOnly); t.setDevice(&b); }
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index ae86c89..47354eb 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -226,12 +226,14 @@ void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4)
 FORALL1(const char *a1,a1)
 FORALL1(char a1,a1)
 FORALL1(int a1,a1)
+#if defined(HAS_BOOL_TYPE)
 FORALL1(bool a1,a1)
-FORALL1(IndexSections a1,a1)
-FORALL2(const char *a1,const char *a2,a1,a2)
-FORALL2(int a1,bool a2,a1,a2)
 FORALL2(bool a1,int a2,a1,a2)
 FORALL2(bool a1,bool a2,a1,a2)
+#endif
+FORALL2(int a1,bool a2,a1,a2)
+FORALL1(IndexSections a1,a1)
+FORALL2(const char *a1,const char *a2,a1,a2)
 FORALL3(ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3)
 FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3)
 FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3)
diff --git a/src/outputlist.h b/src/outputlist.h
index 79ee93f..8e57ed6 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -72,10 +72,10 @@ class OutputList
     { forall(&OutputGenerator::endFile); }
     void endPlainFile() 
     { forall(&OutputGenerator::endPlainFile); }
-    void startTitleHead() 
-    { forall(&OutputGenerator::startTitleHead); }
-    void endTitleHead(const char *name)
-    { forall(&OutputGenerator::endTitleHead,name); }
+    void startTitleHead(const char *fileName) 
+    { forall(&OutputGenerator::startTitleHead,fileName); }
+    void endTitleHead(const char *fileName,const char *name)
+    { forall(&OutputGenerator::endTitleHead,fileName,name); }
     void startTitle() 
     { forall(&OutputGenerator::startTitle); }
     void endTitle() 
@@ -96,10 +96,10 @@ class OutputList
     { forall(&OutputGenerator::startEnumList); }
     void endEnumList() 
     { forall(&OutputGenerator::endEnumList); }
-    void startAlfabeticalIndexList()
-    { forall(&OutputGenerator::startAlfabeticalIndexList); }
-    void endAlfabeticalIndexList()
-    { forall(&OutputGenerator::endAlfabeticalIndexList); }
+    void startAlphabeticalIndexList()
+    { forall(&OutputGenerator::startAlphabeticalIndexList); }
+    void endAlphabeticalIndexList()
+    { forall(&OutputGenerator::endAlphabeticalIndexList); }
     void writeIndexHeading(const char *s)
     { forall(&OutputGenerator::writeIndexHeading,s); }
     void writeIndexItem(const char *ref,const char *file,const char *text)
@@ -177,16 +177,20 @@ class OutputList
     { forall(&OutputGenerator::endEmphasis); }
     void writeChar(char c)
     { forall(&OutputGenerator::writeChar,c); }
-    void startMemberDoc(const char *clName,const char *memName,const char *anchor)
-    { forall(&OutputGenerator::startMemberDoc,clName,memName,anchor); }
+    void startMemberDoc(const char *clName,const char *memName,
+                        const char *anchor,const char *title)
+    { forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title); }
     void endMemberDoc() 
     { forall(&OutputGenerator::endMemberDoc); }
-    void writeDoxyAnchor(const char *clName,const char *anchor,const char *name)
-    { forall(&OutputGenerator::writeDoxyAnchor,clName,anchor,name); }
+    void startDoxyAnchor(const char *fn,    const char *cn,
+                         const char *anchor,const char *name)
+    { forall(&OutputGenerator::startDoxyAnchor,fn,cn,anchor,name); }
+    void endDoxyAnchor()
+    { forall(&OutputGenerator::endDoxyAnchor); }
     void writeLatexSpacing() 
     { forall(&OutputGenerator::writeLatexSpacing); }
-    void writeLatexLabel(const char *scope,const char *anchor) 
-    { forall(&OutputGenerator::writeLatexLabel,scope,anchor); }
+    //void writeLatexLabel(const char *scope,const char *anchor) 
+    //{ forall(&OutputGenerator::writeLatexLabel,scope,anchor); }
     void startDescription() 
     { forall(&OutputGenerator::startDescription); }
     void endDescription() 
@@ -289,8 +293,10 @@ class OutputList
     { forall(&OutputGenerator::startColorFont,r,g,b); }
     void endColorFont()
     { forall(&OutputGenerator::endColorFont); }
-    void writePageRef(const char *c,const char *a)
-    { forall(&OutputGenerator::writePageRef,c,a); }
+    void startPageRef()
+    { forall(&OutputGenerator::startPageRef); }
+    void endPageRef(const char *c,const char *a)
+    { forall(&OutputGenerator::endPageRef,c,a); }
     void startQuickIndexItem(const char *s,const char *l)
     { forall(&OutputGenerator::startQuickIndexItem,s,l); }
     void endQuickIndexItem()
@@ -299,6 +305,8 @@ class OutputList
     { forall(&OutputGenerator::writeFormula,n,t); }
     void writeNonBreakableSpace()
     { forall(&OutputGenerator::writeNonBreakableSpace); }
+    void writeImage(const char *n,const char *w,const char *h)
+    { forall(&OutputGenerator::writeImage,n,w,h); }
 
   private:
     void debug();
@@ -307,13 +315,15 @@ class OutputList
     void forall(void (OutputGenerator::*func)());
     FORALLPROTO1(const char *);
     FORALLPROTO1(char);
+    FORALLPROTO1(IndexSections);
     FORALLPROTO1(int);
+#if defined(HAS_BOOL_TYPE)
     FORALLPROTO1(bool);
-    FORALLPROTO1(IndexSections);
-    FORALLPROTO2(const char *,const char *);
-    FORALLPROTO2(int,bool);
     FORALLPROTO2(bool,int);
     FORALLPROTO2(bool,bool);
+#endif
+    FORALLPROTO2(int,bool);
+    FORALLPROTO2(const char *,const char *);
     FORALLPROTO3(const char *,const char *,bool);
     FORALLPROTO3(uchar,uchar,uchar);
     FORALLPROTO3(const char *,const char *,const char *);
diff --git a/src/pre.l b/src/pre.l
index 360e250..f8b6c18 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1155,7 +1155,7 @@ BN	[ \t\r\n]
                                           ifcount++; 
   					  //printf("#if... depth=%d\n",ifcount);
 					}
-<SkipCommand>"else"/[^a-z_A-Z0-9]	{
+<SkipCommand>"else"			{
 					  //printf("Else! ifcount=%d otherCaseDone=%d\n",ifcount,otherCaseDone());
   					  if (ifcount==0 && !otherCaseDone())
 					  {
@@ -1179,7 +1179,7 @@ BN	[ \t\r\n]
 					    }
 					  }
 					}
-<SkipCommand>"endif"/[^a-z_A-Z0-9]	{ 
+<SkipCommand>"endif"			{ 
   					  decrLevel();
   				          if (--ifcount<0)
   					  {
diff --git a/src/scanner.l b/src/scanner.l
index c3c4ade..602dcc8 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -115,6 +115,7 @@ static int              includeFileLength = 0;
 static bool             firstLine;
 static bool             isTypedef;
 static bool             inParamBlock;
+static bool             inRetValBlock;
 static bool             inExceptionBlock;
 static bool             inSeeBlock;
 static bool             inReturnBlock;
@@ -149,6 +150,7 @@ static QCString         *copyArgString;
 
 static ArgumentList     *currentArgumentList;
 static QCString         *currentTemplateSpec;
+static QCString         curImageName;
 
 //-----------------------------------------------------------------------------
 
@@ -186,6 +188,7 @@ static void initParser()
   firstLine = TRUE;
   isTypedef = FALSE;
   inParamBlock = FALSE;
+  inRetValBlock = FALSE;
   inExceptionBlock = FALSE;
   inSeeBlock = FALSE;
   inReturnBlock = FALSE;
@@ -534,7 +537,7 @@ static void newDocState();
 
 static bool inBlock()
 {
-  return inParamBlock || inSeeBlock || inReturnBlock || inAuthorBlock ||
+  return inParamBlock || inRetValBlock || inSeeBlock || inReturnBlock || inAuthorBlock ||
          inVersionBlock || inDateBlock || inWarningBlock || inBugBlock ||
 	 inParBlock || inExceptionBlock;
 }
@@ -542,7 +545,7 @@ static bool inBlock()
 static void endBlock()
 {
     outDoc->endDescList();
-    inParamBlock=inSeeBlock=inReturnBlock=inAuthorBlock=
+    inParamBlock=inRetValBlock=inSeeBlock=inReturnBlock=inAuthorBlock=
     inVersionBlock=inDateBlock=inBugBlock=inWarningBlock=
     inParBlock=inExceptionBlock=FALSE;
 }
@@ -692,6 +695,7 @@ VAR	  [vV][aA][rR]
 %x	ClassName
 %x	ClassVar
 %x	Bases
+%x	BasesProt
 %x	NextSemi
 %x	FindMembers
 %x	FindMemberName
@@ -803,6 +807,10 @@ VAR	  [vV][aA][rR]
 %x	DocRefArgStart
 %x      DocRefItem
 %x      DocRefItemName
+%x	DocImage
+%x	DocHtmlImageName
+%x	DocLatexImageName
+%x	DocLatexImageWidth
 %x	SectionLabel
 %x	SectionTitle
 %x	SkipTemplate
@@ -1031,7 +1039,7 @@ VAR	  [vV][aA][rR]
   					    outDoc->writeDescItem();
 					  }
 				        }
-<DocScan>("\\"|"@")"bug"{BN}+		{
+<DocScan>("\\"|"@")"bug"[s]?{BN}+		{
   				          endArgumentList();
   					  if (!inBugBlock)
 					  {
@@ -1107,7 +1115,7 @@ VAR	  [vV][aA][rR]
 					    outDoc->docify(", ");
 					  }
   					}
-<DocScan>("\\"|"@")"return"{BN}+	{
+<DocScan>("\\"|"@")("return"([s])?|"result"){BN}+	{
   				          endArgumentList();
   					  if (!inReturnBlock)
 					  {
@@ -1150,7 +1158,6 @@ VAR	  [vV][aA][rR]
 					    if (inBlock()) endBlock();
 					    inParamBlock=TRUE;
 					    outDoc->startDescList();
-					    //outDoc->writeBoldString("Parameters: ");
 					    outDoc->startBold();
 					    scanString(theTranslator->trParameters()+": ");
 					    outDoc->endBold();
@@ -1158,6 +1165,20 @@ VAR	  [vV][aA][rR]
 					  }
   				          BEGIN(DocParam); 
   					}
+<DocScan>("\\"|"@")"retval"{BN}+	{
+  				          endArgumentList();
+  					  if (!inRetValBlock)
+					  {
+					    if (inBlock()) endBlock();
+					    inRetValBlock=TRUE;
+					    outDoc->startDescList();
+					    outDoc->startBold();
+					    scanString(theTranslator->trReturnValues()+": ");
+					    outDoc->endBold();
+  					    outDoc->endDescTitle();
+					  }
+  				          BEGIN(DocParam); 
+  					}
 <DocScan>("\\"|"@")"exception"{BN}+	{
   					  endArgumentList();
 					  if (!inExceptionBlock)
@@ -1174,7 +1195,7 @@ VAR	  [vV][aA][rR]
 					  BEGIN(DocException);
   					}
 <DocScan>"\\capt".*
-<DocParam>{SCOPENAME}			{
+<DocParam>[a-z_A-Z0-9:]+		{
   					  outDoc->writeDescItem();
 					  outDoc->startEmphasis();
   					  outDoc->docify(yytext); 
@@ -1290,6 +1311,52 @@ VAR	  [vV][aA][rR]
 					  }
 					  BEGIN(DocScan);
   					}
+<DocScan>("\\"|"@")"image"{B}+		{
+  					  BEGIN(DocImage); 
+  					}
+<DocImage>[hH][tT][mM][lL]		{
+  					  BEGIN(DocHtmlImageName);
+  					}
+<DocImage>[lL][aA][tT][eE][xX]		{
+  					  BEGIN(DocLatexImageName);
+  					}
+<DocHtmlImageName>{FILE}|{URLMASK}      {
+  				          outDoc->disableAllBut(OutputGenerator::Html);
+					  outDoc->writeImage(yytext,0,0);
+					  outDoc->enableAll();
+					  BEGIN(DocScan);
+  					}
+<DocLatexImageName>{FILE}		{
+  					  curImageName = yytext;
+					  BEGIN(DocLatexImageWidth);
+  					}
+<DocLatexImageWidth>\n			{ // no width specified
+  				          outDoc->disableAllBut(OutputGenerator::Html);
+					  outDoc->writeImage(curImageName,0,0);
+					  outDoc->enableAll();
+					  BEGIN(DocScan);
+  					}
+<DocLatexImageWidth>"width"{B}*"="{B}*[0-9\.]+({B}*{ID})?	{
+  				          outDoc->disableAllBut(OutputGenerator::Latex);
+					  outDoc->writeImage(curImageName,yytext,0);
+					  outDoc->enableAll();
+					  BEGIN(DocScan);
+  					}
+<DocLatexImageWidth>"height"{B}*"="{B}*[0-9\.]+({B}*{ID})?	{
+  				          outDoc->disableAllBut(OutputGenerator::Latex);
+					  outDoc->writeImage(curImageName,0,yytext);
+					  outDoc->enableAll();
+					  BEGIN(DocScan);
+  					}
+<DocImage>[a-z_A-Z0-9\.\-]+		{
+					  warn("Warning: %s is an unsupported output format for \\image\n",yytext);
+  					}
+<DocImage,DocHtmlImageName,DocLatexImageName>\n {
+  					  warn("Warning: invalid \\image command found!\n");
+					  yyLineNr++;
+					  outDoc->enableAll();
+					  BEGIN(DocScan);
+  					}
 <DocScan>("\\"|"@")"code"/{BN}+	        { 
 					  outDoc->startCodeFragment();
   					  codeBlock.resize(0);
@@ -1697,9 +1764,6 @@ VAR	  [vV][aA][rR]
 					  current->argList->clear();
 					  lineCount() ;
 					}
-  /*
-<FindMembers>"inline"     		
-  */
 <FindMembers>{BN}+			{
   					  lineCount();
   					}
@@ -1715,7 +1779,9 @@ VAR	  [vV][aA][rR]
 					  current->virt = Virtual;
 					  lineCount();
 					}
-<FindMembers>{B}*"inline"{BN}+		{ lineCount(); }
+<FindMembers>{B}*"inline"{BN}+		{ current->inLine = TRUE;
+                                          lineCount(); 
+                                        }
 <FindMembers>{B}*"typename"{BN}+	{ lineCount(); }
 <FindMembers>{B}*"namespace"{BN}+	{ 
   					  isTypedef=FALSE;
@@ -2177,7 +2243,8 @@ VAR	  [vV][aA][rR]
 					  else
 					  {
 					    QCString &cn = current->name;
-					    QCString rn = stripAnnonymousScope(current_root->name);
+					    //QCString rn = stripAnnonymousScope(current_root->name);
+					    QCString rn = current_root->name.copy();
 					    //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
 					    if (!cn.isEmpty() && !rn.isEmpty() && 
 					      (current_root->section & Entry::SCOPE_MASK))
@@ -2202,8 +2269,10 @@ VAR	  [vV][aA][rR]
 					      //printf("adding `%s' `%s' `%s' brief=%s\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data());
 					      current_root->addSubEntry( current ) ;
 					      current = new Entry(*current);
-					      if (current->section == Entry::NAMESPACE_SEC)
-					      { // a namespace ends with a closing bracket
+					      if (current->section==Entry::NAMESPACE_SEC || 
+						  current->section==Entry::INTERFACE_SEC
+						 )
+					      { // namespaces and interfaces ends with a closing bracket without semicolon
 						current->reset();
 						current->protection = protection ;
 						current->sig = sig;
@@ -2254,7 +2323,33 @@ VAR	  [vV][aA][rR]
 					  msType = yytext; msType=msType.left(i);
 					}
 <MemberSpec>[,;]			{
-					  if (msName.length()>0)
+  					  if (msName.isEmpty() && !current->name.isEmpty())
+					   /* && (current->section & Entry::COMPOUND_MASK)) */
+					  { 
+					    // see if the compound does not have a name or is inside another
+					    // annonymous compound. If so we insert a 
+					    // special `annonymous' variable.
+					    Entry *p=current_root;
+					    while (p)
+					    {
+					      // only look for class scopes, not namespace scopes
+					      if (p->section & Entry::COMPOUND_MASK)
+					      {
+						//printf("Trying scope `%s'\n",p->name.data());
+						int i=p->name.findRev("::");
+						int pi = (i==-1) ? 0 : i+2;
+						if (p->name.at(pi)=='@')
+						{
+						  // annonymous compound inside -> insert dummy variable name
+						  //printf("Adding annonymous variable for scope %s\n",p->name.data());
+						  msName.sprintf("@%d",anonCount++); 
+						  break;
+						}
+					      }
+					      p=p->parent;
+					    }
+					  }
+					  if (!msName.isEmpty())
 					  {
   					    Entry *varEntry=new Entry;
 					    varEntry->protection = current->protection ;
@@ -2518,6 +2613,11 @@ VAR	  [vV][aA][rR]
 					  lineCount() ;
 					  BEGIN( ExcpRound ) ;
 					}
+<FuncQual>{BN}*"raises"{BN}*"("         {
+  					  current->exception = " raises(" ;
+					  lineCount() ;
+					  BEGIN( ExcpRound ) ;
+  					}
 <ExcpRound>"("				{ current->exception += *yytext ;
 					  ++bracketCount ;
 					}
@@ -2588,7 +2688,8 @@ VAR	  [vV][aA][rR]
 					  {
 					    //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
 					    QRegExp re("([^)]*)");
-					    if (!current->type.isNull() && current->type.find(re,0)!=-1)
+					    if (!current->type.isNull() && 
+						(current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
 					    {
 					      //printf("Scanner.l: found function variable!\n");
 					      current->section = Entry::VARIABLE_SEC;
@@ -2600,9 +2701,8 @@ VAR	  [vV][aA][rR]
 					      current->proto = TRUE;
 					    }
 					  }
-					  //printf("Adding entry `%s' groupId=%d groupHeader=`%s'\n",
-					  //    current->name.data(),current->mGrpId,current->mGrpId!=-1 ? 
-					  //        memberGroupDict[current->mGrpId]->header().data() : "");
+					  //printf("Adding entry `%s' inLine`%d'\n",
+					  //    current->name.data(),current->inLine);
 					  previous = current;
 					  current_root->addSubEntry(current);
 					  current = new Entry ;
@@ -2615,6 +2715,8 @@ VAR	  [vV][aA][rR]
 					  lastCurlyContext = FindMembers;
 					  if( *yytext == '{' )
 					  {
+					    if (current_root->section & Entry::COMPOUND_MASK)
+					      previous->inLine = TRUE;
 					    addToBody(yytext);
 					    BEGIN( SkipCurly ) ;
 					  }
@@ -2779,7 +2881,7 @@ VAR	  [vV][aA][rR]
 					    baseProt=Private;
                                           baseVirt=Normal;
 					  baseName.resize(0);
-					  BEGIN( Bases ) ;
+					  BEGIN( BasesProt ) ;
 					}
 <ClassVar>[;=*&]			{
     					  unput(*yytext);
@@ -2792,17 +2894,25 @@ VAR	  [vV][aA][rR]
 					    current->name.sprintf("@%d",anonCount++);
 					  BEGIN( Curly ) ;
 					}
-<Bases>"virtual"                        { baseVirt = Virtual; }
-<Bases>"public"                         { baseProt = Public; }
-<Bases>"protected"                      { baseProt = Protected; }
-<Bases>"private"                        { baseProt = Private; }
-<Bases>({ID}{BN}*"::"{BN}*)*{ID}	{ 
+<BasesProt>"virtual"                    { baseVirt = Virtual; }
+<BasesProt>"public"                     { baseProt = Public; }
+<BasesProt>"protected"                  { baseProt = Protected; }
+<BasesProt>"private"                    { baseProt = Private; }
+<BasesProt>{BN}				{}
+<BasesProt>.				{ unput(*yytext); BEGIN(Bases); }
+<Bases>("::")*{BN}*({ID}{BN}*"::"{BN}*)*{ID}	{ 
   					  //current->extends->append(
 					  //  new BaseInfo(yytext,baseProt,baseVirt)
 					  //) ;
-  					  baseName += yytext;
-					  current->args += ' ' ;
-					  current->args += yytext ;
+  					  if (*yytext != ':')
+  					    baseName += yytext;
+					  else
+					    baseName += (yytext+2);
+					  current->args += ' ';
+					  if (*yytext != ':')
+					    current->args += yytext;
+					  else
+					    current->args += (yytext+2);
 					}
 <ClassVar>"<"   	                { current->name += *yytext;
   					  sharpCount=1; 
@@ -2845,6 +2955,7 @@ VAR	  [vV][aA][rR]
 					  baseProt=Private;
 					  baseVirt=Normal;
 					  baseName.resize(0);
+					  BEGIN(BasesProt);
 					}
 <Bases>{B}*"{"{B}*			{ current->fileName = yyFileName ;
 					  current->startLine = yyLineNr ;
@@ -2940,6 +3051,10 @@ VAR	  [vV][aA][rR]
   					  lastBriefContext=Doc;
   					  BEGIN( ClassDocBrief ); 
 					}
+<JavaDoc>"\\brief"{B}+			{
+  					  lastBriefContext=tmpDocType;
+  					  BEGIN( ClassDocBrief ); 
+					}
 <JavaDoc>^(({B}*"*"+)?){BL}		{
 					  lineCount();
 					  if (!current->brief.stripWhiteSpace().isEmpty())
@@ -3061,6 +3176,12 @@ VAR	  [vV][aA][rR]
 					  current->startLine = yyLineNr;
 					  BEGIN( PageDocArg1 );
   					}
+<Doc,JavaDoc>{B}*("\\"|"@")"mainpage"{B}* {
+  					  current->section = Entry::MAINPAGEDOC_SEC;
+					  current->fileName = yyFileName;
+					  current->startLine = yyLineNr;
+					  BEGIN( PageDocArg2 );
+  					}
 <Doc,JavaDoc>{B}*("\\"|"@")"file"{B}*	{
   					  current->section = Entry::FILEDOC_SEC;
 					  current->fileName = yyFileName;
@@ -3150,8 +3271,6 @@ VAR	  [vV][aA][rR]
 					  newDocState();
   				        }
 <FileDocArg1>"\n"			{
-  					  //warn("Warning: missing argument after "
-					  //     "\\file at line %d of %s.\n",yyLineNr,yyFileName);
   					  current->name = yyFileName;
   					  yyLineNr++;
 					  newDocState();
@@ -3430,17 +3549,18 @@ VAR	  [vV][aA][rR]
   					  current->brief=current->brief.stripWhiteSpace();
 					  BEGIN( lastBriefContext ); 
   					}
+<ClassDocBrief>{BS}/("\\"|"@")"image"	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"author"	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"internal" { BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"version"	{ BEGIN( lastBriefContext ); }
-<ClassDocBrief>{BS}/"\\date"	        { BEGIN( lastBriefContext ); }
+<ClassDocBrief>{BS}/("\\"|"@")"date"	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"param"	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"exception" { BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"return"	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\sa"|"@see")	{ BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\"|"@")"bug"	{ BEGIN( lastBriefContext ); }
-<ClassDocBrief>{BS}/("\\"|"@")"warning"	        { BEGIN( lastBriefContext ); }
-<ClassDocBrief>{BS}/("\\"|"@")"par"{BN}+	{ BEGIN( lastBriefContext ); }
+<ClassDocBrief>{BS}/("\\"|"@")"warning"	 { BEGIN( lastBriefContext ); }
+<ClassDocBrief>{BS}/("\\"|"@")"par"{BN}+ { BEGIN( lastBriefContext ); }
 <ClassDocBrief>{BS}/("\\brief"|"@short"){BN}+ {
   					  lastBriefContext=YY_START;
   					  BEGIN( ClassDocBrief ); 
@@ -3529,6 +3649,7 @@ VAR	  [vV][aA][rR]
 					  current->name = current->name.stripWhiteSpace();
 					  newDocState();
   					}
+<Doc>[a-z_A-Z0-9]+			{ current->doc += yytext; }
 <Doc>.					{ current->doc += *yytext; }
 <DefLineDoc,LineDoc>.			{ current->brief += *yytext; }
 <Doc>\n					{ yyLineNr++; current->doc += *yytext; }
@@ -3564,6 +3685,12 @@ VAR	  [vV][aA][rR]
 					  BEGIN(lastAfterDocContext);
   					}
 <AfterDocBrief>"."/{BN}			{ BEGIN(AfterDoc); }
+<LineDoc,AfterDocBrief,AfterDocLine>("\\"|"@")"internal"	{ 
+                                          current->brief+="\\internal"; 
+					}
+<Doc,AfterDoc>("\\"|"@")"internal"	{ 
+                                          current->doc+="\\internal"; 
+					}
 <AfterDoc>("\\"|"@")"brief"		{ BEGIN(AfterDocBrief); }
 <AfterDoc>"/*"|"//"			{ current->doc+=yytext; }
 <AfterDoc>^{B}*"*"+/[^/]			
diff --git a/src/section.h b/src/section.h
index aa9a674..20d1c6a 100644
--- a/src/section.h
+++ b/src/section.h
@@ -44,6 +44,7 @@ class SectionDict : public QDict<SectionInfo>
 {
   public:
     SectionDict(int size) : QDict<SectionInfo>(size) {}
+   ~SectionDict() {}
 };
 
 #endif
diff --git a/src/tag.l b/src/tag.l
index e875f31..35b2c5c 100644
--- a/src/tag.l
+++ b/src/tag.l
@@ -63,7 +63,7 @@ static void addClass(const char *name,const char *fileName)
 
 static void addFile(const char *name)
 {
-  //printf("adding file %s\n",name);
+  //printf("adding file %s tagName=`%s'\n",name,tagName.data());
   fd = new FileDef(0,name,tagName);
   FileName *mn;
   if ((mn=inputNameDict[name]))
diff --git a/src/translator.h b/src/translator.h
index e81ff92..6d91eac 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -687,7 +687,7 @@ class Translator
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="interface"; break;
       }
-      result+="was generated from the following file";
+      result+=" was generated from the following file";
       if (single) result+=":"; else result+="s:";
       return result;
     }
@@ -696,9 +696,26 @@ class Translator
      * list.
      */
     virtual QCString trAlphabeticalList()
-    {
-      return "Alphabetical List";
-    }
+    { return "Alphabetical List"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the heading text for the retval command. */
+    virtual QCString trReturnValues()
+    { return "Return values"; }
+
+    /*! This is in the (quick) index as a link to the main page (index.html)
+     */
+    virtual QCString trMainPage()
+    { return "Main Page"; }
+
+    /*! This is used in references to page that are put in the LaTeX 
+     *  documentation. It should be an abbreviation of the word page.
+     */
+    virtual QCString trPageAbbreviation()
+    { return "p."; }
 };
 
 
diff --git a/src/translator_es.h b/src/translator_es.h
index 0aba0a8..3c5d25f 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -16,7 +16,7 @@
 
 
 /**
- * translator_es.h modifief by Francisco Oltra 
+ * translator_es.h modified by Francisco Oltra 
  * Some notes: 
  * - Computer related use of the spanish language differs from
  * country to country, so some words might not sound so good
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 8214221..586a48a 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -24,89 +24,138 @@
 class TranslatorFrench : public Translator
 {
   public:
+    /*! returns the name of the package that is included by LaTeX */
     QCString latexBabelPackage()
     { return "french"; }
-    QCString trInherits()
-    { return "Hérite de"; }
-    QCString trAnd()
-    { return "et"; }
-    QCString trInheritedBy()
-    { return "Dérivée par"; }
+
+    /*! used in the compound documentation before a list of related functions. */
     QCString trRelatedFunctions()
     { return "Fonctions associées"; }
+
+    /*! subscript for the related functions. */
     QCString trRelatedSubscript()
     { return "(Noter que ces fonctions ne sont pas des méthodes de la classe)"; }
+
+    /*! header that is put before the detailed description of files, classes and namespaces. */
     QCString trDetailedDescription()
     { return "Description détaillée"; }
+
+    /*! header that is put before the list of typedefs. */
     QCString trMemberTypedefDocumentation()
     { return "Documentation des types imbriqués"; }
+    
+    /*! header that is put before the list of enumerations. */
     QCString trMemberEnumerationDocumentation()
     { return "Documentation des énumérations imbriqués"; }
+    
+    /*! header that is put before the list of member functions. */
     QCString trMemberFunctionDocumentation()
     { return "Documentation des méthodes"; }
+    
+    /*! header that is put before the list of member attributes. */
     QCString trMemberDataDocumentation()
     { return "Documentation des données imbriqués"; }
-    QCString trGeneratedFrom(const char *s,bool single)
-    { 
-      QCString result=(QCString)"La documentation pour cette"+s+
-                     " a été générée à partir ";
-      if (single) result+="du fichier suivant:";   
-      else result+="des fichiers suivants:";
-      return result;
-    }
+
+    /*! this is the text of a link put after brief descriptions. */
     QCString trMore()
     { return "Plus de détails..."; }
-    QCString trReference()
-    { return "Référence"; }
+
+    /*! put in the class documentation */
     QCString trListOfAllMembers()
     { return "Liste de tous les membres"; }
+
+    /*! used as the title of the "list of all members" page of a class */
     QCString trMemberList()
     { return "Liste des membres"; }
+
+    /*! this is the first part of a sentence that is followed by a class name */
     QCString trThisIsTheListOfAllMembers()
     { return "Ceci est la liste complète des membres de"; }
+
+    /*! this is the remainder of the sentence after the class name */
     QCString trIncludingInheritedMembers()
     { return "y compris des membres des classes héritées."; }
+    
+    /*! this is put at the author sections at the bottom of man pages.
+     *  parameter s is name of the project name.
+     */
     QCString trGeneratedAutomatically(const char *s)
     { QCString result="Généré automatiquement par Doxygen"; 
       if (s) result+=(QCString)" pour "+s;
       result+=" à partir du code source."; 
       return result;
     }
+
+    /*! put after an enum name in the list of all members */
     QCString trEnumName()
     { return "énumération"; }
+    
+    /*! put after an enum value in the list of all members */
     QCString trEnumValue()
     { return "élément d'une énumération"; }
+    
+    /*! put after an undocumented member in the list of all members */
     QCString trDefinedIn()
     { return "défini dans"; }
+
+    /*! put as in introduction in the verbatim header file of a class.
+     *  parameter f is the name of the include file.
+     */
     QCString trIncludeFile()
     { return "Fichier inclu"; }
     QCString trVerbatimText(const char *f)
     { return (QCString)"Ce texte provient du fichier inclu "+f+"."; }
 
+    // quick reference sections
 
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \group command).
+     */
     QCString trModules()
     { return "Modules"; }
+    
+    /*! This is put above each page as a link to the class hierarchy */
     QCString trClassHierarchy()
     { return "Hiérarchie des classes"; }
+    
+    /*! This is put above each page as a link to the list of annotated classes */
     QCString trCompoundList()
-    { return "Liste des composants"; }
+    { return "Liste des composants"; 
+    
+    /*! This is put above each page as a link to the list of documented files */}
     QCString trFileList()
     { return "Liste des fichiers"; }
+
+    /*! This is put above each page as a link to the list of all verbatim headers */
     QCString trHeaderFiles()
     { return "Fichiers d'entête"; }
+
+    /*! This is put above each page as a link to all members of compounds. */
     QCString trCompoundMembers()
     { return "Composants"; }
+
+    /*! This is put above each page as a link to all members of files. */
     QCString trFileMembers()
     { return "Déclarations"; }
+
+    /*! This is put above each page as a link to all related pages. */
     QCString trRelatedPages()
     { return "Pages associées"; }
+
+    /*! This is put above each page as a link to all examples. */
     QCString trExamples()
     { return "Exemples"; }
+
+    /*! This is put above each page as a link to the search engine. */
     QCString trSearch()
     { return "Recherche"; }
+
+    /*! This is an introduction to the class hierarchy. */
     QCString trClassHierarchyDescription()
     { return "Cette liste d'héritage est, autant que possible, "
 	"classée par ordre alphabétique"; }
+
+    /*! This is an introduction to the list with all files. */
     QCString trFileListDescription(bool extractAll)
     {
       QCString result="Liste de tous les fichiers ";
@@ -114,10 +163,14 @@ class TranslatorFrench : public Translator
       result+="avec une brève description :";
       return result;
     }
+
+    /*! This is an introduction to the annotated compound list. */
     QCString trCompoundListDescription()
     { return "Liste des classes, des strutures et des unions "
 	"avec une brève description :"; 
     }
+
+    /*! This is an introduction to the page with all class members. */
     QCString trCompoundMembersDescription(bool extractAll)
     {
       QCString result="Liste de tous les membres de classe ";
@@ -127,6 +180,8 @@ class TranslatorFrench : public Translator
       else result+="les classes auxquelles ils appartiennent :";
       return result;
     }
+
+    /*! This is an introduction to the page with all file members. */
     QCString trFileMembersDescription(bool extractAll)
     {
       QCString result="Liste de toutes les déclarations";
@@ -137,79 +192,198 @@ class TranslatorFrench : public Translator
       else result+="les fichiers dans lesquels elles sont définies :";
       return result;
     }
+
+    /*! This is an introduction to the page with the list of all header files. */
     QCString trHeaderFilesDescription()
     { return "Liste de tous les fichiers d'entête constituant "
 	"l'interface de programmation :"; }
+
+    /*! This is an introduction to the page with the list of all examples */
     QCString trExamplesDescription()
     { return "Liste de tous les exemples :"; }
+
+    /*! This is an introduction to the page with the list of related pages */
     QCString trRelatedPagesDescription()
     { return "Liste de toutes les pages de documentation associées :"; }
+
+    /*! This is an introduction to the page with the list of class/file groups */
     QCString trModulesDescription()
     { return "Liste de tous les modules"; }
+
+    /*! This sentences is used in the annotated class/file lists if no brief
+     * description is given. 
+     */
     QCString trNoDescriptionAvailable()
     { return "Aucune description n'est disponible"; }
+    
+    // index titles (the project name is prepended for these) 
+
 
+    /*! This is used in HTML as the title of index.html. */
     QCString trDocumentation()
     { return "Documentation"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
     QCString trModuleIndex()
     { return "Index des modules"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
     QCString trHierarchicalIndex()
     { return "Index hiérarchique"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
     QCString trCompoundIndex()
     { return "Index des composants"; }
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
     QCString trFileIndex() 
     { return "Index des fichiers"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
     QCString trModuleDocumentation()
     { return "Documentation du module"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
     QCString trClassDocumentation()
     { return "Documentation de la classe"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
     QCString trFileDocumentation()
     { return "Documentation du fichier"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
     QCString trExampleDocumentation()
     { return "Documentation de l'exemple"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
     QCString trPageDocumentation()
     { return "Documentation de la page"; }
+
+    /*! This is used in LaTeX as the title of the document */
     QCString trReferenceManual()
     { return "Manuel de référence"; }
-
+    
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
     QCString trDefines()
     { return "Définitions des macros"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
     QCString trFuncProtos()
     { return "Prototypes des fonctions"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
     QCString trTypedefs()
     { return "Définitions des types"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
     QCString trEnumerations()
     { return "Enumérations"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
     QCString trFunctions()
     { return "Fonctions"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
     QCString trVariables()
     { return "Variables"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
     QCString trEnumerationValues()
     { return "Eléments énumérés"; }
-    QCString trReimplementedFrom()
-    { return "Redéfini à partir de"; }
-    QCString trReimplementedIn()
-    { return "Redéfini dans"; }
+    
+    /*! This is used in man pages as the author section. */
     QCString trAuthor()
     { return "Auteur"; }
+
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
     QCString trDefineDocumentation()
     { return "Documentation de la macro"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
     QCString trFunctionPrototypeDocumentation()
     { return "Documentation du prototype de la fonction"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
     QCString trTypedefDocumentation()
     { return "Documentation du type"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
     QCString trEnumerationTypeDocumentation()
     { return "Documentation du type de l'énumeration"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
     QCString trEnumerationValueDocumentation()
     { return "Documentation de l'élément de l'énumeration"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
     QCString trFunctionDocumentation()
     { return "Documentation de la fonction"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
     QCString trVariableDocumentation()
     { return "Documentation de la variable"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
     QCString trCompounds()
     { return "Composants"; }
+
+    /*! This is used in the documentation of a group before the list of 
+     *  links to documented files
+     */
     QCString trFiles()
     { return "Fichiers"; }
+
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
     QCString trGeneratedAt(const char *date,const char *projName)
     { 
       QCString result=(QCString)"Généré le "+date;
@@ -217,47 +391,75 @@ class TranslatorFrench : public Translator
       result+=(QCString)" par ";
       return result;
     }
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
     QCString trWrittenBy()
     {
       return "écrit par";
     }
+
+    /*! this text is put before a class diagram */
     QCString trClassDiagram(const char *clName)
     {
       return (QCString)"Graphe d'héritage de la classe "+clName;
     }
+    
+    /*! this text is generated when the \internal command is used. */
     QCString trForInternalUseOnly()
     { return "A usage interne uniquement."; }
+
+    /*! this text is generated when the \reimp command is used. */
     QCString trReimplementedForInternalReasons()
     { return "Redéfini pour des raisons internes; "
              "l'interface n'est pas modifiée"; 
     }
+
+    /*! this text is generated when the \warning command is used. */
     QCString trWarning()
     { return "Avertissement"; }
+
+    /*! this text is generated when the \bug command is used. */
     QCString trBugsAndLimitations()
     { return "Bogues et limitations"; }
+
+    /*! this text is generated when the \version command is used. */
     QCString trVersion()
     { return "Version"; }
+
+    /*! this text is generated when the \date command is used. */
     QCString trDate()
     { return "Date"; }
+
+    /*! this text is generated when the \author command is used. */
     QCString trAuthors()
     { return "Auteur(s)"; }
+
+    /*! this text is generated when the \return command is used. */
     QCString trReturns()
     { return "Renvoie"; }
+
+    /*! this text is generated when the \sa command is used. */
     QCString trSeeAlso()
     { return "Voir également"; }
+
+    /*! this text is generated when the \param command is used. */
     QCString trParameters()
     { return "Paramètres"; }
+
+    /*! this text is generated when the \exception command is used. */
     QCString trExceptions()
     { return "Exceptions"; }
+    
+    /*! this text is used in the title page of a LaTeX document. */
     QCString trGeneratedBy()
     { return "Généré par"; }
 
     // new since 0.49-990307
     
-    virtual QCString trNamespaces()
-    { return "Namespaces"; }
     virtual QCString trNamespaceList()
     { return "Liste des Namespaces"; }
+
+    /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
       QCString result="Liste de tous les namespaces ";
@@ -265,13 +467,213 @@ class TranslatorFrench : public Translator
       result+="avec une brève description :";
       return result;
     }
+
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
     virtual QCString trFriends()
     { return "Friends"; }
     
-    // new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
     
+    /*! used in the class documentation as a header before the list of all
+     * related classes 
+     */
     virtual QCString trRelatedFunctionDocumentation()
     { return "Documentation des fonctions amies et associées"; }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used as the title of the HTML page of a class/struct/union */
+    virtual QCString trCompoundReference(const char *clName,
+                                    ClassDef::CompoundType compType)
+    {
+      QCString result="Référence de ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="la classe "; break;
+        case ClassDef::Struct:     result+="la structure "; break;
+        case ClassDef::Union:      result+="l'union "; break;
+        case ClassDef::Interface:  result+="l'interface "; break;
+      }
+
+      result+=(QCString)clName;
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a file */
+    virtual QCString trFileReference(const char *fileName)
+    {
+      QCString result= "Référence du fichier ";
+      result += fileName;
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a namespace */
+    virtual QCString trNamespaceReference(const char *namespaceName)
+    {
+      QCString result= "Référence du namespace ";
+      result += namespaceName;
+      return result;
+    }
+    
+    /*! \mgroup Class sections
+     *  these are for the member sections of a class, struct or union 
+     */
+    virtual QCString trPublicMembers()
+    { return "Membres publiques"; }
+    virtual QCString trPublicSlots()
+    { return "Connecteurs publiques"; }
+    virtual QCString trSignals()
+    { return "Signaux"; }
+    virtual QCString trStaticPublicMembers()
+    { return "Membres publiques statiques"; }
+    virtual QCString trProtectedMembers()
+    { return "Membres protégés"; }
+    virtual QCString trProtectedSlots()
+    { return "Connecteurs protégés"; }
+    virtual QCString trStaticProtectedMembers()
+    { return "Membres protégés statiques"; }
+    virtual QCString trPrivateMembers()
+    { return "Membres privés"; }
+    virtual QCString trPrivateSlots()
+    { return "Connecteurs privés"; }
+    virtual QCString trStaticPrivateMembers()
+    { return "Membres privés statiques"; }
+    /*! \endmgroup */ 
+    
+    /*! this function is used to produce a comma-separated list of items.
+     *  use generateMarker(i) to indicate where item i should be put.
+     */
+    virtual QCString trWriteList(int numEntries)
+    {
+      QCString result;
+      int i;
+      // the inherits list contain `numEntries' classes
+      for (i=0;i<numEntries;i++) 
+      {
+        // use generateMarker to generate placeholders for the class links!
+        result+=generateMarker(i); // generate marker for entry i in the list 
+                                   // (order is left to right)
+        
+        if (i!=numEntries-1)  // not the last entry, so we need a separator
+        {
+          if (i<numEntries-2) // not the fore last entry 
+            result+=", ";
+          else                // the fore last entry
+            result+=", and ";
+        }
+      }
+      return result; 
+    }
+    
+    /*! used in class documentation to produce a list of base classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritsList(int numEntries)
+    {
+      return "Est dérivée de "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in class documentation to produce a list of super classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritedByList(int numEntries)
+    {
+      return "Dérivée par "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are hidden by this one.
+     */
+    virtual QCString trReimplementedFromList(int numEntries)
+    {
+      return "Redéfinie à partir de "+trWriteList(numEntries)+".";
+    }
+
+    /*! used in member documentation blocks to produce a list of
+     *  all member that overwrite the implementation of this member.
+     */
+    virtual QCString trReimplementedInList(int numEntries)
+    {
+      return "Redéfinie dans "+trWriteList(numEntries)+".";
+    }
+
+    /*! This is put above each page as a link to all members of namespaces. */
+    virtual QCString trNamespaceMembers()
+    { return "Menbres des namespaces"; }
+
+    /*! This is an introduction to the page with all namespace members */
+    virtual QCString trNamespaceMemberDescription(bool extractAll)
+    { 
+      QCString result="Voici une list de tous les membres de namespace";
+      if (!extractAll) result+="documentés ";
+      result+=" avec liens vers ";
+      if (extractAll) 
+        result+="les documentations des namespaces associés :";
+      else 
+        result+="les namespaces auxquels ils appartiennent :";
+      return result;
+    }
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all namespaces.
+     */
+    virtual QCString trNamespaceIndex()
+    { return "Index des Namespaces"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all namespaces.
+     */
+    virtual QCString trNamespaceDocumentation()
+    { return "Documentation des Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in the documentation before the list of all
+     *  namespaces in a file.
+     */
+    virtual QCString trNamespaces()
+    { return "Namespaces"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Class", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"La documentation associée à cette ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="classe"; break;
+        case ClassDef::Struct:     result+="structure"; break;
+        case ClassDef::Union:      result+="union"; break;
+        case ClassDef::Interface:  result+="interface"; break;
+      }
+      result+=" a été générée à partir ";
+      if (single) result+=" du fichier suivant :"; 
+      else result+="des fichiers suivants :";
+      return result;
+    }
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    {
+      return "Liste par ordre alphabétique";
+    }
+
 };
 
 #endif
diff --git a/src/translator_it.h b/src/translator_it.h
index 34d5660..74f0b75 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -6,6 +6,9 @@
  *
  * Initial Italian Translation by Ahmed Aldo Faisal
  * Revised and completed by Alessandro Falappa  (June 1999)
+ * Updates:
+ *		1999/09/10: corrected some small typos in the "new since 0.49-990425" section
+ *					added the "new since 0.49-990728" section
  *
  * Permission to use, copy, modify, and distribute this software and its
  * documentation under the terms of the GNU General Public License is hereby 
@@ -293,15 +296,15 @@ class TranslatorItalian : public Translator
     QCString trCompoundReference(const char *clName,
                                     ClassDef::CompoundType compType)
     {
-      QCString result="Riferimenti per la";
+      QCString result="Riferimenti per ";
       switch(compType)
       {
-        case ClassDef::Class:  result+=" classe"; break;
-        case ClassDef::Struct: result+=" struct"; break;
-        case ClassDef::Union:  result+=" union"; break;
-        case ClassDef::Interface:  result+=" interface"; break;
+        case ClassDef::Class:  result+="la classe "; break;
+        case ClassDef::Struct: result+="la struct "; break;
+        case ClassDef::Union:  result+="la union "; break;
+        case ClassDef::Interface:  result+="l'interfaccia "; break;
       }
-      result+=" "+(QCString)clName;
+      result+=(QCString)clName;
       return result;
     }
     QCString trFileReference(const char *fileName)
@@ -375,6 +378,40 @@ class TranslatorItalian : public Translator
     { return "Indice dei namespaces"; }
     QCString trNamespaceDocumentation()
     { return "Documentazione dei namespaces"; }
+	
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Class", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"La documentazione per questa ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="classe"; break;
+        case ClassDef::Struct:     result+="struct"; break;
+        case ClassDef::Union:      result+="union"; break;
+        case ClassDef::Interface:  result+="interfaccia"; break;
+      }
+      result+=" è stata generata a partire ";
+      if (single) result+="dal seguente file:";
+	  else result+="dai seguenti files:";
+      return result;
+    }
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    {
+      return "Lista in ordine alfabetico";
+    }
+
 };
 
 #endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
index 4c105f1..a526ac1 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -384,6 +384,55 @@ class TranslatorDutch : public Translator
       // This is used in LaTeX as the title of the chapter containing
       // the documentation of all namespaces.
     { return "Namespace Documentatie"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Class", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"De documentatie voor deze ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="class"; break;
+        case ClassDef::Struct:     result+="struct"; break;
+        case ClassDef::Union:      result+="union"; break;
+        case ClassDef::Interface:  result+="interface"; break;
+      }
+      result+=" is gegenereerd op grond van de volgende file";
+      if (single) result+=":"; else result+="s:";
+      return result;
+    }
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    { return "Alphabetical List"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the heading text for the retval command. */
+    virtual QCString trReturnValues()
+    { return "Retour waarden"; }
+
+    /*! This is in the (quick) index as a link to the main page (index.html)
+     */
+    virtual QCString trMainPage()
+    { return "Hoofd Pagina"; }
+
+    /*! This is used in references to page that are put in the LaTeX 
+     *  documentation. It should be an abbreviation of the word page.
+     */
+    virtual QCString trPageAbbreviation()
+    { return "p."; }
 };
 
 #endif
diff --git a/src/translator_se.h b/src/translator_se.h
index 2a04ff3..2d7fa87 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -47,10 +47,15 @@ Uppdateringar.
 
 ===================================================================================
 Problem!
-   Namespace och slot: har de nån hygglig svensk översättning???
+   Slot: nån hygglig svensk översättning???
 
    Skicka gärna synpunkter.
 ===================================================================================
+1999/09/01
+*  Det verkar som om "namnrymd" är en hyggligt vedertagen svensk översättning
+   av "namnepace", så jag kör med det från och med nu.
+*  "interface" heter numera "gränssnitt"
+
 */
 
 #ifndef TRANSLATOR_SE_H
@@ -349,13 +354,13 @@ class TranslatorSwedish : public Translator
 // new since 0.49-990307
 
     virtual QCString trNamespaceList()
-    { return "Namespacelista"; }
+    { return "Namnrymdlista"; }
 
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
       QCString result="Här är en lista över alla ";
       if (!extractAll) result+="dokumenterade ";
-      result+="namespaces med en kort förklaring:";
+      result+="namnrymder med en kort förklaring:";
       return result;
     }
 
@@ -379,10 +384,10 @@ class TranslatorSwedish : public Translator
       QCString result=(QCString)clName+" ";
       switch(compType)
       {
-        case ClassDef::Class:  result+=" Klass"; break;
-        case ClassDef::Struct: result+=" Strukt"; break;
-        case ClassDef::Union:  result+=" Union"; break;
-        case ClassDef::Interface:  result+=" Interface"; break;
+        case ClassDef::Class:  result+=" klass"; break;
+        case ClassDef::Struct: result+=" strukt"; break;
+        case ClassDef::Union:  result+=" union"; break;
+        case ClassDef::Interface:  result+=" gränssnitt"; break;
       }
       result+="referens";
       return result;
@@ -398,7 +403,7 @@ class TranslatorSwedish : public Translator
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+=" namespacereferens";
+      result+=" namnrymdreferens";
       return result;
     }
 
@@ -474,25 +479,65 @@ class TranslatorSwedish : public Translator
     }
 
     virtual QCString trNamespaceMembers()
-    { return "Namespacemedlemmar"; }
+    { return "Namnrymdsmedlemmar"; }
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     {
       QCString result="Här är en lista över alla ";
       if (!extractAll) result+="dokumenterade ";
-      result+="namespacemedlemmar med länkar till ";
+      result+="namnrymdsmedlemmar med länkar till ";
       if (extractAll)
-        result+=" namespace-dokumentationen för varje medlem:";
+        result+=" namnrymd-dokumentationen för varje medlem:";
       else
-        result+="de namespaces de tillhör:";
+        result+="de namnrymder de tillhör:";
       return result;
     }
 
     virtual QCString trNamespaceIndex()
-    { return "Namespaceindex"; }
+    { return "Namnrymdsindex"; }
 
     virtual QCString trNamespaceDocumentation()
+      { return "Namnrymd-dokumentation"; }
+    //////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in the documentation before the list of all
+     *  namespaces in a file.
+     */
+    virtual QCString trNamespaces()
+    { return "Namnrymder"; }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Class", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"Dokumentationen för ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="denna klass "; break;
+        case ClassDef::Struct:     result+="denna strukt "; break;
+        case ClassDef::Union:      result+="denna union "; break;
+        case ClassDef::Interface:  result+="detta gränssnitt "; break;
+      }
+      result+="var genererad från följande fil";
+      if (single) result+=":"; else result+="er:";
+      return result;
+    }
 
-{ return "Namespace-dokumentation"; }
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    {
+      return "Alfabetisk lista";
+    }
 };
 
 #endif
diff --git a/src/util.cpp b/src/util.cpp
index 167ba3f..d714912 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -39,18 +39,52 @@ bool isId(char c)
   return c=='_' || isalnum(c);
 }
 
-// strip annonymous part of the scope
-QCString stripAnnonymousScope(const QCString &s)
+// strip annonymous left hand side part of the scope
+//QCString stripAnnonymousScope(const QCString &s)
+//{
+//  QCString result=s;
+//  int i=0;
+//  while (!result.isEmpty() && result.at(0)=='@' && (i=result.find("::"))!=-1)
+//  { 
+//    result=result.right(result.length()-i-2);
+//  }
+//  //if (result.at(0)=='@')
+//  //{
+//  //  result.resize(0);
+//  //}
+//  return result;
+//}
+
+// strip annonymous left hand side part of the scope
+QCString stripAnnonymousNamespaceScope(const QCString &s)
 {
-  QCString result=s;
-  int i=0;
-  while (!result.isEmpty() && result.at(0)=='@' && (i=result.find("::"))!=-1)
-  { 
-    result=result.right(result.length()-i-2);
+  int oi=0,i=0,p=0;
+  if (s.isEmpty()) return s;
+  while (s.at(p)=='@' && (i=s.find("::",p))!=-1 && 
+         namespaceDict[s.left(i)]!=0) { oi=i; p=i+2; }
+  if (oi==0) 
+  {
+    //printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.data());
+    return s;
+  }
+  else 
+  {
+    //printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.right(s.length()-oi-2).data());
+    return s.right(s.length()-oi-2);
   }
-  return result;
 }
 
+void writePageRef(OutputList &ol,const char *cn,const char *mn)
+{
+  bool htmlOn = ol.isEnabled(OutputGenerator::Html);
+  bool manOn  = ol.isEnabled(OutputGenerator::Man);
+  ol.startPageRef();
+  ol.disableAllBut(OutputGenerator::Latex);
+  ol.docify(theTranslator->trPageAbbreviation());
+  ol.endPageRef(cn,mn);
+  if (htmlOn) ol.enable(OutputGenerator::Html);
+  if (manOn)  ol.enable(OutputGenerator::Man);
+}
 
 QCString generateMarker(int id)
 {
@@ -159,8 +193,6 @@ QCString removeRedundantWhiteSpace(const QCString &s)
   return result;
 }  
 
-
-
 bool rightScopeMatch(const QCString &scope, const QCString &name)
 {
   return (name==scope || // equal 
@@ -244,12 +276,14 @@ void linkifyText(OutputList &ol,const char *scName,const char *name,const char *
         }
       } while (!found && scopeOffset>=0);
 
+      //if (!found) printf("Trying to link %s in %s\n",word.data(),scName);
       if (!found && 
           getDefs(scName,word,0,md,cd,fd,nd) && 
-          (md->isTypedef() || md->isEnumerate()) &&
+          (md->isTypedef() || md->isEnumerate() || md->isReference()) && 
           md->isLinkable() 
          )
       {
+        //printf("Found ref\n");
         Definition *d=0;
         if (cd) d=cd; else if (nd) d=nd; else d=fd;
         if (d && d->isLinkable())
@@ -369,17 +403,17 @@ QCString tempArgListToString(ArgumentList *al)
 
 static bool manIsEnabled;
 
-void startTitle(OutputList &ol)
+void startTitle(OutputList &ol,const char *fileName)
 {
-  ol.startTitleHead();
+  ol.startTitleHead(fileName);
   manIsEnabled=ol.isEnabled(OutputGenerator::Man);
   if (manIsEnabled) ol.disable(OutputGenerator::Man);
 }
 
-void endTitle(OutputList &ol,const char *name)
+void endTitle(OutputList &ol,const char *fileName,const char *name)
 {
   if (manIsEnabled) ol.enable(OutputGenerator::Man); 
-  ol.endTitleHead(name);
+  ol.endTitleHead(fileName,name);
 }
 
 void writeQuickLinks(OutputList &ol,bool compact,bool ext)
@@ -391,6 +425,12 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
   if (manEnabled) ol.disable(OutputGenerator::Man);
   if (texEnabled) ol.disable(OutputGenerator::Latex);
   if (compact) ol.startCenter(); else ol.startItemList();
+
+  if (!compact) ol.writeListItem();
+  ol.startQuickIndexItem(extLink,absPath+"index.html");
+  parseText(ol,theTranslator->trMainPage());
+  ol.endQuickIndexItem();
+
   if (documentedGroups>0)
   {
     if (!compact) ol.writeListItem();
@@ -1428,15 +1468,19 @@ void generateRef(OutputList &ol,const char *scName,
       {
         ol.writeObjectLink(cd->getReference(),
             cd->getOutputFileBase(),0,linkText);
-        if (!cd->isReference()) 
-          ol.writePageRef(cd->name(),0);
+        if (!cd->isReference() && !Config::pdfHyperFlag) 
+        {
+          writePageRef(ol,cd->name(),0);
+        }
       }
       else // scope matches that of a namespace
       {
         ol.writeObjectLink(nd->getReference(),
             nd->getOutputFileBase(),0,linkText);
-        if (!nd->getReference()) 
-          ol.writePageRef(nd->name(),0);
+        if (!nd->getReference() && !Config::pdfHyperFlag) 
+        {
+          writePageRef(ol,nd->name(),0);
+        }
       }
       // link has been written, stop now.
       return;
@@ -1532,15 +1576,15 @@ void generateRef(OutputList &ol,const char *scName,
     }
 
     // generate the page reference (for LaTeX)
-    if (cName.length()>0 || aName.length()>0)
+    if (!Config::pdfHyperFlag && (cName.length()>0 || aName.length()>0))
     {
       if (
           (cd && cd->isLinkableInProject()) || 
           (fd && !fd->isReference()) ||
-          (nd /* TODO: && !nd->isReference() */)
+          (nd && !nd->isReference()) 
          ) 
       {
-        ol.writePageRef(cName,aName);
+        writePageRef(ol,cName,aName);
       }
     }
     return;
diff --git a/src/util.h b/src/util.h
index f17f5e2..29b77f4 100644
--- a/src/util.h
+++ b/src/util.h
@@ -72,8 +72,8 @@ extern int guessSection(const char *name);
 //extern QCString nameToFile(const char *name);
 extern bool isId(char c);
 extern QCString removeRedundantWhiteSpace(const QCString &s);
-extern void startTitle(OutputList &ol);
-extern void endTitle(OutputList &ol,const char *name);
+extern void startTitle(OutputList &ol,const char *fileName);
+extern void endTitle(OutputList &ol,const char *fileName,const char *name);
 void startFile(OutputList &ol,const char *name,
                const char *title,bool external=FALSE);
 void endFile(OutputList &ol,bool external=FALSE);
@@ -84,6 +84,7 @@ QCString generateMarker(int id);
 void writeExample(OutputList &ol,ExampleList *el);
 void setFileNameForSections(QList<QCString> *anchorList,const char *fileName);
 QCString stripAnnonymousScope(const QCString &s);
+QCString stripAnnonymousNamespaceScope(const QCString &s);
 
 
 //void writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
@@ -92,5 +93,6 @@ QCString stripAnnonymousScope(const QCString &s);
 QCString stripFromPath(const QCString &path);
 bool rightScopeMatch(const QCString &scope, const QCString &name);
 bool leftScopeMatch(const QCString &scope, const QCString &name);
+void writePageRef(OutputList &ol,const char *cn,const char *mn);
 
 #endif
-- 
cgit v0.12

