From 6bf92c5d7efffb6a04c3ccbfc144ad944200fed2 Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Sun, 27 Jul 2008 14:59:10 +0000
Subject: Release-1.5.6-20080727

---
 Doxyfile                  |   6 +-
 INSTALL                   |   4 +-
 README                    |   4 +-
 configure                 |   2 +-
 doc/commands.doc          |  70 ++++-
 doc/config.doc            |  45 +++-
 doc/docblocks.doc         |  16 +-
 doc/language.doc          |   8 +-
 doc/translator_report.txt |  82 +-----
 examples/Makefile.in      |   8 +-
 examples/Makefile.win.in  |   8 +-
 examples/manual.c         |  87 +++++++
 examples/manual.cfg       |  15 ++
 src/classdef.cpp          |  87 ++++---
 src/classdef.h            |   2 +-
 src/commentscan.l         |  61 +++--
 src/config.l              |  43 ++++
 src/doxygen.cpp           |  94 ++++---
 src/doxygen.css           | 617 ++++++++++++++++++++++----------------------
 src/doxygen_css.h         | 635 ++++++++++++++++++++++------------------------
 src/entry.cpp             |   6 +-
 src/entry.h               |   4 +-
 src/groupdef.cpp          |  10 +-
 src/increasebuffer.pl     |   1 +
 src/index.cpp             |   6 +-
 src/language.cpp          |   2 +-
 src/marshal.cpp           |   4 +-
 src/memberdef.cpp         |  36 ++-
 src/memberdef.h           |   4 +-
 src/pagedef.cpp           |  20 +-
 src/pre.l                 |   2 +-
 src/scanner.l             |   5 +-
 src/translator_br.h       |   6 +-
 src/translator_ca.h       | 523 ++++++++++++++++++++++++++------------
 src/util.cpp              |   3 +-
 src/vhdlcode.l            |   2 +-
 src/vhdldocgen.cpp        |  29 +--
 src/vhdldocgen.h          |   1 -
 src/vhdlscanner.l         | 155 +++++++----
 39 files changed, 1614 insertions(+), 1099 deletions(-)
 create mode 100644 examples/manual.c
 create mode 100644 examples/manual.cfg

diff --git a/Doxyfile b/Doxyfile
index 0de2079..c9143e3 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -7,7 +7,7 @@ DOXYFILE_ENCODING      = UTF-8
 PROJECT_NAME           = Doxygen
 PROJECT_NUMBER         = 
 OUTPUT_DIRECTORY       = doxygen_docs
-CREATE_SUBDIRS         = YES
+CREATE_SUBDIRS         = NO
 OUTPUT_LANGUAGE        = English
 BRIEF_MEMBER_DESC      = YES
 REPEAT_BRIEF           = YES
@@ -144,7 +144,7 @@ HTML_HEADER            =
 HTML_FOOTER            = 
 HTML_STYLESHEET        = 
 HTML_ALIGN_MEMBERS     = YES
-GENERATE_HTMLHELP      = NO
+GENERATE_HTMLHELP      = YES
 GENERATE_DOCSET        = YES
 DOCSET_FEEDNAME        = "Doxygen docs"
 DOCSET_BUNDLE_ID       = org.doxygen.Doxygen
@@ -161,7 +161,7 @@ TREEVIEW_WIDTH         = 250
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
-GENERATE_LATEX         = YES
+GENERATE_LATEX         = NO
 LATEX_OUTPUT           = 
 LATEX_CMD_NAME         = latex
 MAKEINDEX_CMD_NAME     = makeindex
diff --git a/INSTALL b/INSTALL
index a1e564d..abe6f0a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.5.6-20080626
+DOXYGEN Version 1.5.6-20080727
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (26 June 2008)
+Dimitri van Heesch (27 July 2008)
diff --git a/README b/README
index 60f0b02..b2d8671 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.5.6_20080626
+DOXYGEN Version 1.5.6_20080727
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (26 June 2008)
+Dimitri van Heesch (dimitri@stack.nl) (27 July 2008)
diff --git a/configure b/configure
index 0b1e2fa..efc8c8f 100755
--- a/configure
+++ b/configure
@@ -20,7 +20,7 @@ doxygen_version_minor=5
 doxygen_version_revision=6
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
-doxygen_version_mmn=20080626
+doxygen_version_mmn=20080727
 
 bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
 
diff --git a/doc/commands.doc b/doc/commands.doc
index f61022a..7450d91 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -83,6 +83,7 @@ documentation:
 \refitem cmdenum \\enum
 \refitem cmdexample \\example
 \refitem cmdexception \\exception
+\refitem cmdextends \\extends
 \refitem cmdfdollar \\f\$
 \refitem cmdfbropen \\f[
 \refitem cmdfbrclose \\f]
@@ -97,6 +98,7 @@ documentation:
 \refitem cmdif \\if
 \refitem cmdifnot \\ifnot
 \refitem cmdimage \\image
+\refitem cmdimplements \\implements
 \refitem cmdinclude \\include
 \refitem cmdincludelineno \\includelineno
 \refitem cmdingroup \\ingroup
@@ -109,6 +111,7 @@ documentation:
 \refitem cmdlink \\link
 \refitem cmdmainpage \\mainpage
 \refitem cmdmanonly \\manonly
+\refitem cmdmemberof \\memberof
 \refitem cmdmsc \\msc
 \refitem cmdn \\n
 \refitem cmdname \\name
@@ -372,6 +375,23 @@ doxygen. Unrecognized commands are treated as normal text.
   \sa section \ref cmdinclude "\\include".
 
 <hr>
+\section cmdextends \\extends <name>
+
+  \addindex \\extends
+  This command can be used to manually indicate an inheritance relation,
+  when the programming language does not support this concept natively
+  (e.g. C).
+ 
+  The file \c manual.c in the example directory shows how to use this command.
+  \htmlonly
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  for the corresponding HTML documentation that is generated by doxygen.
+  \endhtmlonly
+
+  \sa section \ref cmdimplements "\\implements" and section
+      \ref cmdmemberof "\\memberof"
+
+<hr>
 \section cmdfile \\file [<name>]
   
   \addindex \\file
@@ -456,6 +476,23 @@ doxygen. Unrecognized commands are treated as normal text.
   \sa section \ref cmdshowinitializer "\\showinitializer".
 
 <hr>
+\section cmdimplements \\implements <name>
+
+  \addindex \\implements
+  This command can be used to manually indicate an inheritance relation,
+  when the programming language does not support this concept natively
+  (e.g. C).
+ 
+  The file \c manual.c in the example directory shows how to use this command.
+  \htmlonly
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  for the corresponding HTML documentation that is generated by doxygen.
+  \endhtmlonly
+
+  \sa section \ref cmdextends "\\extends" and section
+      \ref cmdmemberof "\\memberof"
+
+<hr>
 \section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
 
   \addindex \\ingroup
@@ -530,15 +567,36 @@ doxygen. Unrecognized commands are treated as normal text.
      section \ref cmdpage "\\page".
 
 <hr>
+\section cmdmemberof \\memberof <name>
+
+  \addindex \\memberof
+  This command make a function a member of a class in a similar way
+  as \ref cmdrelates "\\relates" does, only with this command the function
+  is represented as a real member of the class.
+  This can be useful when the programming language does not support 
+  the concept of member functions natively (e.g. C).
+ 
+  The file \c manual.c in the example directory shows how to use this command.
+  \htmlonly
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  for the corresponding HTML documentation that is generated by doxygen.
+  \endhtmlonly
+
+  \sa section \ref cmdextends "\\extends" and section
+      \ref cmdmemberof "\\memberof"
+
+<hr>
 \section cmdname \\name (header)  
 
-This command turns a comment block into a header
-definition of a member group. The
-comment block should be followed by a 
-<code>//\@{ ... //\@}</code> block containing the
-members of the group.
+  \addindex \\name
+
+  This command turns a comment block into a header
+  definition of a member group. The
+  comment block should be followed by a 
+  <code>//\@{ ... //\@}</code> block containing the
+  members of the group.
 
-See section \ref memgroup for an example.
+  See section \ref memgroup for an example.
 
 <hr>
 \section cmdnamespace \\namespace <name> 
diff --git a/doc/config.doc b/doc/config.doc
index 1f3905a..31ff5a4 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -90,6 +90,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_dot_transparent DOT_TRANSPARENT
 \refitem cfg_dotfile_dirs DOTFILE_DIRS
 \refitem cfg_doxyfile_encoding DOXYFILE_ENCODING
+\refitem cfg_doxygen2qthelp_loc DOXYGEN2QTHELP_LOC
 \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
 \refitem cfg_enum_values_per_line ENUM_VALUES_PER_LINE
 \refitem cfg_enabled_sections ENABLED_SECTIONS
@@ -192,6 +193,8 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_project_name PROJECT_NAME
 \refitem cfg_project_number PROJECT_NUMBER
 \refitem cfg_qt_autobrief QT_AUTOBRIEF
+\refitem cfg_qthelp_config QTHELP_CONFIG
+\refitem cfg_qthelp_file QTHELP_FILE
 \refitem cfg_quiet QUIET
 \refitem cfg_recursive RECURSIVE
 \refitem cfg_referenced_by_relation REFERENCED_BY_RELATION
@@ -222,6 +225,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH
 \refitem cfg_strip_from_path STRIP_FROM_PATH
 \refitem cfg_subgrouping SUBGROUPING
+\refitem cfg_symbol_cache_size SYMBOL_CACHE_SIZE
 \refitem cfg_tab_size TAB_SIZE
 \refitem cfg_tagfiles TAGFILES
 \refitem cfg_template_relations TEMPLATE_RELATIONS
@@ -569,6 +573,23 @@ sources. Doxygen will then generate output that is tailored for VHDL.
  be useful for C code in case the coding convention dictates that all compound 
  types are typedef'ed and only the typedef is referenced, never the tag name.
 
+\anchor cfg_symbol_cache_size
+<dt>\c SYMBOL_CACHE_SIZE <dd>
+ \addindex SYMBOL_CACHE_SIZE
+ The \c SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+ determine which symbols to keep in memory and which to flush to disk.
+ When the cache is full, less often used symbols will be written to disk.
+ For small to medium size projects (<1000 input files) the default value is
+ probably good enough. For larger projects a too small cache size can cause 
+ doxygen to be busy swapping symbols to and from disk most of the time
+ causing a significant performance penality.
+ If the system has enough physical memory increasing the cache will improve the
+ performance by keeping more symbols in memory. Note that the value works on
+ a logarithmic scale so increasing the size by one will rougly double the
+ memory usage. The cache size is given by this formula: 
+ \f$2^{(16+\mbox{SYMBOL\_CACHE\_SIZE})}\f$. The valid range is 0..9, the default is 0, 
+ corresponding to a cache size of \f$2^{16} = 65536\f$ symbols.
+
 </dl>
 
 \section config_build Build related options
@@ -1302,9 +1323,31 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
  \addindex HHC_LOCATION
   If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c HHC_LOCATION tag can
   be used to specify the location (absolute path including file name) of 
-  the HTML help compiler (hhc.exe). If non empty doxygen will try to run
+  the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
   the HTML help compiler on the generated index.hhp.
 
+\anchor cfg_qthelp_file 
+<dt>\c QTHELP_FILE <dd>
+ \addindex QTHELP_FILE
+  If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c QTHELP_FILE tag can
+  be used to specify the file name of the resulting .(qch|qhp) file. 
+  You can add a path in front of the file if the result should not be
+  written to the html output directory.
+
+\anchor cfg_qthelp_config 
+<dt>\c QTHELP_CONFIG <dd>
+ \addindex QTHELP_CONFIG
+  If \c DOXYGEN2QTHELP_LOC is set, \c QTHELP_CONFIG must specify the file name
+  of a config file to pass to doxygen2qthelp.
+
+\anchor cfg_doxygen2qthelp_loc 
+<dt>\c DOXYGEN2QTHELP_LOC <dd>
+ \addindex DOXYGEN2QTHELP_LOC
+  If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c DOXYGEN2QTHELP_LOC tag
+  can be used to specify the location (absolute path including file name) of 
+  the doxygen2qthelp tool. If non-empty doxygen will try to run doxygen2qthelp 
+  on the generated index.hhp.
+
 \anchor cfg_generate_chi
 <dt>\c GENERATE_CHI <dd>
  \addindex GENERATE_CHI
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index 5ebdf7b..0e9f38e 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -166,23 +166,19 @@ for this case.
 
 </ol>
 
-As you can see doxygen is quite flexible. The following however is
-not legal
+As you can see doxygen is quite flexible. If you have multiple
+detailed descriptions, like in the following example:
 
 \verbatim
 //! Brief description, which is
 //! really a detailed description since it spans multiple lines.
-/*! Oops, another detailed description!
+/*! Another detailed description!
  */
 \endverbatim
 
-because doxygen only allows one brief and one detailed description. 
-
-Furthermore, if there is one brief description before a declaration 
-and one before a definition of a code item, only the one before 
-the \e declaration will be used. If the same situation occurs for a 
-detailed description, the one before the \e definition is preferred 
-and the one before the declaration will be ignored.
+They will be joined. Note that this is also the case if the descriptions
+are at different places in the code! In this case the order will depend
+on the order in which doxygen parses the code.
 
 Here is an example of a documented piece of C++ code using the Qt style:
 \include qtstyle.cpp
diff --git a/doc/language.doc b/doc/language.doc
index d991d65..bb6caeb 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -73,7 +73,7 @@ when the translator was updated.
     <td>Catalan</td>
     <td>Maximiliano Pin<br>Albert Mora</td>
     <td>max.pin at bitroit dot com<br>amora at iua dot upf dot es</td>
-    <td>1.5.4</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese</td>
@@ -235,7 +235,7 @@ when the translator was updated.
     <td>Serbian</td>
     <td>Dejan Milosavljevic</td>
     <td>dmilos at email dot com</td>
-    <td>1.4.1</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>SerbianCyrilic</td>
@@ -294,7 +294,7 @@ when the translator was updated.
   \hline
   Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino@uol.com.br} & up-to-date \\
   \hline
-  Catalan & Maximiliano Pin & {\tt\tiny max.pin@bitroit.com} & 1.5.4 \\
+  Catalan & Maximiliano Pin & {\tt\tiny max.pin@bitroit.com} & up-to-date \\
   ~ & Albert Mora & {\tt\tiny amora@iua.upf.es} & ~ \\
   \hline
   Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & up-to-date \\
@@ -360,7 +360,7 @@ when the translator was updated.
   \hline
   Russian & Alexandr Chelpanov & {\tt\tiny cav@cryptopro.ru} & up-to-date \\
   \hline
-  Serbian & Dejan Milosavljevic & {\tt\tiny dmilos@email.com} & 1.4.1 \\
+  Serbian & Dejan Milosavljevic & {\tt\tiny dmilos@email.com} & up-to-date \\
   \hline
   SerbianCyrilic & Nedeljko Stefanovic & {\tt\tiny stenedjo@yahoo.com} & up-to-date \\
   \hline
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
index 8598404..4c6b192 100644
--- a/doc/translator_report.txt
+++ b/doc/translator_report.txt
@@ -9,7 +9,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
 Romanian, Russian, Serbian, SerbianCyrilic, Slovak, Slovene, Spanish,
 Swedish, and Ukrainian.
 
-Of them, 16 translators are up-to-date, 19 translators are based on
+Of them, 18 translators are up-to-date, 17 translators are based on
 some adapter class, and 2 are English based.
 
 ----------------------------------------------------------------------
@@ -19,6 +19,7 @@ and they implement all 216 of the required methods. Anyway, there
 still may be some details listed even for them:
 
   TranslatorBrazilian
+  TranslatorCatalan
   TranslatorChinesetraditional
   TranslatorChinese
   TranslatorCroatian
@@ -33,6 +34,7 @@ still may be some details listed even for them:
   TranslatorPersian
   TranslatorRussian
   TranslatorSerbianCyrilic
+  TranslatorSerbian
   TranslatorSpanish -- Change the base class to Translator.
 
 ----------------------------------------------------------------------
@@ -45,7 +47,6 @@ must be implemented to become up-to-date:
   TranslatorGreek                 1.5.4 	22 methods to implement
   TranslatorFrench                1.5.4 	22 methods to implement
   TranslatorDanish                1.5.4 	22 methods to implement
-  TranslatorCatalan               1.5.4 	22 methods to implement
   TranslatorSwedish               1.4.6 	24 methods to implement
   TranslatorSlovene               1.4.6 	24 methods to implement
   TranslatorPolish                1.4.6 	23 methods to implement
@@ -56,7 +57,6 @@ must be implemented to become up-to-date:
   TranslatorArabic                1.4.6 	23 methods to implement
   TranslatorAfrikaans             1.4.6 	24 methods to implement
   TranslatorUkrainian             1.4.1 	24 methods to implement
-  TranslatorSerbian               1.4.1 	24 methods to implement
   TranslatorRomanian              1.4.1 	24 methods to implement
   TranslatorPortuguese            1.3.3 	35 methods to implement
   TranslatorSlovak                1.2.18	44 methods to implement
@@ -152,37 +152,6 @@ TranslatorArabic   (TranslatorAdapter_1_4_6)  23 methods to implement
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorCatalan   (TranslatorAdapter_1_5_4)  22 methods to implement
------------------
-
-  Implements 194 of the required methods.
-
-  Missing methods (should be implemented):
-
-    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
-    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
-    virtual QCString trSubprograms()
-    virtual QCString trModulesListDescription(bool extractAll)
-    virtual QCString trModulesList()
-    virtual QCString trTypeConstraints()
-    virtual QCString trMemberFunctionDocumentationFortran()
-    virtual QCString trCompoundListDescriptionFortran()
-    virtual QCString trTypeDocumentation()
-    virtual QCString trModuleReference(const char * namespaceName)
-    virtual QCString trModulesMemberDescription(bool extractAll)
-    virtual QCString trModulesMembers()
-    virtual QCString trModulesIndex()
-    virtual QCString trCompoundListFortran()
-    virtual QCString trDataTypes()
-    virtual QCString trCompoundIndexFortran()
-    virtual QCString trSubprogram(bool first_capital, bool singular)
-    virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
-    virtual QCString trType(bool first_capital, bool singular)
-    virtual QCString trModule(bool first_capital, bool singular)
-    virtual QCString trCompoundMembersFortran()
-    virtual QCString trSubprogramDocumentation()
-
-
 TranslatorDanish   (TranslatorAdapter_1_5_4)  22 methods to implement
 ----------------
 
@@ -658,51 +627,6 @@ TranslatorRomanian   (TranslatorAdapter_1_4_1)  24 methods to implement
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorSerbian   (TranslatorAdapter_1_4_1)  24 methods to implement
------------------
-
-  Implements 192 of the required methods.
-
-  Missing methods (should be implemented):
-
-    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
-    virtual QCString trOverloadText()
-    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
-    virtual QCString trSubprograms()
-    virtual QCString trModulesListDescription(bool extractAll)
-    virtual QCString trModulesList()
-    virtual QCString trTypeConstraints()
-    virtual QCString trMemberFunctionDocumentationFortran()
-    virtual QCString trCompoundListDescriptionFortran()
-    virtual QCString trTypeDocumentation()
-    virtual QCString trModuleReference(const char * namespaceName)
-    virtual QCString trModulesMemberDescription(bool extractAll)
-    virtual QCString trModulesMembers()
-    virtual QCString trModulesIndex()
-    virtual QCString trCompoundListFortran()
-    virtual QCString trDataTypes()
-    virtual QCString trCompoundIndexFortran()
-    virtual QCString trSubprogram(bool first_capital, bool singular)
-    virtual QCString trCallerGraph()
-    virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
-    virtual QCString trType(bool first_capital, bool singular)
-    virtual QCString trModule(bool first_capital, bool singular)
-    virtual QCString trCompoundMembersFortran()
-    virtual QCString trSubprogramDocumentation()
-
-  Obsolete methods (should be removed, never used):
-
-    virtual QCString trHeaderFilesDescription()
-    virtual QCString trField(bool first_capital, bool singular)
-    virtual QCString trPackageDocumentation()
-    virtual QCString trSources()
-    virtual QCString trReimplementedForInternalReasons()
-    virtual QCString trInterfaces()
-    virtual QCString trHeaderFiles()
-    virtual QCString trBugsAndLimitations()
-    virtual QCString trNoDescriptionAvailable()
-
-
 TranslatorSlovak   (TranslatorAdapter_1_2_18)  44 methods to implement
 ----------------
 
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 1176e6d..6db4f01 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -24,13 +24,14 @@ all: class/html/index.html \
      memgrp/html/index.html \
      docstring/html/index.html \
      pyexample/html/index.html \
-     mux/html/index.html
+     mux/html/index.html \
+     manual/html/index.html
 
 clean:
 	rm -rf  class define enum file func page relates author \
                 par overload example include qtstyle jdstyle structcmd \
 		autolink tag restypedef afterdoc template tag group diagrams \
-		memgrp docstring pyexample mux
+		memgrp docstring pyexample mux manual
 
 class/html/index.html: class.h class.cfg
 	$(DOXYGEN)/bin/doxygen class.cfg
@@ -106,6 +107,9 @@ pyexample/html/index.html: pyexample.py pyexample.cfg
 mux/html/index.html: mux.vhdl mux.cfg
 	$(DOXYGEN)/bin/doxygen mux.cfg
 
+manual/html/index.html: manual.c manual.cfg
+	$(DOXYGEN)/bin/doxygen manual.cfg
+
 docstring/html/index.html: docstring.py docstring.cfg
 	$(DOXYGEN)/bin/doxygen docstring.cfg
 
diff --git a/examples/Makefile.win.in b/examples/Makefile.win.in
index a6c6956..0d5e64e 100644
--- a/examples/Makefile.win.in
+++ b/examples/Makefile.win.in
@@ -25,13 +25,14 @@ all: class/html/index.html \
      memgrp/html/index.html \
      docstring/html/index.html \
      pyexample/html/index.html \
-     mux/html/index.html
+     mux/html/index.html \
+     manual/html/index.html
 
 clean:
 	del /s/y class define enum file pyexample docstring
 	del /s/y func page relates author
 	del /s/y par overload example include qtstyle 
-	del /s/y jdstyle structcmd autolink resdefine mux
+	del /s/y jdstyle structcmd autolink resdefine mux manual
 	del /s/y restypedef afterdoc template tag group diagrams memgrp
 
 class/html/index.html: class.h class.cfg
@@ -106,6 +107,9 @@ pyexample/html/index.html: pyexample.py pyexample.cfg
 mux/html/index.html: mux.vhdl mux.cfg
 	$(DOXYDIR)\doxygen mux.cfg
 
+manual/html/index.html: manual.c manual.cfg
+	$(DOXYDIR)\doxygen manual.cfg
+
 docstring/html/index.html: docstring.py docstring.cfg
 	$(DOXYDIR)\doxygen docstring.cfg
 	
diff --git a/examples/manual.c b/examples/manual.c
new file mode 100644
index 0000000..fac6832
--- /dev/null
+++ b/examples/manual.c
@@ -0,0 +1,87 @@
+/**
+ * \file manual.c
+ */
+
+typedef struct Object Object;   //!< Object type
+typedef struct Vehicle Vehicle; //!< Vehicle type
+typedef struct Car Car;         //!< Car type
+typedef struct Truck Truck;     //!< Truck type
+
+/*!
+ * Base object class.
+ */
+struct Object
+{
+  int ref;    //!< \private Reference count.
+};
+
+
+/*!
+ * Increments object reference count by one.
+ * \public \memberof Object
+ */
+static Object * objRef(Object *obj);
+
+
+/*!
+ * Decrements object reference count by one.
+ * \public \memberof Object
+ */
+static Object * objUnref(Object *obj);
+
+
+/*!
+ * Vehicle class.
+ * \extends Object
+ */
+struct Vehicle
+{
+  Object base;    //!< \protected Base class.
+};
+
+
+/*!
+ * Starts the vehicle.
+ * \public \memberof Vehicle
+ */
+void vehicleStart(Vehicle *obj);
+
+
+/*!
+ * Stops the vehicle.
+ * \public \memberof Vehicle
+ */
+void vehicleStop(Vehicle *obj);
+
+
+/*!
+ * Car class.
+ * \extends Vehicle
+ */
+struct Car
+{
+  Vehicle base;    //!< \protected Base class.
+};
+
+
+/*!
+ * Truck class.
+ * \extends Vehicle
+ */
+struct Truck
+{
+  Vehicle base;    //!< \protected Base class.
+};
+
+
+/*!
+ * Main function.
+ *
+ * Ref vehicleStart(), objRef(), objUnref().
+ */
+int main(void)
+{
+  Car c;
+  vehicleStart((Vehicle*) &c);
+}
+
diff --git a/examples/manual.cfg b/examples/manual.cfg
new file mode 100644
index 0000000..0b9f798
--- /dev/null
+++ b/examples/manual.cfg
@@ -0,0 +1,15 @@
+PROJECT_NAME           = "Manual inheritance and membership"
+OUTPUT_DIRECTORY       = manual
+GENERATE_LATEX         = NO
+GENERATE_MAN           = NO
+GENERATE_RTF           = NO
+CASE_SENSE_NAMES       = NO
+INPUT                  = manual.c
+QUIET                  = YES
+JAVADOC_AUTOBRIEF      = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+TYPEDEF_HIDES_STRUCT   = YES
+INLINE_SOURCES         = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
diff --git a/src/classdef.cpp b/src/classdef.cpp
index cf4b4be..d30ee62 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -374,40 +374,40 @@ void ClassDef::internalInsertMember(MemberDef *md,
     /********************************************/
     if (md->isRelated() && (extractPrivate || prot!=Private))
     {
-      addMemberToList(MemberList::related,md);
+      addMemberToList(MemberList::related,md,true);
     }
     else if (md->isFriend())
     {
-      addMemberToList(MemberList::friends,md);
+      addMemberToList(MemberList::friends,md,true);
     }
     else
     {
       switch (md->memberType())
       {
         case MemberDef::Signal: // Qt specific
-          addMemberToList(MemberList::signals,md);
+          addMemberToList(MemberList::signals,md,true);
           break;
         case MemberDef::DCOP:   // KDE2 specific
-          addMemberToList(MemberList::dcopMethods,md);
+          addMemberToList(MemberList::dcopMethods,md,true);
           break;
         case MemberDef::Property:
-          addMemberToList(MemberList::properties,md);
+          addMemberToList(MemberList::properties,md,true);
           break;
         case MemberDef::Event:
-          addMemberToList(MemberList::events,md);
+          addMemberToList(MemberList::events,md,true);
           break;
         case MemberDef::Slot:   // Qt specific
           switch (prot)
           {
             case Protected: 
             case Package: // slots in packages are not possible!
-              addMemberToList(MemberList::proSlots,md);
+              addMemberToList(MemberList::proSlots,md,true);
               break;
             case Public:    
-              addMemberToList(MemberList::pubSlots,md);
+              addMemberToList(MemberList::pubSlots,md,true);
               break;
             case Private:   
-              addMemberToList(MemberList::priSlots,md);
+              addMemberToList(MemberList::priSlots,md,true);
               break;
           }
           break;
@@ -419,16 +419,16 @@ void ClassDef::internalInsertMember(MemberDef *md,
               switch (prot)
               {
                 case Protected: 
-                  addMemberToList(MemberList::proStaticAttribs,md);
+                  addMemberToList(MemberList::proStaticAttribs,md,true);
                   break;
                 case Package: 
-                  addMemberToList(MemberList::pacStaticAttribs,md);
+                  addMemberToList(MemberList::pacStaticAttribs,md,true);
                   break;
                 case Public:    
-                  addMemberToList(MemberList::pubStaticAttribs,md);
+                  addMemberToList(MemberList::pubStaticAttribs,md,true);
                   break;
                 case Private:   
-                  addMemberToList(MemberList::priStaticAttribs,md);
+                  addMemberToList(MemberList::priStaticAttribs,md,true);
                   break;
               }
             }
@@ -437,16 +437,16 @@ void ClassDef::internalInsertMember(MemberDef *md,
               switch (prot)
               {
                 case Protected: 
-                  addMemberToList(MemberList::proStaticMethods,md);
+                  addMemberToList(MemberList::proStaticMethods,md,true);
                   break;
                 case Package: 
-                  addMemberToList(MemberList::pacStaticMethods,md);
+                  addMemberToList(MemberList::pacStaticMethods,md,true);
                   break;
                 case Public:    
-                  addMemberToList(MemberList::pubStaticMethods,md);
+                  addMemberToList(MemberList::pubStaticMethods,md,true);
                   break;
                 case Private:   
-                  addMemberToList(MemberList::priStaticMethods,md);
+                  addMemberToList(MemberList::priStaticMethods,md,true);
                   break;
               }
             }
@@ -458,16 +458,16 @@ void ClassDef::internalInsertMember(MemberDef *md,
               switch (prot)
               {
                 case Protected: 
-                  addMemberToList(MemberList::proAttribs,md);
+                  addMemberToList(MemberList::proAttribs,md,true);
                   break;
                 case Package:
-                  addMemberToList(MemberList::pacAttribs,md);
+                  addMemberToList(MemberList::pacAttribs,md,true);
                   break;
                 case Public:    
-                  addMemberToList(MemberList::pubAttribs,md);
+                  addMemberToList(MemberList::pubAttribs,md,true);
                   break;
                 case Private:   
-                  addMemberToList(MemberList::priAttribs,md);
+                  addMemberToList(MemberList::priAttribs,md,true);
                   break;
               }
             }
@@ -476,16 +476,16 @@ void ClassDef::internalInsertMember(MemberDef *md,
               switch (prot)
               {
                 case Protected: 
-                  addMemberToList(MemberList::proTypes,md);
+                  addMemberToList(MemberList::proTypes,md,true);
                   break;
                 case Package: 
-                  addMemberToList(MemberList::pacTypes,md);
+                  addMemberToList(MemberList::pacTypes,md,true);
                   break;
                 case Public:    
-                  addMemberToList(MemberList::pubTypes,md);
+                  addMemberToList(MemberList::pubTypes,md,true);
                   break;
                 case Private:   
-                  addMemberToList(MemberList::priTypes,md);
+                  addMemberToList(MemberList::priTypes,md,true);
                   break;
               }
             }
@@ -494,16 +494,16 @@ void ClassDef::internalInsertMember(MemberDef *md,
               switch (prot)
               {
                 case Protected: 
-                  addMemberToList(MemberList::proMethods,md);
+                  addMemberToList(MemberList::proMethods,md,true);
                   break;
                 case Package: 
-                  addMemberToList(MemberList::pacMethods,md);
+                  addMemberToList(MemberList::pacMethods,md,true);
                   break;
                 case Public:    
-                  addMemberToList(MemberList::pubMethods,md);
+                  addMemberToList(MemberList::pubMethods,md,true);
                   break;
                 case Private:   
-                  addMemberToList(MemberList::priMethods,md);
+                  addMemberToList(MemberList::priMethods,md,true);
                   break;
               }
             }
@@ -517,21 +517,21 @@ void ClassDef::internalInsertMember(MemberDef *md,
     /*******************************************************/
     if ((md->isRelated() && (extractPrivate || prot!=Private)) || md->isFriend())
     {
-      addMemberToList(MemberList::relatedMembers,md);
+      addMemberToList(MemberList::relatedMembers,md,false);
     }
     else
     {
       switch (md->memberType())
       {
         case MemberDef::Property:
-          addMemberToList(MemberList::propertyMembers,md);
+          addMemberToList(MemberList::propertyMembers,md,false);
           break;
         case MemberDef::Event:
-          addMemberToList(MemberList::eventMembers,md);
+          addMemberToList(MemberList::eventMembers,md,false);
           break;
         case MemberDef::Signal: // fall through
         case MemberDef::DCOP:
-          addMemberToList(MemberList::functionMembers,md);
+          addMemberToList(MemberList::functionMembers,md,false);
           break;
         case MemberDef::Slot:
           switch (prot)
@@ -539,12 +539,12 @@ void ClassDef::internalInsertMember(MemberDef *md,
             case Protected: 
             case Package: 
             case Public:    
-              addMemberToList(MemberList::functionMembers,md);
+              addMemberToList(MemberList::functionMembers,md,false);
               break;
             case Private:   
               if (extractPrivate)
               {
-                addMemberToList(MemberList::functionMembers,md);
+                addMemberToList(MemberList::functionMembers,md,false);
               }
               break;
           }
@@ -555,13 +555,13 @@ void ClassDef::internalInsertMember(MemberDef *md,
             switch (md->memberType())
             {
               case MemberDef::Typedef:
-                addMemberToList(MemberList::typedefMembers,md);
+                addMemberToList(MemberList::typedefMembers,md,false);
                 break;
               case MemberDef::Enumeration:
-                addMemberToList(MemberList::enumMembers,md);
+                addMemberToList(MemberList::enumMembers,md,false);
                 break;
               case MemberDef::EnumValue:
-                addMemberToList(MemberList::enumValMembers,md);
+                addMemberToList(MemberList::enumValMembers,md,false);
                 break;
               case MemberDef::Function:
                 if (md->isConstructor() || md->isDestructor())
@@ -571,11 +571,11 @@ void ClassDef::internalInsertMember(MemberDef *md,
                 }
                 else
                 {
-                  addMemberToList(MemberList::functionMembers,md);
+                  addMemberToList(MemberList::functionMembers,md,false);
                 }
                 break;
               case MemberDef::Variable:
-                addMemberToList(MemberList::variableMembers,md);
+                addMemberToList(MemberList::variableMembers,md,false);
                 break;
               default:
                 err("Unexpected member type %d found!\n",md->memberType());
@@ -3168,11 +3168,14 @@ MemberList *ClassDef::getMemberList(MemberList::ListType lt)
   return 0;
 }
 
-void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
+void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrief)
 {
   static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
+  static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
   MemberList *ml = createMemberList(lt);
-  if (sortBriefDocs)
+  if (( isBrief && sortBriefDocs ) ||
+      (!isBrief && sortMemberDocs)
+     )
     ml->inSort(md);
   else
     ml->append(md);
diff --git a/src/classdef.h b/src/classdef.h
index 69e7368..8659449 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -327,7 +327,7 @@ class ClassDef : public Definition
   private: 
     void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
     QCString getMemberListFileName() const;
-    void addMemberToList(MemberList::ListType lt,MemberDef *md);
+    void addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrief);
     MemberList *createMemberList(MemberList::ListType lt);
     void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title,
                                  const char *subTitle=0);
diff --git a/src/commentscan.l b/src/commentscan.l
index cfbc050..8351407 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -79,6 +79,7 @@ static bool handleDeprecated(const QCString &);
 static bool handleXRefItem(const QCString &);
 static bool handleRelated(const QCString &);
 static bool handleRelatedAlso(const QCString &);
+static bool handleMemberOf(const QCString &);
 static bool handleRefItem(const QCString &);
 static bool handleSection(const QCString &);
 static bool handleAnchor(const QCString &);
@@ -106,6 +107,7 @@ static bool handleProtectedSection(const QCString &);
 static bool handlePublic(const QCString &s);
 static bool handlePublicSection(const QCString &s);
 static bool handleInherit(const QCString &);
+static bool handleExtends(const QCString &);
 
 typedef bool (*DocCmdFunc)(const QCString &name);
 
@@ -197,6 +199,9 @@ static DocCmdMap docCmdMap[] =
   { "public",          &handlePublic,           FALSE },
   { "publicsection",   &handlePublicSection,    FALSE },
   { "inherit",         &handleInherit,          TRUE  },
+  { "extends",         &handleExtends,          TRUE  },
+  { "implements",      &handleExtends,          TRUE  },
+  { "memberof",        &handleMemberOf,         TRUE  },
   { "arg",             0,                       TRUE  },
   { "attention",       0,                       TRUE  },
   { "author",          0,                       TRUE  },
@@ -840,6 +845,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 %x	FnParam
 %x	OverloadParam
 %x	InheritParam
+%x	ExtendsParam
 %x      ReadFormulaShort
 %x	ReadFormulaLong
 %x	AnchorLabel
@@ -920,7 +926,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 					  {
 					    if (cmdPtr->endsBrief)
 					    { 
-				              briefEndsAtDot=FALSE;
+					      briefEndsAtDot=FALSE;
 					      // this command forces the end of brief description
 					      setOutput(OutputDoc);
 					    }
@@ -1366,7 +1372,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
   					}
 
 
-  /* --------- handle arguments of the relates(also) command ------------ */
+  /* ----- handle arguments of the relates(also)/memberof command ------- */
 
 <RelatesParam1>({ID}("::"|"."))*{ID}	{ // argument
   					  current->relates = yytext;
@@ -1382,7 +1388,7 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
   					}
 <RelatesParam1>{DOCNL}			{ // missing argument
   					  warn(yyFileName,yyLineNr,
-					      "Warning: Missing argument of \\relates command"
+					      "Warning: Missing argument of \\relates or \\memberof command"
 					      );
   					  if (*yytext=='\n') yyLineNr++;
 					  addOutput('\n');
@@ -1800,6 +1806,25 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 					  BEGIN(Comment);
   					}
 
+  /* ----- handle argument of extends and implements commands ------- */
+
+<ExtendsParam>({ID}("::"|"."))*{ID}	{ // found argument
+					  current->extends->append(
+					    new BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
+					  );
+					  BEGIN( Comment );
+  					}
+<ExtendsParam>{DOCNL}			{ // missing argument
+  					  warn(yyFileName,yyLineNr,
+					      "Warning: \\extends or \\implements command has no argument"
+					      );
+  					  if (*yytext=='\n') yyLineNr++;
+					  addOutput('\n');
+					  BEGIN( Comment );
+  					}
+<ExtendsParam>.				{ // ignore other stuff
+  					}
+
   /* ----- handle language specific sections ------- */
 
 <SkipLang>[\\@]"~"[a-zA-Z]*        { /* language switch */
@@ -2060,7 +2085,14 @@ static bool handleRelated(const QCString &)
 
 static bool handleRelatedAlso(const QCString &)
 {
-  current->relatesDup = TRUE;
+  current->relatesType = Duplicate;
+  BEGIN(RelatesParam1);
+  return FALSE;
+}
+
+static bool handleMemberOf(const QCString &)
+{
+  current->relatesType = MemberOf;
   BEGIN(RelatesParam1);
   return FALSE;
 }
@@ -2257,53 +2289,52 @@ static bool handlePure(const QCString &)
 
 static bool handlePrivate(const QCString &)
 {
-  endBrief();
-  current->protection = Private; 
+  current->protection = Private;
   return FALSE;
 }
 
 static bool handlePrivateSection(const QCString &)
 {
-  endBrief();
-  current->protection = protection = Private; 
+  current->protection = protection = Private;
   return FALSE;
 }
 
 static bool handleProtected(const QCString &)
 {
-  endBrief();
-  current->protection = Protected; 
+  current->protection = Protected;
   return FALSE;
 }
 
 static bool handleProtectedSection(const QCString &)
 {
-  endBrief();
   current->protection = protection = Protected ;
   return FALSE;
 }
 
 static bool handlePublic(const QCString &)
 {
-  endBrief();
   current->protection = Public;
   return FALSE;
 }
 
 static bool handlePublicSection(const QCString &)
 {
-  endBrief();
-  current->protection = protection = Public; 
+  current->protection = protection = Public;
   return FALSE;
 }
 
 static bool handleInherit(const QCString &)
 {
-  endBrief();
   BEGIN(InheritParam);
   return FALSE;
 }
 
+static bool handleExtends(const QCString &)
+{
+  BEGIN(ExtendsParam);
+  return FALSE;
+}
+
 //----------------------------------------------------------------------------
 
 static void checkFormula()
diff --git a/src/config.l b/src/config.l
index ee1ebab..9fffc0b 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1779,6 +1779,24 @@ void Config::create()
 		    "types are typedef'ed and only the typedef is referenced, never the tag name.\n",
 		    FALSE
                 );
+  ci = addInt(
+                    "SYMBOL_CACHE_SIZE",
+                    "The SYMBOL_CACHE_SIZE determines the size of the internal cache use to \n"
+		    "determine which symbols to keep in memory and which to flush to disk.\n"
+		    "When the cache is full, less often used symbols will be written to disk.\n"
+		    "For small to medium size projects (<1000 input files) the default value is \n"
+		    "probably good enough. For larger projects a too small cache size can cause \n"
+		    "doxygen to be busy swapping symbols to and from disk most of the time \n"
+		    "causing a significant performance penality. \n"
+		    "If the system has enough physical memory increasing the cache will improve the \n"
+		    "performance by keeping more symbols in memory. Note that the value works on \n"
+		    "a logarithmic scale so increasing the size by one will rougly double the \n"
+		    "memory usage. The cache size is given by this formula: \n"
+		    "2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, \n"
+		    "corresponding to a cache size of 2^16 = 65536 symbols\n",
+                    0,9,0
+             );
+
   //-----------------------------------------------------------------------------------------------
   addInfo("Build","Build related configuration options");
   //-----------------------------------------------------------------------------------------------
@@ -2410,6 +2428,31 @@ void Config::create()
                    );
   cs->setWidgetType(ConfigString::File);
   cs->addDependency("GENERATE_HTML");
+  cs = addString(
+                    "QTHELP_FILE",
+                    "If the GENERATE_HTMLHELP tag is set to YES, the QTHELP_FILE tag can \n"
+                    "be used to specify the file name of the resulting .(qch|qhp) file. \n"
+                    "You can add a path in front of the file if the result should not be \n"
+                    "written to the html output directory. \n"
+                   );
+  cs->setWidgetType(ConfigString::File);
+  cs->addDependency("GENERATE_HTML");
+  cs = addString(
+                    "QTHELP_CONFIG",
+                    "If DOXYGEN2QTHELP_LOC is set, QTHELP_CONFIG must specify the file name \n"
+                    "of a config file to pass to doxygen2qthelp. \n"
+                   );
+  cs->setWidgetType(ConfigString::File);
+  cs->addDependency("GENERATE_HTML");
+  cs = addString(
+                    "DOXYGEN2QTHELP_LOC",
+                    "If the GENERATE_HTMLHELP tag is set to YES, the DOXYGEN2QTHELP_LOC tag \n"
+                    "can be used to specify the location (absolute path including file name) of \n"
+                    "the doxygen2qthelp tool. If non-empty doxygen will try to run doxygen2qthelp \n"
+                    "on the generated index.hhp.\n"
+                   );
+  cs->setWidgetType(ConfigString::File);
+  cs->addDependency("GENERATE_HTML");
   cb = addBool(
                     "GENERATE_CHI",
                     "If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n"
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index c2cd624..826b86d 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1794,7 +1794,7 @@ static void findUsingDeclImports(EntryNav *rootNav)
                       root->fileName,root->startLine,
                       md->typeString(),memName,md->argsString(),
                       md->excpString(),root->protection,root->virt,
-                      md->isStatic(),FALSE,md->memberType(),
+                      md->isStatic(),Member,md->memberType(),
                       templAl.pointer(),al.pointer()
                       );
                   }
@@ -1880,7 +1880,7 @@ static MemberDef *addVariableToClass(
     bool fromAnnScope,
     MemberDef *fromAnnMemb,
     Protection prot,
-    bool related)
+    Relationship related)
 {
   Entry *root = rootNav->entry();
 
@@ -2145,7 +2145,7 @@ static MemberDef *addVariableToFile(
   MemberDef *md=new MemberDef(
       root->fileName,root->startLine,
       root->type,name,root->args,0,
-      Public, Normal,root->stat,FALSE,
+      Public, Normal,root->stat,Member,
       mtype,0,0);
   md->setTagInfo(rootNav->tagInfo());
   md->setDocumentation(root->doc,root->docFile,root->docLine);
@@ -2427,6 +2427,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
     QCString type=root->type.stripWhiteSpace();
     ClassDef *cd=0;
     bool isRelated=FALSE;
+    bool isMemberOf=FALSE;
 
     QCString classScope=stripAnonymousNamespaceScope(scope);
     classScope=stripTemplateSpecifiersFromScope(classScope,FALSE);
@@ -2447,7 +2448,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
                               FALSE,  // from Anonymous scope
                               0,      // anonymous member
                               Public, // protection
-                              FALSE   // related to a class
+                              Member  // related to a class
                              );
          }
       }
@@ -2476,6 +2477,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
     if (!root->relates.isEmpty()) // related variable
     {
       isRelated=TRUE;
+      isMemberOf=(root->relatesType == MemberOf);
       if (getClass(root->relates)==0 && !scope.isEmpty())
         scope=mergeScopes(scope,root->relates);
       else 
@@ -2517,7 +2519,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
                                   TRUE,  // from anonymous scope
                                   0,     // from anonymous member
                                   root->protection,
-                                  isRelated
+                                  isMemberOf ? Foreign : isRelated ? Related : Member
                                  );
             added=TRUE;
           }
@@ -2541,7 +2543,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1)
                          FALSE,  // from anonymous scope
                          md,     // from anonymous member
                          root->protection, 
-                         isRelated);
+                         isMemberOf ? Foreign : isRelated ? Related : Member);
     }
     else if (!name.isEmpty()) // global variable
     {
@@ -2662,7 +2664,10 @@ static void addMethodToClass(EntryNav *rootNav,ClassDef *cd,
   MemberDef *md=new MemberDef(
       root->fileName,root->startLine,
       root->type,name,root->args,root->exception,
-      root->protection,root->virt,root->stat,!root->relates.isEmpty(),
+      root->protection,root->virt,
+      root->stat && root->relatesType != MemberOf,
+      root->relates.isEmpty() ? Member :
+          root->relatesType == MemberOf ? Foreign : Related,
       mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList);
   md->setTagInfo(rootNav->tagInfo());
   md->setMemberClass(cd);
@@ -2787,13 +2792,13 @@ static void buildFunctionList(EntryNav *rootNav)
 
     Debug::print(Debug::Functions,0,
                  "FUNCTION_SEC:\n"
-                 "  `%s' `%s'::`%s' `%s' relates=`%s' relatesDup=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%d proto=%d docFile=%s\n",
+                 "  `%s' `%s'::`%s' `%s' relates=`%s' relatesType=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d spec=%d proto=%d docFile=%s\n",
                  root->type.data(),
                  rootNav->parent()->name().data(),
                  root->name.data(),
                  root->args.data(),
                  root->relates.data(),
-                 root->relatesDup,
+                 root->relatesType,
                  root->fileName.data(),
                  root->startLine,
                  root->bodyLine,
@@ -2870,7 +2875,7 @@ static void buildFunctionList(EntryNav *rootNav)
                  || rootNav->parent()->section()==Entry::OBJCIMPL_SEC
                 ) &&
                !isMember &&
-               (root->relates.isEmpty() || root->relatesDup) &&
+               (root->relates.isEmpty() || root->relatesType == Duplicate) &&
                root->type.left(7)!="extern " && root->type.left(8)!="typedef " 
               )
       // no member => unrelated function 
@@ -3013,7 +3018,7 @@ static void buildFunctionList(EntryNav *rootNav)
           md=new MemberDef(
               root->fileName,root->startLine,
               root->type,name,root->args,root->exception,
-              root->protection,root->virt,root->stat,FALSE,
+              root->protection,root->virt,root->stat,Member,
               MemberDef::Function,tArgList,root->argList);
 
           md->setTagInfo(rootNav->tagInfo());
@@ -3127,8 +3132,8 @@ static void buildFunctionList(EntryNav *rootNav)
             Doxygen::functionNameSDict->append(name,mn);
           }
           addMemberToGroups(root,md);
-          if (!root->relatesDup) // if this is a relatesalso command, allow find
-                                 // Member to pick it up
+          if (root->relatesType == Simple) // if this is a relatesalso command,
+                                           // allow find Member to pick it up
           {
             rootNav->changeSection(Entry::EMPTY_SEC); // Otherwise we have finished 
                                                       // with this entry.
@@ -3551,7 +3556,7 @@ static void transferRelatedFunctionDocumentation()
           LockingPtr<ArgumentList>  mdAl = md->argumentList();
           LockingPtr<ArgumentList> rmdAl = rmd->argumentList();
           //printf("  Member found: related=`%d'\n",rmd->isRelated());
-          if (rmd->isRelated() && // related function
+          if ((rmd->isRelated() || rmd->isForeign()) && // related function
               matchArguments2( md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
                               rmd->getOuterScope(),rmd->getFileDef(),rmdAl.pointer(),
                               TRUE
@@ -3561,6 +3566,8 @@ static void transferRelatedFunctionDocumentation()
             //printf("  Found related member `%s'\n",md->name().data());
             if (rmd->relatedAlso())
               md->setRelatedAlso(rmd->relatedAlso());
+            else if (rmd->isForeign())
+              md->makeForeign();
             else
               md->makeRelated();
           } 
@@ -4928,7 +4935,7 @@ static bool findGlobalMember(EntryNav *rootNav,
         }
       }
     } 
-    if (!found && !root->relatesDup) // no match
+    if (!found && root->relatesType != Duplicate) // no match
     {
       QCString fullFuncDecl=decl;
       if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
@@ -5114,6 +5121,7 @@ static void findMember(EntryNav *rootNav,
   QCString exceptions;
   QCString funcSpec;
   bool isRelated=FALSE;
+  bool isMemberOf=FALSE;
   bool isFriend=FALSE;
   bool done;
   do
@@ -5195,6 +5203,7 @@ static void findMember(EntryNav *rootNav,
   if (!root->relates.isEmpty()) 
   {                             // related member, prefix user specified scope
     isRelated=TRUE;
+    isMemberOf=(root->relatesType == MemberOf);
     if (getClass(root->relates)==0 && !scopeName.isEmpty())
       scopeName= mergeScopes(scopeName,root->relates);
     else 
@@ -5375,11 +5384,12 @@ static void findMember(EntryNav *rootNav,
            "  related=`%s'\n" 
            "  exceptions=`%s'\n"
            "  isRelated=%d\n"
+           "  isMemberOf=%d\n"
            "  isFriend=%d\n"
            "  isFunc=%d\n\n",
            namespaceName.data(),className.data(),
            funcType.data(),funcSpec.data(),funcName.data(),funcArgs.data(),funcTempList.data(),
-           funcDecl.data(),root->relates.data(),exceptions.data(),isRelated,isFriend,
+           funcDecl.data(),root->relates.data(),exceptions.data(),isRelated,isMemberOf,isFriend,
            isFunc
           );
 
@@ -5621,7 +5631,7 @@ static void findMember(EntryNav *rootNav,
           MemberDef *md=new MemberDef(
               root->fileName,root->startLine,
               funcType,funcName,funcArgs,exceptions,
-              root->protection,root->virt,root->stat,FALSE,
+              root->protection,root->virt,root->stat,Member,
               mtype,tArgList,root->argList);
           //printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
           md->setTagInfo(rootNav->tagInfo());
@@ -5685,7 +5695,7 @@ static void findMember(EntryNav *rootNav,
           MemberDef *md=new MemberDef(
               root->fileName,root->startLine,
               funcType,funcName,funcArgs,exceptions,
-              root->protection,root->virt,root->stat,TRUE,
+              root->protection,root->virt,root->stat,Related,
               mtype,tArgList,root->argList);
           md->setTagInfo(rootNav->tagInfo());
           md->setTypeConstraints(root->typeConstr);
@@ -5814,7 +5824,9 @@ static void findMember(EntryNav *rootNav,
           MemberDef *md=new MemberDef(
               root->fileName,root->startLine,
               funcType,funcName,funcArgs,exceptions,
-              root->protection,root->virt,root->stat,TRUE,
+              root->protection,root->virt,
+              root->stat && !isMemberOf,
+              isMemberOf ? Foreign : isRelated ? Related : Member,
               mtype,
               (root->tArgLists ? root->tArgLists->last() : 0),
               funcArgs.isEmpty() ? 0 : root->argList);
@@ -5897,7 +5909,7 @@ static void findMember(EntryNav *rootNav,
           cd->insertMember(md);
           cd->insertUsedFile(root->fileName);
           md->setRefItems(root->sli);
-          if (root->relatesDup) md->setRelatedAlso(cd);
+          if (root->relatesType == Duplicate) md->setRelatedAlso(cd);
           addMemberToGroups(root,md);
           //printf("Adding member=%s\n",md->name().data());
           if (newMemberName)
@@ -5907,7 +5919,7 @@ static void findMember(EntryNav *rootNav,
             Doxygen::memberNameSDict->append(funcName,mn);
           }
         }
-        if (root->relatesDup)
+        if (root->relatesType == Duplicate)
         {
           if (!findGlobalMember(rootNav,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
           {
@@ -5940,7 +5952,7 @@ localObjCMethod:
         MemberDef *md=new MemberDef(
             root->fileName,root->startLine,
             funcType,funcName,funcArgs,exceptions,
-            root->protection,root->virt,root->stat,FALSE,
+            root->protection,root->virt,root->stat,Member,
             MemberDef::Function,0,root->argList);
         md->setTagInfo(rootNav->tagInfo());
         md->makeImplementationDetail();
@@ -6020,7 +6032,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
   //printf("rootNav->parent()->name()=%s\n",rootNav->parent()->name().data());
   bool isFunc=TRUE;
 
-  if (root->relatesDup && !root->relates.isEmpty())
+  if (root->relatesType == Duplicate && !root->relates.isEmpty())
   {
     QCString tmp = root->relates;
     root->relates.resize(0);
@@ -6205,6 +6217,7 @@ static void findEnums(EntryNav *rootNav)
     MemberNameSDict *mnsd=0;
     bool isGlobal;
     bool isRelated=FALSE;
+    bool isMemberOf=FALSE;
     //printf("Found enum with name `%s' relates=%s\n",root->name.data(),root->relates.data());
     int i;
 
@@ -6232,6 +6245,7 @@ static void findEnums(EntryNav *rootNav)
     if (!root->relates.isEmpty()) 
     {   // related member, prefix user specified scope
       isRelated=TRUE;
+      isMemberOf=(root->relatesType == MemberOf);
       if (getClass(root->relates)==0 && !scope.isEmpty())
         scope=mergeScopes(scope,root->relates);
       else 
@@ -6264,7 +6278,9 @@ static void findEnums(EntryNav *rootNav)
       md = new MemberDef(
           root->fileName,root->startLine,
           0,name,0,0,
-          root->protection,Normal,FALSE,isRelated,MemberDef::Enumeration,
+          root->protection,Normal,FALSE,
+          isMemberOf ? Foreign : isRelated ? Related : Member,
+          MemberDef::Enumeration,
           0,0);
       md->setTagInfo(rootNav->tagInfo());
       if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
@@ -7463,7 +7479,7 @@ static void findDefineDocumentation(EntryNav *rootNav)
     {
       MemberDef *md=new MemberDef("<tagfile>",1,
                     "#define",root->name,root->args,0,
-                    Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
+                    Public,Normal,FALSE,Member,MemberDef::Define,0,0);
       md->setTagInfo(rootNav->tagInfo());
       //printf("Searching for `%s' fd=%p\n",filePathName.data(),fd);
       md->setFileDef(rootNav->parent()->fileDef());
@@ -8925,10 +8941,9 @@ extern void commentScanTest();
 
 void initDoxygen()
 {
-#if QT_VERSION >= 200
   setlocale(LC_ALL,"");
+  setlocale(LC_CTYPE,"C"); // to get isspace(0xA0)==0, needed for UTF-8
   setlocale(LC_NUMERIC,"C");
-#endif 
 
   //Doxygen::symbolMap->setAutoDelete(TRUE);
 
@@ -9400,8 +9415,11 @@ void parseInput()
    **************************************************************************/
 
   Doxygen::symbolMap     = new QDict<DefinitionIntf>(1000);
-  Doxygen::symbolCache   = new ObjCache(16); // 16 -> room for 65536 elements, 
-                                             //       ~2.0 MByte "overhead"
+  int cacheSize = Config_getInt("SYMBOL_CACHE_SIZE");
+  if (cacheSize<0) cacheSize=0;
+  if (cacheSize>9) cacheSize=9;
+  Doxygen::symbolCache   = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements, 
+                                                //       ~2.0 MByte "overhead"
   Doxygen::symbolStorage = new Store;
 
 #ifdef HAS_SIGNALS
@@ -10196,6 +10214,24 @@ void generateOutput()
     }
     QDir::setCurrent(oldDir);
   }
+  if ( Config_getBool("GENERATE_HTMLHELP") && 
+      !Config_getString("DOXYGEN2QTHELP_LOC").isEmpty() && 
+      !Config_getString("QTHELP_CONFIG").isEmpty())
+  {
+    msg("Running doxygen2qthelp...\n");
+    const QCString qtHelpFile = Config_getString("QTHELP_FILE");
+    const QCString args = QCString().sprintf("--config=%s index.hhp%s%s",
+        Config_getString("QTHELP_CONFIG").data(),
+        (qtHelpFile.isEmpty() ? "" : " "), (qtHelpFile.isEmpty() ? "" : qtHelpFile.data()));
+    
+    const QString oldDir = QDir::currentDirPath();
+    QDir::setCurrent(Config_getString("HTML_OUTPUT"));
+    if (portable_system(Config_getString("DOXYGEN2QTHELP_LOC"), args.data(), FALSE))
+    {
+      err("Error: failed to run doxygen2qthelp on index.hhp\n");
+    }
+    QDir::setCurrent(oldDir);
+  }
   if (Config_getBool("SEARCHENGINE"))
   {
     msg("Generating search index\n");
diff --git a/src/doxygen.css b/src/doxygen.css
index 74c22a2..c8356a2 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -1,363 +1,287 @@
-BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
-	font-family: Geneva, Arial, Helvetica, sans-serif;
+body, table, div, p, dl {
+	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+	font-size: 12px;
 }
-BODY,TD {
-	font-size: 90%;
-}
-H1 {
+
+/* @group Heading Levels */
+
+h1 {
 	text-align: center;
-	font-size: 160%;
+	font-size: 150%;
 }
-H2 {
+
+h2 {
 	font-size: 120%;
 }
-H3 {
+
+h3 {
 	font-size: 100%;
 }
-CAPTION { 
-	font-weight: bold 
+
+/* @end */
+
+caption {
+	font-weight: bold;
 }
-DIV.qindex {
-	width: 100%;
+
+div.qindex, div.navpath, div.navtab{
 	background-color: #e8eef2;
 	border: 1px solid #84b0c7;
 	text-align: center;
 	margin: 2px;
 	padding: 2px;
-	line-height: 140%;
 }
-DIV.navpath {
+
+div.qindex, div.navpath {
 	width: 100%;
-	background-color: #e8eef2;
-	border: 1px solid #84b0c7;
-	text-align: center;
-	margin: 2px;
-	padding: 2px;
 	line-height: 140%;
 }
-DIV.navtab {
-       background-color: #e8eef2;
-       border: 1px solid #84b0c7;
-       text-align: center;
-       margin: 2px;
-       margin-right: 15px;
-       padding: 2px;
+
+div.navtab {
+	margin-right: 15px;
 }
-TD.navtab {
-       font-size: 70%;
+
+/* @group Link Styling */
+
+a {
+	color: #153788;
+	font-weight: normal;
+	text-decoration: none;
 }
-A.qindex {
-       text-decoration: none;
-       font-weight: bold;
-       color: #1A419D;
+
+.contents a:visited {
+	color: #1b77c5;
 }
-A.qindex:visited {
-       text-decoration: none;
-       font-weight: bold;
-       color: #1A419D
+
+a:hover {
+	text-decoration: underline;
 }
-A.qindex:hover {
-	text-decoration: none;
-	background-color: #ddddff;
+
+a.qindex {
+	font-weight: bold;
 }
-A.qindexHL {
-	text-decoration: none;
+
+a.qindexHL {
 	font-weight: bold;
 	background-color: #6666cc;
 	color: #ffffff;
 	border: 1px double #9295C2;
 }
-A.qindexHL:hover {
-	text-decoration: none;
-	background-color: #6666cc;
-	color: #ffffff;
-}
-A.qindexHL:visited { 
-	text-decoration: none; 
-	background-color: #6666cc; 
-	color: #ffffff 
+
+a.el {
+	font-weight: bold;
 }
-A.el { 
-	text-decoration: none; 
-	font-weight: bold 
+
+a.elRef {
 }
-A.elRef { 
-	font-weight: bold 
+
+a.code {
 }
-A.code:link { 
-	text-decoration: none; 
-	font-weight: normal; 
-	color: #0000FF
+
+a.codeRef {
 }
-A.code:visited { 
-	text-decoration: none; 
-	font-weight: normal; 
-	color: #0000FF
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
 }
-A.codeRef:link { 
-	font-weight: normal; 
-	color: #0000FF
+
+.fragment {
+	font-family: monospace, fixed;
+	font-size: 105%;
 }
-A.codeRef:visited { 
-	font-weight: normal; 
-	color: #0000FF
+
+pre.fragment {
+	border: 1px solid #CCCCCC;
+	background-color: #f5f5f5;
+	padding: 4px 6px;
+	margin: 4px 8px 4px 2px;
 }
-A:hover { 
-	text-decoration: none; 	
-	background-color: #f2f2ff 
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px
 }
-DL.el { 
-	margin-left: -1cm 
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	margin-bottom: 6px;
+	font-weight: bold;
 }
-.fragment {
-       font-family: monospace, fixed;
-       font-size: 95%;
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
 }
-PRE.fragment {
-	border: 1px solid #CCCCCC;
-	background-color: #f5f5f5;
-	margin-top: 4px;
-	margin-bottom: 4px;
-	margin-left: 2px;
-	margin-right: 8px;
-	padding-left: 6px;
-	padding-right: 6px;
-	padding-top: 4px;
-	padding-bottom: 4px;
-}
-DIV.ah { 
-	background-color: black; 
-	font-weight: bold; 
-	color: #ffffff; 
-	margin-bottom: 3px; 
-	margin-top: 3px 
-}
-
-DIV.groupHeader {
-       margin-left: 16px;
-       margin-top: 12px;
-       margin-bottom: 6px;
-       font-weight: bold;
-}
-DIV.groupText { 
-	margin-left: 16px; 
-	font-style: italic; 
-	font-size: 90% 
-}
-BODY {
+
+body {
 	background: white;
 	color: black;
 	margin-right: 20px;
 	margin-left: 20px;
 }
-TD.indexkey {
+
+td.indexkey {
 	background-color: #e8eef2;
 	font-weight: bold;
-	padding-right  : 10px;
-	padding-top    : 2px;
-	padding-left   : 10px;
-	padding-bottom : 2px;
-	margin-left    : 0px;
-	margin-right   : 0px;
-	margin-top     : 2px;
-	margin-bottom  : 2px;
 	border: 1px solid #CCCCCC;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
 }
-TD.indexvalue {
+
+td.indexvalue {
 	background-color: #e8eef2;
-	font-style: italic;
-	padding-right  : 10px;
-	padding-top    : 2px;
-	padding-left   : 10px;
-	padding-bottom : 2px;
-	margin-left    : 0px;
-	margin-right   : 0px;
-	margin-top     : 2px;
-	margin-bottom  : 2px;
+//	font-style: italic;
 	border: 1px solid #CCCCCC;
+	padding: 2px 10px;
+	margin: 2px 0px;
 }
-TR.memlist {
-	background-color: #f0f0f0; 
+
+tr.memlist {
+	background-color: #f0f0f0;
 }
-P.formulaDsp { 
-	text-align: center; 
+
+p.formulaDsp {
+	text-align: center;
 }
-IMG.formulaDsp {
+
+img.formulaDsp {
+	
 }
-IMG.formulaInl { 
-	vertical-align: middle; 
+
+img.formulaInl {
+	vertical-align: middle;
 }
-SPAN.keyword       { color: #008000 }
-SPAN.keywordtype   { color: #604020 }
-SPAN.keywordflow   { color: #e08000 }
-SPAN.comment       { color: #800000 }
-SPAN.preprocessor  { color: #806020 }
-SPAN.stringliteral { color: #002080 }
-SPAN.charliteral   { color: #008080 }
-SPAN.vhdldigit     { color: #ff00ff }
-SPAN.vhdlchar      { color: #000000 }
-SPAN.vhdlkeyword   { color: #700070 }
-SPAN.vhdllogic     { color: #ff0000 }
 
-.mdescLeft {
-	padding: 0px 8px 4px 8px;
-	font-size: 80%;
-	font-style: italic;
-	background-color: #FAFAFA;
-	border-top: 1px none #E0E0E0;
-	border-right: 1px none #E0E0E0;
-	border-bottom: 1px none #E0E0E0;
-	border-left: 1px none #E0E0E0;
-	margin: 0px;
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
 }
-.mdescRight {
-        padding: 0px 8px 4px 8px;
-	font-size: 80%;
-	font-style: italic;
-	background-color: #FAFAFA;
-	border-top: 1px none #E0E0E0;
-	border-right: 1px none #E0E0E0;
-	border-bottom: 1px none #E0E0E0;
-	border-left: 1px none #E0E0E0;
-	margin: 0px;
+
+span.keywordtype {
+	color: #604020
 }
-.memItemLeft {
-	padding: 1px 0px 0px 8px;
-	margin: 4px;
-	border-top-width: 1px;
-	border-right-width: 1px;
-	border-bottom-width: 1px;
-	border-left-width: 1px;
-	border-top-color: #E0E0E0;
-	border-right-color: #E0E0E0;
-	border-bottom-color: #E0E0E0;
-	border-left-color: #E0E0E0;
-	border-top-style: solid;
-	border-right-style: none;
-	border-bottom-style: none;
-	border-left-style: none;
-	background-color: #FAFAFA;
-	font-size: 80%;
+
+span.keywordflow {
+	color: #e08000
 }
-.memItemRight {
-	padding: 1px 8px 0px 8px;
-	margin: 4px;
-	border-top-width: 1px;
-	border-right-width: 1px;
-	border-bottom-width: 1px;
-	border-left-width: 1px;
-	border-top-color: #E0E0E0;
-	border-right-color: #E0E0E0;
-	border-bottom-color: #E0E0E0;
-	border-left-color: #E0E0E0;
-	border-top-style: solid;
-	border-right-style: none;
-	border-bottom-style: none;
-	border-left-style: none;
-	background-color: #FAFAFA;
-	font-size: 80%;
+
+span.comment {
+	color: #800000
 }
-.memTemplItemLeft {
-	padding: 1px 0px 0px 8px;
-	margin: 4px;
-	border-top-width: 1px;
-	border-right-width: 1px;
-	border-bottom-width: 1px;
-	border-left-width: 1px;
-	border-top-color: #E0E0E0;
-	border-right-color: #E0E0E0;
-	border-bottom-color: #E0E0E0;
-	border-left-color: #E0E0E0;
-	border-top-style: none;
-	border-right-style: none;
-	border-bottom-style: none;
-	border-left-style: none;
-	background-color: #FAFAFA;
-	font-size: 80%;
+
+span.preprocessor {
+	color: #806020
 }
-.memTemplItemRight {
-	padding: 1px 8px 0px 8px;
-	margin: 4px;
-	border-top-width: 1px;
-	border-right-width: 1px;
-	border-bottom-width: 1px;
-	border-left-width: 1px;
-	border-top-color: #E0E0E0;
-	border-right-color: #E0E0E0;
-	border-bottom-color: #E0E0E0;
-	border-left-color: #E0E0E0;
-	border-top-style: none;
-	border-right-style: none;
-	border-bottom-style: none;
-	border-left-style: none;
-	background-color: #FAFAFA;
-	font-size: 80%;
+
+span.stringliteral {
+	color: #002080
 }
-.memTemplParams {
-	padding: 1px 0px 0px 8px;
-	margin: 4px;
-	border-top-width: 1px;
-	border-right-width: 1px;
-	border-bottom-width: 1px;
-	border-left-width: 1px;
-	border-top-color: #E0E0E0;
-	border-right-color: #E0E0E0;
-	border-bottom-color: #E0E0E0;
-	border-left-color: #E0E0E0;
-	border-top-style: solid;
-	border-right-style: none;
-	border-bottom-style: none;
-	border-left-style: none;
-	color: #606060;
-	background-color: #FAFAFA;
-	font-size: 80%;
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
 }
-.search { 
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+/* @end */
+
+.search {
 	color: #003399;
 	font-weight: bold;
 }
-FORM.search {
+
+form.search {
 	margin-bottom: 0px;
 	margin-top: 0px;
 }
-INPUT.search { 
+
+input.search {
 	font-size: 75%;
 	color: #000080;
 	font-weight: normal;
 	background-color: #e8eef2;
 }
-TD.tiny { 
+
+td.tiny {
 	font-size: 75%;
 }
-a {
-	color: #1A41A8;
-}
-a:visited {
-	color: #2A3798;
-}
-.dirtab { 
+
+.dirtab {
 	padding: 4px;
 	border-collapse: collapse;
 	border: 1px solid #84b0c7;
 }
-TH.dirtab { 
+
+th.dirtab {
 	background: #e8eef2;
 	font-weight: bold;
 }
-HR { 
-	height: 1px;
+
+hr {
+	height: 0;
 	border: none;
-	border-top: 1px solid black;
+	border-top: 1px solid #666;
 }
 
-/* Style for detailed member documentation */
+/* @group Member Descriptions */
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #FAFAFA;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+	border-top: 1px solid #ccc;
+}
+
+.memTemplParams {
+	color: #606060;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
 .memtemplate {
 	font-size: 80%;
 	color: #606060;
 	font-weight: normal;
 	margin-left: 3px;
-} 
-.memnav { 
+}
+
+.memnav {
 	background-color: #e8eef2;
 	border: 1px solid #84b0c7;
 	text-align: center;
@@ -365,69 +289,154 @@ HR {
 	margin-right: 15px;
 	padding: 2px;
 }
+
 .memitem {
-	padding: 4px;
-	background-color: #eef3f5;
-	border-width: 1px;
-	border-style: solid;
-	border-color: #dedeee;
-	-moz-border-radius: 8px 8px 8px 8px;
+	padding: 0;
 }
+
 .memname {
 	white-space: nowrap;
 	font-weight: bold;
 }
-.memdoc{
-	padding-left: 10px;
+
+.memproto, .memdoc {
+	border: 1px solid #84b0c7;	
 }
+
 .memproto {
+	padding: 0;
 	background-color: #d5e1e8;
-	width: 100%;
-	border-width: 1px;
-	border-style: solid;
-	border-color: #84b0c7;
 	font-weight: bold;
-	-moz-border-radius: 8px 8px 8px 8px;
+	-webkit-border-top-left-radius: 8px;
+	-webkit-border-top-right-radius: 8px;
+	-moz-border-radius-topleft: 8px;
+	-moz-border-radius-topright: 8px;
 }
+
+.memdoc {
+	padding: 2px 5px;
+	background-color: #eef3f5;
+	border-top-width: 0;
+	-webkit-border-bottom-left-radius: 8px;
+	-webkit-border-bottom-right-radius: 8px;
+	-moz-border-radius-bottomleft: 8px;
+	-moz-border-radius-bottomright: 8px;
+}
+
+.memdoc p, .memdoc dl, .memdoc ul {
+	margin: 6px 0;
+}
+
 .paramkey {
 	text-align: right;
 }
+
 .paramtype {
 	white-space: nowrap;
 }
+
 .paramname {
 	color: #602020;
-	font-style: italic;
 	white-space: nowrap;
 }
-/* End Styling for detailed member documentation */
+.paramname em {
+	font-style: normal;
+}
+
+/* @end */
+
+/* @group Directory (tree) */
 
 /* for the tree view */
+
 .ftvtree {
 	font-family: sans-serif;
-	margin:0.5em;
+	margin: 0.5em;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+	font-size: 9pt;
+	font-weight: bold;
+}
+
+.directory h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice.  Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+	height: 61px;
+	background-repeat: no-repeat;
+	background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+	display: none;
+}
+*/
+
+.directory > h3 {
+	margin-top: 0;
 }
-.directory { 
-	font-size: 9pt; 
-	font-weight: bold; 
+
+.directory p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory div {
+	display: none;
+	margin: 0px;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+	font-size: 100%;
+	font-weight: bold;
 }
-.directory h3 { 
-	margin: 0px; 
-	margin-top: 1em; 
-	font-size: 11pt; 
+
+.directory-alt h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
 }
-.directory > h3 { 
-	margin-top: 0; 
+
+.directory-alt > h3 {
+	margin-top: 0;
 }
-.directory p { 
-	margin: 0px; 
-	white-space: nowrap; 
+
+.directory-alt p {
+	margin: 0px;
+	white-space: nowrap;
 }
-.directory div { 
-	display: none; 
-	margin: 0px; 
+
+.directory-alt div {
+	display: none;
+	margin: 0px;
 }
-.directory img { 
-	vertical-align: -30%; 
+
+.directory-alt img {
+	vertical-align: -30%;
 }
 
+/* @end */
+
+address {
+	font-style: normal;
+	color: #333;
+}
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index 2c42fd5..d9d381e 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -1,363 +1,287 @@
-"BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {\n"
-"	font-family: Geneva, Arial, Helvetica, sans-serif;\n"
+"body, table, div, p, dl {\n"
+"	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;\n"
+"	font-size: 12px;\n"
 "}\n"
-"BODY,TD {\n"
-"	font-size: 90%;\n"
-"}\n"
-"H1 {\n"
+"\n"
+"/* @group Heading Levels */\n"
+"\n"
+"h1 {\n"
 "	text-align: center;\n"
-"	font-size: 160%;\n"
+"	font-size: 150%;\n"
 "}\n"
-"H2 {\n"
+"\n"
+"h2 {\n"
 "	font-size: 120%;\n"
 "}\n"
-"H3 {\n"
+"\n"
+"h3 {\n"
 "	font-size: 100%;\n"
 "}\n"
-"CAPTION { \n"
-"	font-weight: bold \n"
+"\n"
+"/* @end */\n"
+"\n"
+"caption {\n"
+"	font-weight: bold;\n"
 "}\n"
-"DIV.qindex {\n"
-"	width: 100%;\n"
+"\n"
+"div.qindex, div.navpath, div.navtab{\n"
 "	background-color: #e8eef2;\n"
 "	border: 1px solid #84b0c7;\n"
 "	text-align: center;\n"
 "	margin: 2px;\n"
 "	padding: 2px;\n"
-"	line-height: 140%;\n"
 "}\n"
-"DIV.navpath {\n"
+"\n"
+"div.qindex, div.navpath {\n"
 "	width: 100%;\n"
-"	background-color: #e8eef2;\n"
-"	border: 1px solid #84b0c7;\n"
-"	text-align: center;\n"
-"	margin: 2px;\n"
-"	padding: 2px;\n"
 "	line-height: 140%;\n"
 "}\n"
-"DIV.navtab {\n"
-"       background-color: #e8eef2;\n"
-"       border: 1px solid #84b0c7;\n"
-"       text-align: center;\n"
-"       margin: 2px;\n"
-"       margin-right: 15px;\n"
-"       padding: 2px;\n"
+"\n"
+"div.navtab {\n"
+"	margin-right: 15px;\n"
 "}\n"
-"TD.navtab {\n"
-"       font-size: 70%;\n"
+"\n"
+"/* @group Link Styling */\n"
+"\n"
+"a {\n"
+"	color: #153788;\n"
+"	font-weight: normal;\n"
+"	text-decoration: none;\n"
 "}\n"
-"A.qindex {\n"
-"       text-decoration: none;\n"
-"       font-weight: bold;\n"
-"       color: #1A419D;\n"
+"\n"
+".contents a:visited {\n"
+"	color: #1b77c5;\n"
 "}\n"
-"A.qindex:visited {\n"
-"       text-decoration: none;\n"
-"       font-weight: bold;\n"
-"       color: #1A419D\n"
+"\n"
+"a:hover {\n"
+"	text-decoration: underline;\n"
 "}\n"
-"A.qindex:hover {\n"
-"	text-decoration: none;\n"
-"	background-color: #ddddff;\n"
+"\n"
+"a.qindex {\n"
+"	font-weight: bold;\n"
 "}\n"
-"A.qindexHL {\n"
-"	text-decoration: none;\n"
+"\n"
+"a.qindexHL {\n"
 "	font-weight: bold;\n"
 "	background-color: #6666cc;\n"
 "	color: #ffffff;\n"
 "	border: 1px double #9295C2;\n"
 "}\n"
-"A.qindexHL:hover {\n"
-"	text-decoration: none;\n"
-"	background-color: #6666cc;\n"
-"	color: #ffffff;\n"
-"}\n"
-"A.qindexHL:visited { \n"
-"	text-decoration: none; \n"
-"	background-color: #6666cc; \n"
-"	color: #ffffff \n"
+"\n"
+"a.el {\n"
+"	font-weight: bold;\n"
 "}\n"
-"A.el { \n"
-"	text-decoration: none; \n"
-"	font-weight: bold \n"
+"\n"
+"a.elRef {\n"
 "}\n"
-"A.elRef { \n"
-"	font-weight: bold \n"
+"\n"
+"a.code {\n"
 "}\n"
-"A.code:link { \n"
-"	text-decoration: none; \n"
-"	font-weight: normal; \n"
-"	color: #0000FF\n"
+"\n"
+"a.codeRef {\n"
 "}\n"
-"A.code:visited { \n"
-"	text-decoration: none; \n"
-"	font-weight: normal; \n"
-"	color: #0000FF\n"
+"\n"
+"/* @end */\n"
+"\n"
+"dl.el {\n"
+"	margin-left: -1cm;\n"
 "}\n"
-"A.codeRef:link { \n"
-"	font-weight: normal; \n"
-"	color: #0000FF\n"
+"\n"
+".fragment {\n"
+"	font-family: monospace, fixed;\n"
+"	font-size: 105%;\n"
 "}\n"
-"A.codeRef:visited { \n"
-"	font-weight: normal; \n"
-"	color: #0000FF\n"
+"\n"
+"pre.fragment {\n"
+"	border: 1px solid #CCCCCC;\n"
+"	background-color: #f5f5f5;\n"
+"	padding: 4px 6px;\n"
+"	margin: 4px 8px 4px 2px;\n"
 "}\n"
-"A:hover { \n"
-"	text-decoration: none; 	\n"
-"	background-color: #f2f2ff \n"
+"\n"
+"div.ah {\n"
+"	background-color: black;\n"
+"	font-weight: bold;\n"
+"	color: #ffffff;\n"
+"	margin-bottom: 3px;\n"
+"	margin-top: 3px\n"
 "}\n"
-"DL.el { \n"
-"	margin-left: -1cm \n"
+"\n"
+"div.groupHeader {\n"
+"	margin-left: 16px;\n"
+"	margin-top: 12px;\n"
+"	margin-bottom: 6px;\n"
+"	font-weight: bold;\n"
 "}\n"
-".fragment {\n"
-"       font-family: monospace, fixed;\n"
-"       font-size: 95%;\n"
+"\n"
+"div.groupText {\n"
+"	margin-left: 16px;\n"
+"	font-style: italic;\n"
 "}\n"
-"PRE.fragment {\n"
-"	border: 1px solid #CCCCCC;\n"
-"	background-color: #f5f5f5;\n"
-"	margin-top: 4px;\n"
-"	margin-bottom: 4px;\n"
-"	margin-left: 2px;\n"
-"	margin-right: 8px;\n"
-"	padding-left: 6px;\n"
-"	padding-right: 6px;\n"
-"	padding-top: 4px;\n"
-"	padding-bottom: 4px;\n"
-"}\n"
-"DIV.ah { \n"
-"	background-color: black; \n"
-"	font-weight: bold; \n"
-"	color: #ffffff; \n"
-"	margin-bottom: 3px; \n"
-"	margin-top: 3px \n"
-"}\n"
-"\n"
-"DIV.groupHeader {\n"
-"       margin-left: 16px;\n"
-"       margin-top: 12px;\n"
-"       margin-bottom: 6px;\n"
-"       font-weight: bold;\n"
-"}\n"
-"DIV.groupText { \n"
-"	margin-left: 16px; \n"
-"	font-style: italic; \n"
-"	font-size: 90% \n"
-"}\n"
-"BODY {\n"
+"\n"
+"body {\n"
 "	background: white;\n"
 "	color: black;\n"
 "	margin-right: 20px;\n"
 "	margin-left: 20px;\n"
 "}\n"
-"TD.indexkey {\n"
+"\n"
+"td.indexkey {\n"
 "	background-color: #e8eef2;\n"
 "	font-weight: bold;\n"
-"	padding-right  : 10px;\n"
-"	padding-top    : 2px;\n"
-"	padding-left   : 10px;\n"
-"	padding-bottom : 2px;\n"
-"	margin-left    : 0px;\n"
-"	margin-right   : 0px;\n"
-"	margin-top     : 2px;\n"
-"	margin-bottom  : 2px;\n"
 "	border: 1px solid #CCCCCC;\n"
+"	margin: 2px 0px 2px 0;\n"
+"	padding: 2px 10px;\n"
 "}\n"
-"TD.indexvalue {\n"
+"\n"
+"td.indexvalue {\n"
 "	background-color: #e8eef2;\n"
-"	font-style: italic;\n"
-"	padding-right  : 10px;\n"
-"	padding-top    : 2px;\n"
-"	padding-left   : 10px;\n"
-"	padding-bottom : 2px;\n"
-"	margin-left    : 0px;\n"
-"	margin-right   : 0px;\n"
-"	margin-top     : 2px;\n"
-"	margin-bottom  : 2px;\n"
+"//	font-style: italic;\n"
 "	border: 1px solid #CCCCCC;\n"
+"	padding: 2px 10px;\n"
+"	margin: 2px 0px;\n"
 "}\n"
-"TR.memlist {\n"
-"	background-color: #f0f0f0; \n"
+"\n"
+"tr.memlist {\n"
+"	background-color: #f0f0f0;\n"
 "}\n"
-"P.formulaDsp { \n"
-"	text-align: center; \n"
+"\n"
+"p.formulaDsp {\n"
+"	text-align: center;\n"
 "}\n"
-"IMG.formulaDsp {\n"
+"\n"
+"img.formulaDsp {\n"
+"	\n"
 "}\n"
-"IMG.formulaInl { \n"
-"	vertical-align: middle; \n"
+"\n"
+"img.formulaInl {\n"
+"	vertical-align: middle;\n"
 "}\n"
-"SPAN.keyword       { color: #008000 }\n"
-"SPAN.keywordtype   { color: #604020 }\n"
-"SPAN.keywordflow   { color: #e08000 }\n"
-"SPAN.comment       { color: #800000 }\n"
-"SPAN.preprocessor  { color: #806020 }\n"
-"SPAN.stringliteral { color: #002080 }\n"
-"SPAN.charliteral   { color: #008080 }\n"
-"SPAN.vhdldigit     { color: #ff00ff }\n"
-"SPAN.vhdlchar      { color: #000000 }\n"
-"SPAN.vhdlkeyword   { color: #700070 }\n"
-"SPAN.vhdllogic     { color: #ff0000 }\n"
 "\n"
-".mdescLeft {\n"
-"	padding: 0px 8px 4px 8px;\n"
-"	font-size: 80%;\n"
-"	font-style: italic;\n"
-"	background-color: #FAFAFA;\n"
-"	border-top: 1px none #E0E0E0;\n"
-"	border-right: 1px none #E0E0E0;\n"
-"	border-bottom: 1px none #E0E0E0;\n"
-"	border-left: 1px none #E0E0E0;\n"
-"	margin: 0px;\n"
+"/* @group Code Colorization */\n"
+"\n"
+"span.keyword {\n"
+"	color: #008000\n"
 "}\n"
-".mdescRight {\n"
-"        padding: 0px 8px 4px 8px;\n"
-"	font-size: 80%;\n"
-"	font-style: italic;\n"
-"	background-color: #FAFAFA;\n"
-"	border-top: 1px none #E0E0E0;\n"
-"	border-right: 1px none #E0E0E0;\n"
-"	border-bottom: 1px none #E0E0E0;\n"
-"	border-left: 1px none #E0E0E0;\n"
-"	margin: 0px;\n"
+"\n"
+"span.keywordtype {\n"
+"	color: #604020\n"
 "}\n"
-".memItemLeft {\n"
-"	padding: 1px 0px 0px 8px;\n"
-"	margin: 4px;\n"
-"	border-top-width: 1px;\n"
-"	border-right-width: 1px;\n"
-"	border-bottom-width: 1px;\n"
-"	border-left-width: 1px;\n"
-"	border-top-color: #E0E0E0;\n"
-"	border-right-color: #E0E0E0;\n"
-"	border-bottom-color: #E0E0E0;\n"
-"	border-left-color: #E0E0E0;\n"
-"	border-top-style: solid;\n"
-"	border-right-style: none;\n"
-"	border-bottom-style: none;\n"
-"	border-left-style: none;\n"
-"	background-color: #FAFAFA;\n"
-"	font-size: 80%;\n"
+"\n"
+"span.keywordflow {\n"
+"	color: #e08000\n"
 "}\n"
-".memItemRight {\n"
-"	padding: 1px 8px 0px 8px;\n"
-"	margin: 4px;\n"
-"	border-top-width: 1px;\n"
-"	border-right-width: 1px;\n"
-"	border-bottom-width: 1px;\n"
-"	border-left-width: 1px;\n"
-"	border-top-color: #E0E0E0;\n"
-"	border-right-color: #E0E0E0;\n"
-"	border-bottom-color: #E0E0E0;\n"
-"	border-left-color: #E0E0E0;\n"
-"	border-top-style: solid;\n"
-"	border-right-style: none;\n"
-"	border-bottom-style: none;\n"
-"	border-left-style: none;\n"
-"	background-color: #FAFAFA;\n"
-"	font-size: 80%;\n"
+"\n"
+"span.comment {\n"
+"	color: #800000\n"
 "}\n"
-".memTemplItemLeft {\n"
-"	padding: 1px 0px 0px 8px;\n"
-"	margin: 4px;\n"
-"	border-top-width: 1px;\n"
-"	border-right-width: 1px;\n"
-"	border-bottom-width: 1px;\n"
-"	border-left-width: 1px;\n"
-"	border-top-color: #E0E0E0;\n"
-"	border-right-color: #E0E0E0;\n"
-"	border-bottom-color: #E0E0E0;\n"
-"	border-left-color: #E0E0E0;\n"
-"	border-top-style: none;\n"
-"	border-right-style: none;\n"
-"	border-bottom-style: none;\n"
-"	border-left-style: none;\n"
-"	background-color: #FAFAFA;\n"
-"	font-size: 80%;\n"
+"\n"
+"span.preprocessor {\n"
+"	color: #806020\n"
 "}\n"
-".memTemplItemRight {\n"
-"	padding: 1px 8px 0px 8px;\n"
-"	margin: 4px;\n"
-"	border-top-width: 1px;\n"
-"	border-right-width: 1px;\n"
-"	border-bottom-width: 1px;\n"
-"	border-left-width: 1px;\n"
-"	border-top-color: #E0E0E0;\n"
-"	border-right-color: #E0E0E0;\n"
-"	border-bottom-color: #E0E0E0;\n"
-"	border-left-color: #E0E0E0;\n"
-"	border-top-style: none;\n"
-"	border-right-style: none;\n"
-"	border-bottom-style: none;\n"
-"	border-left-style: none;\n"
-"	background-color: #FAFAFA;\n"
-"	font-size: 80%;\n"
+"\n"
+"span.stringliteral {\n"
+"	color: #002080\n"
 "}\n"
-".memTemplParams {\n"
-"	padding: 1px 0px 0px 8px;\n"
-"	margin: 4px;\n"
-"	border-top-width: 1px;\n"
-"	border-right-width: 1px;\n"
-"	border-bottom-width: 1px;\n"
-"	border-left-width: 1px;\n"
-"	border-top-color: #E0E0E0;\n"
-"	border-right-color: #E0E0E0;\n"
-"	border-bottom-color: #E0E0E0;\n"
-"	border-left-color: #E0E0E0;\n"
-"	border-top-style: solid;\n"
-"	border-right-style: none;\n"
-"	border-bottom-style: none;\n"
-"	border-left-style: none;\n"
-"	color: #606060;\n"
-"	background-color: #FAFAFA;\n"
-"	font-size: 80%;\n"
+"\n"
+"span.charliteral {\n"
+"	color: #008080\n"
+"}\n"
+"\n"
+"span.vhdldigit { \n"
+"	color: #ff00ff \n"
+"}\n"
+"\n"
+"span.vhdlchar { \n"
+"	color: #000000 \n"
+"}\n"
+"\n"
+"span.vhdlkeyword { \n"
+"	color: #700070 \n"
 "}\n"
-".search { \n"
+"\n"
+"span.vhdllogic { \n"
+"	color: #ff0000 \n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+".search {\n"
 "	color: #003399;\n"
 "	font-weight: bold;\n"
 "}\n"
-"FORM.search {\n"
+"\n"
+"form.search {\n"
 "	margin-bottom: 0px;\n"
 "	margin-top: 0px;\n"
 "}\n"
-"INPUT.search { \n"
+"\n"
+"input.search {\n"
 "	font-size: 75%;\n"
 "	color: #000080;\n"
 "	font-weight: normal;\n"
 "	background-color: #e8eef2;\n"
 "}\n"
-"TD.tiny { \n"
+"\n"
+"td.tiny {\n"
 "	font-size: 75%;\n"
 "}\n"
-"a {\n"
-"	color: #1A41A8;\n"
-"}\n"
-"a:visited {\n"
-"	color: #2A3798;\n"
-"}\n"
-".dirtab { \n"
+"\n"
+".dirtab {\n"
 "	padding: 4px;\n"
 "	border-collapse: collapse;\n"
 "	border: 1px solid #84b0c7;\n"
 "}\n"
-"TH.dirtab { \n"
+"\n"
+"th.dirtab {\n"
 "	background: #e8eef2;\n"
 "	font-weight: bold;\n"
 "}\n"
-"HR { \n"
-"	height: 1px;\n"
+"\n"
+"hr {\n"
+"	height: 0;\n"
+"	border: none;\n"
+"	border-top: 1px solid #666;\n"
+"}\n"
+"\n"
+"/* @group Member Descriptions */\n"
+"\n"
+".mdescLeft, .mdescRight,\n"
+".memItemLeft, .memItemRight,\n"
+".memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n"
+"	background-color: #FAFAFA;\n"
 "	border: none;\n"
-"	border-top: 1px solid black;\n"
+"	margin: 4px;\n"
+"	padding: 1px 0 0 8px;\n"
+"}\n"
+"\n"
+".mdescLeft, .mdescRight {\n"
+"	padding: 0px 8px 4px 8px;\n"
+"	color: #555;\n"
+"}\n"
+"\n"
+".memItemLeft, .memItemRight, .memTemplParams {\n"
+"	border-top: 1px solid #ccc;\n"
 "}\n"
 "\n"
-"/* Style for detailed member documentation */\n"
+".memTemplParams {\n"
+"	color: #606060;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"/* @group Member Details */\n"
+"\n"
+"/* Styles for detailed member documentation */\n"
+"\n"
 ".memtemplate {\n"
 "	font-size: 80%;\n"
 "	color: #606060;\n"
 "	font-weight: normal;\n"
 "	margin-left: 3px;\n"
-"} \n"
-".memnav { \n"
+"}\n"
+"\n"
+".memnav {\n"
 "	background-color: #e8eef2;\n"
 "	border: 1px solid #84b0c7;\n"
 "	text-align: center;\n"
@@ -365,109 +289,154 @@
 "	margin-right: 15px;\n"
 "	padding: 2px;\n"
 "}\n"
+"\n"
 ".memitem {\n"
-"	padding: 4px;\n"
-"	background-color: #eef3f5;\n"
-"	border-width: 1px;\n"
-"	border-style: solid;\n"
-"	border-color: #dedeee;\n"
-"	-moz-border-radius: 8px 8px 8px 8px;\n"
+"	padding: 0;\n"
 "}\n"
+"\n"
 ".memname {\n"
 "	white-space: nowrap;\n"
 "	font-weight: bold;\n"
 "}\n"
-".memdoc{\n"
-"	padding-left: 10px;\n"
+"\n"
+".memproto, .memdoc {\n"
+"	border: 1px solid #84b0c7;	\n"
 "}\n"
+"\n"
 ".memproto {\n"
+"	padding: 0;\n"
 "	background-color: #d5e1e8;\n"
-"	width: 100%;\n"
-"	border-width: 1px;\n"
-"	border-style: solid;\n"
-"	border-color: #84b0c7;\n"
 "	font-weight: bold;\n"
-"	-moz-border-radius: 8px 8px 8px 8px;\n"
+"	-webkit-border-top-left-radius: 8px;\n"
+"	-webkit-border-top-right-radius: 8px;\n"
+"	-moz-border-radius-topleft: 8px;\n"
+"	-moz-border-radius-topright: 8px;\n"
+"}\n"
+"\n"
+".memdoc {\n"
+"	padding: 2px 5px;\n"
+"	background-color: #eef3f5;\n"
+"	border-top-width: 0;\n"
+"	-webkit-border-bottom-left-radius: 8px;\n"
+"	-webkit-border-bottom-right-radius: 8px;\n"
+"	-moz-border-radius-bottomleft: 8px;\n"
+"	-moz-border-radius-bottomright: 8px;\n"
+"}\n"
+"\n"
+".memdoc p, .memdoc dl, .memdoc ul {\n"
+"	margin: 6px 0;\n"
 "}\n"
+"\n"
 ".paramkey {\n"
 "	text-align: right;\n"
 "}\n"
+"\n"
 ".paramtype {\n"
 "	white-space: nowrap;\n"
 "}\n"
+"\n"
 ".paramname {\n"
 "	color: #602020;\n"
-"	font-style: italic;\n"
 "	white-space: nowrap;\n"
 "}\n"
-"/* End Styling for detailed member documentation */\n"
+".paramname em {\n"
+"	font-style: normal;\n"
+"}\n"
+"\n"
+"/* @end */\n"
+"\n"
+"/* @group Directory (tree) */\n"
 "\n"
 "/* for the tree view */\n"
+"\n"
 ".ftvtree {\n"
 "	font-family: sans-serif;\n"
-"	margin:0.5em;\n"
+"	margin: 0.5em;\n"
 "}\n"
+"\n"
 "/* these are for tree view when used as main index */\n"
-".directory { \n"
-"	font-size: 9pt; \n"
-"	font-weight: bold; \n"
+"\n"
+".directory {\n"
+"	font-size: 9pt;\n"
+"	font-weight: bold;\n"
 "}\n"
-".directory h3 { \n"
-"	margin: 0px; \n"
-"	margin-top: 1em; \n"
-"	font-size: 11pt; \n"
+"\n"
+".directory h3 {\n"
+"	margin: 0px;\n"
+"	margin-top: 1em;\n"
+"	font-size: 11pt;\n"
 "}\n"
 "\n"
-"/* The following two styles can be used to replace the root node title */\n"  
-"/* with an image of your choice.  Simply uncomment the next two styles, */\n"
-"/* specify the name of your image and be sure to set \'height\' to the */\n"  
-"/* proper pixel height of your image. */\n"  
+"/*\n"
+"The following two styles can be used to replace the root node title\n"
+"with an image of your choice.  Simply uncomment the next two styles,\n"
+"specify the name of your image and be sure to set 'height' to the\n"
+"proper pixel height of your image.\n"
+"*/\n"
 "\n"
-"/* .directory h3.swap { */\n"
-"/* 	height: 61px; */\n"
-"/* 	background-repeat: no-repeat; */\n"
-"/* 	background-image: url(\"yourimage.gif\"); */\n"
-"/* } */\n"
-"/* .directory h3.swap span { */\n"
-"/* 	display: none; */\n"
-"/* } */\n"
+"/*\n"
+".directory h3.swap {\n"
+"	height: 61px;\n"
+"	background-repeat: no-repeat;\n"
+"	background-image: url(\"yourimage.gif\");\n"
+"}\n"
+".directory h3.swap span {\n"
+"	display: none;\n"
+"}\n"
+"*/\n"
 "\n"
-".directory > h3 { \n"
-"	margin-top: 0; \n"
+".directory > h3 {\n"
+"	margin-top: 0;\n"
 "}\n"
-".directory p { \n"
-"	margin: 0px; \n"
-"	white-space: nowrap; \n"
+"\n"
+".directory p {\n"
+"	margin: 0px;\n"
+"	white-space: nowrap;\n"
 "}\n"
-".directory div { \n"
-"	display: none; \n"
-"	margin: 0px; \n"
+"\n"
+".directory div {\n"
+"	display: none;\n"
+"	margin: 0px;\n"
 "}\n"
-".directory img { \n"
-"	vertical-align: -30%; \n"
+"\n"
+".directory img {\n"
+"	vertical-align: -30%;\n"
 "}\n"
+"\n"
 "/* these are for tree view when not used as main index */\n"
-".directory-alt { \n"
-"	font-size: 100%; \n"
-"	font-weight: bold; \n"
+"\n"
+".directory-alt {\n"
+"	font-size: 100%;\n"
+"	font-weight: bold;\n"
 "}\n"
-".directory-alt h3 { \n"
-"	margin: 0px; \n"
-"	margin-top: 1em; \n"
-"	font-size: 11pt; \n"
+"\n"
+".directory-alt h3 {\n"
+"	margin: 0px;\n"
+"	margin-top: 1em;\n"
+"	font-size: 11pt;\n"
 "}\n"
-".directory-alt > h3 { \n"
-"	margin-top: 0; \n"
+"\n"
+".directory-alt > h3 {\n"
+"	margin-top: 0;\n"
 "}\n"
-".directory-alt p { \n"
-"	margin: 0px; \n"
-"	white-space: nowrap; \n"
+"\n"
+".directory-alt p {\n"
+"	margin: 0px;\n"
+"	white-space: nowrap;\n"
 "}\n"
-".directory-alt div { \n"
-"	display: none; \n"
-"	margin: 0px; \n"
+"\n"
+".directory-alt div {\n"
+"	display: none;\n"
+"	margin: 0px;\n"
 "}\n"
-".directory-alt img { \n"
-"	vertical-align: -30%; \n"
+"\n"
+".directory-alt img {\n"
+"	vertical-align: -30%;\n"
 "}\n"
 "\n"
+"/* @end */\n"
+"\n"
+"address {\n"
+"	font-style: normal;\n"
+"	color: #333;\n"
+"}\n"
diff --git a/src/entry.cpp b/src/entry.cpp
index d0ba5cb..fb45e5f 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -69,7 +69,7 @@ Entry::Entry()
   mGrpId = -1;
   tagInfo = 0;
   sli = 0;
-  relatesDup = FALSE;
+  relatesType = Simple;
   hidden = FALSE;
   groupDocType = GROUPDOC_NORMAL;
   reset();
@@ -98,7 +98,7 @@ Entry::Entry(const Entry &e)
   docLine     = e.docLine;
   docFile     = e.docFile.copy();
   relates     = e.relates.copy();
-  relatesDup  = e.relatesDup;
+  relatesType = e.relatesType;
   read        = e.read.copy();
   write       = e.write.copy();
   brief       = e.brief.copy();
@@ -255,7 +255,7 @@ void Entry::reset()
   docFile.resize(0);
   docLine=-1;
   relates.resize(0);
-  relatesDup=FALSE;
+  relatesType=Simple;
   brief.resize(0);
   briefFile.resize(0);
   briefLine=-1;
diff --git a/src/entry.h b/src/entry.h
index f87182c..10c3319 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -33,6 +33,8 @@ class StorageIntf;
 enum Protection { Public, Protected, Private, Package } ;
 enum Specifier { Normal, Virtual, Pure } ;
 enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event };
+enum RelatesType { Simple, Duplicate, MemberOf };
+enum Relationship { Member, Related, Foreign };
 
 struct ListItemInfo
 {
@@ -350,7 +352,7 @@ class Entry
     int          inbodyLine;  //!< line number at which the body doc was found
     QCString     inbodyFile;  //!< file in which the body doc was found
     QCString     relates;     //!< related class (doc block)
-    bool         relatesDup;  //!< keep duplicate doc in original file also
+    RelatesType  relatesType; //!< how relates is handled
     QCString     read;        //!< property read accessor
     QCString     write;       //!< property write accessor
     QCString     inside;      //!< name of the class in which documents are found
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index e193a17..984bb4f 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -1162,8 +1162,16 @@ MemberList *GroupDef::getMemberList(MemberList::ListType lt) const
 
 void GroupDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)
 {
+   static bool optimizeVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+ 
   MemberList * ml = getMemberList(lt);
-  if (ml) ml->writeDeclarations(ol,0,0,0,this,title,0);
+    if (optimizeVhdl && ml) 
+    {
+         VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0);
+        return;
+    }
+  if (ml) 
+  ml->writeDeclarations(ol,0,0,0,this,title,0);
 }
 
 void GroupDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)
diff --git a/src/increasebuffer.pl b/src/increasebuffer.pl
index 056a6b5..109f9ad 100755
--- a/src/increasebuffer.pl
+++ b/src/increasebuffer.pl
@@ -4,5 +4,6 @@
 while (<>)
 {
 	s/YY_BUF_SIZE 16384/YY_BUF_SIZE 262144/g; 
+        s/YY_READ_BUF_SIZE 8192/YY_READ_BUF_SIZE 262144/g;
 	print $_;
 }
diff --git a/src/index.cpp b/src/index.cpp
index 2b4c895..79240ce 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -1577,7 +1577,8 @@ void addClassMemberNameToIndex(MemberDef *md)
         g_memberIndexLetterUsed[CMHL_Events][letter].append(md);
         documentedClassMembers[CMHL_Events]++;
       }
-      else if (md->isRelated() || (md->isFriend() && !isFriendToHide))
+      else if (md->isRelated() || md->isForeign() ||
+               (md->isFriend() && !isFriendToHide))
       {
         g_memberIndexLetterUsed[CMHL_Related][letter].append(md);
         documentedClassMembers[CMHL_Related]++;
@@ -2954,7 +2955,8 @@ void writeIndex(OutputList &ol)
     for (pdi.toFirst();(pd=pdi.current());++pdi)
     {
       if (!pd->getGroupDef() && !pd->isReference() && 
-          !pd->hasParentPage()
+          (!pd->hasParentPage() ||                    // not inside other page
+           (Doxygen::mainPage==pd->getOuterScope()))  // or inside main page
          )
       {
         QCString title = pd->title();
diff --git a/src/language.cpp b/src/language.cpp
index ebe6c84..e1bd947 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -340,7 +340,7 @@ bool setTranslator(const char *langName)
 #ifdef LANG_CA
   else if (L_EQUAL("catalan"))
   {
-    theTranslator=new TranslatorDecoder(new TranslatorCatalan);
+    theTranslator=new TranslatorCatalan;
   }
 #endif
 #ifdef LANG_LT
diff --git a/src/marshal.cpp b/src/marshal.cpp
index 8983e27..803c53b 100644
--- a/src/marshal.cpp
+++ b/src/marshal.cpp
@@ -395,7 +395,7 @@ void marshalEntry(StorageIntf *s,Entry *e)
   marshalInt(s,e->inbodyLine);
   marshalQCString(s,e->inbodyFile);
   marshalQCString(s,e->relates);
-  marshalBool(s,e->relatesDup);
+  marshalInt(s,e->relatesType);
   marshalQCString(s,e->read);
   marshalQCString(s,e->write);
   marshalQCString(s,e->inside);
@@ -788,7 +788,7 @@ Entry * unmarshalEntry(StorageIntf *s)
   e->inbodyLine       = unmarshalInt(s);
   e->inbodyFile       = unmarshalQCString(s);
   e->relates          = unmarshalQCString(s);
-  e->relatesDup       = unmarshalBool(s);
+  e->relatesType      = (RelatesType)unmarshalInt(s);
   e->read             = unmarshalQCString(s);
   e->write            = unmarshalQCString(s);
   e->inside           = unmarshalQCString(s);
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 824d8e9..a57238b 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -306,8 +306,9 @@ class MemberDefImpl
     MemberDefImpl();
    ~MemberDefImpl();
     void init(Definition *def,const char *t,const char *a,const char *e,
-              Protection p,Specifier v,bool s,bool r,MemberDef::MemberType mt,
-              const ArgumentList *tal,const ArgumentList *al
+              Protection p,Specifier v,bool s,Relationship r,
+              MemberDef::MemberType mt,const ArgumentList *tal,
+              const ArgumentList *al
              );
 
     ClassDef     *classDef;   // member of or related to 
@@ -395,7 +396,7 @@ class MemberDefImpl
     bool hasDocumentedParams;
     bool hasDocumentedReturnType;
     bool isDMember;
-    bool related;             // is this a member that is only related to a class
+    Relationship related;     // relationship of this to the class
     bool stat;                // is it a static function?
     bool proto;               // is it a prototype;
     bool docEnumValues;       // is an enum with documented enum values.
@@ -439,8 +440,9 @@ MemberDefImpl::~MemberDefImpl()
 
 void MemberDefImpl::init(Definition *def,
                      const char *t,const char *a,const char *e,
-                     Protection p,Specifier v,bool s,bool r,MemberDef::MemberType mt,
-                     const ArgumentList *tal,const ArgumentList *al
+                     Protection p,Specifier v,bool s,Relationship r,
+                     MemberDef::MemberType mt,const ArgumentList *tal,
+                     const ArgumentList *al
                     )
 {
   classDef=0;
@@ -572,7 +574,7 @@ void MemberDefImpl::init(Definition *def,
  * \param v  The degree of `virtualness' of the member, possible values are:
  *           \c Normal, \c Virtual, \c Pure.
  * \param s  A boolean that is true iff the member is static.
- * \param r  A boolean that is true iff the member is only related.
+ * \param r  The relationship between the class and the member.
  * \param mt The kind of member. See #MemberDef::MemberType for a list of 
  *           all types.
  * \param tal The template arguments of this member.
@@ -582,7 +584,7 @@ void MemberDefImpl::init(Definition *def,
 
 MemberDef::MemberDef(const char *df,int dl,
                      const char *t,const char *na,const char *a,const char *e,
-                     Protection p,Specifier v,bool s,bool r,MemberType mt,
+                     Protection p,Specifier v,bool s,Relationship r,MemberType mt,
                      const ArgumentList *tal,const ArgumentList *al
                     ) : Definition(df,dl,removeRedundantWhiteSpace(na))
 {
@@ -3201,7 +3203,13 @@ bool MemberDef::isEvent() const
 bool MemberDef::isRelated() const
 { 
   makeResident();
-  return m_impl->related; 
+  return m_impl->related == Related;
+}
+
+bool MemberDef::isForeign() const
+{ 
+  makeResident();
+  return m_impl->related == Foreign; 
 }
 
 bool MemberDef::isStatic() const
@@ -3638,7 +3646,13 @@ void MemberDef::setTemplateSpecialization(bool b)
 void MemberDef::makeRelated()
 { 
   makeResident();
-  m_impl->related=TRUE; 
+  m_impl->related = Related; 
+}
+
+void MemberDef::makeForeign()
+{ 
+  makeResident();
+  m_impl->related = Foreign; 
 }
 
 void MemberDef::setHasDocumentedParams(bool b)
@@ -3838,7 +3852,7 @@ void MemberDef::flushToDisk() const
   marshalBool         (Doxygen::symbolStorage,m_impl->hasDocumentedParams);
   marshalBool         (Doxygen::symbolStorage,m_impl->hasDocumentedReturnType);
   marshalBool         (Doxygen::symbolStorage,m_impl->isDMember);
-  marshalBool         (Doxygen::symbolStorage,m_impl->related);
+  marshalInt          (Doxygen::symbolStorage,(int)m_impl->related);
   marshalBool         (Doxygen::symbolStorage,m_impl->stat);
   marshalBool         (Doxygen::symbolStorage,m_impl->proto);
   marshalBool         (Doxygen::symbolStorage,m_impl->docEnumValues);
@@ -3938,7 +3952,7 @@ void MemberDef::loadFromDisk() const
   m_impl->hasDocumentedParams     = unmarshalBool         (Doxygen::symbolStorage);
   m_impl->hasDocumentedReturnType = unmarshalBool         (Doxygen::symbolStorage);
   m_impl->isDMember               = unmarshalBool         (Doxygen::symbolStorage);
-  m_impl->related                 = unmarshalBool         (Doxygen::symbolStorage);
+  m_impl->related                 = (Relationship)unmarshalInt(Doxygen::symbolStorage);
   m_impl->stat                    = unmarshalBool         (Doxygen::symbolStorage);
   m_impl->proto                   = unmarshalBool         (Doxygen::symbolStorage);
   m_impl->docEnumValues           = unmarshalBool         (Doxygen::symbolStorage);
diff --git a/src/memberdef.h b/src/memberdef.h
index 6336269..8dbcf0e 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -69,7 +69,7 @@ class MemberDef : public Definition
     MemberDef(const char *defFileName,int defLine,
               const char *type,const char *name,const char *args,
               const char *excp,Protection prot,Specifier virt,bool stat,
-              bool related,MemberType t,const ArgumentList *tal,
+              Relationship related,MemberType t,const ArgumentList *tal,
               const ArgumentList *al);
    ~MemberDef(); 
     DefType definitionType() const        { return TypeMember; }
@@ -133,6 +133,7 @@ class MemberDef : public Definition
     bool isProperty() const;
     bool isEvent() const;
     bool isRelated() const;
+    bool isForeign() const;
     bool isStatic() const;
     bool isInline() const;
     bool isExplicit() const;
@@ -257,6 +258,7 @@ class MemberDef : public Definition
     void setTemplateSpecialization(bool b);
     
     void makeRelated();
+    void makeForeign();
     void setHasDocumentedParams(bool b);
     void setHasDocumentedReturnType(bool b);
     void setInheritsDocsFrom(MemberDef *md);
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index 9168d82..2f59f2a 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -49,7 +49,14 @@ void PageDef::addInnerCompound(Definition *def)
     PageDef *pd = (PageDef*)def;
     m_subPageDict->append(pd->name(),pd);
     def->setOuterScope(this);
-    pd->setNestingLevel(m_nestingLevel+1);
+    if (this==Doxygen::mainPage)
+    {
+      pd->setNestingLevel(m_nestingLevel);
+    }
+    else
+    {
+      pd->setNestingLevel(m_nestingLevel+1);
+    }
   }
 }
 
@@ -71,8 +78,12 @@ void PageDef::writeDocumentation(OutputList &ol)
   startFile(ol,pageName,pageName,title(),HLI_None,TRUE);
 
   ol.pushGeneratorState();
+  //1.{ 
 
-  if (m_nestingLevel>0) // a sub page
+  if (m_nestingLevel>0 
+      //&& // a sub page
+      //(Doxygen::mainPage==0 || getOuterScope()!=Doxygen::mainPage) // and not a subpage of the mainpage
+     )
   {
     // do not generate sub page output for RTF and LaTeX, as these are
     // part of their parent page
@@ -91,13 +102,16 @@ void PageDef::writeDocumentation(OutputList &ol)
 
   // save old generator state and write title only to Man generator
   ol.pushGeneratorState();
+  //2.{
   ol.disableAllBut(OutputGenerator::Man);
   ol.startTitleHead(pageName);
   ol.endTitleHead(pageName, pageName);
   ol.popGeneratorState();
+  //2.}
 
   // for Latex the section is already generated as a chapter in the index!
   ol.pushGeneratorState();
+  //2.{
   ol.disable(OutputGenerator::Latex);
   ol.disable(OutputGenerator::RTF);
   SectionInfo *si=0;
@@ -112,10 +126,12 @@ void PageDef::writeDocumentation(OutputList &ol)
     ol.endSection(si->label,si->type);
   }
   ol.popGeneratorState();
+  //2.}
 
   writePageDocumentation(ol);
 
   ol.popGeneratorState();
+  //1.}
 
   endFile(ol);
 
diff --git a/src/pre.l b/src/pre.l
index 8fd51e6..5d5a79c 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -1040,7 +1040,7 @@ void addDefine()
   MemberDef *md=new MemberDef(
       g_yyFileName,g_yyLineNr,
       "#define",g_defName,g_defArgsStr,0,
-      Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
+      Public,Normal,FALSE,Member,MemberDef::Define,0,0);
   if (!g_defArgsStr.isEmpty())
   {
     ArgumentList *argList = new ArgumentList;
diff --git a/src/scanner.l b/src/scanner.l
index 4557ac1..b102853 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -1594,7 +1594,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					  current->tArgLists->append(al);
 					  currentArgumentList = al;
 					  templateStr="<";
-					  fullArgString = templateStr.copy();
+					  fullArgString = templateStr;
 					  copyArgString = &templateStr;
 					  currentArgumentContext = FindMembers;
 					  BEGIN( ReadTempArgs );
@@ -4326,9 +4326,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					  current->spec |= Entry::Template;
 					  current->tArgLists->append(al);
 					  currentArgumentList = al;
+					  current->name+="<";
 					  templateStr="<";
 					  fullArgString = templateStr;
-					  copyArgString = &templateStr;
+					  copyArgString = &current->name;
 					  currentArgumentContext = CompoundName;
 					  BEGIN( ReadTempArgs );
   					}
diff --git a/src/translator_br.h b/src/translator_br.h
index 56708cf..7012f40 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -15,6 +15,8 @@
  *    Thanks to Jorge Ramos and others for their contributions.
  *
  * History:
+ *   20080709:
+ *	- References to MAX_DOT_GRAPH_HEIGHT removed from trLegendDocs().
  *   20080206:
  *      - Method trTypeContraints() renamed to trTypeConstraints().
  *   20071216:
@@ -1028,9 +1030,7 @@ class TranslatorBrazilian : public Translator
         "    Used *m_usedClass;\n"
         "};\n"
         "\\endcode\n"
-
-        "Se a tag \\c MAX_DOT_GRAPH_HEIGHT no arquivo de configuração tem o valor"
-        "200, o seguinte gráfo será gerado:"
+        "Isto irá gerar o seguinte gráfo:"
         "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
         "As caixas no grafo acima tem as seguintes interpretações:\n"
diff --git a/src/translator_ca.h b/src/translator_ca.h
index 38e5dcf..da3940e 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -18,28 +18,29 @@
 #ifndef TRANSLATOR_CA_H
 #define TRANSLATOR_CA_H
 
-// When defining a translator class for the new language, follow
-// the description in the documentation.  One of the steps says
-// that you should copy the translator_en.h (this) file to your
-// translator_xx.h new file.  Your new language should use the
-// Translator class as the base class.  This means that you need to
-// implement exactly the same (pure virtual) methods as the
-// TranslatorEnglish does.  Because of this, it is a good idea to
-// start with the copy of TranslatorEnglish and replace the strings
-// one by one.
-//
-// It is not necessary to include "translator.h" or
-// "translator_adapter.h" here.  The files are included in the
-// language.cpp correctly.  Not including any of the mentioned
-// files frees the maintainer from thinking about whether the
-// first, the second, or both files should be included or not, and
-// why.  This holds namely for localized translators because their
-// base class is changed occasionaly to adapter classes when the
-// Translator class changes the interface, or back to the
-// Translator class (by the local maintainer) when the localized
-// translator is made up-to-date again.
-
-class TranslatorCatalan : public TranslatorAdapter_1_5_4
+/*! 
+ When defining a translator class for the new language, follow
+ the description in the documentation.  One of the steps says
+ that you should copy the translator_en.h (this) file to your
+ translator_xx.h new file.  Your new language should use the
+ Translator class as the base class.  This means that you need to
+ implement exactly the same (pure virtual) methods as the
+ TranslatorEnglish does.  Because of this, it is a good idea to
+ start with the copy of TranslatorEnglish and replace the strings
+ one by one.
+
+ It is not necessary to include "translator.h" or
+ "translator_adapter.h" here.  The files are included in the
+ language.cpp correctly.  Not including any of the mentioned
+ files frees the maintainer from thinking about whether the
+ first, the second, or both files should be included or not, and
+ why.  This holds namely for localized translators because their
+ base class is changed occasionaly to adapter classes when the
+ Translator class changes the interface, or back to the
+ Translator class (by the local maintainer) when the localized
+ translator is made up-to-date again.
+*/
+class TranslatorCatalan : public Translator
 {
   public:
 
@@ -77,7 +78,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! return the language charset. This will be used for the HTML output */
     virtual QCString idLanguageCharset()
     {
-      return "iso-8859-1";
+      return "utf-8";
     }
 
     // --- Language translation methods -------------------
@@ -88,40 +89,40 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     /*! subscript for the related functions. */
     virtual QCString trRelatedSubscript()
-    { return "(Remarcar que aquestes funcions no s�n funcions membre.)"; }
+    { return "(Remarcar que aquestes funcions no són funcions membre.)"; }
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
     virtual QCString trDetailedDescription()
-    { return "Descripci� Detallada"; }
+    { return "Descripció Detallada"; }
 
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
-    { return "Documentaci� de les Definicions de Tipus Membre"; }
+    { return "Documentació de les Definicions de Tipus Membre"; }
     
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
-    { return "Documentaci� de les Enumeracions Membre"; }
+    { return "Documentació de les Enumeracions Membre"; }
     
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
-    { return "Documentaci� de les Funcions Membre"; }
+    { return "Documentació de les Funcions Membre"; }
     
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaci� dels Camps"; 
+        return "Documentació dels Camps"; 
       }
       else
       {
-        return "Documentaci� de les Dades Membre"; 
+        return "Documentació de les Dades Membre"; 
       }
     }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore() 
-    { return "M�s..."; }
+    { return "Més..."; }
 
     /*! put in the class documentation */
     virtual QCString trListOfAllMembers()
@@ -133,7 +134,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     /*! this is the first part of a sentence that is followed by a class name */
     virtual QCString trThisIsTheListOfAllMembers()
-    { return "Aquesta �s la llista complerta dels membres de "; }
+    { return "Aquesta és la llista complerta dels membres de "; }
 
     /*! this is the remainder of the sentence after the class name */
     virtual QCString trIncludingInheritedMembers()
@@ -143,7 +144,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Generat autom�ticament per Doxygen";
+    { QCString result="Generat automàticament per Doxygen";
       if (s) result+=(QCString)" per a "+s;
       result+=" a partir del codi font."; 
       return result;
@@ -167,7 +168,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
-    { return "M�duls"; }
+    { return "Mòduls"; }
     
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
@@ -218,7 +219,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
-    { return "P�gines Relacionades"; }
+    { return "Pàgines Relacionades"; }
 
     /*! This is put above each page as a link to all examples. */
     virtual QCString trExamples()
@@ -230,14 +231,14 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     /*! This is an introduction to the class hierarchy. */
     virtual QCString trClassHierarchyDescription()
-    { return "Aquesta llista d'her�ncia est� ordenada toscament, "
-             "per� no completa, de forma alfab�tica:";
+    { return "Aquesta llista d'herència està ordenada toscament, "
+             "però no completa, de forma alfabètica:";
     }
 
     /*! This is an introduction to the list with all files. */
     virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="Aquesta �s la llista de tots els fitxers ";
+      QCString result="Aquesta és la llista de tots els fitxers ";
       if (!extractAll) result+="documentats ";
       result+="acompanyats amb breus descripcions:";
       return result;
@@ -249,19 +250,19 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
       
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Aquestes s�n les estructures de dades acompanyades amb breus descripcions:"; 
+        return "Aquestes són les estructures de dades acompanyades amb breus descripcions:"; 
       }
       else
       {
-        return "Aquestes s�n les classes, estructures, "
-               "unions i interf�cies acompanyades amb breus descripcions:"; 
+        return "Aquestes són les classes, estructures, "
+               "unions i interfícies acompanyades amb breus descripcions:"; 
       }
     }
 
     /*! This is an introduction to the page with all class members. */
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="Aquesta �s la llista de tots els ";
+      QCString result="Aquesta és la llista de tots els ";
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
         result+="camps d'estructures i unions";
@@ -274,16 +275,16 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
       {
         result+=" documentats";
       }
-      result+=" amb enlla�os a ";
+      result+=" amb enllaços a ";
       if (!extractAll) 
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
-          result+="la documentaci� de l'estructura/uni� per a cada camp:";
+          result+="la documentació de l'estructura/unió per a cada camp:";
         }
         else
         {
-          result+="la documentaci� de la classe per a cada membre:";
+          result+="la documentació de la classe per a cada membre:";
         }
       }
       else 
@@ -302,7 +303,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! This is an introduction to the page with all file members. */
     virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="Aquesta �s la llista de ";
+      QCString result="Aquesta és la llista de ";
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
         result+="totes les funcions, variables, definicions, enumeracions, i definicions de tipus";
@@ -313,44 +314,44 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
         result+="tots els membres de fitxers";
         if (!extractAll) result+=" documentats";
       }
-      result+=" amb enlla�os ";
+      result+=" amb enllaços ";
       if (extractAll) 
         result+="als fitxers als quals corresponen:";
       else 
-        result+="a la documentaci�:";
+        result+="a la documentació:";
       return result;
     }
 
     /*! This is an introduction to the page with the list of all examples */
     virtual QCString trExamplesDescription()
-    { return "Aquesta �s la llista de tots els exemples:"; }
+    { return "Aquesta és la llista de tots els exemples:"; }
 
     /*! This is an introduction to the page with the list of related pages */
     virtual QCString trRelatedPagesDescription()
-    { return "Aquesta �s la llista de totes les p�gines de documentaci� associades:"; }
+    { return "Aquesta és la llista de totes les pàgines de documentació associades:"; }
 
     /*! This is an introduction to the page with the list of class/file groups */
     virtual QCString trModulesDescription()
-    { return "Aquesta �s la llista de m�duls:"; }
+    { return "Aquesta és la llista de mòduls:"; }
     
     // index titles (the project name is prepended for these) 
 
 
     /*! This is used in HTML as the title of index.html. */
     virtual QCString trDocumentation()
-    { return ": Documentaci�"; }
+    { return ": Documentació"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * index of all groups.
      */
     virtual QCString trModuleIndex()
-    { return "�ndex de M�duls"; }
+    { return "Índex de Mòduls"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * class hierarchy.
      */
     virtual QCString trHierarchicalIndex()
-    { return "�ndex Jer�rquic"; }
+    { return "Índex Jeràrquic"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * annotated compound index.
@@ -359,11 +360,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       { 
-        return "�ndex d'Estructures de Dades";
+        return "Índex d'Estructures de Dades";
       }
       else
       {
-        return "�ndex de Classes"; 
+        return "Índex de Classes"; 
       }
     }
 
@@ -371,13 +372,13 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      * list of all files.
      */
     virtual QCString trFileIndex() 
-    { return "�ndex de Fitxers"; }
+    { return "Índex de Fitxers"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all groups.
      */
     virtual QCString trModuleDocumentation()
-    { return "Documentaci� dels M�duls"; }
+    { return "Documentació dels Mòduls"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
@@ -386,11 +387,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaci� de les Estructures de Dades";
+        return "Documentació de les Estructures de Dades";
       }
       else
       {
-        return "Documentaci� de les Classes"; 
+        return "Documentació de les Classes"; 
       }
     }
 
@@ -398,23 +399,23 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  the documentation of all files.
      */
     virtual QCString trFileDocumentation()
-    { return "Documentaci� dels Fitxers"; }
+    { return "Documentació dels Fitxers"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all examples.
      */
     virtual QCString trExampleDocumentation()
-    { return "Documentaci� dels Exemples"; }
+    { return "Documentació dels Exemples"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all related pages.
      */
     virtual QCString trPageDocumentation()
-    { return "Documentaci� de les P�gines"; }
+    { return "Documentació de les Pàgines"; }
 
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
-    { return "Manual de Refer�ncia"; }
+    { return "Manual de Referència"; }
     
     /*! This is used in the documentation of a file as a header before the 
      *  list of defines
@@ -462,37 +463,37 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  documentation blocks for defines
      */
     virtual QCString trDefineDocumentation()
-    { return "Documentaci� de les Definicions"; }
+    { return "Documentació de les Definicions"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for function prototypes
      */
     virtual QCString trFunctionPrototypeDocumentation()
-    { return "Documentaci� de les Funcions Prototipus"; }
+    { return "Documentació de les Funcions Prototipus"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for typedefs
      */
     virtual QCString trTypedefDocumentation()
-    { return "Documentaci� de les Definicions de Tipus"; }
+    { return "Documentació de les Definicions de Tipus"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for enumeration types
      */
     virtual QCString trEnumerationTypeDocumentation()
-    { return "Documentaci� dels Tipus de les Enumeracions"; }
+    { return "Documentació dels Tipus de les Enumeracions"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for functions
      */
     virtual QCString trFunctionDocumentation()
-    { return "Documentaci� de les Funcions"; }
+    { return "Documentació de les Funcions"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for variables
      */
     virtual QCString trVariableDocumentation()
-    { return "Documentaci� de les Variables"; }
+    { return "Documentació de les Variables"; }
 
     /*! This is used in the documentation of a file/namespace/group before 
      *  the list of links to documented compounds
@@ -529,20 +530,20 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! this text is put before a class diagram */
     virtual QCString trClassDiagram(const char *clName)
     {
-      return (QCString)"Diagrama d'Her�ncia per a "+clName+":";
+      return (QCString)"Diagrama d'Herència per a "+clName+":";
     }
     
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
-    { return "Tan sols per a �s intern."; }
+    { return "Tan sols per a ús intern."; }
 
     /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
-    { return "Atenci�"; }
+    { return "Atenció"; }
 
     /*! this text is generated when the \\version command is used. */
     virtual QCString trVersion()
-    { return "Versi�"; }
+    { return "Versió"; }
 
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
@@ -554,11 +555,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return "Mireu tamb�"; }
+    { return "Mireu també"; }
 
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
-    { return "Par�metres"; }
+    { return "Paràmetres"; }
 
     /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
@@ -579,7 +580,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
-      QCString result="Aquests s�n tots els espais de noms ";
+      QCString result="Aquests són tots els espais de noms ";
       if (!extractAll) result+="documentats ";
       result+="amb breus descripcions:";
       return result;
@@ -599,7 +600,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      * related classes 
      */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Documentaci� de funcions amigues i relacionades"; }
+    { return "Documentació de funcions amigues i relacionades"; }
     
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
@@ -610,16 +611,16 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
                                     ClassDef::CompoundType compType,
                                     bool isTemplate)
     {
-      QCString result="Refer�ncia de";
+      QCString result="Referència de";
       switch(compType)
       {
         case ClassDef::Class:      result+=" la Classe "; break;
         case ClassDef::Struct:     result+=" l'Estructura "; break;
-        case ClassDef::Union:      result+=" la Uni� "; break;
-        case ClassDef::Interface:  result+=" la Interf�cie "; break;
+        case ClassDef::Union:      result+=" la Unió "; break;
+        case ClassDef::Interface:  result+=" la Interfície "; break;
         case ClassDef::Protocol:   result+="l Protocol "; break;
         case ClassDef::Category:   result+=" la Categoria "; break;
-        case ClassDef::Exception:  result+=" l'Excepci� "; break;
+        case ClassDef::Exception:  result+=" l'Excepció "; break;
       }
       if (isTemplate) result+="Template ";
       result+=(QCString)clName;
@@ -629,7 +630,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
-      QCString result="Refer�ncia del Fitxer ";
+      QCString result="Referència del Fitxer ";
       result+=fileName; 
       return result;
     }
@@ -637,31 +638,31 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
-      QCString result="Refer�ncia de l'Espai de Noms ";
+      QCString result="Referència de l'Espai de Noms ";
       result+=namespaceName;
       return result;
     }
     
     virtual QCString trPublicMembers()
-    { return "M�todes p�blics"; }
+    { return "Mètodes públics"; }
     virtual QCString trPublicSlots()
-    { return "Slots p�blics"; }
+    { return "Slots públics"; }
     virtual QCString trSignals()
     { return "Senyals"; }
     virtual QCString trStaticPublicMembers()
-    { return "M�todes P�blics Est�tics"; }
+    { return "Mètodes Públics Estàtics"; }
     virtual QCString trProtectedMembers()
-    { return "M�todes Protegits"; }
+    { return "Mètodes Protegits"; }
     virtual QCString trProtectedSlots()
     { return "Slots Protegits"; }
     virtual QCString trStaticProtectedMembers()
-    { return "M�todes Protegits Est�tics"; }
+    { return "Mètodes Protegits Estàtics"; }
     virtual QCString trPrivateMembers()
-    { return "M�todes Privats"; }
+    { return "Mètodes Privats"; }
     virtual QCString trPrivateSlots()
     { return "Slots Privats"; }
     virtual QCString trStaticPrivateMembers()
-    { return "M�todes Privats Est�tics"; }
+    { return "Mètodes Privats Estàtics"; }
     
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
@@ -727,11 +728,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     { 
-      QCString result="Aquesta �s la llista de tots els membres de l'espai de noms ";
+      QCString result="Aquesta és la llista de tots els membres de l'espai de noms ";
       if (!extractAll) result+="documentats ";
-      result+="amb enlla�os a ";
+      result+="amb enllaços a ";
       if (extractAll) 
-        result+="la documentaci� de l'espai de noms de cada membre:";
+        result+="la documentació de l'espai de noms de cada membre:";
       else 
         result+="l'espai de noms al qual corresponen:";
       return result;
@@ -740,13 +741,13 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  index of all namespaces.
      */
     virtual QCString trNamespaceIndex()
-    { return "�ndex d'Espais de Noms"; }
+    { return "Índex d'Espais de Noms"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all namespaces.
      */
     virtual QCString trNamespaceDocumentation()
-    { return "Documentaci� de l'Espai de Noms"; }
+    { return "Documentació de l'Espai de Noms"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
@@ -769,20 +770,20 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"La documentaci� d'aquest";
+      QCString result=(QCString)"La documentació d'aquest";
       switch(compType)
       {
         case ClassDef::Class:      result+="a classe"; break;
         case ClassDef::Struct:     result+="a estructura"; break;
-        case ClassDef::Union:      result+="a uni�"; break;
-        case ClassDef::Interface:  result+="a interf�cie"; break;
+        case ClassDef::Union:      result+="a unió"; break;
+        case ClassDef::Interface:  result+="a interfície"; break;
         case ClassDef::Protocol:   result+=" protocol"; break;
         case ClassDef::Category:   result+="a categoria"; break;
-        case ClassDef::Exception:  result+="a excepci�"; break;
+        case ClassDef::Exception:  result+="a excepció"; break;
       }
       result+=" es va generar a partir del";
       if (!single) result+="s";
-      result+=" seg�ent";
+      result+=" següent";
       if (!single) result+="s";
       result+=" fitxer";
       if (!single) result+="s:"; else result+=":";
@@ -793,7 +794,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      * list.
      */
     virtual QCString trAlphabeticalList()
-    { return "Llista Alfab�tica"; }
+    { return "Llista Alfabètica"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
@@ -806,7 +807,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return "P�gina principal"; }
+    { return "Pàgina principal"; }
 
     /*! This is used in references to page that are put in the LaTeX 
      *  documentation. It should be an abbreviation of the word page.
@@ -820,11 +821,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
 
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "Definici� a la l�nia @0 del fitxer @1.";
+      return "Definició a la línia @0 del fitxer @1.";
     }
     virtual QCString trDefinedInSourceFile()
     {
-      return "Definici� al fitxer @0.";
+      return "Definició al fitxer @0.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -843,17 +844,17 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Diagrama de col�laboraci� per a "+clName+":";
+      return (QCString)"Diagrama de col·laboració per a "+clName+":";
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Inclou el graf de depend�ncies per a "+fName+":";
+      return (QCString)"Inclou el graf de dependències per a "+fName+":";
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "Documentaci� del Constructor i el Destructor"; 
+      return "Documentació del Constructor i el Destructor"; 
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
@@ -863,17 +864,17 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "Veure la documentaci� d'aquest fitxer.";
+      return "Veure la documentació d'aquest fitxer.";
     }
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
     {
-      return "Precondici�";
+      return "Precondició";
     }
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return "Postcondici�";
+      return "Postcondició";
     }
     /*! Text for the \\invariant command */
     virtual QCString trInvariant()
@@ -892,11 +893,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trGraphicalHierarchy()
     {
-      return "Jerarquia Gr�fica de la Classe";
+      return "Jerarquia Gràfica de la Classe";
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "Veure la jerarquia gr�fica de la classe";
+      return "Veure la jerarquia gràfica de la classe";
     }
     virtual QCString trGotoTextualHierarchy()
     {
@@ -904,7 +905,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trPageIndex()
     {
-      return "�ndex de P�gines";
+      return "Índex de Pàgines";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -917,7 +918,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trPublicTypes()
     {
-      return "Tipus P�blics";
+      return "Tipus Públics";
     }
     virtual QCString trPublicAttribs()
     {
@@ -927,12 +928,12 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
       }
       else
       {
-        return "Atributs P�blics";
+        return "Atributs Públics";
       }
     }
     virtual QCString trStaticPublicAttribs()
     {
-      return "Atributs P�blics Est�tics";
+      return "Atributs Públics Estàtics";
     }
     virtual QCString trProtectedTypes()
     {
@@ -944,7 +945,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trStaticProtectedAttribs()
     {
-      return "Atributs Protegits Est�tics";
+      return "Atributs Protegits Estàtics";
     }
     virtual QCString trPrivateTypes()
     {
@@ -956,7 +957,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trStaticPrivateAttribs()
     {
-      return "Atributs Privats Est�tics";
+      return "Atributs Privats Estàtics";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -988,11 +989,11 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     }
     virtual QCString trAttention()
     {
-      return "Atenci�";
+      return "Atenció";
     }
     virtual QCString trInclByDepGraph()
     {
-      return "Aquest gr�fic mostra quins fitxers inclouen, "
+      return "Aquest gràfic mostra quins fitxers inclouen, "
              "de forma directa o indirecta, aquest fitxer:";
     }
     virtual QCString trSince()
@@ -1007,7 +1008,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! title of the graph legend page */
     virtual QCString trLegendTitle()
     {
-      return "Llegenda del Gr�fic";
+      return "Llegenda del Gràfic";
     }
     /*! page explaining how the dot graph's should be interpreted 
      *  The %A in the text below are to prevent link to classes called "A".
@@ -1015,22 +1016,22 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     virtual QCString trLegendDocs()
     {
       return 
-        "Aquesta p�gina explica com s'interpreten els gr�fics generats per doxygen.<p>\n"
+        "Aquesta pàgina explica com s'interpreten els gràfics generats per doxygen.<p>\n"
         "Considera aquest exemple:\n"
         "\\code\n"
         "/*! Classe invisible per culpa del retall */\n"
         "class Invisible { };\n\n"
-        "/*! Classe truncada, l'her�ncia est� amagada */\n"
+        "/*! Classe truncada, l'herència està amagada */\n"
         "class Truncated : public Invisible { };\n\n"
         "/* Classe no documentada amb comentaris doxygen */\n"
         "class Undocumented { };\n\n"
-        "/*! Classe heredada amb her�ncia p�blica */\n"
+        "/*! Classe heredada amb herència pública */\n"
         "class PublicBase : public Truncated { };\n\n"
         "/*! Una classe Template */\n"
         "template<class T> class Templ { };\n\n"
-        "/*! Classe heredada utilitzant her�ncia protegida */\n"
+        "/*! Classe heredada utilitzant herència protegida */\n"
         "class ProtectedBase { };\n\n"
-        "/*! Classe heredada utiltzant her�ncia privada */\n"
+        "/*! Classe heredada utiltzant herència privada */\n"
         "class PrivateBase { };\n\n"
         "/*! Classe usada per la classe heretada */\n"
         "class Used { };\n\n"
@@ -1045,26 +1046,26 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
         "    Used *m_usedClass;\n"
         "};\n"
         "\\endcode\n"
-        "Si l'etiqueta \\c MAX_DOT_GRAPH_HEIGHT est� igualada a 24a0 al fitxer de configuraci�, resultar� el gr�fic seg�ent:"
+        "Resultarà el gràfic següent:"
         "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
-        "Les caixes del gr�fic superior tenen aquesta interpretaci�:\n"
+        "Les caixes del gràfic superior tenen aquesta interpretació:\n"
         "<ul>\n"
-        "<li>Una caixa negra plena represent l'estructura o classe per la qual el gr�fic s'ha generat.\n"
+        "<li>Una caixa negra plena represent l'estructura o classe per la qual el gràfic s'ha generat.\n"
         "<li>Una caixa de vora negra representa una estructura o classe documentada.\n"
         "<li>Una caixa de vora verda representa una estructura o classe indocumentada.\n"
         "<li>Una caixa de vora vermalla representa una estructura o classe documentada de la qual "
-        "no es mostren totes les relacions d'her�ncia/inclusi�. Un gr�fic �s truncat si no s'ajusta als l�mits.\n"
+        "no es mostren totes les relacions d'herència/inclusió. Un gràfic és truncat si no s'ajusta als límits.\n"
         "</ul>\n"
         "Les sagetes tenen aquest significat:\n"
         "<ul>\n"
-        "<li>Una sageta blau fosc remarca una relaci� d'her�ncia de tipus p�blica entre dues classes.\n"
-        "<li>Una sageta verd fosc remarca una relaci� d'her�ncia de tipus protegida entre dues classes.\n"
-        "<li>Una sageta roig fosc remarca una relaci� d'her�ncia de tipus privada entre dues classes.\n"
-        "<li>Una sageta puntejada de color porpra indica que una classe �s continguda o usada per una altra classe."
-        " La sageta s'etiqueta amb la variable o variables a trav�s de les quals la classe o estructura apuntada �s accessible.\n"
-        "<li>Una sageta puntejada de color groc indica la relaci� entre una inst�ncia template i la classe template de qu� ha set instanciada."
-        " La sageta s'etiqueta amb els par�metres template de la inst�ncia.\n"
+        "<li>Una sageta blau fosc remarca una relació d'herència de tipus pública entre dues classes.\n"
+        "<li>Una sageta verd fosc remarca una relació d'herència de tipus protegida entre dues classes.\n"
+        "<li>Una sageta roig fosc remarca una relació d'herència de tipus privada entre dues classes.\n"
+        "<li>Una sageta puntejada de color porpra indica que una classe és continguda o usada per una altra classe."
+        " La sageta s'etiqueta amb la variable o variables a través de les quals la classe o estructura apuntada és accessible.\n"
+        "<li>Una sageta puntejada de color groc indica la relació entre una instància template i la classe template de què ha set instanciada."
+        " La sageta s'etiqueta amb els paràmetres template de la instància.\n"
         "</ul>\n";
     }
     /*! text for the link to the legend page */
@@ -1095,7 +1096,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return "M�todes DCOP";
+      return "Mètodes DCOP";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1110,7 +1111,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Used as a section header for IDL property documentation */
     virtual QCString trPropertyDocumentation()
     {
-      return "Documentaci� de les Propietats";
+      return "Documentació de les Propietats";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1142,7 +1143,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-      return "Aquesta �s la llista de paquets, amb una breu descripci� (si se'n disposa):";
+      return "Aquesta és la llista de paquets, amb una breu descripció (si se'n disposa):";
     }
     /*! The link name in the Quick links header for each page */
     virtual QCString trPackages()
@@ -1216,7 +1217,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Used as header RTF general index */
     virtual QCString trRTFGeneralIndex()
     {
-      return "�ndex";
+      return "Índex";
     }
    
     /*! This is used for translation of the word that will possibly
@@ -1269,7 +1270,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trPage(bool first_capital, bool singular)
     { 
-      QCString result((first_capital ? "P�gin" : "p�gin"));
+      QCString result((first_capital ? "Pàgin" : "pàgin"));
       if (!singular)  result+="es"; else result+="a";
       return result; 
     }
@@ -1317,7 +1318,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trReferences()
     {
-      return "Refer�ncies";
+      return "Referències";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1378,7 +1379,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Header used for the documentation section of a class' events. */
     virtual QCString trEventDocumentation()
     {
-      return "Documentaci� dels Esdeveniments";
+      return "Documentació dels Esdeveniments";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1403,7 +1404,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trStaticPackageMembers()
     { 
-      return "Funcions Est�tiques de Paquet";
+      return "Funcions Estàtiques de Paquet";
     }
     /*! Used as a heading for a list of Java class variables with package 
      * scope.
@@ -1417,7 +1418,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trStaticPackageAttribs()
     { 
-      return "Atributs Est�tics de Paquet";
+      return "Atributs Estàtics de Paquet";
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -1434,7 +1435,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! Put in front of the call graph for a function. */
     virtual QCString trCallGraph()
     {
-      return "Gr�fic de crides d'aquesta funci�:";
+      return "Gràfic de crides d'aquesta funció:";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1454,7 +1455,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trSearchResultsTitle()
     {
-      return "Resultats de la B�squeda";
+      return "Resultats de la Búsqueda";
     }
     /*! This string is put just before listing the search results. The
      *  text can be different depending on the number of documents found.
@@ -1513,7 +1514,7 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  of the directories.
      */
     virtual QCString trDirDocumentation()
-    { return "Documentaci� dels Directoris"; }
+    { return "Documentació dels Directoris"; }
 
     /*! This is used as the title of the directory index and also in the
      *  Quick links of a HTML page, to link to the directory hierarchy.
@@ -1525,15 +1526,15 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      *  and the fact that it is sorted alphabetically per level
      */
     virtual QCString trDirDescription()
-    { return "Aquesta jerarquia de directoris est� ordenada toscament, "
-             "per� no completa, de forma alfab�tica:";
+    { return "Aquesta jerarquia de directoris està ordenada toscament, "
+             "però no completa, de forma alfabètica:";
     }
 
     /*! This returns the title of a directory page. The name of the
      *  directory is passed via \a dirName.
      */
     virtual QCString trDirReference(const char *dirName)
-    { QCString result="Refer�ncia del Directori "; result+=dirName; return result; }
+    { QCString result="Referència del Directori "; result+=dirName; return result; }
 
     /*! This returns the word directory with or without starting capital
      *  (\a first_capital) and in sigular or plural form (\a singular).
@@ -1554,9 +1555,9 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
      */
     virtual QCString trOverloadText()
     {
-       return "Aquesta �s una funci� membre sobrecarregada, "
-              "prove�da per conveni�ncia. Es diferencia de la funci� "
-              "anterior nom�s en els arguments que accepta.";
+       return "Aquesta és una funció membre sobrecarregada, "
+              "proveïda per conveniència. Es diferencia de la funció "
+              "anterior només en els arguments que accepta.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1566,15 +1567,221 @@ class TranslatorCatalan : public TranslatorAdapter_1_5_4
     /*! This is used to introduce a caller (or called-by) graph */
     virtual QCString trCallerGraph()
     {
-      return "Gr�fic de crides a aquesta funci�:";
+      return "Gràfic de crides a aquesta funció:";
     }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for enumeration values
      */
     virtual QCString trEnumerationValueDocumentation()
-    { return "Documentaci� de les Enumeracions"; }
+    { return "Documentació de les Enumeracions"; }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4 (mainly for Fortran)
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! header that is put before the list of member subprograms (Fortran). */
+    virtual QCString trMemberFunctionDocumentationFortran()
+    { return "Documentació de les Funcions/Subrutines Membre"; }
+
+    /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
+    virtual QCString trCompoundListFortran()
+    { return "Llista de Tipus de Dades"; }
+
+    /*! This is put above each page as a link to all members of compounds (Fortran). */
+    virtual QCString trCompoundMembersFortran()
+    { return "Camps de Dades"; }
+
+    /*! This is an introduction to the annotated compound list (Fortran). */
+    virtual QCString trCompoundListDescriptionFortran()
+    { return "Aquests són els tipus de dades acompanyats amb breus descripcions:"; }
+
+    /*! This is an introduction to the page with all data types (Fortran). */
+    virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
+    {
+      QCString result="Aquesta és la llista de tots els membres de tipus de dades";
+      if (!extractAll)
+      {
+        result+=" documentats";
+      }
+      result+=" amb enllaços a ";
+      if (!extractAll) 
+      {
+        result+="la documentació del tipus de dades per a cada membre:";
+      }
+      else 
+      {
+        result+="els tipus de dades a que pertanyen:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index (Fortran).
+     */
+    virtual QCString trCompoundIndexFortran()
+    { return "Índex de Tipus de Dades"; }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all data types (Fortran).
+     */
+    virtual QCString trTypeDocumentation()
+    { return "Documentació dels Tipus de Dades"; }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) subprograms (Fortran).
+     */
+    virtual QCString trSubprograms()
+    { return "Funcions/Subrutines"; }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for subprograms (Fortran)
+     */
+    virtual QCString trSubprogramDocumentation()
+    { return "Documentació de les Funcions/Subrutines"; }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds (Fortran)
+     */
+     virtual QCString trDataTypes()
+    { return "Tipus de Dades"; }
+    
+    /*! used as the title of page containing all the index of all modules (Fortran). */
+    virtual QCString trModulesList()
+    { return "Llista de Mòduls"; }
+
+    /*! used as an introduction to the modules list (Fortran) */
+    virtual QCString trModulesListDescription(bool extractAll)
+    {
+      QCString result="Aquesta és la llista de tots els mòduls ";
+      if (!extractAll) result+="documentats ";
+      result+="amb breus descripcions:";
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a module/type (Fortran) */
+    virtual QCString trCompoundReferenceFortran(const char *clName,
+                                    ClassDef::CompoundType compType,
+                                    bool isTemplate)
+    {
+      QCString result="Referència de";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+=" el Mòdul "; break;
+        case ClassDef::Struct:     result+=" el Tipus "; break;
+        case ClassDef::Union:      result+=" la Unió "; break;
+        case ClassDef::Interface:  result+=" la Interfície "; break;
+        case ClassDef::Protocol:   result+="l Protocol "; break;
+        case ClassDef::Category:   result+=" la Categoria "; break;
+        case ClassDef::Exception:  result+=" l'Excepció "; break;
+      }
+      if (isTemplate) result+="Template ";
+      result+=(QCString)clName;
+      return result;
+    }
+
+    /*! used as the title of the HTML page of a module (Fortran) */
+    virtual QCString trModuleReference(const char *namespaceName)
+    {
+      QCString result="Referència del Mòdul ";
+      result+=namespaceName;
+      return result;
+    }
+    
+    /*! This is put above each page as a link to all members of modules. (Fortran) */
+    virtual QCString trModulesMembers()
+    { return "Membres del Mòdul"; }
+
+    /*! This is an introduction to the page with all modules members (Fortran) */
+    virtual QCString trModulesMemberDescription(bool extractAll)
+    {
+      QCString result="Aquesta és la llista de tots els membres del mòdul";
+      if (!extractAll)
+      {
+        result+=" documentats";
+      }
+      result+=" amb enllaços a ";
+      if (!extractAll) 
+      {
+        result+="la documentació del mòdul per a cada membre:";
+      }
+      else 
+      {
+        result+="els mòduls a que pertanyen:";
+      }
+      return result;
+    }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all modules (Fortran).
+     */
+    virtual QCString trModulesIndex()
+    { return "Índex de Mòduls"; }
+    
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trModule(bool first_capital, bool singular)
+    {       
+      QCString result((first_capital ? "Mòdul" : "mòdul"));
+      if (!singular)  result+="s";
+      return result; 
+    }
+    /*! This is put at the bottom of a module documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Module", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"La documentació d'aquest";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+=" mòdul"; break;
+        case ClassDef::Struct:     result+=" tipus"; break;
+        case ClassDef::Union:      result+="a unió"; break;
+        case ClassDef::Interface:  result+="a interfície"; break;
+        case ClassDef::Protocol:   result+=" protocol"; break;
+        case ClassDef::Category:   result+="a categoria"; break;
+        case ClassDef::Exception:  result+="a excepció"; break;
+      }
+      result+=" es va generar a partir del";
+      if (!single) result+="s";
+      result+=" següent";
+      if (!single) result+="s";
+      result+=" fitxer";
+      if (!single) result+="s:"; else result+=":";
+      return result;
+    }
+
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trType(bool first_capital, bool)
+    { 
+      QCString result((first_capital ? "Tipus" : "tipus"));
+      //if (!singular)  result+="s";
+      return result; 
+    }
+    /*! This is used for translation of the word that will possibly
+     *  be followed by a single name or by a list of names 
+     *  of the category.
+     */
+    virtual QCString trSubprogram(bool first_capital, bool singular)
+    { 
+      QCString result((first_capital ? "Subprogram" : "subprogram"));
+      if (!singular)  result+="es";
+      else            result+="a";
+      return result; 
+    }
+
+    /*! C# Type Constraint list */
+    virtual QCString trTypeConstraints()
+    {
+      return "Restriccions de Tipus";
+    }
 
 };
 
diff --git a/src/util.cpp b/src/util.cpp
index 500b1af..4c2e628 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -3715,7 +3715,8 @@ bool getDefs(const QCString &scName,const QCString &memberName,
 
     for (mmli.toFirst(); (mmd = mmli.current()); ++mmli)
     {
-      if (!mmd->isLinkable() || !mmd->isRelated() || !mmd->getClassDef())
+      if (!mmd->isLinkable() || (!mmd->isRelated() && !mmd->isForeign()) ||
+           !mmd->getClassDef())
         continue;
 
       if (!args) break;
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index 7e72d84..bbce4e9 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -974,7 +974,7 @@ MAPPORT       {BN}*("port"|"generic"){BN}*("map"){BN}*("("){1}
 			}
                       }
 
-<ParseType>[_a-zA_Z"]["_a-zA-Z0-9]* {
+<ParseType>["_a-zA-Z0-9]* {
                         QCString val(yytext);
                         g_FuncProto.append(yytext);
                         appStringLower(g_PrevString,yytext);
diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp
index 4e027e0..5535a90 100644
--- a/src/vhdldocgen.cpp
+++ b/src/vhdldocgen.cpp
@@ -160,24 +160,6 @@ QCString* VhdlDocGen::findKeyWord(const QCString& word)
  * returns the parsed entry at line xxx
  */
 
-Entry* VhdlDocGen::getEntryAtLine(const Entry* ce,int line)
-{
-  EntryListIterator eli(*ce->children());
-  Entry *found=0;
-  Entry *rt;
-  for (;(rt=eli.current());++eli)
-  {
-    if (rt->bodyLine==line)
-    {
-      found=rt;
-    } // if
-    if (!found) 
-    {
-      found=getEntryAtLine(rt,line);
-    }
-  }
-  return found;
-}// getEntryAtLine
 
 void VhdlDocGen::debugClassName(ClassSDict* mDict)
 {
@@ -1360,7 +1342,7 @@ void VhdlDocGen::formatString(QCString & qcs, OutputList& ol,const MemberDef* md
       {
 	temp+=" ";
       }
-      temp+=QCString(&c,1);
+      temp+=c;
       temp+=" "; 
     }
     else if (c=='=') 
@@ -1373,13 +1355,13 @@ void VhdlDocGen::formatString(QCString & qcs, OutputList& ol,const MemberDef* md
       else // = operator
       {
 	temp+=" ";      
-	temp+=QCString(&c,1);
+	temp+=c;
 	temp+=" "; 
       }
     }
     else      
     {
-      temp+=QCString(&c,1);
+      temp+=c;
     }
 
     index=temp.length();
@@ -1670,19 +1652,20 @@ void VhdlDocGen::writeVhdlDeclarations(MemberList* ml,
                              OutputList& ol,GroupDef* gd,ClassDef* cd)
 {
   static ClassDef *cdef;
-  static GroupDef* gdef;
+  //static GroupDef* gdef;
   if (cd && cdef!=cd)
   { // only one inline link
     VhdlDocGen::writeInlineClassLink(cd,ol);
     cdef=cd;
   }
 
+  /*
   if (gd && gdef==gd) return;
   if (gd && gdef!=gd)
   {
     gdef=gd;
   }
-
+*/
   VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::LIBRARY,FALSE),0,FALSE,VhdlDocGen::LIBRARY);
   VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::USE,FALSE),0,FALSE,VhdlDocGen::USE);
   VhdlDocGen::writeVHDLDeclarations(ml,ol,cd,0,0,gd,theTranslator_vhdlType(VhdlDocGen::FUNCTION,FALSE),0,FALSE,VhdlDocGen::FUNCTION);
diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h
index 2c530a4..f8952a7 100644
--- a/src/vhdldocgen.h
+++ b/src/vhdldocgen.h
@@ -80,7 +80,6 @@ class VhdlDocGen
     static void init();
 
     // --- used by vhdlscanner.l -----------
-    static Entry*   getEntryAtLine(const Entry* e,int line);
     static QCString getIndexWord(const char* ,int index);
     static  bool    foundInsertedComponent(const QCString& name,Entry* root);
     static bool     deleteCharRev(QCString &s,char c);
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l
index 0eeb426..1fd68d4 100644
--- a/src/vhdlscanner.l
+++ b/src/vhdlscanner.l
@@ -141,7 +141,7 @@ static void getBufText(QCString& qc,int start)
 
 static void lineCount()
 {
-  for ( const char* c = vhdlscanYYtext ; *c ; ++c )
+  for ( const char* c = yytext ; *c ; ++c )
   {
     yyLineNr += (*c == '\n') ;
   }
@@ -446,6 +446,24 @@ static void parseFunctionProto()
   bufferClear();
 }//parseFunctionProto
 
+static Entry* getEntryAtLine(const Entry* ce,int line)
+{
+  EntryListIterator eli(*ce->children());
+  Entry *found=0;
+  Entry *rt;
+  for (;(rt=eli.current());++eli)
+  {
+    if (rt->bodyLine==line)
+    {
+      found=rt;
+    } // if
+    if (!found) 
+    {
+      found=getEntryAtLine(rt,line);
+    }
+  }
+  return found;
+}// getEntryAtLine
 
 //-------------------------------------------------------------------------
 
@@ -534,7 +552,7 @@ static void addOneTextLine(QCString& ss )
   //else if (pEntry && pEntry->bodyLine==yyLineNr)
   //  pTemp=pEntry;
   else 
-    pTemp=VhdlDocGen::getEntryAtLine(current_root,yyLineNr) ;
+    pTemp=getEntryAtLine(current_root,yyLineNr) ;
 
   if (pTemp)
   {
@@ -622,7 +640,7 @@ ALLID        [^;()\t ]
 
     bufferClear();
     //pEntry=current;
-    getType(current,vhdlscanYYtext);
+    getType(current,yytext);
     current->bodyLine=yyLineNr;
     if (current->spec==VhdlDocGen::UNITS)
     {
@@ -645,7 +663,7 @@ ALLID        [^;()\t ]
   bufferClear();
   isBody=0;
   lastCompound = current;
-  QCString curName=VhdlDocGen::getIndexWord(vhdlscanYYtext,1);
+  QCString curName=VhdlDocGen::getIndexWord(yytext,1);
   current->section=Entry::CLASS_SEC; //Entry::CLASS_SEC;
   current->spec=VhdlDocGen::ARCHITECTURE;
   current->protection=Private;
@@ -684,7 +702,7 @@ ALLID        [^;()\t ]
   bropen=0;
   bufferClear();
   isBody=0;
-  QCString qcs=QCString(vhdlscanYYtext);
+  QCString qcs=QCString(yytext);
   // lowerString(qcs);
   qcs=qcs.stripWhiteSpace();
   if (stricmp(qcs.data(),"use")==0)
@@ -709,7 +727,7 @@ ALLID        [^;()\t ]
   bropen=0;
   bufferClear();
   isFunc=1;
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   BEGIN(FindFuncName);
 }
 
@@ -719,7 +737,7 @@ ALLID        [^;()\t ]
 
   bropen=0;  
   bufferClear();
-  QCString word(vhdlscanYYtext);
+  QCString word(yytext);
   word=word.lower();  
   word=word.stripWhiteSpace();
 
@@ -764,7 +782,7 @@ ALLID        [^;()\t ]
 
   lineCount();
   QCString type;
-  QCString tt(vhdlscanYYtext);
+  QCString tt(yytext);
   tt = tt.stripWhiteSpace();
   //printf("  tt=%s\n",tt.data());
   //VhdlDocGen::deleteAllChars(tt,'\n');
@@ -821,7 +839,7 @@ ALLID        [^;()\t ]
 
 <Start>{CR}*    {
   lineCount();
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   BEGIN(Start); 
 }
 
@@ -855,7 +873,7 @@ ALLID        [^;()\t ]
 
 <ParseUnits>{B}*[a-z_][^\n;]* { // parse record|unit body
   lineCount();
-  QCString zz(vhdlscanYYtext);
+  QCString zz(yytext);
   addSignals(zz.data(),yyLineNr,current);
   BEGIN(ParseUnits);
 }
@@ -863,8 +881,8 @@ ALLID        [^;()\t ]
 <FindName>{NAME} {  // found entity|architecture|component name
   lineCount();
 
-  QCString qcs(vhdlscanYYtext);
-  QCString qreal=QCString(vhdlscanYYtext);
+  QCString qcs(yytext);
+  QCString qreal=QCString(yytext);
   qcs=qcs.stripWhiteSpace();
   if (current->spec==VhdlDocGen::USE)
   {
@@ -910,13 +928,13 @@ ALLID        [^;()\t ]
 <FindFuncName>{FUNCNAME}    { // found name of a process|function|procedure
   lineCount();
 
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   BEGIN(ParseType);
 }
 
 <FindTypeName>{NAME}{BR}* {
   lineCount();                                                            
-  current->name=QCString(vhdlscanYYtext);
+  current->name=QCString(yytext);
   BEGIN(ParseType);
 }
 
@@ -930,7 +948,7 @@ ALLID        [^;()\t ]
   genPort=2;
   current->section=Entry::VARIABLE_SEC;
   current->spec=VhdlDocGen::RECORD;
-  addText(vhdlscanYYtext,vhdlscanYYleng); 
+  addText(yytext,yyleng); 
   newEntry(); // adds the record to the last compound
   BEGIN(ParseRecord);
 }
@@ -949,21 +967,26 @@ ALLID        [^;()\t ]
 <ParseRecord>[a-z_A-Z0-9][^\n;]*";"({B}*{COMMENT})* { // parse record body
   lineCount();
   QCString comment;
-  QCString zz(vhdlscanYYtext);
+  QCString zz(yytext);
   if (zz.contains("--!"))
   {
     QStringList ql=QStringList::split("--!",zz,FALSE);
     comment = ql[1];
     zz = ql[0];
   }
+  else if (zz.contains("--"))
+  {
+    QStringList ql=QStringList::split("--",zz,FALSE);
+    zz = ql[0];
+  }
   initEntry(current);
   addSignals(zz,yyLineNr,current,comment);
-  addText(vhdlscanYYtext,vhdlscanYYleng); 
+  addText(yytext,yyleng); 
   BEGIN(ParseRecord);
 }
 
 <ParseType>{B}+("is"){B}*{CR}|{B}+("is"){B}*"--" { // found a new function  in an architecture ?
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
   QCString ttt;
   bool bb=TRUE;
@@ -1024,21 +1047,21 @@ ALLID        [^;()\t ]
 
 <ParseType>[^;()\t ] {
   lineCount();      
-  addText(vhdlscanYYtext,vhdlscanYYleng); 
+  addText(yytext,yyleng); 
   BEGIN(ParseType);
 }
 
 <ParseType>{BRACEOPEN} {
   lineCount();
   bropen++;
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   BEGIN(ParseType);
 }
 
 <ParseType>{BRACECLOSE} {
   lineCount();
   bropen--;
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   if (bropen==0 && scantype==2) // process
   {
     ::parseProcessProto();
@@ -1072,7 +1095,7 @@ ALLID        [^;()\t ]
 
 <ParseType>{ENDE3} {
   lineCount();
-  QCString tt(vhdlscanYYtext);
+  QCString tt(yytext);
   tt=tt.lower();
   VhdlDocGen::deleteAllChars(tt,';');
   tt.stripWhiteSpace();
@@ -1101,7 +1124,7 @@ ALLID        [^;()\t ]
 
 <ParseType>";" {
   lineCount();
-  addText(vhdlscanYYtext,vhdlscanYYleng);    
+  addText(yytext,yyleng);    
   if (bropen==0 && !(isFunc==1 && isBody==1) )
   {
     if (isFunc)
@@ -1194,13 +1217,13 @@ ALLID        [^;()\t ]
 
 <ParseType>{BR}* {
   lineCount();
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   BEGIN(ParseType);
 }
 
 <FindEntityName>{NAME} {    // found name of an entity/architecture/package
   lineCount();
-  QCString qcs(vhdlscanYYtext);
+  QCString qcs(yytext);
   qcs=qcs.stripWhiteSpace();
   qcs=qcs.lower();
   if (strcmp(qcs.data(),"body")==0) // found package body
@@ -1214,7 +1237,7 @@ ALLID        [^;()\t ]
   }
   else if (scantype==1) // found a component
   {
-    QCString qq(vhdlscanYYtext);
+    QCString qq(yytext);
     qq=qq.stripWhiteSpace();
     //qq=qq.lower();
 
@@ -1242,18 +1265,18 @@ ALLID        [^;()\t ]
   } 
   else
   {
-    QCString qq(vhdlscanYYtext);
+    QCString qq(yytext);
     qq=qq.stripWhiteSpace();
     current->name=qq;
     newEntry();
-    //QCString qreal=QCString(vhdlscanYYtext);
+    //QCString qreal=QCString(yytext);
     BEGIN(Start);
   }
 }
 
 <Start>{B}*("generic"|"port"){BR}*[(]+ { // found generic|port in entity
-    QCString genp(vhdlscanYYleng+1);
-    deleteSpecChars(vhdlscanYYtext,genp.data());
+    QCString genp(yyleng+1);
+    deleteSpecChars(yytext,genp.data());
     VhdlDocGen::deleteCharRev(genp,'(');
 
     if (stricmp(genp.data(),"port" )==0)
@@ -1274,7 +1297,7 @@ ALLID        [^;()\t ]
 <FindSigName>{BRACECLOSE} { 
     lineCount();
     bropen--;
-    addText(vhdlscanYYtext,vhdlscanYYleng); 
+    addText(yytext,yyleng); 
     if (bropen==0)
     {
       bufferClear();
@@ -1287,7 +1310,7 @@ ALLID        [^;()\t ]
 }
 
 <FindSigName>{LABELID} {  // found signals in entity
-  QCString line(vhdlscanYYtext);
+  QCString line(yytext);
 
   // note that line can be something like:
   // "var1, var2, var3 : in std_logic_vector(8 downto 0); --! Some comment"
@@ -1307,9 +1330,14 @@ ALLID        [^;()\t ]
   int openCount=line.contains('(');
   int closeCount=line.contains(')');
   int semi = line.find(';');
-  int pos;
+  int pos  = line.find("--");
+  int pos1 = line.find("--!");
+  if (pos!=-1 && pos<pos1) // strip normal comment before special one
+  {
+    line = line.remove(pos,pos1-pos);
+  }
   //printf("=> signal: line='%s'\n",line.data());
-  if (semi!=-1 && (pos=line.find("--"))!=-1)
+  if (semi!=-1 && pos!=-1)
   {
     int eol = line.findRev('\n');
     //printf("pos=%d eol=%d\n",pos,eol);
@@ -1348,7 +1376,7 @@ ALLID        [^;()\t ]
 
   if (scantype!=1) // not a component
   {  
-    addText(vhdlscanYYtext,vhdlscanYYleng);
+    addText(yytext,yyleng);
     addSignals(line,yyLineNr,lastEntity,comment);
   } 
 
@@ -1365,24 +1393,24 @@ ALLID        [^;()\t ]
 <FindSigName>{BRACEOPEN} { 
   lineCount();
   bropen++;
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
 }
 
 
 <FindSigName>{CR}        { 
   lineCount();
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   //BEGIN(FindSigName);
 }
 
 
 <*>^{B}*("for ")[^;]* {
-  //printf("\n found for[%s] [%d]",vhdlscanYYtext,yyLineNr);
+  //printf("\n found for[%s] [%d]",yytext,yyLineNr);
   lineCount();
 }
 
 <*>{DIGITS}                {   // found digit
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
 }
 
@@ -1412,20 +1440,39 @@ ALLID        [^;()\t ]
 
 <*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment
   if (iDocLine==-1) iDocLine=yyLineNr;
+  // signal clk :in std_logic; --!@brief global clock
+  // --!@brief  global reset
+  // signal reset:in std_logic;
+  // these two comments are detected as a multi line comment
+  QCString qc(yytext);
+  int len=qc.contains('\n')+yyLineNr-1;
+
   if (YY_START!=Comment) // Start of the comment block
   {
-    iTextCounter=iCounter;
+    bufferClear();
+    iTextCounter=0;
     startComment=yyLineNr;
     g_lastCommentContext=YY_START;
   }
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+
+  Entry* pTemp=getEntryAtLine(current_root,len);
+  if (pTemp)
+  { // found one line comment, add it to the entry on this line
+    pTemp->briefLine=yyLineNr;
+    pTemp->brief+=yytext;
+    VhdlDocGen::prepareComment(pTemp->brief);
+  }
+  else 
+  {
+    addText(yytext,yyleng);
+  }
   lineCount();
   BEGIN(Comment);
 }
 
 <Comment>^{B}*"--!"[^\n]* {
   if (iDocLine==-1) iDocLine=yyLineNr;
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
 }
 
@@ -1436,17 +1483,27 @@ ALLID        [^;()\t ]
   VhdlDocGen::prepareComment(qcs);
   handleCommentBlock(qcs,FALSE);
   bufferClear();
-  unput(*vhdlscanYYtext);
+  unput(*yytext);
   BEGIN(g_lastCommentContext);
 }
 
-<*>^{B}*"--!"[^\n]* { // one line comment
+<*>"--!"[^\n]* { // one line comment
   if (iDocLine==-1) iDocLine=yyLineNr;
   QCString qcs(yytext);
   int j=qcs.find("--!");
   qcs=qcs.right(qcs.length()-3-j);
   //printf("--> handleCommentBlock line %d\n",yyLineNr);
-  handleCommentBlock(qcs,TRUE);
+  Entry* pTemp=getEntryAtLine(current_root,yyLineNr);
+  if (pTemp)
+  {
+    pTemp->briefLine=yyLineNr;
+    pTemp->brief+=qcs;
+    iDocLine=-1;
+  }
+  else
+  {
+    handleCommentBlock(qcs,TRUE);
+  }
   //printf("--> end: handleCommentBlock line %d\n",yyLineNr);
   bufferClear();
 } 
@@ -1456,23 +1513,23 @@ ALLID        [^;()\t ]
 
 <*>\n                    {
   lineCount();
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   //         printf("\n new-line [%d]",yyLineNr);
   BEGIN(Start);
 }
 
 <*>{NAME} {
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
 }
 
 <*>{B}*	{
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
 }
 
 <*>.                    {
-  addText(vhdlscanYYtext,vhdlscanYYleng);
+  addText(yytext,yyleng);
   lineCount();
 }
 
-- 
cgit v0.12

