From 5dfd148b5f3dfe5db7691b8dca017c828e800a3c Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Tue, 19 Aug 2008 13:23:22 +0000
Subject: Release-1.5.6-20080819

---
 Doxyfile                              |   26 +-
 INSTALL                               |    4 +-
 Makefile.in                           |    3 +-
 README                                |    4 +-
 addon/doxmlparser/include/doxmlintf.h |    2 +
 addon/doxmlparser/src/dochandler.cpp  |    1 -
 addon/doxmlparser/src/mainhandler.cpp |    6 +-
 addon/doxmlparser/src/stringimpl.h    |    2 +
 configure                             |    2 +-
 doc/Doxyfile                          |    2 +-
 doc/config.doc                        |   43 +-
 doc/customize.doc                     |  248 ++++++++
 doc/diagrams.doc                      |   31 +-
 doc/doxygen_manual.tex                |    1 +
 doc/index.doc                         |    2 +
 doc/infoflow.eps                      |  401 ++++++------
 doc/infoflow.fig                      |  160 ++---
 doc/infoflow.gif                      |  Bin 24468 -> 13383 bytes
 doc/language.doc                      |    7 +-
 doc/maintainers.txt                   |    1 +
 doc/output.doc                        |    2 +-
 doc/translator_report.txt             |   18 +-
 src/classdef.cpp                      |  543 ++++++++++------
 src/classdef.h                        |   17 +-
 src/config.l                          |  185 +++---
 src/defgen.cpp                        |    1 -
 src/dirdef.cpp                        |  248 ++++++--
 src/dirdef.h                          |   10 +-
 src/docsets.cpp                       |    4 +-
 src/dot.cpp                           |    4 +-
 src/doxygen.cpp                       |   60 +-
 src/doxytag.l                         |    1 +
 src/filedef.cpp                       |  511 +++++++++------
 src/filedef.h                         |   16 +-
 src/groupdef.cpp                      |  458 ++++++++++----
 src/groupdef.h                        |   17 +-
 src/htmlgen.cpp                       |  175 ++++-
 src/language.cpp                      |    2 +-
 src/latexdocvisitor.cpp               |   67 +-
 src/latexdocvisitor.h                 |    4 +
 src/layout.cpp                        | 1121 +++++++++++++++++++++++++++++++++
 src/layout.h                          |  187 ++++++
 src/layout_default.h                  |  182 ++++++
 src/layout_default.xml                |  182 ++++++
 src/libdoxygen.pro.in                 |    3 +
 src/libdoxygen.t                      |    3 +
 src/memberdef.cpp                     |    3 +-
 src/memberdef.h                       |    1 -
 src/memberlist.cpp                    |    4 +-
 src/namespacedef.cpp                  |  329 +++++++---
 src/namespacedef.h                    |   14 +-
 src/perlmodgen.cpp                    |    2 +-
 src/pre.l                             |    7 +-
 src/qtbc.h                            |    2 +-
 src/translator_fi.h                   |  371 +++++------
 src/translator_ro.h                   |   26 +-
 src/xmlgen.cpp                        |    1 -
 57 files changed, 4421 insertions(+), 1306 deletions(-)
 create mode 100644 doc/customize.doc
 create mode 100644 src/layout.cpp
 create mode 100644 src/layout.h
 create mode 100644 src/layout_default.h
 create mode 100644 src/layout_default.xml

diff --git a/Doxyfile b/Doxyfile
index c9143e3..1ba1628 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.5.4
+# Doxyfile 1.5.6
 
 #---------------------------------------------------------------------------
 # Project related configuration options
@@ -21,7 +21,6 @@ SHORT_NAMES            = NO
 JAVADOC_AUTOBRIEF      = YES
 QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP         = NO
 INHERIT_DOCS           = YES
 SEPARATE_MEMBER_PAGES  = NO
 TAB_SIZE               = 8
@@ -29,12 +28,15 @@ ALIASES                =
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
 OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
 BUILTIN_STL_SUPPORT    = NO
 CPP_CLI_SUPPORT        = NO
 SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = NO
 SUBGROUPING            = YES
 TYPEDEF_HIDES_STRUCT   = NO
+SYMBOL_CACHE_SIZE      = 0
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -51,10 +53,10 @@ HIDE_IN_BODY_DOCS      = NO
 INTERNAL_DOCS          = NO
 CASE_SENSE_NAMES       = NO
 HIDE_SCOPE_NAMES       = NO
-SHOW_INCLUDE_FILES     = YES
 INLINE_INFO            = YES
 SORT_MEMBER_DOCS       = YES
 SORT_BRIEF_DOCS        = NO
+SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
 GENERATE_TODOLIST      = YES
 GENERATE_TESTLIST      = YES
@@ -62,9 +64,11 @@ GENERATE_BUGLIST       = YES
 GENERATE_DEPRECATEDLIST= YES
 ENABLED_SECTIONS       = 
 MAX_INITIALIZER_LINES  = 30
-SHOW_USED_FILES        = YES
 SHOW_DIRECTORIES       = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
 FILE_VERSION_FILTER    = 
+LAYOUT_FILE            = 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
@@ -131,7 +135,6 @@ VERBATIM_HEADERS       = YES
 #---------------------------------------------------------------------------
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
-ALPHABETICAL_INDEX     = YES
 COLS_IN_ALPHA_INDEX    = 5
 IGNORE_PREFIX          = 
 #---------------------------------------------------------------------------
@@ -151,13 +154,18 @@ DOCSET_BUNDLE_ID       = org.doxygen.Doxygen
 HTML_DYNAMIC_SECTIONS  = YES
 CHM_FILE               = 
 HHC_LOCATION           = 
+QTHELP_FILE            = 
+QTHELP_CONFIG          = 
+DOXYGEN2QTHELP_LOC     = 
 GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     = 
 BINARY_TOC             = NO
 TOC_EXPAND             = NO
 DISABLE_INDEX          = NO
 ENUM_VALUES_PER_LINE   = 4
 GENERATE_TREEVIEW      = YES
 TREEVIEW_WIDTH         = 250
+FORMULA_FONTSIZE       = 10
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
@@ -235,17 +243,13 @@ CLASS_DIAGRAMS         = NO
 MSCGEN_PATH            = 
 HIDE_UNDOC_RELATIONS   = YES
 HAVE_DOT               = YES
-CLASS_GRAPH            = YES
-COLLABORATION_GRAPH    = YES
-GROUP_GRAPHS           = YES
+DOT_FONTNAME           = FreeSans
+DOT_FONTPATH           = 
 UML_LOOK               = NO
 TEMPLATE_RELATIONS     = YES
-INCLUDE_GRAPH          = YES
-INCLUDED_BY_GRAPH      = NO
 CALL_GRAPH             = NO
 CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
-DIRECTORY_GRAPH        = YES
 DOT_IMAGE_FORMAT       = png
 DOT_PATH               = 
 DOTFILE_DIRS           = 
diff --git a/INSTALL b/INSTALL
index abe6f0a..eb27c2d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.5.6-20080727
+DOXYGEN Version 1.5.6-20080819
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (27 July 2008)
+Dimitri van Heesch (19 August 2008)
diff --git a/Makefile.in b/Makefile.in
index 8f472c1..31ea1b3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -94,8 +94,7 @@ dist: clean
 	rm -rf $(DISTDIR)
 	mkdir $(DISTDIR)
 	cp -a $(DISTFILES) README $(DISTDIR)
-	find $(DISTDIR) \( -name "CVS" -o -name ".cvsignore" \) \
-  	               -print0 | xargs -0 rm -rf
+	find $(DISTDIR) \( -name ".svn" \) -print0 | xargs -0 rm -rf
 	tar zcvf $(DISTDIR).src.tar.gz $(DISTDIR)
 	rm -rf $(DISTDIR)
 
diff --git a/README b/README
index b2d8671..2063e27 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.5.6_20080727
+DOXYGEN Version 1.5.6_20080819
 
 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) (27 July 2008)
+Dimitri van Heesch (dimitri@stack.nl) (19 August 2008)
diff --git a/addon/doxmlparser/include/doxmlintf.h b/addon/doxmlparser/include/doxmlintf.h
index 79d7bc7..88cb2e3 100644
--- a/addon/doxmlparser/include/doxmlintf.h
+++ b/addon/doxmlparser/include/doxmlintf.h
@@ -45,6 +45,8 @@ class IString
     VIRTUAL_DESTRUCTOR(IString)
     /*! Returns a latin1 character representation of the string. */
     virtual const char *latin1() const = 0;
+    /*! Returns a utf8 character representation of the string. */
+    virtual const char *utf8() const = 0;
     /*! Returns a 16-bit unicode character representation of the character at 
      *  position \a index in the string. The first character is at index 0.
      */
diff --git a/addon/doxmlparser/src/dochandler.cpp b/addon/doxmlparser/src/dochandler.cpp
index 07971c3..ce7cb3f 100644
--- a/addon/doxmlparser/src/dochandler.cpp
+++ b/addon/doxmlparser/src/dochandler.cpp
@@ -1118,7 +1118,6 @@ void HighlightHandler::startSpace(const QXmlAttributes&)
 
 void HighlightHandler::addTextNode()
 {
-  printf("m_curString=`%s'\n",m_curString.data());
   if (!m_curString.isEmpty())
   {
     m_children.append(new TextNode(m_curString,IDocMarkup::Normal,0));
diff --git a/addon/doxmlparser/src/mainhandler.cpp b/addon/doxmlparser/src/mainhandler.cpp
index 0ac0fe9..81d7d2f 100644
--- a/addon/doxmlparser/src/mainhandler.cpp
+++ b/addon/doxmlparser/src/mainhandler.cpp
@@ -148,12 +148,12 @@ void MainHandler::startMember(const QXmlAttributes& attrib)
 
 void MainHandler::endMember()
 {
-  m_curCompound->memberDict.insert(m_curString,m_curMember);
+  m_curCompound->memberDict.insert(m_curMember->name,m_curMember);
   QList<CompoundEntry> *cel=0;
-  if ((cel=m_memberNameDict.find(m_curString))==0)
+  if ((cel=m_memberNameDict.find(m_curMember->name))==0)
   {
     cel = new QList<CompoundEntry>;
-    m_memberNameDict.insert(m_curString,cel);
+    m_memberNameDict.insert(m_curMember->name,cel);
   }
   cel->append(m_curCompound);
   m_insideMember = FALSE;
diff --git a/addon/doxmlparser/src/stringimpl.h b/addon/doxmlparser/src/stringimpl.h
index ac4ee12..013858f 100644
--- a/addon/doxmlparser/src/stringimpl.h
+++ b/addon/doxmlparser/src/stringimpl.h
@@ -16,6 +16,8 @@ class StringImpl : public QString, public IString
     // IString 
     const char *latin1() const 
     { return QString::latin1(); }
+    const char *utf8() const 
+    { return QString::utf8(); }
     unsigned short unicodeCharAt(int index) const 
     { return QString::unicode()[index].unicode(); } 
     bool isEmpty() const 
diff --git a/configure b/configure
index efc8c8f..a0a1ffc 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=20080727
+doxygen_version_mmn=20080819
 
 bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
 
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 7ea5784..0876ffa 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -33,7 +33,7 @@ CASE_SENSE_NAMES  = NO
 IMAGE_PATH        = .
 INPUT             = index.doc install.doc starting.doc docblocks.doc lists.doc \
                     grouping.doc formulas.doc diagrams.doc preprocessing.doc \
-                    autolink.doc output.doc custcmd.doc external.doc faq.doc trouble.doc history.doc features.doc \
+                    autolink.doc output.doc customize.doc custcmd.doc external.doc faq.doc trouble.doc history.doc features.doc \
 		    doxygen_usage.doc doxytag_usage.doc \
                     doxywizard_usage.doc installdox_usage.doc \
 		    config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
diff --git a/doc/config.doc b/doc/config.doc
index 31ff5a4..27fde41 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -58,7 +58,6 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_abbreviate_brief ABBREVIATE_BRIEF
 \refitem cfg_aliases ALIASES
 \refitem cfg_allexternals ALLEXTERNALS 
-\refitem cfg_alphabetical_index ALPHABETICAL_INDEX 
 \refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
 \refitem cfg_binary_toc BINARY_TOC
 \refitem cfg_builtin_stl_support BUILTIN_STL_SUPPORT
@@ -68,14 +67,11 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_case_sense_names CASE_SENSE_NAMES 
 \refitem cfg_chm_file CHM_FILE
 \refitem cfg_class_diagrams CLASS_DIAGRAMS 
-\refitem cfg_class_graph CLASS_GRAPH
-\refitem cfg_collaboration_graph COLLABORATION_GRAPH
 \refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
 \refitem cfg_compact_latex COMPACT_LATEX 
 \refitem cfg_compact_rtf COMPACT_RTF
 \refitem cfg_cpp_cli_support CPP_CLI_SUPPORT
 \refitem cfg_create_subdirs CREATE_SUBDIRS
-\refitem cfg_details_at_top DETAILS_AT_TOP 
 \refitem cfg_directory_graph DIRECTORY_GRAPH
 \refitem cfg_disable_index DISABLE_INDEX 
 \refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
@@ -134,7 +130,6 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_generate_treeview GENERATE_TREEVIEW
 \refitem cfg_generate_xml GENERATE_XML
 \refitem cfg_graphical_hierarchy GRAPHICAL_HIERARCHY
-\refitem cfg_group_graphs GROUP_GRAPHS
 \refitem cfg_have_dot HAVE_DOT
 \refitem cfg_hhc_location HHC_LOCATION
 \refitem cfg_hide_friend_compounds HIDE_FRIEND_COMPOUNDS
@@ -152,7 +147,6 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_idl_property_support IDL_PROPERTY_SUPPORT
 \refitem cfg_ignore_prefix IGNORE_PREFIX
 \refitem cfg_image_path IMAGE_PATH
-\refitem cfg_include_graph INCLUDE_GRAPH
 \refitem cfg_include_path INCLUDE_PATH
 \refitem cfg_inherit_docs INHERIT_DOCS
 \refitem cfg_inline_info INLINE_INFO
@@ -168,6 +162,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_latex_header LATEX_HEADER
 \refitem cfg_latex_hide_indices LATEX_HIDE_INDICES
 \refitem cfg_latex_output LATEX_OUTPUT
+\refitem cfg_layout_file LAYOUT_FILE
 \refitem cfg_macro_expansion MACRO_EXPANSION
 \refitem cfg_makeindex_cmd_name MAKEINDEX_CMD_NAME
 \refitem cfg_man_extension MAN_EXTENSION
@@ -211,9 +206,7 @@ followed by the descriptions of the tags grouped by category.
 \refitem cfg_short_names SHORT_NAMES
 \refitem cfg_show_dirs SHOW_DIRECTORIES
 \refitem cfg_show_files SHOW_FILES
-\refitem cfg_show_include_files SHOW_INCLUDE_FILES
 \refitem cfg_show_namespaces SHOW_NAMESPACES
-\refitem cfg_show_used_files SHOW_USED_FILES
 \refitem cfg_sip_support SIP_SUPPORT
 \refitem cfg_skip_function_macros SKIP_FUNCTION_MACROS
 \refitem cfg_sort_brief_docs SORT_BRIEF_DOCS
@@ -480,6 +473,7 @@ followed by the descriptions of the tags grouped by category.
   Note that setting this tag to YES also means that rational rose comments
   are not recognized any more.
 
+<!--
 \anchor cfg_details_at_top
 <dt>\c DETAILS_AT_TOP <dd>
  \addindex DETAILS_AT_TOP
@@ -487,6 +481,7 @@ followed by the descriptions of the tags grouped by category.
   will output the detailed description near the top, like JavaDoc.
   If set to NO, the detailed description appears after the member
   documentation.
+-->
 
 \anchor cfg_inherit_docs
 <dt>\c INHERIT_DOCS <dd>
@@ -692,12 +687,14 @@ function's detailed documentation block.
  will show members with their full class and namespace scopes in the
  documentation. If set to \c YES the scope will be hidden. 
 
+<!--
 \anchor cfg_show_include_files
 <dt>\c SHOW_INCLUDE_FILES <dd>
  \addindex SHOW_INCLUDE_FILES
  If the SHOW_INCLUDE_FILES tag is set to YES (the default) then doxygen
  will put a list of the files that are included by a file in the documentation 
  of that file.
+-->
 
 \anchor cfg_inline_info
 <dt>\c INLINE_INFO <dd>
@@ -789,12 +786,14 @@ function's detailed documentation block.
  individual variables and defines can be controlled using \ref cmdshowinitializer "\\showinitializer"
  or \ref cmdhideinitializer "\\hideinitializer" command in the documentation.
 
+<!--
 \anchor cfg_show_used_files
 <dt>\c SHOW_USED_FILES <dd>
  \addindex SHOW_USED_FILES
  Set the \c SHOW_USED_FILES tag to \c NO to disable the list of files generated
  at the bottom of the documentation of classes and structs. If set to \c YES the
  list will mention the files that were used to generate the documentation.
+-->
 
 \anchor cfg_show_dirs
 <dt>\c SHOW_DIRECTORIES <dd>
@@ -949,6 +948,17 @@ Example filter for ClearCase:
 FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 \endverbatim
 
+\anchor cfg_layout_file
+<dt>\c LAYOUT_FILE <dd>
+ The \c LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+ doxygen. The layout file controls the global structure of the generated output files
+ in an output format independent way. The create the layout file that represents
+ doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+ file name after the option, if omitted doxygenlayout.xml will be used as the name
+ of the layout file. Note that if you run doxygen from a directory containing 
+ a file called doxygenlayout.xml, doxygen will parse it automatically even if 
+ the \c LAYOUT_FILE tag is left empty.
+
 \anchor cfg_recursive
 <dt>\c RECURSIVE <dd>
  \addindex RECURSIVE
@@ -1124,14 +1134,16 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 \anchor cfg_alphabetical_index
 <dl>
 
+<!--
 <dt>\c ALPHABETICAL_INDEX <dd>
  \addindex ALPHABETICAL_INDEX
  If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
  of all compounds will be generated. Enable this if the project contains 
  a lot of classes, structs, unions or interfaces.
+-->
 
-\anchor cfg_cols_in_alpha_index
 <dt>\c COLS_IN_ALPHA_INDEX <dd>
+ \anchor cfg_cols_in_alpha_index
  \addindex COLS_IN_ALPHA_INDEX
  If the alphabetical index is enabled 
  (see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be 
@@ -1925,6 +1937,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
  different font using \c DOT_FONTNAME you can set the path where dot 
  can find it using this tag. 
 
+<!--
 \anchor cfg_class_graph
 <dt>\c CLASS_GRAPH <dd>
  \addindex CLASS_GRAPH
@@ -1946,6 +1959,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
  \addindex GROUP_GRAPHS
  If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
  will generate a graph for groups, showing the direct groups dependencies.
+-->
 
 \anchor cfg_uml_look
 <dt>\c UML_LOOK <dd>
@@ -1967,6 +1981,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
  inheritance and usage relations if the target is undocumented
  or is not a class.
 
+<!--
 \anchor cfg_include_graph
 <dt>\c INCLUDE_GRAPH <dd>
  \addindex INCLUDE_GRAPH 
@@ -1982,6 +1997,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
  \c HAVE_DOT tags are set to \c YES then doxygen will generate a graph for each
  documented header file showing the documented files that directly or indirectly
  include this file.
+-->
 
 \anchor cfg_call_graph
 <dt>\c CALL_GRAPH <dd>
@@ -2060,10 +2076,11 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
 \anchor cfg_dot_transparent
 <dt>\c DOT_TRANSPARENT <dd>
  \addindex DOT_TRANSPARENT
- Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent 
- background. This is enabled by default, which results in a transparent background. 
- Warning: Depending on the platform used, enabling this option may lead to badly
- anti-aliased labels on the edges of a graph (i.e. they become hard to read).
+ Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
+ background. This is disabled by default, because dot on Windows does not 
+ seem to support this out of the box. Warning: Depending on the platform used, 
+ enabling this option may lead to badly anti-aliased labels on the edges of 
+ a graph (i.e. they become hard to read). 
  
 \anchor cfg_dot_multi_targets
 <dt>\c DOT_MULTI_TARGETS <dd>
diff --git a/doc/customize.doc b/doc/customize.doc
new file mode 100644
index 0000000..e8bc99a
--- /dev/null
+++ b/doc/customize.doc
@@ -0,0 +1,248 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+/*! \page customize Customizing the output
+
+Doxygen provides various levels of customization. 
+The \ref minor_tweaks "first section" discusses what to 
+do if you want to do minor tweaker to the look and feel of the output. 
+The \ref layout "next" section show how to reorder and hide certain 
+information on a page. 
+The \ref xmlgenerator "last" section show how to generate whatever output
+you want based on the XML output produced by doxygen.
+
+\section minor_tweaks Minor Tweaks
+
+To simply tweak things like fonts or colors, margins, or other look \& feel
+espects of the HTML output you can create a different 
+<a href="http://www.w3schools.com/css/default.asp">cascading style sheet</a>. 
+You can also let doxygen use a custom header and footer for each HTML 
+page it generates, for instance to include a logo or to make the 
+doxygen output blend in with the rest of the web site.
+
+To do this first run doxygen as follows:
+\verbatim
+doxygen -w html header.html footer.html customdoxygen.css 
+\endverbatim
+
+This will create 3 files:
+- header.html is a HTML fragment which doxygen normally uses to start
+  a HTML page. Note that the fragment ends with a body tag and that is
+  contains a couple of commands of the form \$word. These will be replaced
+  by doxygen on the fly. 
+- footer.html is a HTML fragment which doxygen normally uses to end 
+  a HTML page. Also here special commands can be used. This file contain the 
+  link to www.doxygen.org and the body and html end tags.
+- customdoxygen.css is the default cascading style sheet
+  used by doxygen. 
+
+You should edit these files and then reference them from the config file.
+\verbatim
+HTML_HEADER      = header.html
+HTML_FOOTER      = footer.html
+HTML_STYLESHEET  = customdoxygen.css
+\endverbatim
+
+See the documentation of the \ref cfg_html_header "HTML_HEADER" tag
+for more information about the possible meta commands.
+
+\note You should not put the style sheet in the HTML output directory. Treat
+it is a source file. Doxygen will copy it for you. 
+
+\note If you use images or other external content in a custom header you
+need to make sure these end up in the HTML output directory yourself,
+for instance by writing a script that runs doxygen can then copies the
+images to the output.
+
+
+\section layout Changing the layout of pages
+
+In some cases you may want to change the way the output is structured.
+A different style sheet or custom headers and footers do not help in such 
+case.
+
+The solution doxygen provides is a layout file, which you can
+modify and doxygen will use to control what information is presented, 
+in which order, and to some extent also how information is presented.
+The layout file is an XML file. 
+
+The default layout can be generated
+by doxygen using the following command:
+\verbatim
+doxygen -l 
+\endverbatim
+optionally the name of the layout file can be specified, if omitted
+\c doxygenlayout.xml will be used.
+
+The toplevel structure of the file looks as follows:
+\verbatim
+<doxygenlayout version="1.0">
+  <navindex>
+    ...
+  </navindex>
+  <class>
+    ...
+  </class>
+  <namespace>
+    ...
+  </namespace>
+  <file>
+    ...
+  </file>
+  <group>
+    ...
+  </group>
+  <directory>
+    ...
+  </directory>
+</doxygenlayout>
+\endverbatim
+
+The root tag of the XML is \c doxygenlayout, it has an attribute named
+\c version, which will be used in the future to cope with changes that are
+not backward compatible.
+
+The first section, enclosed by \c navindex tags represents the layout of 
+the navigation tabs displayed at the top of each HTML page. 
+Each tab is represented by a \c tab tag in the XML file.
+
+You can hide tabs by setting the \c visible attribute to \c no. 
+You can also override the default title of a tab by specifying it as 
+the value of the \c title attribute. If the title field is the empty string
+(the default) then doxygen will fill in an appropriate title.
+You can reorder the tabs by moving the tab tags in the XML file
+within the \c navindex section and even change the tree structure. 
+Do not change the value of the \c type attribute however. 
+Only a fixed set of types are supported, each representing a link to a 
+specific index.
+
+The sections after \c navindex represent the layout of the different 
+pages generated by doxygen:
+- The \c class section represents the layout of all pages generated for
+  documented classes, structs, unions, and interfaces.
+- The \c namespace section represents the layout of all pages generated for
+  documented namespaces (and also Java packages).
+- The \c file section represents the layout of all pages generated for
+  documented files.
+- The \c group section represents the layout of all pages generated for
+  documented groups (or modules).
+- The \c directory section represents the layout of all pages generated for
+  documented directories.
+
+Each XML tag within one of the above page sections represents a certain
+piece of information. Some pieces can appear in each type of page,
+others are specific for a certain type of page.
+Doxygen will list the pieces in the order in which they appear 
+in the XML file. 
+
+Some tags have a \c visible attribute which can be 
+used to hide the fragment from the generated output. 
+Note that the \c visible attribute is just a hint for doxygen. 
+If no relevant information is available for a certain piece it is 
+omitted even if it is set to \c yes.
+
+Some tags have a \c title attribute. This attribute can be used
+to customize the title doxygen will use as a header for the piece.
+
+@warning at the moment you should not remove tags from the layout file
+as a way to hide information. Doing so can cause broken links in the 
+generated output!
+
+At the moment the following generic tags are possible for each page:
+<dl>
+<dt>\c briefdescription
+  <dd>Represents the brief description on a page.
+<dt>\c detaileddescription
+  <dd>Represents the detailed description on a page.
+<dt>\c authorsection
+  <dd>Represents the author section of a page (only used for man pages).
+<dt>\c memberdecl
+  <dd>Represents the quick overview of members on a page (member declarations).
+      This tag has child tags each representing a list of 
+      members of a certain type. 
+      The possible child tags are not listed in detail in the document, 
+      but the name of the tag should be a good indication of the type 
+      of members that the tag represents.
+<dt>\c memberdef
+  <dd>Represents the detailed member list on a page (member definition).
+      Like the \c memberdecl tag, also this tag has a number of 
+      possible child tags. 
+</dl>
+
+The class page has the following specific tags:
+<dl>
+<dt>\c includes
+  <dd>Represents the include file needed to obtain the definition for 
+      this class.
+<dt>\c inheritancegraph
+  <dd>Represents the inheritance relations for a class. 
+      Note that the CLASS_DIAGRAM option determines
+      if the inheritance relation is a list of base and derived classes or
+      a graph. 
+<dt>\c collaborationgraph
+  <dd>Represents the collaboration graph for a class.
+<dt>\c allmemberslink
+  <dd>Represents the link to the list of all members for a class.
+<dt>\c usedfiles
+  <dd>Represents the list of files from which documentation for the class was
+      extracted.
+</dl>
+
+The file page has the following specific tags:
+<dl>
+<dt>\c includes
+  <dd>Represents the list of \#include statements contained in this file.
+<dt>\c includegraph
+  <dd>Represents the include dependency graph for the file.
+<dt>\c includedbygraph
+  <dd>Represents the included by dependency graph for the file.
+<dt>\c sourcelink
+  <dd>Represents the link to the source code of this file.
+</dl>
+
+The group page has a specific \c groupgraph tag which represents the
+graph showing the dependencies between groups.
+
+Similarily, the directory page has a specific \c directorygraph tag 
+which represents the graph showing the dependencies between the directories 
+based on the \#include relations of the files inside the directories.
+
+\section xmlgenerator Using the XML output
+
+If the above two methods still do not provide enough flexibility, you
+can also use the XML output produced by doxygen as a basis to
+generate the output you like. To do this set GENERATE_XML to YES.
+
+The XML output consists of an index file named \c index.xml which
+lists all items extracted by doxygen with references to the other XML files
+for details. The structure of the index is described by a schema file
+\c index.xsd. All other XML files are described by the schema file 
+named \c compound.xsd. If you prefer one big XML file 
+you can combine the index and the other files using the 
+XSLT file \c combine.xslt.
+
+You can use any XML parser to parse the file or use the one that can be found
+in the \c addon/doxmlparser directory of doxygen source distribution. 
+Look at \c addon/doxmlparser/include/doxmlintf.h for the interface of the
+parser and in \c addon/doxmlparser/example for examples.
+
+The advantage of using the doxmlparser is that it
+will only read the index file into memory and then only those XML 
+files that you implicitly load via navigating through the index. As a 
+result this works even for very large projects where reading all XML
+files as one big DOM tree would not fit into memory.
+
+ */
diff --git a/doc/diagrams.doc b/doc/diagrams.doc
index f060bd9..9295360 100644
--- a/doc/diagrams.doc
+++ b/doc/diagrams.doc
@@ -19,33 +19,31 @@
   Doxygen has built-in support to generate inheritance diagrams for C++
   classes. 
 
-  Doxygen can use the "dot" tool from graphviz 1.5 to generate
-  more advanced diagrams and graphs. Graphviz is an "open-sourced", 
+  Doxygen can use the "dot" tool from graphviz to generate
+  more advanced diagrams and graphs. Graphviz is an open-source, 
   cross-platform graph drawing toolkit and can be found 
   at http://www.graphviz.org/
 
-  If you have the "dot" tool available in the path, you can set
+  If you have the "dot" tool in the path, you can set
   \ref cfg_have_dot "HAVE_DOT" to \c YES in the configuration file to 
   let doxygen use it.
 
   Doxygen uses the "dot" tool to generate the following graphs:
   <ul>
-  <li>if \ref cfg_graphical_hierarchy "GRAPHICAL_HIERARCHY" is set to \c YES, 
-      a graphical representation of the class hierarchy will be drawn, along 
+  <li>A graphical representation of the class hierarchy will be drawn, along 
       with the textual one. Currently this feature is supported for HTML only.\n
       <b>Warning:</b> When you have a very large class hierarchy where many 
       classes derive from a common base class, the resulting image may become 
       too big to handle for some browsers.
-  <li>if \ref cfg_class_graph "CLASS_GRAPH" is set to \c YES,
-      a graph will be generated for each documented class showing the 
+  <li>An inheritance graph will be generated for each documented class showing the 
       direct and indirect inheritance relations. This disables the
       generation of the built-in class inheritance diagrams.
-  <li>if \ref cfg_include_graph "INCLUDE_GRAPH" is set to \c YES, an include 
-      dependency graph is generated for each documented file that includes at 
-      least one other file. This feature is currently supported for HTML and RTF 
-      only.
-  <li>if \ref cfg_collaboration_graph "COLLABORATION_GRAPH" is set to YES, a 
-      graph is drawn for each documented class and struct that shows:
+  <li>An include dependency graph is generated for each documented file that 
+      includes at least one other file. This feature is currently supported 
+      for HTML and RTF only.
+  <li>An inverse include dependency graph is also generated showing for
+      a (header) file, which other files include it.
+  <li>A graph is drawn for each documented class and struct that shows:
       <ul>
       <li> the inheritance relations with base classes.
       <li> the usage relations with other structs and classes (e.g. 
@@ -60,6 +58,13 @@
       functions that the function is directly or indirectly called by.
   </ul>
 
+  Using a \ref customize "layout file" you can determine which of the
+  graphs are actually shown.
+
+  The options \ref cfg_dot_graph_max_nodes "DOT_GRAPH_MAX_NODES" and
+  \ref cfg_max_dot_graph_depth "MAX_DOT_GRAPH_DEPTH" can be used to 
+  limit the size of the various graphs.
+
   The elements in the class diagrams in HTML and RTF 
   have the following meaning:
   <ul>
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index 5a46eb9..3020fd4 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -56,6 +56,7 @@ Written by Dimitri van Heesch\\[2ex]
 \chapter{Preprocessing}\label{preprocessing}\hypertarget{preprocessing}{}\input{preprocessing}
 \chapter{Automatic link generation}\label{autolink}\hypertarget{autolink}{}\input{autolink}
 \chapter{Output Formats}\label{output}\hypertarget{output}{}\input{output}
+\chapter{Customizing the Output}\label{customize}\hypertarget{customize}{}\input{customize}
 \chapter{Custom Commands}\label{custcmd}\hypertarget{custcmd}{}\input{custcmd}
 \chapter{Link to external documentation}\label{external}\hypertarget{external}{}\input{external}
 \chapter{Frequently Asked Questions}\label{faq}\hypertarget{faq}{}\input{faq}
diff --git a/doc/index.doc b/doc/index.doc
index 86052bf..87e419f 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -75,6 +75,8 @@ The first part forms a user manual:
                  and members in the documentation.
 <li>Section \ref output shows how to generate the various output formats
                  supported by doxygen.
+<li>Section \ref customize explains how you can customize the output generated
+                 by doxygen.
 <li>Section \ref custcmd show how to define and use custom commands in your comments.
 <li>Section \ref external explains how to let doxygen create links to externally generated documentation.
 <li>Section \ref faq gives answers to frequently asked questions. 
diff --git a/doc/infoflow.eps b/doc/infoflow.eps
index 740c1e4..dd7f799 100644
--- a/doc/infoflow.eps
+++ b/doc/infoflow.eps
@@ -1,10 +1,10 @@
 %!PS-Adobe-2.0 EPSF-2.0
-%%Title: infoflow.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 3c
-%%CreationDate: Fri Aug  8 17:06:41 2003
-%%For: dimitri@pandora.home.nl (Dimitri van Heesch)
-%%BoundingBox: 0 0 659 583
-%%Magnification: 1.0000
+%%Title: infoflow.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5
+%%CreationDate: Sun Aug 17 14:52:37 2008
+%%For: dimitri@macbook.home.nl (Dimitri Van Heesch)
+%%BoundingBox: 0 0 661 582
+%Magnification: 1.0000
 %%EndComments
 /$F2psDict 200 dict def
 $F2psDict begin
@@ -47,8 +47,8 @@ $F2psDict /mtrx matrix put
 
 end
 save
-newpath 0 583 moveto 0 0 lineto 659 0 lineto 659 583 lineto closepath clip newpath
--53.0 600.0 translate
+newpath 0 582 moveto 0 0 lineto 661 0 lineto 661 582 lineto closepath clip newpath
+-53.3 599.2 translate
 1 -1 scale
 
 /cp {closepath} bind def
@@ -124,28 +124,21 @@ newfontname newfont definefont pop end } def
 /$F2psEnd {$F2psEnteredState restore end} def
 
 $F2psBegin
-%%Page: 1 1
 10 setmiterlimit
+0 slj 0 slc
  0.06000 0.06000 sc
 %
 % Fig objects follow
 %
+% 
+% here starts figure with depth 50
+/Times-Roman-iso ff 200.00 scf sf
+8100 7200 m
+gs 1 -1 sc (import) col0 sh gr
 % Polyline
+0 slj
+0 slc
 7.500 slw
-n 3600 1950 m 3900 1650 l 4800 1650 l 4800 3150 l 3600 3150 l 3600 1950 l
- 3900 1950 l
- 3900 1650 l gs col0 s gr 
-/Times-Roman-iso ff 180.00 scf sf
-3900 2250 m
-gs 1 -1 sc (Config file) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3900 2550 m
-gs 1 -1 sc (Doxyfile) col0 sh gr
-% Polyline
-n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l
- 1200 3675 l
- 1200 3375 l gs col0 s gr 
-% Polyline
 n 975 3600 m 975 3300 l 2175 3300 l 2175 4800 l
  2100 4800 l gs col0 s gr 
 % Polyline
@@ -167,13 +160,13 @@ n 1050 5325 m 1050 5250 l 2250 5250 l 2250 6750 l
 % Polyline
 n 1125 5250 m 1125 5175 l 2325 5175 l 2325 6675 l
  2250 6675 l gs col0 s gr 
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 1275 6075 m
 gs 1 -1 sc (- headers) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 1275 6675 m
 gs 1 -1 sc (- images) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 1275 6375 m
 gs 1 -1 sc (- footers) col0 sh gr
 % Polyline
@@ -229,17 +222,25 @@ n 6750 525 m 6750 450 l 7950 450 l 7950 1950 l
 n 6825 450 m 6825 375 l 8025 375 l 8025 1875 l
  7950 1875 l gs col0 s gr 
 % Polyline
-gs  clippath
-4020 3765 m 4080 3765 l 4080 3614 l 4050 3734 l 4020 3614 l cp
-eoclip
-n 4050 3150 m
- 4050 3750 l gs col0 s gr gr
-
-% arrowhead
-n 4020 3614 m 4050 3734 l 4080 3614 l 4020 3614 l  cp gs 0.00 setgray ef gr  col0 s
+n 4350 1950 m 4650 1650 l 5550 1650 l 5550 3150 l 4350 3150 l 4350 1950 l
+ 4650 1950 l
+ 4650 1650 l gs col0 s gr 
+/Times-Roman-iso ff 200.00 scf sf
+4575 2250 m
+gs 1 -1 sc (Config file) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4575 2550 m
+gs 1 -1 sc (Doxyfile) col0 sh gr
+% Polyline
+n 2850 1950 m 3150 1650 l 4050 1650 l 4050 3150 l 2850 3150 l 2850 1950 l
+ 3150 1950 l
+ 3150 1650 l gs col0 s gr 
+/Times-Roman-iso ff 200.00 scf sf
+3000 2475 m
+gs 1 -1 sc (Layout file) col0 sh gr
 % Polyline
 gs  clippath
-3315 4155 m 3315 4095 l 3164 4095 l 3284 4125 l 3164 4155 l cp
+3164 4155 m 3315 4155 l 3315 4095 l 3164 4095 l 3164 4095 l 3284 4125 l 3164 4155 l cp
 eoclip
 n 2100 4125 m
  3300 4125 l gs col0 s gr gr
@@ -248,7 +249,7 @@ n 2100 4125 m
 n 3164 4155 m 3284 4125 l 3164 4095 l 3164 4155 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-3315 4380 m 3315 4320 l 3164 4320 l 3284 4350 l 3164 4380 l cp
+3164 4380 m 3315 4380 l 3315 4320 l 3164 4320 l 3164 4320 l 3284 4350 l 3164 4380 l cp
 eoclip
 n 2100 6225 m 2700 6225 l 2700 4350 l
  3300 4350 l gs col0 s gr gr
@@ -256,24 +257,12 @@ n 2100 6225 m 2700 6225 l 2700 4350 l
 % arrowhead
 n 3164 4380 m 3284 4350 l 3164 4320 l 3164 4380 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
-gs  clippath
-4380 3135 m 4320 3135 l 4320 3286 l 4350 3166 l 4380 3286 l cp
-eoclip
-n 4350 3150 m
- 4350 3750 l gs col0 s gr gr
-
-% arrowhead
-n 4380 3286 m 4350 3166 l 4320 3286 l 4380 3286 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
 n 3675 5925 m 3975 5625 l 4875 5625 l 4875 7125 l 3675 7125 l 3675 5925 l
  3975 5925 l
  3975 5625 l gs col0 s gr 
 % Polyline
-n 3300 300 m 5100 300 l 5100 1050 l 3300 1050 l
- cp gs col32 1.00 shd ef gr gs col0 s gr 
-% Polyline
 gs  clippath
-4155 4635 m 4095 4635 l 4095 4786 l 4125 4666 l 4155 4786 l cp
+4155 4786 m 4155 4635 l 4095 4635 l 4095 4786 l 4095 4786 l 4125 4666 l 4155 4786 l cp
 eoclip
 n 4125 5625 m
  4125 4650 l gs col0 s gr gr
@@ -282,7 +271,7 @@ n 4125 5625 m
 n 4155 4786 m 4125 4666 l 4095 4786 l 4155 4786 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-4320 5640 m 4380 5640 l 4380 5489 l 4350 5609 l 4320 5489 l cp
+4320 5489 m 4320 5640 l 4380 5640 l 4380 5489 l 4380 5489 l 4350 5609 l 4320 5489 l cp
 eoclip
 n 4350 5625 m
  4350 4650 l gs col0 s gr gr
@@ -291,19 +280,7 @@ n 4350 5625 m
 n 4320 5489 m 4350 5609 l 4380 5489 l 4320 5489 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-4170 1665 m 4230 1665 l 4230 1514 l 4200 1634 l 4170 1514 l cp
-4230 1035 m 4170 1035 l 4170 1186 l 4200 1066 l 4230 1186 l cp
-eoclip
-n 4200 1050 m
- 4200 1650 l gs col0 s gr gr
-
-% arrowhead
-n 4230 1186 m 4200 1066 l 4170 1186 l 4230 1186 l  cp gs 0.00 setgray ef gr  col0 s
-% arrowhead
-n 4170 1514 m 4200 1634 l 4230 1514 l 4170 1514 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-gs  clippath
-6615 1455 m 6615 1395 l 6464 1395 l 6584 1425 l 6464 1455 l cp
+6464 1455 m 6615 1455 l 6615 1395 l 6464 1395 l 6464 1395 l 6584 1425 l 6464 1455 l cp
 eoclip
 n 5100 3900 m 6000 3900 l 6000 1425 l
  6600 1425 l gs col0 s gr gr
@@ -312,7 +289,7 @@ n 5100 3900 m 6000 3900 l 6000 1425 l
 n 6464 1455 m 6584 1425 l 6464 1395 l 6464 1455 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-6615 3480 m 6615 3420 l 6464 3420 l 6584 3450 l 6464 3480 l cp
+6464 3480 m 6615 3480 l 6615 3420 l 6464 3420 l 6464 3420 l 6584 3450 l 6464 3480 l cp
 eoclip
 n 5100 4050 m 6300 4050 l 6300 3450 l
  6600 3450 l gs col0 s gr gr
@@ -321,7 +298,7 @@ n 5100 4050 m 6300 4050 l 6300 3450 l
 n 6464 3480 m 6584 3450 l 6464 3420 l 6464 3480 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-6615 5580 m 6615 5520 l 6464 5520 l 6584 5550 l 6464 5580 l cp
+6464 5580 m 6615 5580 l 6615 5520 l 6464 5520 l 6464 5520 l 6584 5550 l 6464 5580 l cp
 eoclip
 n 5100 4200 m 6300 4200 l 6300 5550 l
  6600 5550 l gs col0 s gr gr
@@ -330,7 +307,7 @@ n 5100 4200 m 6300 4200 l 6300 5550 l
 n 6464 5580 m 6584 5550 l 6464 5520 l 6464 5580 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-6690 7380 m 6690 7320 l 6539 7320 l 6659 7350 l 6539 7380 l cp
+6539 7380 m 6690 7380 l 6690 7320 l 6539 7320 l 6539 7320 l 6659 7350 l 6539 7380 l cp
 eoclip
 n 5100 4350 m 6000 4350 l 6000 7350 l
  6675 7350 l gs col0 s gr gr
@@ -339,7 +316,7 @@ n 5100 4350 m 6000 4350 l 6000 7350 l
 n 6539 7380 m 6659 7350 l 6539 7320 l 6539 7380 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-6690 9180 m 6690 9120 l 6539 9120 l 6659 9150 l 6539 9180 l cp
+6539 9180 m 6690 9180 l 6690 9120 l 6539 9120 l 6539 9120 l 6659 9150 l 6539 9180 l cp
 eoclip
 n 5100 4500 m 5700 4500 l 5700 9150 l
  6675 9150 l gs col0 s gr gr
@@ -361,7 +338,7 @@ n 9075 900 m 10650 900 l 10650 1425 l 9075 1425 l
  cp gs col0 s gr 
 % Polyline
 gs  clippath
-8790 1380 m 8790 1320 l 8639 1320 l 8759 1350 l 8639 1380 l cp
+8639 1380 m 8790 1380 l 8790 1320 l 8639 1320 l 8639 1320 l 8759 1350 l 8639 1380 l cp
 eoclip
 n 7800 1350 m
  8775 1350 l gs col0 s gr gr
@@ -370,7 +347,7 @@ n 7800 1350 m
 n 8639 1380 m 8759 1350 l 8639 1320 l 8639 1380 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-11490 1380 m 11490 1320 l 11339 1320 l 11459 1350 l 11339 1380 l cp
+11339 1380 m 11490 1380 l 11490 1320 l 11339 1320 l 11339 1320 l 11459 1350 l 11339 1380 l cp
 eoclip
 n 10800 1350 m
  11475 1350 l gs col0 s gr gr
@@ -379,7 +356,7 @@ n 10800 1350 m
 n 11339 1380 m 11459 1350 l 11339 1320 l 11339 1380 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-9015 3180 m 9015 3120 l 8864 3120 l 8984 3150 l 8864 3180 l cp
+8864 3180 m 9015 3180 l 9015 3120 l 8864 3120 l 8864 3120 l 8984 3150 l 8864 3180 l cp
 eoclip
 n 7800 3150 m
  9000 3150 l gs col0 s gr gr
@@ -388,7 +365,7 @@ n 7800 3150 m
 n 8864 3180 m 8984 3150 l 8864 3120 l 8864 3180 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-9015 3555 m 9015 3495 l 8864 3495 l 8984 3525 l 8864 3555 l cp
+8864 3555 m 9015 3555 l 9015 3495 l 8864 3495 l 8864 3495 l 8984 3525 l 8864 3555 l cp
 eoclip
 n 7800 3525 m
  9000 3525 l gs col0 s gr gr
@@ -400,7 +377,7 @@ n 9000 2925 m 10800 2925 l 10800 3675 l 9000 3675 l
  cp gs col32 1.00 shd ef gr gs col0 s gr 
 % Polyline
 gs  clippath
-11490 3180 m 11490 3120 l 11339 3120 l 11459 3150 l 11339 3180 l cp
+11339 3180 m 11490 3180 l 11490 3120 l 11339 3120 l 11339 3120 l 11459 3150 l 11339 3180 l cp
 eoclip
 n 10800 3150 m
  11475 3150 l gs col0 s gr gr
@@ -409,7 +386,7 @@ n 10800 3150 m
 n 11339 3180 m 11459 3150 l 11339 3120 l 11339 3180 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-11490 3555 m 11490 3495 l 11339 3495 l 11459 3525 l 11339 3555 l cp
+11339 3555 m 11490 3555 l 11490 3495 l 11339 3495 l 11339 3495 l 11459 3525 l 11339 3555 l cp
 eoclip
 n 10800 3525 m
  11475 3525 l gs col0 s gr gr
@@ -417,11 +394,8 @@ n 10800 3525 m
 % arrowhead
 n 11339 3555 m 11459 3525 l 11339 3495 l 11339 3555 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
-n 9000 6900 m 10800 6900 l 10800 7650 l 9000 7650 l
- cp gs col32 1.00 shd ef gr gs col0 s gr 
-% Polyline
 gs  clippath
-9015 7305 m 9015 7245 l 8864 7245 l 8984 7275 l 8864 7305 l cp
+8864 7305 m 9015 7305 l 9015 7245 l 8864 7245 l 8864 7245 l 8984 7275 l 8864 7305 l cp
 eoclip
 n 7875 7275 m
  9000 7275 l gs col0 s gr gr
@@ -430,16 +404,7 @@ n 7875 7275 m
 n 8864 7305 m 8984 7275 l 8864 7245 l 8864 7305 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
 gs  clippath
-11415 7305 m 11415 7245 l 11264 7245 l 11384 7275 l 11264 7305 l cp
-eoclip
-n 10800 7275 m
- 11400 7275 l gs col0 s gr gr
-
-% arrowhead
-n 11264 7305 m 11384 7275 l 11264 7245 l 11264 7305 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-gs  clippath
-9015 9180 m 9015 9120 l 8864 9120 l 8984 9150 l 8864 9180 l cp
+8864 9180 m 9015 9180 l 9015 9120 l 8864 9120 l 8864 9120 l 8984 9150 l 8864 9180 l cp
 eoclip
 n 7875 9150 m
  9000 9150 l gs col0 s gr gr
@@ -447,23 +412,11 @@ n 7875 9150 m
 % arrowhead
 n 8864 9180 m 8984 9150 l 8864 9120 l 8864 9180 l  cp gs 0.00 setgray ef gr  col0 s
 % Polyline
-n 9000 8775 m 10875 8775 l 10875 9525 l 9000 9525 l
- cp gs col32 1.00 shd ef gr gs col0 s gr 
-% Polyline
-gs  clippath
-11415 9180 m 11415 9120 l 11264 9120 l 11384 9150 l 11264 9180 l cp
-eoclip
-n 10875 9150 m
- 11400 9150 l gs col0 s gr gr
-
-% arrowhead
-n 11264 9180 m 11384 9150 l 11264 9120 l 11264 9180 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
 n 3300 8850 m 5100 8850 l 5100 9525 l 3300 9525 l
  cp gs col32 1.00 shd ef gr gs col0 s gr 
 % Polyline
 gs  clippath
-5085 9270 m 5085 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp
+5236 9270 m 5085 9270 l 5085 9330 l 5236 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp
 eoclip
 n 6675 9300 m
  5100 9300 l gs col0 s gr gr
@@ -476,132 +429,218 @@ n 8700 6450 m 11850 6450 l 11850 9975 l 8700 9975 l
  cp gs col0 s gr  [] 0 sd
 % Polyline
 gs  clippath
-4305 7110 m 4245 7110 l 4245 7261 l 4275 7141 l 4305 7261 l cp
+4305 7261 m 4305 7110 l 4245 7110 l 4245 7261 l 4245 7261 l 4275 7141 l 4305 7261 l cp
 eoclip
 n 4275 8850 m
  4275 7125 l gs col0 s gr gr
 
 % arrowhead
 n 4305 7261 m 4275 7141 l 4245 7261 l 4305 7261 l  cp gs 0.00 setgray ef gr  col0 s
-/Times-Roman-iso ff 180.00 scf sf
-4500 3525 m
-gs 1 -1 sc (generate/update) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3600 3525 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+% Polyline
+gs  clippath
+4845 1514 m 4845 1665 l 4905 1665 l 4905 1514 l 4905 1514 l 4875 1634 l 4845 1514 l cp
+4905 1186 m 4905 1035 l 4845 1035 l 4845 1186 l 4845 1186 l 4875 1066 l 4905 1186 l cp
+eoclip
+n 4875 1050 m
+ 4875 1650 l gs col0 s gr gr
+
+% arrowhead
+n 4905 1186 m 4875 1066 l 4845 1186 l 4905 1186 l  cp gs 0.00 setgray ef gr  col0 s
+% arrowhead
+n 4845 1514 m 4875 1634 l 4905 1514 l 4845 1514 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 4125 300 m 5925 300 l 5925 1050 l 4125 1050 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+4905 3286 m 4905 3135 l 4845 3135 l 4845 3286 l 4845 3286 l 4875 3166 l 4905 3286 l cp
+eoclip
+n 4875 3150 m
+ 4875 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4905 3286 m 4875 3166 l 4845 3286 l 4905 3286 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+4620 3614 m 4620 3765 l 4680 3765 l 4680 3614 l 4680 3614 l 4650 3734 l 4620 3614 l cp
+eoclip
+n 4650 3150 m
+ 4650 3750 l gs col0 s gr gr
+
+% arrowhead
+n 4620 3614 m 4650 3734 l 4680 3614 l 4620 3614 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3720 3614 m 3720 3765 l 3780 3765 l 3780 3614 l 3780 3614 l 3750 3734 l 3720 3614 l cp
+eoclip
+n 3750 3150 m
+ 3750 3750 l gs col0 s gr gr
+
+% arrowhead
+n 3720 3614 m 3750 3734 l 3780 3614 l 3720 3614 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3555 3286 m 3555 3135 l 3495 3135 l 3495 3286 l 3495 3286 l 3525 3166 l 3555 3286 l cp
+eoclip
+n 3525 3150 m
+ 3525 3750 l gs col0 s gr gr
+
+% arrowhead
+n 3555 3286 m 3525 3166 l 3495 3286 l 3555 3286 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 9000 8775 m 11175 8775 l 11175 9525 l 9000 9525 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+11639 7305 m 11790 7305 l 11790 7245 l 11639 7245 l 11639 7245 l 11759 7275 l 11639 7305 l cp
+eoclip
+n 11250 7275 m
+ 11775 7275 l gs col0 s gr gr
+
+% arrowhead
+n 11639 7305 m 11759 7275 l 11639 7245 l 11639 7305 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 9000 6900 m 11250 6900 l 11250 7650 l 9000 7650 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+11564 9180 m 11715 9180 l 11715 9120 l 11564 9120 l 11564 9120 l 11684 9150 l 11564 9180 l cp
+eoclip
+n 11175 9150 m
+ 11700 9150 l gs col0 s gr gr
+
+% arrowhead
+n 11564 9180 m 11684 9150 l 11564 9120 l 11564 9180 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman-iso ff 200.00 scf sf
 2850 3975 m
 gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 2850 4650 m
 gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3975 6450 m
-gs 1 -1 sc (Tag file\(s\)) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3750 750 m
-gs 1 -1 sc (Doxywizard) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 4425 5175 m
 gs 1 -1 sc (generate) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 3675 5175 m
 gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-4350 1425 m
-gs 1 -1 sc (generate/edit) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 1350 m
-gs 1 -1 sc (XML files) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 3300 m
-gs 1 -1 sc (Latex files) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 3750 m
-gs 1 -1 sc (Makefile) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-7200 3525 m
-gs 1 -1 sc (+) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 3900 4275 m
 gs 1 -1 sc (Doxygen) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9225 750 m
-gs 1 -1 sc (Your application) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9300 1275 m
-gs 1 -1 sc (doxmlparser lib) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8175 3750 m
-gs 1 -1 sc (make pdf) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 8175 3000 m
 gs 1 -1 sc (make ps) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 9675 3375 m
 gs 1 -1 sc (latex) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 11025 825 m
 gs 1 -1 sc (custom) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 11025 1050 m
 gs 1 -1 sc (output) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 11025 3000 m
 gs 1 -1 sc (postscript) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 11025 3825 m
 gs 1 -1 sc (PDF) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 7350 m
-gs 1 -1 sc (refman.rtf) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9525 7350 m
-gs 1 -1 sc (MS-Word) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11100 7200 m
-gs 1 -1 sc (doc) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8175 7200 m
-gs 1 -1 sc (import) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 6975 9075 m
 gs 1 -1 sc (HTML) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 6975 9300 m
 gs 1 -1 sc (pages) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9075 9225 m
-gs 1 -1 sc (HTML Help Workshop) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11100 9000 m
-gs 1 -1 sc (chm) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6825 5625 m
-gs 1 -1 sc (Man pages) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 5475 9525 m
 gs 1 -1 sc (parse) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 3825 9300 m
 gs 1 -1 sc (Doxytag) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8325 9075 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 8775 6675 m
 gs 1 -1 sc (Windows only) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 8250 1200 m
 gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 1200 4200 m
 gs 1 -1 sc (Sources) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 1275 5775 m
 gs 1 -1 sc (Custom) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
+/Times-Roman-iso ff 200.00 scf sf
 4350 8175 m
 gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3675 1350 m
+gs 1 -1 sc (generate/edit) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4425 750 m
+gs 1 -1 sc (Doxywizard) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+4050 3525 m
+gs 1 -1 sc (read) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+5025 3375 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+5025 3600 m
+gs 1 -1 sc (update) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+2625 3375 m
+gs 1 -1 sc (generate) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6825 1350 m
+gs 1 -1 sc (XML files) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 3300 m
+gs 1 -1 sc (Latex files) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 3750 m
+gs 1 -1 sc (Makefile) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+7125 3525 m
+gs 1 -1 sc (+) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6750 5625 m
+gs 1 -1 sc (Man pages) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+6900 7350 m
+gs 1 -1 sc (refman.rtf) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9075 9225 m
+gs 1 -1 sc (HTML Help Workshop) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8100 3750 m
+gs 1 -1 sc (make pdf) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9225 1275 m
+gs 1 -1 sc (doxmlparser lib) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9150 750 m
+gs 1 -1 sc (Your application) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+3900 6450 m
+gs 1 -1 sc (Tag file\(s\)) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11325 7125 m
+gs 1 -1 sc (doc) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+9750 7350 m
+gs 1 -1 sc (MS-Word) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+11325 9000 m
+gs 1 -1 sc (chm) col0 sh gr
+/Times-Roman-iso ff 200.00 scf sf
+8250 9075 m
+gs 1 -1 sc (read) col0 sh gr
+% Polyline
+n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l
+ 1200 3675 l
+ 1200 3375 l gs col0 s gr 
+% here ends figure;
 $F2psEnd
 rs
+showpage
+%%Trailer
+%EOF
diff --git a/doc/infoflow.fig b/doc/infoflow.fig
index 501b81b..d09c571 100644
--- a/doc/infoflow.fig
+++ b/doc/infoflow.fig
@@ -1,4 +1,4 @@
-#FIG 3.2
+#FIG 3.2  Produced by xfig version 3.2.5
 Landscape
 Center
 Inches
@@ -9,13 +9,6 @@ Single
 1200 2
 0 32 #e0e0e0
 0 33 #000000
-6 3600 1650 4800 3150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
-	 3600 1950 3900 1650 4800 1650 4800 3150 3600 3150 3600 1950
-	 3900 1950 3900 1650
-4 0 0 50 0 0 12 0.0000 4 180 780 3900 2250 Config file\001
-4 0 0 50 0 0 12 0.0000 4 180 645 3900 2550 Doxyfile\001
--6
 6 900 3150 2325 4875
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
 	 900 3675 1200 3375 2100 3375 2100 4875 900 4875 900 3675
@@ -39,9 +32,9 @@ Single
 	 1125 5250 1125 5175 2325 5175 2325 6675 2250 6675
 -6
 6 1275 5925 2025 6750
-4 0 0 50 0 0 12 0.0000 4 135 750 1275 6075 - headers\001
-4 0 0 50 0 0 12 0.0000 4 180 690 1275 6675 - images\001
-4 0 0 50 0 0 12 0.0000 4 135 690 1275 6375 - footers\001
+4 0 0 50 0 0 12 0.0000 4 150 795 1275 6075 - headers\001
+4 0 0 50 0 0 12 0.0000 4 195 720 1275 6675 - images\001
+4 0 0 50 0 0 12 0.0000 4 150 705 1275 6375 - footers\001
 -6
 6 6675 8250 8100 9975
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
@@ -87,33 +80,34 @@ Single
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
 	 6825 450 6825 375 8025 375 8025 1875 7950 1875
 -6
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 4050 3150 4050 3750
+6 4350 1650 5550 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 4350 1950 4650 1650 5550 1650 5550 3150 4350 3150 4350 1950
+	 4650 1950 4650 1650
+4 0 0 50 0 0 12 0.0000 4 195 870 4575 2250 Config file\001
+4 0 0 50 0 0 12 0.0000 4 195 720 4575 2550 Doxyfile\001
+-6
+6 2850 1650 4050 3150
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
+	 2850 1950 3150 1650 4050 1650 4050 3150 2850 3150 2850 1950
+	 3150 1950 3150 1650
+4 0 0 50 -1 0 12 0.0000 4 195 915 3000 2475 Layout file\001
+-6
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
 	 2100 4125 3300 4125
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
 	1 1 1.00 60.00 120.00
 	 2100 6225 2700 6225 2700 4350 3300 4350
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
-	1 1 1.00 60.00 120.00
-	 4350 3150 4350 3750
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
 	 3675 5925 3975 5625 4875 5625 4875 7125 3675 7125 3675 5925
 	 3975 5925 3975 5625
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
-	 3300 300 5100 300 5100 1050 3300 1050 3300 300
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
 	 4125 5625 4125 4650
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
 	1 1 1.00 60.00 120.00
 	 4350 5625 4350 4650
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
-	1 1 1.00 60.00 120.00
-	1 1 1.00 60.00 120.00
-	 4200 1050 4200 1650
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
 	1 1 1.00 60.00 120.00
 	 5100 3900 6000 3900 6000 1425 6600 1425
@@ -158,23 +152,13 @@ Single
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
 	 10800 3525 11475 3525
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
-	 9000 6900 10800 6900 10800 7650 9000 7650 9000 6900
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
 	 7875 7275 9000 7275
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
-	 10800 7275 11400 7275
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
 	 7875 9150 9000 9150
 2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
-	 9000 8775 10875 8775 10875 9525 9000 9525 9000 8775
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 60.00 120.00
-	 10875 9150 11400 9150
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
 	 3300 8850 5100 8850 5100 9525 3300 9525 3300 8850
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
@@ -184,43 +168,73 @@ Single
 2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 60.00 120.00
 	 4275 8850 4275 7125
-4 0 0 50 0 0 12 0.0000 4 180 1215 4500 3525 generate/update\001
-4 0 0 50 0 0 12 0.0000 4 135 330 3600 3525 read\001
-4 0 0 50 0 0 12 0.0000 4 135 330 2850 3975 read\001
-4 0 0 50 0 0 12 0.0000 4 135 330 2850 4650 read\001
-4 0 0 50 0 0 12 0.0000 4 180 810 3975 6450 Tag file(s)\001
-4 0 0 50 0 0 12 0.0000 4 180 915 3750 750 Doxywizard\001
-4 0 0 50 0 0 12 0.0000 4 150 660 4425 5175 generate\001
-4 0 0 50 0 0 12 0.0000 4 135 330 3675 5175 read\001
-4 0 0 50 0 0 12 0.0000 4 180 990 4350 1425 generate/edit\001
-4 0 0 50 0 0 12 0.0000 4 135 780 6900 1350 XML files\001
-4 0 0 50 0 0 12 0.0000 4 135 810 6900 3300 Latex files\001
-4 0 0 50 0 0 12 0.0000 4 135 675 6900 3750 Makefile\001
-4 0 0 50 0 0 12 0.0000 4 75 105 7200 3525 +\001
-4 0 0 50 0 0 12 0.0000 4 180 675 3900 4275 Doxygen\001
-4 0 0 50 0 0 12 0.0000 4 180 1245 9225 750 Your application\001
-4 0 0 50 0 0 12 0.0000 4 180 1155 9300 1275 doxmlparser lib\001
-4 0 0 50 0 0 12 0.0000 4 180 690 8175 3750 make pdf\001
-4 0 0 50 0 0 12 0.0000 4 180 630 8175 3000 make ps\001
-4 0 0 50 0 0 12 0.0000 4 135 375 9675 3375 latex\001
-4 0 0 50 0 0 12 0.0000 4 105 555 11025 825 custom\001
-4 0 0 50 0 0 12 0.0000 4 150 480 11025 1050 output\001
-4 0 0 50 0 0 12 0.0000 4 180 765 11025 3000 postscript\001
-4 0 0 50 0 0 12 0.0000 4 135 345 11025 3825 PDF\001
-4 0 0 50 0 0 12 0.0000 4 135 750 6900 7350 refman.rtf\001
-4 0 0 50 0 0 12 0.0000 4 135 795 9525 7350 MS-Word\001
-4 0 0 50 0 0 12 0.0000 4 135 270 11100 7200 doc\001
-4 0 0 50 0 0 12 0.0000 4 180 480 8175 7200 import\001
-4 0 0 50 0 0 12 0.0000 4 135 510 6975 9075 HTML\001
-4 0 0 50 0 0 12 0.0000 4 135 450 6975 9300 pages\001
-4 0 0 50 0 0 12 0.0000 4 180 1740 9075 9225 HTML Help Workshop\001
-4 0 0 50 0 0 12 0.0000 4 135 315 11100 9000 chm\001
-4 0 0 50 0 0 12 0.0000 4 180 840 6825 5625 Man pages\001
-4 0 0 50 0 0 12 0.0000 4 135 420 5475 9525 parse\001
-4 0 0 50 0 0 12 0.0000 4 180 645 3825 9300 Doxytag\001
-4 0 0 50 0 0 12 0.0000 4 135 330 8325 9075 read\001
-4 0 0 50 0 0 12 0.0000 4 180 1080 8775 6675 Windows only\001
-4 0 0 50 0 0 12 0.0000 4 135 330 8250 1200 read\001
-4 0 0 50 0 0 12 0.0000 4 135 615 1200 4200 Sources\001
-4 0 0 50 0 0 12 0.0000 4 135 585 1275 5775 Custom\001
-4 0 0 50 0 0 12 0.0000 4 150 660 4350 8175 generate\001
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+	1 1 1.00 60.00 120.00
+	1 1 1.00 60.00 120.00
+	 4875 1050 4875 1650
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 4125 300 5925 300 5925 1050 4125 1050 4125 300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+	1 1 1.00 60.00 120.00
+	 4875 3150 4875 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4650 3150 4650 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 3750 3150 3750 3750
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+	1 1 1.00 60.00 120.00
+	 3525 3150 3525 3750
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 9000 8775 11175 8775 11175 9525 9000 9525 9000 8775
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 11250 7275 11775 7275
+2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
+	 9000 6900 11250 6900 11250 7650 9000 7650 9000 6900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 11175 9150 11700 9150
+4 0 0 50 0 0 12 0.0000 4 150 390 2850 3975 read\001
+4 0 0 50 0 0 12 0.0000 4 150 390 2850 4650 read\001
+4 0 0 50 0 0 12 0.0000 4 165 765 4425 5175 generate\001
+4 0 0 50 0 0 12 0.0000 4 150 390 3675 5175 read\001
+4 0 0 50 0 0 12 0.0000 4 195 780 3900 4275 Doxygen\001
+4 0 0 50 0 0 12 0.0000 4 195 720 8175 3000 make ps\001
+4 0 0 50 0 0 12 0.0000 4 150 420 9675 3375 latex\001
+4 0 0 50 0 0 12 0.0000 4 120 630 11025 825 custom\001
+4 0 0 50 0 0 12 0.0000 4 165 540 11025 1050 output\001
+4 0 0 50 0 0 12 0.0000 4 195 840 11025 3000 postscript\001
+4 0 0 50 0 0 12 0.0000 4 150 390 11025 3825 PDF\001
+4 0 0 50 0 0 12 0.0000 4 150 615 6975 9075 HTML\001
+4 0 0 50 0 0 12 0.0000 4 150 510 6975 9300 pages\001
+4 0 0 50 0 0 12 0.0000 4 150 480 5475 9525 parse\001
+4 0 0 50 0 0 12 0.0000 4 195 735 3825 9300 Doxytag\001
+4 0 0 50 0 0 12 0.0000 4 195 1215 8775 6675 Windows only\001
+4 0 0 50 0 0 12 0.0000 4 150 390 8250 1200 read\001
+4 0 0 50 0 0 12 0.0000 4 150 705 1200 4200 Sources\001
+4 0 0 50 0 0 12 0.0000 4 150 675 1275 5775 Custom\001
+4 0 0 50 0 0 12 0.0000 4 165 765 4350 8175 generate\001
+4 0 0 50 0 0 12 0.0000 4 195 1140 3675 1350 generate/edit\001
+4 0 0 50 0 0 12 0.0000 4 195 1050 4425 750 Doxywizard\001
+4 0 0 50 0 0 12 0.0000 4 150 390 4050 3525 read\001
+4 0 0 50 0 0 12 0.0000 4 165 765 5025 3375 generate\001
+4 0 0 50 -1 0 12 0.0000 4 195 585 5025 3600 update\001
+4 0 0 50 0 0 12 0.0000 4 165 765 2625 3375 generate\001
+4 0 0 50 0 0 12 0.0000 4 150 870 6825 1350 XML files\001
+4 0 0 50 0 0 12 0.0000 4 150 900 6750 3300 Latex files\001
+4 0 0 50 0 0 12 0.0000 4 150 765 6750 3750 Makefile\001
+4 0 0 50 0 0 12 0.0000 4 105 120 7125 3525 +\001
+4 0 0 50 0 0 12 0.0000 4 195 960 6750 5625 Man pages\001
+4 0 0 50 0 0 12 0.0000 4 150 870 6900 7350 refman.rtf\001
+4 0 0 50 0 0 12 0.0000 4 195 1995 9075 9225 HTML Help Workshop\001
+4 0 0 50 0 0 12 0.0000 4 195 795 8100 3750 make pdf\001
+4 0 0 50 0 0 12 0.0000 4 195 1320 9225 1275 doxmlparser lib\001
+4 0 0 50 0 0 12 0.0000 4 195 1395 9150 750 Your application\001
+4 0 0 50 0 0 12 0.0000 4 195 885 3900 6450 Tag file(s)\001
+4 0 0 50 0 0 12 0.0000 4 150 315 11325 7125 doc\001
+4 0 0 50 0 0 12 0.0000 4 150 855 9750 7350 MS-Word\001
+4 0 0 50 0 0 12 0.0000 4 150 375 11325 9000 chm\001
+4 0 0 50 0 0 12 0.0000 4 150 390 8250 9075 read\001
+4 0 0 50 0 0 12 0.0000 4 195 555 8100 7200 import\001
diff --git a/doc/infoflow.gif b/doc/infoflow.gif
index 7b4468b..4bd30c5 100644
Binary files a/doc/infoflow.gif and b/doc/infoflow.gif differ
diff --git a/doc/language.doc b/doc/language.doc
index bb6caeb..b51310f 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -221,8 +221,8 @@ when the translator was updated.
   </tr>
   <tr bgcolor="#ffffff">
     <td>Romanian</td>
-    <td>Alexandru Iosup</td>
-    <td>aiosup at yahoo dot com</td>
+    <td>Ionut Dumitrascu<br>Alexandru Iosup</td>
+    <td>reddumy at yahoo dot com<br>aiosup at yahoo dot com</td>
     <td>1.4.1</td>
   </tr>
   <tr bgcolor="#ffffff">
@@ -356,7 +356,8 @@ when the translator was updated.
   \hline
   Portuguese & Rui Godinho Lopes & {\tt\tiny ruiglopes@yahoo.com} & 1.3.3 \\
   \hline
-  Romanian & Alexandru Iosup & {\tt\tiny aiosup@yahoo.com} & 1.4.1 \\
+  Romanian & Ionut Dumitrascu & {\tt\tiny reddumy@yahoo.com} & 1.4.1 \\
+  ~ & Alexandru Iosup & {\tt\tiny aiosup@yahoo.com} & ~ \\
   \hline
   Russian & Alexandr Chelpanov & {\tt\tiny cav@cryptopro.ru} & up-to-date \\
   \hline
diff --git a/doc/maintainers.txt b/doc/maintainers.txt
index cacf416..06d522b 100644
--- a/doc/maintainers.txt
+++ b/doc/maintainers.txt
@@ -100,6 +100,7 @@ TranslatorPortuguese
 Rui Godinho Lopes: ruiglopes@yahoo.com
 
 TranslatorRomanian
+Ionut Dumitrascu: reddumy@yahoo.com
 Alexandru Iosup: aiosup@yahoo.com
 
 TranslatorRussian
diff --git a/doc/output.doc b/doc/output.doc
index f5a8d3d..6e87ce7 100644
--- a/doc/output.doc
+++ b/doc/output.doc
@@ -14,7 +14,7 @@
  * input used in their production; they are not affected by this license.
  *
  */
-/*! \page output.html Output Formats
+/*! \page output Output Formats
 
 \section output Output Formats
 
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
index 4c6b192..a75f78d 100644
--- a/doc/translator_report.txt
+++ b/doc/translator_report.txt
@@ -26,7 +26,7 @@ still may be some details listed even for them:
   TranslatorCzech
   TranslatorDutch
   TranslatorEnglish
-  TranslatorFinnish
+  TranslatorFinnish -- Change the base class to Translator.
   TranslatorGerman
   TranslatorItalian
   TranslatorKorean
@@ -71,6 +71,16 @@ version of the translator for the language:
   TranslatorKoreanEn	implements 5 methods
 
 ======================================================================
+WARNING: The following translator methods are declared in the
+Translator class but their identifiers do not appear in source files.
+The situation should be checked. The .cpp files and .h files excluding
+the '*translator*' files in doxygen/src directory were simply searched
+for occurence of the method identifiers:
+
+  QCString trFunctionPrototypeDocumentation()
+
+
+======================================================================
 Details for translators (classes sorted alphabetically):
 
 
@@ -183,6 +193,12 @@ TranslatorDanish   (TranslatorAdapter_1_5_4)  22 methods to implement
     virtual QCString trSubprogramDocumentation()
 
 
+TranslatorFinnish   (TranslatorEnglish)
+-----------------
+
+  Implements 216 of the required methods.
+
+
 TranslatorFrench   (TranslatorAdapter_1_5_4)  22 methods to implement
 ----------------
 
diff --git a/src/classdef.cpp b/src/classdef.cpp
index d30ee62..2362928 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -37,6 +37,9 @@
 #include "docparser.h"
 #include "searchindex.h"
 #include "vhdldocgen.h"
+#include "layout.h"
+
+//-----------------------------------------------------------------------------
 
 //static inline MemberList *createNewMemberList(MemberList::ListType lt)
 //{
@@ -842,8 +845,39 @@ static void writeTemplateSpec(OutputList &ol,Definition *d,
   }
 }
 
+void ClassDef::writeBriefDescription(OutputList &ol,bool exampleFlag)
+{
+  if (!briefDescription().isEmpty())
+  {
+    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.writeString(" \n");
+    ol.enable(OutputGenerator::RTF);
+
+    if (Config_getBool("REPEAT_BRIEF") || 
+        !documentation().isEmpty() || 
+        exampleFlag
+       )
+    {
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.startTextLink(0,"_details");
+      ol.parseText(theTranslator->trMore());
+      ol.endTextLink();
+    }
+    ol.popGeneratorState();
+
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.newParagraph();
+    ol.popGeneratorState();
+  }
+  ol.writeSynopsis();
+}
+
 // write the detailed description for this class
-void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag)
+void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag, 
+                                        const QCString &title)
 {
   if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
       !documentation().isEmpty() || 
@@ -852,13 +886,13 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType
   {
     ol.writeRuler();
     ol.pushGeneratorState();
-      ol.disable(OutputGenerator::Latex);
-      ol.disable(OutputGenerator::RTF);
+      ol.disableAllBut(OutputGenerator::Html);
       ol.writeAnchor(0,"_details");
     ol.popGeneratorState();
     ol.startGroupHeader();
-    ol.parseText(theTranslator->trDetailedDescription());
+    ol.parseText(title);
     ol.endGroupHeader();
+
     ol.startTextBlock();
     
     writeTemplateSpec(ol,this,pageType);
@@ -910,9 +944,11 @@ void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType
     
 void ClassDef::showUsedFiles(OutputList &ol)
 {
+  ol.pushGeneratorState();
+  ol.disable(OutputGenerator::Man);
   bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
-  if (Config_getBool("SHOW_USED_FILES"))
-  {
+  //if (Config_getBool("SHOW_USED_FILES"))
+  //{
     ol.writeRuler();
     if (fortranOpt)
     {
@@ -993,11 +1029,12 @@ void ClassDef::showUsedFiles(OutputList &ol)
       file=m_impl->files.next();
     }
     if (!first) ol.endItemList();
-  }
+  //}
+  ol.popGeneratorState();
 }
 
 
-void ClassDef::writeClassDiagrams(OutputList &ol)
+void ClassDef::writeInheritanceGraph(OutputList &ol)
 {
   // count direct inheritance relations
   int count=0;
@@ -1025,7 +1062,7 @@ void ClassDef::writeClassDiagrams(OutputList &ol)
 
   
   bool renderDiagram = FALSE;
-  if (Config_getBool("HAVE_DOT") && Config_getBool("CLASS_GRAPH"))
+  if (Config_getBool("HAVE_DOT") && Config_getBool("CLASS_DIAGRAMS"))
     // write class diagram using dot
   {
     DotClassGraph inheritanceGraph(this,DotNode::Inheritance);
@@ -1157,8 +1194,11 @@ void ClassDef::writeClassDiagrams(OutputList &ol)
   {
     ol.enableAll();
   }
+}
 
-  if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH"))
+void ClassDef::writeCollaborationGraph(OutputList &ol)
+{
+  if (Config_getBool("HAVE_DOT") /*&& Config_getBool("COLLABORATION_GRAPH")*/)
   {
     DotClassGraph usageImplGraph(this,DotNode::Collaboration);
     if (!usageImplGraph.isTrivial())
@@ -1171,7 +1211,152 @@ void ClassDef::writeClassDiagrams(OutputList &ol)
       ol.popGeneratorState();
     }
   }
+}
+
+void ClassDef::writeIncludeFiles(OutputList &ol)
+{
+  if (m_impl->incInfo /*&& Config_getBool("SHOW_INCLUDE_FILES")*/)
+  {
+    QCString nm=m_impl->incInfo->includeName.isEmpty() ? 
+      (m_impl->incInfo->fileDef ?
+       m_impl->incInfo->fileDef->docName().data() : "" 
+      ) :
+      m_impl->incInfo->includeName.data();
+    if (!nm.isEmpty())
+    {
+      ol.startTypewriter();
+      bool isIDLorJava = nm.right(4)==".idl" || 
+                         nm.right(5)==".pidl" || 
+                         nm.right(5)==".java";
+      if (isIDLorJava)
+      {
+        ol.docify("import ");
+      }
+      else if (isObjectiveC())
+      {
+        ol.docify("#import ");
+      }
+      else
+      {
+        ol.docify("#include ");
+      }
+      if (m_impl->incInfo->local || isIDLorJava)
+        ol.docify("\"");
+      else
+        ol.docify("<");
+      ol.pushGeneratorState();
+      ol.disable(OutputGenerator::Html);
+      ol.docify(nm);
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.enable(OutputGenerator::Html);
+      if (m_impl->incInfo->fileDef)
+      {
+        ol.writeObjectLink(0,m_impl->incInfo->fileDef->includeName(),0,nm);
+      }
+      else
+      {
+        ol.docify(nm);
+      }
+      ol.popGeneratorState();
+      if (m_impl->incInfo->local || isIDLorJava)
+        ol.docify("\"");
+      else
+        ol.docify(">");
+      if (isIDLorJava) 
+        ol.docify(";");
+      ol.endTypewriter();
+      ol.newParagraph();
+    }
+  }
+}
+
+void ClassDef::writeAllMembersLink(OutputList &ol)
+{
+  // write link to list of all members (HTML only)
+  if (m_impl->allMemberNameInfoSDict &&
+      !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
+     )
+  {
+    ol.pushGeneratorState();
+    ol.disableAllBut(OutputGenerator::Html);
+    ol.newParagraph();
+    ol.startTextLink(getMemberListFileName(),0);
+    ol.parseText(theTranslator->trListOfAllMembers());
+    ol.endTextLink();
+    ol.enableAll();
+    ol.popGeneratorState();
+  }
+}
+
+void ClassDef::writeMemberGroups(OutputList &ol)
+{
+  // write user defined member groups
+  if (m_impl->memberGroupSDict)
+  {
+    MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
+      {
+        mg->writeDeclarations(ol,this,0,0,0);
+      }
+      else // add this group to the corresponding member section
+      {
+        //printf("addToDeclarationSection(%s)\n",mg->header().data());
+        //mg->addToDeclarationSection();
+      }
+    }
+  }
+}
 
+void ClassDef::writeNestedClasses(OutputList &ol,const QCString &title)
+{
+  // nested classes
+  if (m_impl->innerClasses) 
+  {
+    m_impl->innerClasses->writeDeclaration(ol,0,title,TRUE);
+  }
+}
+
+void ClassDef::startMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+  {
+    ol.disable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = TRUE;
+  }
+}
+
+void ClassDef::endMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+  {
+    ol.enable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = FALSE;
+  }
+}
+
+void ClassDef::startMemberDeclarations(OutputList &ol)
+{
+  ol.startMemberSections();
+}
+
+void ClassDef::endMemberDeclarations(OutputList &ol)
+{
+  ol.endMemberSections();
+}
+
+void ClassDef::writeAuthorSection(OutputList &ol)
+{
+  ol.pushGeneratorState();
+  ol.disableAllBut(OutputGenerator::Man);
+  ol.writeString("\n");
+  ol.startGroupHeader();
+  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+  ol.endGroupHeader();
+  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+  ol.popGeneratorState();
 }
 
 // write all documentation for this class
@@ -1237,104 +1422,6 @@ void ClassDef::writeDocumentation(OutputList &ol)
     ol.popGeneratorState();
   }
 
-
-  if (Config_getBool("SEARCHENGINE"))
-  {
-    Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
-    Doxygen::searchIndex->addWord(localName(),TRUE);
-  }
-
-  ol.startTextBlock();
-  
-  //printf("Class %s brief=`%s' doc=`%s'\n",name().data(),briefDescription().data(),documentation().data());
-  
-  bool exampleFlag=hasExamples();
-  // write brief description
-  if (!briefDescription().isEmpty())
-  {
-    if (!Config_getBool("DETAILS_AT_TOP")) 
-    {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
-      ol.pushGeneratorState();
-      ol.disable(OutputGenerator::RTF);
-      ol.writeString(" \n");
-      ol.enable(OutputGenerator::RTF);
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.startTextLink(0,"_details");
-    
-      if (Config_getBool("REPEAT_BRIEF") || 
-          !documentation().isEmpty() || 
-          exampleFlag
-         )
-      {
-        ol.parseText(theTranslator->trMore());
-      }
-      ol.endTextLink();
-      ol.popGeneratorState();
-
-      ol.pushGeneratorState();
-      ol.disable(OutputGenerator::RTF);
-      ol.newParagraph();
-      ol.popGeneratorState();
-    }
-  }
-  ol.writeSynopsis();
-  
-  if (m_impl->incInfo && Config_getBool("SHOW_INCLUDE_FILES"))
-  {
-    QCString nm=m_impl->incInfo->includeName.isEmpty() ? 
-      (m_impl->incInfo->fileDef ?
-       m_impl->incInfo->fileDef->docName().data() : "" 
-      ) :
-      m_impl->incInfo->includeName.data();
-    if (!nm.isEmpty())
-    {
-      ol.startTypewriter();
-      bool isIDLorJava = nm.right(4)==".idl" || 
-                         nm.right(5)==".pidl" || 
-                         nm.right(5)==".java";
-      if (isIDLorJava)
-      {
-        ol.docify("import ");
-      }
-      else if (isObjectiveC())
-      {
-        ol.docify("#import ");
-      }
-      else
-      {
-        ol.docify("#include ");
-      }
-      if (m_impl->incInfo->local || isIDLorJava)
-        ol.docify("\"");
-      else
-        ol.docify("<");
-      ol.pushGeneratorState();
-      ol.disable(OutputGenerator::Html);
-      ol.docify(nm);
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.enable(OutputGenerator::Html);
-      if (m_impl->incInfo->fileDef)
-      {
-        ol.writeObjectLink(0,m_impl->incInfo->fileDef->includeName(),0,nm);
-      }
-      else
-      {
-        ol.docify(nm);
-      }
-      ol.popGeneratorState();
-      if (m_impl->incInfo->local || isIDLorJava)
-        ol.docify("\"");
-      else
-        ol.docify(">");
-      if (isIDLorJava) 
-        ol.docify(";");
-      ol.endTypewriter();
-      ol.newParagraph();
-    }
-  }
-
-
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
     Doxygen::tagFile << "  <compound kind=\"" << compoundTypeString();
@@ -1354,24 +1441,127 @@ void ClassDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  writeClassDiagrams(ol); 
+  if (Config_getBool("SEARCHENGINE"))
+  {
+    Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
+    Doxygen::searchIndex->addWord(localName(),TRUE);
+  }
+  bool exampleFlag=hasExamples();
 
-  // write link to list of all members (HTML only)
-  if (m_impl->allMemberNameInfoSDict &&
-      !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
-     )
+  //---------------------------------------- start flexible part -------------------------------
+
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT // new flexible layout
+
+  QListIterator<LayoutDocEntry> eli(
+      LayoutDocManager::instance().docEntries(LayoutDocManager::Class));
+  LayoutDocEntry *lde;
+  for (eli.toFirst();(lde=eli.current());++eli)
+  {
+    switch (lde->kind())
+    {
+      case LayoutDocEntry::BriefDesc: 
+        writeBriefDescription(ol,exampleFlag);
+        break; 
+      case LayoutDocEntry::ClassIncludes: 
+        writeIncludeFiles(ol);
+        break;
+      case LayoutDocEntry::ClassInheritanceGraph: 
+        writeInheritanceGraph(ol); 
+        break; 
+      case LayoutDocEntry::ClassCollaborationGraph: 
+        writeCollaborationGraph(ol); 
+        break; 
+      case LayoutDocEntry::ClassAllMembersLink: 
+        writeAllMembersLink(ol);
+        break;
+      case LayoutDocEntry::MemberDeclStart: 
+        startMemberDeclarations(ol);
+        break; 
+      case LayoutDocEntry::MemberGroups: 
+        writeMemberGroups(ol);
+        break;
+      case LayoutDocEntry::MemberDecl: 
+        {
+          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+          writeMemberDeclarations(ol,lmd->type,lmd->title,lmd->subscript);
+        }
+        break; 
+      case LayoutDocEntry::ClassNestedClasses: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNestedClasses(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::MemberDeclEnd: 
+        endMemberDeclarations(ol);
+        break;
+      case LayoutDocEntry::DetailedDesc: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDetailedDescription(ol,pageType,exampleFlag,ls->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberDefStart: 
+        startMemberDocumentation(ol);
+        break; 
+      case LayoutDocEntry::MemberDef: 
+        {
+          LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+          writeMemberDocumentation(ol,lmd->type,lmd->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberDefEnd: 
+        endMemberDocumentation(ol);
+        break;
+      case LayoutDocEntry::ClassUsedFiles: 
+        showUsedFiles(ol);
+        break;
+      case LayoutDocEntry::AuthorSection: 
+        writeAuthorSection(ol);
+        break;
+      case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::FileClasses:
+      case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileIncludes:
+      case LayoutDocEntry::FileIncludeGraph:
+      case LayoutDocEntry::FileIncludedByGraph: 
+      case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::GroupClasses: 
+      case LayoutDocEntry::GroupNamespaces:
+      case LayoutDocEntry::GroupDirs: 
+      case LayoutDocEntry::GroupNestedGroups: 
+      case LayoutDocEntry::GroupFiles:
+      case LayoutDocEntry::GroupGraph: 
+      case LayoutDocEntry::GroupPageDocs:
+      case LayoutDocEntry::DirSubDirs:
+      case LayoutDocEntry::DirFiles:
+      case LayoutDocEntry::DirGraph:
+        err("Internal inconsistency: member %d should not be part of "
+            "LayoutDocManager::Class entry list\n",lde->kind());
+        break;
+    }
+  }
+
+#else // old fixed layout
+  
+  //printf("Class %s brief=`%s' doc=`%s'\n",name().data(),briefDescription().data(),documentation().data());
+  
+  //ol.startTextBlock();
+
+  // write brief description
+  if (!Config_getBool("DETAILS_AT_TOP")) 
   {
-    ol.pushGeneratorState();
-    ol.disableAllBut(OutputGenerator::Html);
-    ol.newParagraph();
-    ol.startTextLink(getMemberListFileName(),0);
-    ol.parseText(theTranslator->trListOfAllMembers());
-    ol.endTextLink();
-    ol.enableAll();
-    ol.popGeneratorState();
+    writeBriefDescription(ol,exampleFlag);
   }
+  
+  writeIncludeFiles(ol);
+  writeInheritanceGraph(ol); 
+  writeCollaborationGraph(ol); 
+  writeAllMembersLink(ol);
 
-  ol.endTextBlock();
+  //ol.endTextBlock();
   
   // write detailed description if the user wants it near the top
   if (Config_getBool("DETAILS_AT_TOP")) 
@@ -1383,27 +1573,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
   //// Member declarations + brief descriptions
   ///////////////////////////////////////////////////////////////////////////
 
-  // write member groups
-  ol.startMemberSections();
+  startMemberDeclarations(ol);
 
-  // write user defined member groups
-  if (m_impl->memberGroupSDict)
-  {
-    MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
-    {
-      if (!mg->allMembersInSameSection() || !m_impl->subGrouping) // group is in its own section
-      {
-        mg->writeDeclarations(ol,this,0,0,0);
-      }
-      else // add this group to the corresponding member section
-      {
-        //printf("addToDeclarationSection(%s)\n",mg->header().data());
-        //mg->addToDeclarationSection();
-      }
-    }
-  }
+  // write member groups
+  writeMemberGroups(ol);
 
   // public types
   writeMemberDeclarations(ol,MemberList::pubTypes,theTranslator->trPublicTypes()); 
@@ -1470,18 +1643,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
   writeMemberDeclarations(ol,MemberList::related,theTranslator->trRelatedFunctions(),
                                               theTranslator->trRelatedSubscript()
                          ); 
-  //if (related) related->writeDeclarations(ol,this,0,0,0,
-  //                theTranslator->trRelatedFunctions(),
-  //                theTranslator->trRelatedSubscript()
-  //               ); 
 
-  // nested classes
-  if (m_impl->innerClasses) 
-  {
-    m_impl->innerClasses->writeDeclaration(ol,0,0,TRUE);
-  }
+  writeNestedClasses(ol);
 
-  ol.endMemberSections();
+  endMemberDeclarations(ol);
     
   // write detailed description
   if (!Config_getBool("DETAILS_AT_TOP")) 
@@ -1489,56 +1654,11 @@ void ClassDef::writeDocumentation(OutputList &ol)
     writeDetailedDescription(ol,pageType,exampleFlag);
   }
   
-  writeMemberDocumentation(ol);
-
-  /////////////////////////////////////////////////////////////////////
-  ol.startTextBlock();
-
-  // write the list of used files (not for man pages)
-  ol.pushGeneratorState();
-  ol.disable(OutputGenerator::Man);
-
-  showUsedFiles(ol);
-
-  // write Author section (Man only)
-  ol.enable(OutputGenerator::Man);
-  ol.disableAllBut(OutputGenerator::Man);
-  ol.writeString("\n");
-  ol.startGroupHeader();
-  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
-  ol.endGroupHeader();
-  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
-  ol.popGeneratorState();
-
-  ol.endTextBlock();
-  /////////////////////////////////////////////////////////////////////
-
-  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
-  {
-    writeDocAnchorsToTagFile();
-    Doxygen::tagFile << "  </compound>" << endl;
-  }
- 
-  endFile(ol);
-
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    writeMemberPages(ol);
-  }
-}
-
-void ClassDef::writeMemberDocumentation(OutputList &ol)
-{
   ///////////////////////////////////////////////////////////////////////////
   //// Member definitions + detailed documentation
   ///////////////////////////////////////////////////////////////////////////
-  bool fortranOpt=Config_getBool("OPTIMIZE_FOR_FORTRAN");
     
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    ol.disable(OutputGenerator::Html);
-    Doxygen::suppressDocWarnings = TRUE;
-  }
+  startMemberDocumentation(ol);
   
   writeMemberDocumentation(ol,MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation());
   writeMemberDocumentation(ol,MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation());
@@ -1556,10 +1676,33 @@ void ClassDef::writeMemberDocumentation(OutputList &ol)
   writeMemberDocumentation(ol,MemberList::propertyMembers,theTranslator->trPropertyDocumentation());
   writeMemberDocumentation(ol,MemberList::eventMembers,theTranslator->trEventDocumentation());
 
+  endMemberDocumentation(ol);
+  /////////////////////////////////////////////////////////////////////
+  //ol.startTextBlock();
+
+  // write the list of used files (not for man pages)
+  showUsedFiles(ol);
+
+  // write Author section (Man only)
+  writeAuthorSection(ol);
+
+  //ol.endTextBlock();
+  /////////////////////////////////////////////////////////////////////
+  //---------------------------------------- end flexible part -------------------------------
+
+#endif
+
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+  {
+    writeDocAnchorsToTagFile();
+    Doxygen::tagFile << "  </compound>" << endl;
+  }
+ 
+  endFile(ol);
+
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
-    ol.enable(OutputGenerator::Html);
-    Doxygen::suppressDocWarnings = FALSE;
+    writeMemberPages(ol);
   }
 }
 
diff --git a/src/classdef.h b/src/classdef.h
index 8659449..7c390c6 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -306,13 +306,10 @@ class ClassDef : public Definition
     void mergeMembers();
     void distributeMemberGroupDocumentation();
     void writeDocumentation(OutputList &ol);
-    void writeClassDiagrams(OutputList &ol);
     void writeDocumentationForInnerClasses(OutputList &ol);
-    void writeMemberDocumentation(OutputList &ol);
     void writeMemberPages(OutputList &ol);
     void writeMemberList(OutputList &ol);
     void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
-    void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag);
     void writeQuickMemberLinks(OutputList &ol,MemberDef *md) const;
     void reclassifyMember(MemberDef *md,MemberDef::MemberType t);
     
@@ -333,6 +330,20 @@ class ClassDef : public Definition
                                  const char *subTitle=0);
     void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
     void writePlainMemberDeclaration(OutputList &ol,MemberList::ListType lt,bool inGroup);
+    void writeBriefDescription(OutputList &ol,bool exampleFlag);
+    void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
+                                  const QCString &title);
+    void writeIncludeFiles(OutputList &ol);
+    void writeAllMembersLink(OutputList &ol);
+    void writeInheritanceGraph(OutputList &ol);
+    void writeCollaborationGraph(OutputList &ol);
+    void writeMemberGroups(OutputList &ol);
+    void writeNestedClasses(OutputList &ol,const QCString &title);
+    void startMemberDeclarations(OutputList &ol);
+    void endMemberDeclarations(OutputList &ol);
+    void startMemberDocumentation(OutputList &ol);
+    void endMemberDocumentation(OutputList &ol);
+    void writeAuthorSection(OutputList &ol);
     
     ClassDefImpl *m_impl;
 
diff --git a/src/config.l b/src/config.l
index 9fffc0b..21e7a39 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1653,14 +1653,14 @@ void Config::create()
 		    "description. Set this tag to YES if you prefer the old behaviour instead. \n",
                     FALSE
                  );
-  cb = addBool(
-                    "DETAILS_AT_TOP",
-                    "If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
-                    "will output the detailed description near the top, like JavaDoc.\n"
-                    "If set to NO, the detailed description appears after the member \n"
-                    "documentation. \n",
-                    FALSE
-                 );
+  //cb = addBool(
+  //                  "DETAILS_AT_TOP",
+  //                  "If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
+  //                  "will output the detailed description near the top, like JavaDoc.\n"
+  //                  "If set to NO, the detailed description appears after the member \n"
+  //                  "documentation. \n",
+  //                  FALSE
+  //               );
   cb = addBool(
                     "INHERIT_DOCS",
                     "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n"
@@ -1901,13 +1901,13 @@ void Config::create()
                     "documentation. If set to YES the scope will be hidden. \n",
                     FALSE
                  );
-  cb = addBool(
-                    "SHOW_INCLUDE_FILES",
-                    "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
-                    "will put a list of the files that are included by a file in the documentation \n"
-                    "of that file. \n",
-                    TRUE
-                 );
+  //cb = addBool(
+  //                  "SHOW_INCLUDE_FILES",
+  //                  "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
+  //                  "will put a list of the files that are included by a file in the documentation \n"
+  //                  "of that file. \n",
+  //                  TRUE
+  //               );
   cb = addBool(
                     "INLINE_INFO",
                     "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n"
@@ -1993,13 +1993,13 @@ void Config::create()
                     "command in the documentation regardless of this setting. \n",
                     0,10000,30
                  );
-  cb = addBool(
-                    "SHOW_USED_FILES",
-                    "Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
-                    "at the bottom of the documentation of classes and structs. If set to YES the \n"
-                    "list will mention the files that were used to generate the documentation. \n",
-                    TRUE
-                );
+  //cb = addBool(
+  //                  "SHOW_USED_FILES",
+  //                  "Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
+  //                  "at the bottom of the documentation of classes and structs. If set to YES the \n"
+  //                  "list will mention the files that were used to generate the documentation. \n",
+  //                  TRUE
+  //              );
   cb = addBool(
                     "SHOW_DIRECTORIES",
 		    "If the sources in your project are distributed over multiple directories \n"
@@ -2031,6 +2031,25 @@ void Config::create()
 		   "is used as the file version. See the manual for examples. \n"
               );
   cs->setWidgetType(ConfigString::File);
+  cs = addString(  "LAYOUT_FILE",
+                   "The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by \n"
+		   "doxygen. The layout file controls the global structure of the generated output files \n"
+		   "in an output format independent way. The create the layout file that represents \n"
+		   "doxygen's defaults, run doxygen with the -l option. You can optionally specify a \n"
+		   "file name after the option, if omitted doxygenlayout.xml will be used as the name \n"
+		   "of the layout file.\n"
+	      );
+  cs->setWidgetType(ConfigString::File);
+  addObsolete("DETAILS_AT_TOP");
+  addObsolete("SHOW_INCLUDE_FILES");
+  addObsolete("SHOW_USED_FILES");
+  addObsolete("ALPHABETICAL_INDEX");
+  addObsolete("CLASS_GRAPH");
+  addObsolete("COLLABORATION_GRAPH");
+  addObsolete("GROUP_GRAPHS");
+  addObsolete("INCLUDE_GRAPH");
+  addObsolete("INCLUDED_BY_GRAPH");
+
   
   //-----------------------------------------------------------------------------------------------
   addInfo(  "Messages","configuration options related to warning and progress messages");
@@ -2276,13 +2295,13 @@ void Config::create()
   addInfo(  "Index","configuration options related to the alphabetical class index");
   //-----------------------------------------------------------------------------------------------
   
-  cb = addBool(
-                    "ALPHABETICAL_INDEX",
-                    "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
-                    "of all compounds will be generated. Enable this if the project \n"
-                    "contains a lot of classes, structs, unions or interfaces. \n",
-                    FALSE
-                 );
+  //cb = addBool(
+  //                  "ALPHABETICAL_INDEX",
+  //                  "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
+  //                  "of all compounds will be generated. Enable this if the project \n"
+  //                  "contains a lot of classes, structs, unions or interfaces. \n",
+  //                  FALSE
+  //               );
   ci = addInt(
                     "COLS_IN_ALPHA_INDEX",
                     "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n"
@@ -3029,31 +3048,31 @@ void Config::create()
 		    "different font using DOT_FONTNAME you can set the path where dot \n"
 		    "can find it using this tag. \n"
                 );
-  cb = addBool(
-                    "CLASS_GRAPH",
-                    "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
-                    "will generate a graph for each documented class showing the direct and \n"
-                    "indirect inheritance relations. Setting this tag to YES will force the \n"
-                    "the CLASS_DIAGRAMS tag to NO.\n",
-                    TRUE
-                 );
-  cb->addDependency("HAVE_DOT");
-  cb = addBool(
-                    "COLLABORATION_GRAPH",
-                    "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
-                    "will generate a graph for each documented class showing the direct and \n"
-                    "indirect implementation dependencies (inheritance, containment, and \n"
-                    "class references variables) of the class with other documented classes. \n",
-                    TRUE
-                 );
-  cb->addDependency("HAVE_DOT");
-  cb = addBool(
-                    "GROUP_GRAPHS",
-                    "If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n"
-                    "will generate a graph for groups, showing the direct groups dependencies\n",
-                    TRUE
-                 );                 
-  cb->addDependency("HAVE_DOT");
+  //cb = addBool(
+  //                  "CLASS_GRAPH",
+  //                  "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
+  //                  "will generate a graph for each documented class showing the direct and \n"
+  //                  "indirect inheritance relations. Setting this tag to YES will force the \n"
+  //                  "the CLASS_DIAGRAMS tag to NO.\n",
+  //                  TRUE
+  //               );
+  //cb->addDependency("HAVE_DOT");
+  //cb = addBool(
+  //                  "COLLABORATION_GRAPH",
+  //                  "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
+  //                  "will generate a graph for each documented class showing the direct and \n"
+  //                  "indirect implementation dependencies (inheritance, containment, and \n"
+  //                  "class references variables) of the class with other documented classes. \n",
+  //                  TRUE
+  //               );
+  //cb->addDependency("HAVE_DOT");
+  //cb = addBool(
+  //                  "GROUP_GRAPHS",
+  //                  "If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n"
+  //                  "will generate a graph for groups, showing the direct groups dependencies\n",
+  //                  TRUE
+  //               );                 
+  //cb->addDependency("HAVE_DOT");
   cb = addBool(
                     "UML_LOOK",
                     "If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n"
@@ -3069,24 +3088,24 @@ void Config::create()
                     FALSE
                  );
   cb->addDependency("HAVE_DOT");
-  cb = addBool(
-                    "INCLUDE_GRAPH",
-                    "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
-                    "tags are set to YES then doxygen will generate a graph for each documented \n"
-                    "file showing the direct and indirect include dependencies of the file with \n"
-                    "other documented files. \n",
-                    TRUE
-                 );
-  cb->addDependency("HAVE_DOT");
-  cb = addBool(
-                    "INCLUDED_BY_GRAPH",
-                    "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
-                    "HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
-                    "documented header file showing the documented files that directly or \n"
-                    "indirectly include this file. \n",
-                    TRUE
-                 );
-  cb->addDependency("HAVE_DOT");
+  //cb = addBool(
+  //                  "INCLUDE_GRAPH",
+  //                  "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
+  //                  "tags are set to YES then doxygen will generate a graph for each documented \n"
+  //                  "file showing the direct and indirect include dependencies of the file with \n"
+  //                  "other documented files. \n",
+  //                  TRUE
+  //               );
+  //cb->addDependency("HAVE_DOT");
+  //cb = addBool(
+  //                  "INCLUDED_BY_GRAPH",
+  //                  "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
+  //                  "HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
+  //                  "documented header file showing the documented files that directly or \n"
+  //                  "indirectly include this file. \n",
+  //                  TRUE
+  //               );
+  //cb->addDependency("HAVE_DOT");
   cb = addBool(
                     "CALL_GRAPH",
                     "If the CALL_GRAPH and HAVE_DOT options are set to YES then \n"
@@ -3115,12 +3134,12 @@ void Config::create()
                  );
   cb->addDependency("HAVE_DOT");
   cb = addBool(    
-                    "DIRECTORY_GRAPH",
-		    "If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n"
-		    "then doxygen will show the dependencies a directory has on other directories \n"
-		    "in a graphical way. The dependency relations are determined by the #include\n"
-		    "relations between the files in the directories.\n",
-                    TRUE
+                  "DIRECTORY_GRAPH",
+  		  "If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n"
+  	 	  "then doxygen will show the dependencies a directory has on other directories \n"
+       	          "in a graphical way. The dependency relations are determined by the #include\n"
+  		  "relations between the files in the directories.\n",
+                  TRUE
                );
   cb->addDependency("HAVE_DOT");
   ce = addEnum(
@@ -3178,11 +3197,11 @@ void Config::create()
   cb = addBool(
                     "DOT_TRANSPARENT",
 		    "Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n"
-		    "background. This is enabled by default, which results in a transparent \n"
-		    "background. Warning: Depending on the platform used, enabling this option \n"
-		    "may lead to badly anti-aliased labels on the edges of a graph (i.e. they \n"
-		    "become hard to read). \n",
-		    TRUE
+		    "background. This is disabled by default, because dot on Windows does not \n"
+		    "seem to support this out of the box. Warning: Depending on the platform used, \n"
+		    "enabling this option may lead to badly anti-aliased labels on the edges of \n"
+		    "a graph (i.e. they become hard to read). \n",
+		    FALSE
               );
   cb->addDependency("HAVE_DOT");
   cb = addBool(
diff --git a/src/defgen.cpp b/src/defgen.cpp
index 4c52150..4f760e2 100644
--- a/src/defgen.cpp
+++ b/src/defgen.cpp
@@ -94,7 +94,6 @@ void generateDEFForMember(MemberDef *md,
     case MemberDef::Enumeration: memType="enum";      break;
     case MemberDef::Function:    memType="function";  isFunc=TRUE; break;
     case MemberDef::Signal:      memType="signal";    isFunc=TRUE; break;
-    case MemberDef::Prototype:   memType="prototype"; isFunc=TRUE; break;
     case MemberDef::Friend:      memType="friend";    isFunc=TRUE; break;
     case MemberDef::DCOP:        memType="dcop";      isFunc=TRUE; break;
     case MemberDef::Slot:        memType="slot";      isFunc=TRUE; break;
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 9107627..23fe600 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -8,6 +8,7 @@
 #include "language.h"
 #include "message.h"
 #include "dot.h"
+#include "layout.h"
 
 //----------------------------------------------------------------------
 // method implementation
@@ -107,25 +108,37 @@ QCString DirDef::getOutputFileBase() const
   //return QCString().sprintf("dir_%06d",m_dirCount);
 }
 
-void DirDef::writeDetailedDocumentation(OutputList &ol)
+void DirDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
-  if (!briefDescription().isEmpty() || !documentation().isEmpty())
+  if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
+      !documentation().isEmpty())
   {
     ol.writeRuler();
     ol.pushGeneratorState();
-      ol.disable(OutputGenerator::Latex);
-      ol.disable(OutputGenerator::RTF);
-    ol.writeAnchor(0,"_details");
+    ol.disableAllBut(OutputGenerator::Html);
+      ol.writeAnchor(0,"_details");
     ol.popGeneratorState();
     ol.startGroupHeader();
-    ol.parseText(theTranslator->trDetailedDescription());
+    ol.parseText(title);
     ol.endGroupHeader();
 
     // repeat brief description
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
       ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
-      ol.newParagraph();
+    }
+    // separator between brief and details
+    if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && 
+        !documentation().isEmpty())
+    {
+      ol.pushGeneratorState();
+        ol.disable(OutputGenerator::Man);
+        ol.disable(OutputGenerator::RTF);
+        ol.newParagraph();
+        ol.enableAll();
+        ol.disableAllBut(OutputGenerator::Man);
+        ol.writeString("\n\n");
+      ol.popGeneratorState();
     }
 
     // write documentation
@@ -136,63 +149,39 @@ void DirDef::writeDetailedDocumentation(OutputList &ol)
   }
 }
 
-void DirDef::writeDocumentation(OutputList &ol)
+void DirDef::writeBriefDescription(OutputList &ol)
 {
-  ol.pushGeneratorState();
-  
-  QCString shortTitle=theTranslator->trDirReference(m_shortName);
-  QCString title=theTranslator->trDirReference(m_dispName);
-  startFile(ol,getOutputFileBase(),name(),title,HLI_None,TRUE);
-
-  // write navigation path
-  writeNavigationPath(ol);
-
-  ol.endQuickIndices();
-  ol.startContents();
-
-  startTitle(ol,getOutputFileBase());
-  ol.pushGeneratorState();
-    ol.disableAllBut(OutputGenerator::Html);
-    ol.parseText(shortTitle);
-    ol.enableAll();
-    ol.disable(OutputGenerator::Html);
-    ol.parseText(title);
-  ol.popGeneratorState();
-  endTitle(ol,getOutputFileBase(),title);
-
-  // write brief or details (if DETAILS_AT_TOP)
-  if (Config_getBool("DETAILS_AT_TOP"))
-  {
-    writeDetailedDocumentation(ol);
-    ol.newParagraph();
-  }
-  else if (!briefDescription().isEmpty())
+  if (!briefDescription().isEmpty()) 
   {
     ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
     ol.writeString(" \n");
+    ol.enable(OutputGenerator::RTF);
+
+    if (Config_getBool("REPEAT_BRIEF") ||
+        !documentation().isEmpty()
+       )
+    {
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.startTextLink(0,"_details");
+      ol.parseText(theTranslator->trMore());
+      ol.endTextLink();
+    }
+    ol.popGeneratorState();
+
     ol.pushGeneratorState();
-    ol.disable(OutputGenerator::Latex);
     ol.disable(OutputGenerator::RTF);
-    ol.disable(OutputGenerator::Man);
-    ol.startTextLink(0,"_details");
-    ol.parseText(theTranslator->trMore());
-    ol.endTextLink();
-    ol.enableAll();
-    ol.disableAllBut(OutputGenerator::Man);
     ol.newParagraph();
     ol.popGeneratorState();
   }
+  ol.writeSynopsis();
+}
 
-  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
-  {
-    Doxygen::tagFile << "  <compound kind=\"dir\">" << endl;
-    Doxygen::tagFile << "    <name>" << convertToXML(displayName()) << "</name>" << endl;
-    Doxygen::tagFile << "    <path>" << convertToXML(name()) << "</path>" << endl;
-    Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
-  }
-  
+void DirDef::writeDirectoryGraph(OutputList &ol)
+{
   // write graph dependency graph
-  if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT"))
+  if (/*Config_getBool("DIRECTORY_GRAPH") &&*/ Config_getBool("HAVE_DOT"))
   {
     DotDirDeps dirDep(this);
     if (!dirDep.isTrivial())
@@ -206,8 +195,10 @@ void DirDef::writeDocumentation(OutputList &ol)
       ol.enableAll();
     }
   }
+}
 
-  ol.startMemberSections();
+void DirDef::writeSubDirList(OutputList &ol)
+{
   // write subdir list
   if (m_subdirs.count()>0)
   {
@@ -245,7 +236,10 @@ void DirDef::writeDocumentation(OutputList &ol)
 
     ol.endMemberList();
   }
-  
+}
+
+void DirDef::writeFileList(OutputList &ol)
+{
   // write file list
   if (m_fileList->count()>0)
   {
@@ -303,22 +297,160 @@ void DirDef::writeDocumentation(OutputList &ol)
     }
     ol.endMemberList();
   }
+}
+
+void DirDef::startMemberDeclarations(OutputList &ol)
+{
+  ol.startMemberSections();
+}
+
+void DirDef::endMemberDeclarations(OutputList &ol)
+{
   ol.endMemberSections();
+}
+
+void DirDef::writeDocumentation(OutputList &ol)
+{
+  ol.pushGeneratorState();
+  
+  QCString shortTitle=theTranslator->trDirReference(m_shortName);
+  QCString title=theTranslator->trDirReference(m_dispName);
+  startFile(ol,getOutputFileBase(),name(),title,HLI_None,TRUE);
+
+  // write navigation path
+  writeNavigationPath(ol);
+
+  ol.endQuickIndices();
+  ol.startContents();
+
+  startTitle(ol,getOutputFileBase());
+  ol.pushGeneratorState();
+    ol.disableAllBut(OutputGenerator::Html);
+    ol.parseText(shortTitle);
+    ol.enableAll();
+    ol.disable(OutputGenerator::Html);
+    ol.parseText(title);
+  ol.popGeneratorState();
+  endTitle(ol,getOutputFileBase(),title);
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
-    writeDocAnchorsToTagFile();
-    Doxygen::tagFile << "  </compound>" << endl;
+    Doxygen::tagFile << "  <compound kind=\"dir\">" << endl;
+    Doxygen::tagFile << "    <name>" << convertToXML(displayName()) << "</name>" << endl;
+    Doxygen::tagFile << "    <path>" << convertToXML(name()) << "</path>" << endl;
+    Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
   }
+  
+  //---------------------------------------- start flexible part -------------------------------
 
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT // new flexible layout
+
+  QListIterator<LayoutDocEntry> eli(
+      LayoutDocManager::instance().docEntries(LayoutDocManager::Directory));
+  LayoutDocEntry *lde;
+  for (eli.toFirst();(lde=eli.current());++eli)
+  {
+    switch (lde->kind())
+    {
+      case LayoutDocEntry::BriefDesc: 
+        writeBriefDescription(ol);
+        break; 
+      case LayoutDocEntry::DirGraph: 
+        writeDirectoryGraph(ol);
+        break; 
+      case LayoutDocEntry::MemberDeclStart: 
+        startMemberDeclarations(ol);
+        break; 
+      case LayoutDocEntry::DirSubDirs: 
+        writeSubDirList(ol);
+        break; 
+      case LayoutDocEntry::DirFiles: 
+        writeFileList(ol);
+        break; 
+      case LayoutDocEntry::MemberDeclEnd: 
+        endMemberDeclarations(ol);
+        break;
+      case LayoutDocEntry::DetailedDesc: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDetailedDescription(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::ClassIncludes:
+      case LayoutDocEntry::ClassInheritanceGraph:
+      case LayoutDocEntry::ClassNestedClasses:
+      case LayoutDocEntry::ClassCollaborationGraph:
+      case LayoutDocEntry::ClassAllMembersLink:
+      case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::FileClasses:
+      case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileIncludes:
+      case LayoutDocEntry::FileIncludeGraph:
+      case LayoutDocEntry::FileIncludedByGraph: 
+      case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::GroupClasses: 
+      case LayoutDocEntry::GroupNamespaces:
+      case LayoutDocEntry::GroupDirs: 
+      case LayoutDocEntry::GroupNestedGroups: 
+      case LayoutDocEntry::GroupFiles:
+      case LayoutDocEntry::GroupGraph: 
+      case LayoutDocEntry::GroupPageDocs:
+      case LayoutDocEntry::AuthorSection:
+      case LayoutDocEntry::MemberGroups:
+      case LayoutDocEntry::MemberDecl:
+      case LayoutDocEntry::MemberDef:
+      case LayoutDocEntry::MemberDefStart:
+      case LayoutDocEntry::MemberDefEnd:
+        err("Internal inconsistency: member %d should not be part of "
+            "LayoutDocManager::Directory entry list\n",lde->kind());
+        break;
+    }
+  }
+
+
+#else
+
+  // write brief or details (if DETAILS_AT_TOP)
+  if (Config_getBool("DETAILS_AT_TOP"))
+  {
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
+  }
+  else if (!briefDescription().isEmpty())
+  {
+    writeBriefDescription(ol);
+  }
+
+  writeDirectoryGraph(ol);
+
+  startMemberDeclarations(ol);
+
+  writeSubDirList(ol);
+  writeFileList(ol);
+  
+  endMemberDeclarations(ol);
 
   if (!Config_getBool("DETAILS_AT_TOP"))
   {
-    writeDetailedDocumentation(ol);
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
   }
+
+#endif
   
+  //---------------------------------------- end flexible part -------------------------------
+
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+  {
+    writeDocAnchorsToTagFile();
+    Doxygen::tagFile << "  </compound>" << endl;
+  }
+
   endFile(ol); 
   ol.popGeneratorState();
+
+
 }
 
 #if 0
diff --git a/src/dirdef.h b/src/dirdef.h
index 49dca57..90c9379 100644
--- a/src/dirdef.h
+++ b/src/dirdef.h
@@ -68,7 +68,6 @@ class DirDef : public Definition
     bool depGraphIsTrivial() const;
 
     // generate output
-    void writeDetailedDocumentation(OutputList &ol);
     void writeDocumentation(OutputList &ol);
     void writeDepGraph(QTextStream &t);
 
@@ -77,6 +76,15 @@ class DirDef : public Definition
 
   private:
     friend void computeDirDependencies();
+
+    void writeDetailedDescription(OutputList &ol,const QCString &title);
+    void writeBriefDescription(OutputList &ol);
+    void writeDirectoryGraph(OutputList &ol);
+    void writeSubDirList(OutputList &ol);
+    void writeFileList(OutputList &ol);
+    void startMemberDeclarations(OutputList &ol);
+    void endMemberDeclarations(OutputList &ol);
+
     void setLevel();
     static DirDef *createNewDir(const char *path);
     static bool matchPath(const QCString &path,QStrList &l);
diff --git a/src/docsets.cpp b/src/docsets.cpp
index f9f5114..6daad38 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -329,8 +329,8 @@ void DocSets::addIndexItem(const char *, const char *,
       type="enum"; break;
     case MemberDef::EnumValue:
       type="econst"; break;
-    case MemberDef::Prototype:
-      type="prototype"; break;
+    //case MemberDef::Prototype:
+    //  type="prototype"; break;
     case MemberDef::Signal:
       type="signal"; break;
     case MemberDef::Slot:
diff --git a/src/dot.cpp b/src/dot.cpp
index 51a2506..87a7e08 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -842,12 +842,12 @@ void DotNode::writeXML(QTextStream &t,bool isClassGraph)
       {
         int p=0;
         int ni;
-        while ((ni=edgeInfo->m_label.find("\\n",p))!=-1)
+        while ((ni=edgeInfo->m_label.find('\n',p))!=-1)
         {
           t << "          <edgelabel>" 
             << convertToXML(edgeInfo->m_label.mid(p,ni-p))
             << "</edgelabel>" << endl;
-          p=ni+2;
+          p=ni+1;
         }
         t << "          <edgelabel>" 
           << convertToXML(edgeInfo->m_label.right(edgeInfo->m_label.length()-p))
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 826b86d..0c1bdae 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -76,6 +76,8 @@
 #include "portable.h"
 #include "vhdlscanner.h"
 
+#include "layout.h"
+
 #define RECURSE_ENTRYTREE(func,var) \
   do { if (var->children()) { \
     EntryNavListIterator eli(*var->children()); \
@@ -7165,11 +7167,11 @@ static void generateClassDocs()
   msg("Generating annotated compound index...\n");
   writeAnnotatedIndex(*outputList);
 
-  if (Config_getBool("ALPHABETICAL_INDEX"))
-  {
+  //if (Config_getBool("ALPHABETICAL_INDEX"))
+  //{
     msg("Generating alphabetical compound index...\n");
     writeAlphabeticalIndex(*outputList);
-  }
+  //}
 
   msg("Generating hierarchical class index...\n");
   writeHierarchicalIndex(*outputList);
@@ -8910,11 +8912,14 @@ static void usage(const char *name)
   msg("configuration file:\n");
   msg("    %s [configName]\n\n",name);
   msg("    If - is used for configName doxygen will read from standard input.\n\n");
-  msg("4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
+  msg("4) Use doxygen to generate a template file controlling the layout of the\n");
+  msg("   generated documentation:\n");
+  msg("    %s -l layoutFileName.xml\n\n",name);
+  msg("5) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
   msg("    RTF:   %s -w rtf styleSheetFile\n",name);
   msg("    HTML:  %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
   msg("    LaTeX: %s -w latex headerFile styleSheetFile [configFile]\n\n",name);
-  msg("5) Use doxygen to generate an rtf extensions file\n");
+  msg("6) Use doxygen to generate an rtf extensions file\n");
   msg("    RTF:   %s -e rtf extensionsFile\n\n",name);
   msg("If -s is specified the comments in the config file will be omitted.\n");
   msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
@@ -8957,10 +8962,8 @@ void initDoxygen()
   Doxygen::parserManager->registerParser(".f90", new FortranLanguageScanner);
   Doxygen::parserManager->registerParser(".vhd", new VHDLLanguageScanner);
 
-
   // register any additional parsers here...
 
-
   initClassMemberIndices();
   initNamespaceMemberIndices();
   initFileMemberIndices();
@@ -9028,11 +9031,13 @@ void readConfiguration(int argc, char **argv)
 
   int optind=1;
   const char *configName=0;
+  const char *layoutName=0;
   const char *debugLabel;
   const char *formatName;
   bool genConfig=FALSE;
   bool shortList=FALSE;
   bool updateConfig=FALSE;
+  bool genLayout=FALSE;
   while (optind<argc && argv[optind][0]=='-' && 
                (isalpha(argv[optind][1]) || argv[optind][1]=='?' || 
                 argv[optind][1]=='-')
@@ -9048,6 +9053,12 @@ void readConfiguration(int argc, char **argv)
         if (!configName) 
         { configName="Doxyfile"; }
         break;
+      case 'l':
+        genLayout=TRUE;
+        layoutName=getArg(argc,argv,optind);
+        if (!layoutName)
+        { layoutName="doxygenlayout.xml"; }
+        break;
       case 'd':
         debugLabel=getArg(argc,argv,optind);
         Debug::setFlag(debugLabel);
@@ -9251,6 +9262,12 @@ void readConfiguration(int argc, char **argv)
     cleanUpDoxygen();
     exit(0);
   }
+  if (genLayout)
+  {
+    writeDefaultLayoutFile(layoutName);
+    cleanUpDoxygen();
+    exit(0);
+  }
 
   QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
   if (optind>=argc)
@@ -9301,6 +9318,7 @@ void readConfiguration(int argc, char **argv)
   /* Perlmod wants to know the path to the config file.*/
   QFileInfo configFileInfo(configName);
   setPerlModDoxyfile(configFileInfo.absFilePath());
+
 }
 
 void checkConfiguration()
@@ -9585,6 +9603,31 @@ void parseInput()
     exit(1);
   }
   /**************************************************************************
+   *             Handle layout file                                         *
+   **************************************************************************/
+
+  LayoutDocManager::instance().init();
+  QCString layoutFileName = Config_getString("LAYOUT_FILE");
+  bool defaultLayoutUsed = FALSE;
+  if (layoutFileName.isEmpty())
+  {
+    layoutFileName = "doxygenlayout.xml";
+    defaultLayoutUsed = TRUE;
+  }
+
+  QFile layoutFile(layoutFileName);
+  if (layoutFile.open(IO_ReadOnly))
+  {
+    msg("Parsing layout file %s...\n",layoutFileName.data());
+    QTextStream t(&layoutFile); 
+    LayoutDocManager::instance().parse(t);
+  }
+  else if (!defaultLayoutUsed)
+  {
+    err("Warning: failed to open layout file '%s' for reading!\n",layoutFileName.data());
+  }
+
+  /**************************************************************************
    *             Read and preprocess input                                  *
    **************************************************************************/
  
@@ -9963,6 +10006,8 @@ void parseInput()
   msg("Combining using relations...\n");
   combineUsingRelations();
 
+  msg("Adding members to index pages...\n");
+  addMembersToIndex();
 }
 
 void generateOutput()
@@ -10107,7 +10152,6 @@ void generateOutput()
   writeGroupIndex(*outputList);
  
   msg("Generating class documentation...\n");
-  addMembersToIndex();
   generateClassDocs();
   
   if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
diff --git a/src/doxytag.l b/src/doxytag.l
index 687fd63..a7beff1 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -245,6 +245,7 @@ QCString unhtmlify(const char *str)
 				   } 
 <Start>^"<td"[^\n]*"<h1 align=center>" | // Qt-3.x.x
 <Start>"</table><h1 align=\"center\">" | // Qt-4
+<Start>"</table><h1 class=\"title\">"  | // >Qt-4.4.0
 <Start>^"<h1 align=center>"	   { // Qt variant
   				     BEGIN( ReadClassName );
 			           }
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 053c1a5..e323dd5 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -35,6 +35,9 @@
 #include "portable.h"
 #include "vhdldocgen.h"
 #include "debug.h"
+#include "layout.h"
+
+//---------------------------------------------------------------------------
 
 class DevNullCodeDocInterface : public CodeOutputInterface
 {
@@ -55,6 +58,8 @@ class DevNullCodeDocInterface : public CodeOutputInterface
     virtual void linkableSymbol(int, const char *,Definition *,Definition *) {}
 };
 
+//---------------------------------------------------------------------------
+
 /*! create a new file definition, where \a p is the file path, 
     \a nm the file name, and \a ref is an HTML anchor name if the
     file was read from a tag file or 0 otherwise
@@ -154,21 +159,22 @@ void FileDef::findSectionsInDocumentation()
   }
 }
 
-void FileDef::writeDetailedDocumentation(OutputList &ol)
+void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
   if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
-      !documentation().isEmpty() 
+      !documentation().isEmpty() ||
+      (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef())
      )
   {
     ol.writeRuler();
     ol.pushGeneratorState();
-    ol.disable(OutputGenerator::Latex);
-    ol.disable(OutputGenerator::RTF);
-    ol.writeAnchor(0,"_details"); 
+    ol.disableAllBut(OutputGenerator::Html);
+      ol.writeAnchor(0,"_details"); 
     ol.popGeneratorState();
     ol.startGroupHeader();
-    ol.parseText(theTranslator->trDetailedDescription());
+    ol.parseText(title);
     ol.endGroupHeader();
+
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
@@ -179,6 +185,7 @@ void FileDef::writeDetailedDocumentation(OutputList &ol)
     {
       ol.pushGeneratorState();
         ol.disable(OutputGenerator::Man);
+        ol.disable(OutputGenerator::RTF);
         ol.newParagraph();
         ol.enableAll();
         ol.disableAllBut(OutputGenerator::Man);
@@ -187,8 +194,6 @@ void FileDef::writeDetailedDocumentation(OutputList &ol)
     }
     if (!documentation().isEmpty())
     {
-      //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') 
-      //  doc+='.';
       ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
     }
     //printf("Writing source ref for file %s\n",name().data());
@@ -211,113 +216,38 @@ void FileDef::writeDetailedDocumentation(OutputList &ol)
   }
 }
 
-/*! Write the documentation page for this file to the file of output
-    generators \a ol. 
-*/
-void FileDef::writeDocumentation(OutputList &ol)
+void FileDef::writeBriefDescription(OutputList &ol)
 {
-  bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
-  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
-  //funcList->countDecMembers();
-  
-  //QCString fn = name();
-  //if (Config_getBool("FULL_PATH_NAMES"))
-  //{
-  //  fn.prepend(stripFromPath(getPath().copy()));
-  //}
-
-  //printf("WriteDocumentation diskname=%s\n",diskname.data());
-  
-  QCString versionTitle;
-  if (!fileVersion.isEmpty())
-  {
-    versionTitle=("("+fileVersion+")");
-  }
-  QCString title = docname+versionTitle;
-  QCString pageTitle=theTranslator->trFileReference(docname);
-
-  if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
-  {
-    startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible,TRUE);
-    getDirDef()->writeNavigationPath(ol);
-    ol.endQuickIndices();
-    ol.startContents();
-    QCString pageTitleShort=theTranslator->trFileReference(name());
-    startTitle(ol,getOutputFileBase());
-    ol.pushGeneratorState();
-      ol.disableAllBut(OutputGenerator::Html);
-      ol.parseText(pageTitleShort); // Html only
-      ol.enableAll();
-      ol.disable(OutputGenerator::Html);
-      ol.parseText(pageTitle); // other output formats
-    ol.popGeneratorState();
-    addGroupListToTitle(ol,this);
-    endTitle(ol,getOutputFileBase(),title);
-  }
-  else
-  {
-    startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible);
-    startTitle(ol,getOutputFileBase());
-    ol.parseText(pageTitle);
-    addGroupListToTitle(ol,this);
-    endTitle(ol,getOutputFileBase(),title);
-  }
-  if (!fileVersion.isEmpty())
-  {
-    ol.disableAllBut(OutputGenerator::Html);
-    ol.startProjectNumber();
-    ol.docify(versionTitle);
-    ol.endProjectNumber();
-    ol.enableAll();
-  }
-  
-  if (Config_getBool("SEARCHENGINE"))
-  {
-    Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
-    Doxygen::searchIndex->addWord(localName(),TRUE);
-  }
-  
-  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
-  {
-    Doxygen::tagFile << "  <compound kind=\"file\">" << endl;
-    Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
-    Doxygen::tagFile << "    <path>" << convertToXML(getPath()) << "</path>" << endl;
-    Doxygen::tagFile << "    <filename>" 
-                     << convertToXML(getOutputFileBase()) 
-                     << "</filename>" << endl;
-  }
-  
-  if (Config_getBool("DETAILS_AT_TOP"))
+  if (!briefDescription().isEmpty()) 
   {
-    ol.startTextBlock(); 
-    writeDetailedDocumentation(ol);
-    ol.endTextBlock();
-
+    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
     ol.pushGeneratorState();
-    ol.disable(OutputGenerator::Man);
     ol.disable(OutputGenerator::RTF);
-    ol.newParagraph();
+    ol.writeString(" \n");
+    ol.enable(OutputGenerator::RTF);
+
+    if (Config_getBool("REPEAT_BRIEF") ||
+        !documentation().isEmpty()
+       )
+    {
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.startTextLink(0,"_details");
+      ol.parseText(theTranslator->trMore());
+      ol.endTextLink();
+    }
     ol.popGeneratorState();
-  }
-  else if (!briefDescription().isEmpty()) 
-  {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
-    //ol.writeString(" \n");
-    ol.disableAllBut(OutputGenerator::Html);
-    ol.startTextLink(0,"_details");
-    ol.parseText(theTranslator->trMore());
-    ol.endTextLink();
-    ol.enableAll();
 
     ol.pushGeneratorState();
-    ol.disable(OutputGenerator::Man);
     ol.disable(OutputGenerator::RTF);
     ol.newParagraph();
     ol.popGeneratorState();
   }
   ol.writeSynopsis();
- 
-  if (Config_getBool("SHOW_INCLUDE_FILES") && includeList && 
+}
+
+void FileDef::writeIncludeFiles(OutputList &ol)
+{
+  if (/*Config_getBool("SHOW_INCLUDE_FILES") &&*/ includeList && 
       includeList->count()>0)
   {
     ol.startTextBlock(TRUE);
@@ -395,8 +325,11 @@ void FileDef::writeDocumentation(OutputList &ol)
     }
     ol.endTextBlock();
   }
-  
-  if (Config_getBool("HAVE_DOT") && Config_getBool("INCLUDE_GRAPH"))
+}
+
+void FileDef::writeIncludeGraph(OutputList &ol)
+{
+  if (Config_getBool("HAVE_DOT") /*&& Config_getBool("INCLUDE_GRAPH")*/)
   {
     //printf("Graph for file %s\n",name().data());
     DotInclDepGraph incDepGraph(this,FALSE);
@@ -413,8 +346,11 @@ void FileDef::writeDocumentation(OutputList &ol)
     }
     //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
   }
+}
 
-  if (Config_getBool("HAVE_DOT") && Config_getBool("INCLUDED_BY_GRAPH"))
+void FileDef::writeIncludedByGraph(OutputList &ol)
+{
+  if (Config_getBool("HAVE_DOT") /*&& Config_getBool("INCLUDED_BY_GRAPH")*/)
   {
     //printf("Graph for file %s\n",name().data());
     DotInclDepGraph incDepGraph(this,TRUE);
@@ -431,7 +367,11 @@ void FileDef::writeDocumentation(OutputList &ol)
     }
     //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
   }
+}
+
 
+void FileDef::writeSourceLink(OutputList &ol)
+{
   //printf("%s: generateSourceFile()=%d\n",name().data(),generateSourceFile());
   if (generateSourceFile())
   {
@@ -442,87 +382,278 @@ void FileDef::writeDocumentation(OutputList &ol)
     ol.endTextLink();
     ol.enableAll();
   }
-  
+}
+
+void FileDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+{
+  // write list of namespaces
+  if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title);
+}
+
+void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+{
+  // write list of classes
+  if (classSDict) classSDict->writeDeclaration(ol,0,title,FALSE);
+}
+
+void FileDef::startMemberDeclarations(OutputList &ol)
+{
   ol.startMemberSections();
+}
+
+void FileDef::endMemberDeclarations(OutputList &ol)
+{
+  ol.endMemberSections();
+}
 
-  if (namespaceSDict && namespaceSDict->count()>0)
+void FileDef::startMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
-    NamespaceSDict::Iterator ndi(*namespaceSDict);
-    NamespaceDef *nd;
-    bool found=FALSE;
-    for (ndi.toFirst();(nd=ndi.current());++ndi)
+    ol.disable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = TRUE;
+  }
+}
+
+void FileDef::endMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+  {
+    ol.enable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = FALSE;
+  }
+}
+
+void FileDef::writeMemberGroups(OutputList &ol)
+{
+  /* write user defined member groups */
+  if (memberGroupSDict)
+  {
+    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
     {
-      if (nd->name().find('@')==-1 && !nd->isArtificial())
+      if ((!mg->allMembersInSameSection() || !m_subGrouping) 
+          && mg->header()!="[NOHEADER]")
       {
-        if (!found)
+        mg->writeDeclarations(ol,0,0,this,0);
+      }
+    }
+  }
+}
+
+void FileDef::writeAuthorSection(OutputList &ol)
+{
+  // write Author section (Man only)
+  ol.pushGeneratorState();
+  ol.disableAllBut(OutputGenerator::Man);
+  ol.startGroupHeader();
+  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+  ol.endGroupHeader();
+  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+  ol.popGeneratorState();
+}
+
+/*! Write the documentation page for this file to the file of output
+    generators \a ol. 
+*/
+void FileDef::writeDocumentation(OutputList &ol)
+{
+  //funcList->countDecMembers();
+  
+  //QCString fn = name();
+  //if (Config_getBool("FULL_PATH_NAMES"))
+  //{
+  //  fn.prepend(stripFromPath(getPath().copy()));
+  //}
+
+  //printf("WriteDocumentation diskname=%s\n",diskname.data());
+  
+  QCString versionTitle;
+  if (!fileVersion.isEmpty())
+  {
+    versionTitle=("("+fileVersion+")");
+  }
+  QCString title = docname+versionTitle;
+  QCString pageTitle=theTranslator->trFileReference(docname);
+
+  if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
+  {
+    startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible,TRUE);
+    getDirDef()->writeNavigationPath(ol);
+    ol.endQuickIndices();
+    ol.startContents();
+    QCString pageTitleShort=theTranslator->trFileReference(name());
+    startTitle(ol,getOutputFileBase());
+    ol.pushGeneratorState();
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.parseText(pageTitleShort); // Html only
+      ol.enableAll();
+      ol.disable(OutputGenerator::Html);
+      ol.parseText(pageTitle); // other output formats
+    ol.popGeneratorState();
+    addGroupListToTitle(ol,this);
+    endTitle(ol,getOutputFileBase(),title);
+  }
+  else
+  {
+    startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible);
+    startTitle(ol,getOutputFileBase());
+    ol.parseText(pageTitle);
+    addGroupListToTitle(ol,this);
+    endTitle(ol,getOutputFileBase(),title);
+  }
+  if (!fileVersion.isEmpty())
+  {
+    ol.disableAllBut(OutputGenerator::Html);
+    ol.startProjectNumber();
+    ol.docify(versionTitle);
+    ol.endProjectNumber();
+    ol.enableAll();
+  }
+  
+  if (Config_getBool("SEARCHENGINE"))
+  {
+    Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
+    Doxygen::searchIndex->addWord(localName(),TRUE);
+  }
+  
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+  {
+    Doxygen::tagFile << "  <compound kind=\"file\">" << endl;
+    Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
+    Doxygen::tagFile << "    <path>" << convertToXML(getPath()) << "</path>" << endl;
+    Doxygen::tagFile << "    <filename>" 
+                     << convertToXML(getOutputFileBase()) 
+                     << "</filename>" << endl;
+  }
+
+  //---------------------------------------- start flexible part -------------------------------
+  
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT // new flexible layout
+
+  QListIterator<LayoutDocEntry> eli(
+      LayoutDocManager::instance().docEntries(LayoutDocManager::File));
+  LayoutDocEntry *lde;
+  for (eli.toFirst();(lde=eli.current());++eli)
+  {
+    switch (lde->kind())
+    {
+      case LayoutDocEntry::BriefDesc: 
+        writeBriefDescription(ol);
+        break; 
+      case LayoutDocEntry::MemberDeclStart: 
+        startMemberDeclarations(ol);
+        break; 
+      case LayoutDocEntry::FileIncludes:
+        writeIncludeFiles(ol);
+        break;
+      case LayoutDocEntry::FileIncludeGraph:
+        writeIncludeGraph(ol);
+        break;
+      case LayoutDocEntry::FileIncludedByGraph:
+        writeIncludedByGraph(ol);
+        break;
+      case LayoutDocEntry::FileSourceLink:
+        writeSourceLink(ol);
+        break;
+      case LayoutDocEntry::FileClasses: 
         {
-          ol.startMemberHeader();
-          if (fortranOpt)
-          {
-            ol.parseText(theTranslator->trModules());
-          }
-          else
-          {
-            ol.parseText(theTranslator->trNamespaces());
-          }
-          ol.endMemberHeader();
-          ol.startMemberList();
-          found=TRUE;
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeClassDeclarations(ol,ls->title);
         }
-        ol.startMemberItem(0);
-        if (fortranOpt) 
+        break; 
+      case LayoutDocEntry::FileNamespaces: 
         {
-          ol.writeString("module ");
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNamespaceDeclarations(ol,ls->title);
         }
-        else
+        break; 
+      case LayoutDocEntry::MemberGroups: 
+        writeMemberGroups(ol);
+        break; 
+      case LayoutDocEntry::MemberDecl: 
         {
-          ol.writeString("namespace ");
+          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+          writeMemberDeclarations(ol,lmd->type,lmd->title);
         }
-        ol.insertMemberAlign();
-        if (nd->isLinkable()) 
+        break; 
+      case LayoutDocEntry::MemberDeclEnd: 
+        endMemberDeclarations(ol);
+        break;
+      case LayoutDocEntry::DetailedDesc: 
         {
-          ol.writeObjectLink(nd->getReference(),
-              nd->getOutputFileBase(),
-              0,
-              nd->displayName()
-          );
-          if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
-          {
-            Doxygen::tagFile << "    <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
-          }
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDetailedDescription(ol,ls->title);
         }
-        else
+        break;
+      case LayoutDocEntry::MemberDefStart: 
+        startMemberDocumentation(ol);
+        break; 
+      case LayoutDocEntry::MemberDef: 
         {
-          ol.startBold();
-          ol.docify(nd->displayName());
-          ol.endBold();
+          LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+          writeMemberDocumentation(ol,lmd->type,lmd->title);
         }
-        ol.endMemberItem();
-      }
+        break;
+      case LayoutDocEntry::MemberDefEnd: 
+        endMemberDocumentation(ol);
+        break;
+      case LayoutDocEntry::AuthorSection: 
+        writeAuthorSection(ol);
+        break;
+      case LayoutDocEntry::ClassIncludes:
+      case LayoutDocEntry::ClassInheritanceGraph:
+      case LayoutDocEntry::ClassNestedClasses:
+      case LayoutDocEntry::ClassCollaborationGraph:
+      case LayoutDocEntry::ClassAllMembersLink:
+      case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::GroupClasses: 
+      case LayoutDocEntry::GroupNamespaces:
+      case LayoutDocEntry::GroupDirs: 
+      case LayoutDocEntry::GroupNestedGroups: 
+      case LayoutDocEntry::GroupFiles:
+      case LayoutDocEntry::GroupGraph: 
+      case LayoutDocEntry::GroupPageDocs:
+      case LayoutDocEntry::DirSubDirs:
+      case LayoutDocEntry::DirFiles:
+      case LayoutDocEntry::DirGraph:
+        err("Internal inconsistency: member %d should not be part of "
+            "LayoutDocManager::File entry list\n",lde->kind());
+        break;
     }
-    if (found) ol.endMemberList();
   }
 
-  if (classSDict) classSDict->writeDeclaration(ol);
-  
-  /* write user defined member groups */
-  if (memberGroupSDict)
+
+#else
+
+  bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
+
+  if (Config_getBool("DETAILS_AT_TOP"))
   {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
-    {
-      if ((!mg->allMembersInSameSection() || !m_subGrouping) 
-          && mg->header()!="[NOHEADER]")
-      {
-        mg->writeDeclarations(ol,0,0,this,0);
-      }
-    }
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
   }
+  else
+  {
+    writeBriefDescription(ol);
+  }
+ 
+  writeIncludeFiles(ol);
+  writeIncludeGraph(ol);
+  writeIncludedByGraph(ol);
+  writeSourceLink(ol);
+  
+  startMemberDeclarations(ol);
 
-  //allMemberList.writeDeclarations(ol,0,0,this,0,0,0);
+  writeNamespaceDeclarations(ol);
+  writeClassDeclarations(ol);
+  writeMemberGroups(ol);
+  
   writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
-  writeMemberDeclarations(ol,MemberList::decProtoMembers,theTranslator->trFuncProtos());
   writeMemberDeclarations(ol,MemberList::decTypedefMembers,theTranslator->trTypedefs());
   writeMemberDeclarations(ol,MemberList::decEnumMembers,theTranslator->trEnumerations());
   writeMemberDeclarations(ol,MemberList::decFuncMembers,
@@ -530,22 +661,29 @@ void FileDef::writeDocumentation(OutputList &ol)
       vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
                    theTranslator->trFunctions())   ;
   writeMemberDeclarations(ol,MemberList::decVarMembers,theTranslator->trVariables());
-  ol.endMemberSections();
+
+  endMemberDeclarations(ol);
 
   if (!Config_getBool("DETAILS_AT_TOP"))
   {
-    writeDetailedDocumentation(ol);
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
   }
 
-  writeMemberDocumentation(ol);
+  startMemberDocumentation(ol);
+
+  writeMemberDocumentation(ol,MemberList::docDefineMembers,theTranslator->trDefineDocumentation());
+  writeMemberDocumentation(ol,MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation());
+  writeMemberDocumentation(ol,MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+  writeMemberDocumentation(ol,MemberList::docFuncMembers,theTranslator->trFunctionDocumentation());
+  writeMemberDocumentation(ol,MemberList::docVarMembers,theTranslator->trVariableDocumentation());
+
+  endMemberDocumentation(ol);
   
   // write Author section (Man only)
-  ol.disableAllBut(OutputGenerator::Man);
-  ol.startGroupHeader();
-  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
-  ol.endGroupHeader();
-  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
-  ol.enableAll();
+  writeAuthorSection(ol);
+
+#endif
+  //---------------------------------------- end flexible part -------------------------------
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
@@ -563,27 +701,6 @@ void FileDef::writeDocumentation(OutputList &ol)
   }
 }
 
-void FileDef::writeMemberDocumentation(OutputList &ol)
-{
-  bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    ol.disable(OutputGenerator::Html);
-  }
-
-  writeMemberDocumentation(ol,MemberList::docDefineMembers,theTranslator->trDefineDocumentation());
-  writeMemberDocumentation(ol,MemberList::docProtoMembers,fortranOpt?theTranslator->trSubprogramDocumentation():theTranslator->trFunctionPrototypeDocumentation());
-  writeMemberDocumentation(ol,MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation());
-  writeMemberDocumentation(ol,MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
-  writeMemberDocumentation(ol,MemberList::docFuncMembers,theTranslator->trFunctionDocumentation());
-  writeMemberDocumentation(ol,MemberList::docVarMembers,theTranslator->trVariableDocumentation());
-
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    ol.enable(OutputGenerator::Html);
-  }
-}
-
 void FileDef::writeMemberPages(OutputList &ol)
 {
   ol.pushGeneratorState();
@@ -775,10 +892,6 @@ void FileDef::insertMember(MemberDef *md)
       break;
     case MemberDef::EnumValue:    // enum values are shown inside their enums
       break;
-    case MemberDef::Prototype:    
-      addMemberToList(MemberList::decProtoMembers,md);
-      addMemberToList(MemberList::docProtoMembers,md);
-      break;
     case MemberDef::Define:       
       addMemberToList(MemberList::decDefineMembers,md);
       addMemberToList(MemberList::docDefineMembers,md);
diff --git a/src/filedef.h b/src/filedef.h
index 6ea8d23..52282f7 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -126,9 +126,7 @@ class FileDef : public Definition
 
     bool isJava() const { return m_isJava; }
 
-    void writeDetailedDocumentation(OutputList &ol);
     void writeDocumentation(OutputList &ol);
-    void writeMemberDocumentation(OutputList &ol);
     void writeMemberPages(OutputList &ol);
     void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
 
@@ -188,6 +186,20 @@ class FileDef : public Definition
     void addMemberToList(MemberList::ListType lt,MemberDef *md);
     void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
     void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
+    void writeIncludeFiles(OutputList &ol);
+    void writeIncludeGraph(OutputList &ol);
+    void writeIncludedByGraph(OutputList &ol);
+    void writeMemberGroups(OutputList &ol);
+    void writeAuthorSection(OutputList &ol);
+    void writeSourceLink(OutputList &ol);
+    void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+    void writeClassDeclarations(OutputList &ol,const QCString &title);
+    void startMemberDeclarations(OutputList &ol);
+    void endMemberDeclarations(OutputList &ol);
+    void startMemberDocumentation(OutputList &ol);
+    void endMemberDocumentation(OutputList &ol);
+    void writeDetailedDescription(OutputList &ol,const QCString &title);
+    void writeBriefDescription(OutputList &ol);
 
     QDict<IncludeInfo>   *includeDict;
     QList<IncludeInfo>   *includeList;
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 984bb4f..b0fd61d 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -35,6 +35,9 @@
 #include "searchindex.h"
 #include "dot.h"
 #include "vhdldocgen.h"
+#include "layout.h"
+
+//---------------------------------------------------------------------------
 
 GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
                    const char *refFileName) : Definition(df,dl,na)
@@ -297,13 +300,6 @@ bool GroupDef::insertMember(MemberDef *md,bool docOnly)
       }
       addMemberToList(MemberList::docEnumValMembers,md);
       break;
-    case MemberDef::Prototype:    
-      if (!docOnly)
-      {
-        addMemberToList(MemberList::decProtoMembers,md);
-      }
-      addMemberToList(MemberList::docProtoMembers,md);
-      break;
     case MemberDef::Define:       
       if (!docOnly)
       {
@@ -420,10 +416,6 @@ void GroupDef::removeMember(MemberDef *md)
         removeMemberFromList(MemberList::decEnumValMembers,md);
         removeMemberFromList(MemberList::docEnumValMembers,md);
         break;
-      case MemberDef::Prototype:    
-        removeMemberFromList(MemberList::decProtoMembers,md);
-        removeMemberFromList(MemberList::docProtoMembers,md);
-        break;
       case MemberDef::Define:       
         removeMemberFromList(MemberList::decDefineMembers,md);
         removeMemberFromList(MemberList::docDefineMembers,md);
@@ -505,32 +497,44 @@ void GroupDef::computeAnchors()
   setAnchors(0,'a',allMemberList);
 }
 
-void GroupDef::writeDetailedDocumentation(OutputList &ol)
+void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
-  if (!briefDescription().isEmpty() || !documentation().isEmpty())
+  if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) 
+      || !documentation().isEmpty()
+     )
   {
-    
-    if (pageDict->count()!=countMembers()) // classical layout
+    if (pageDict->count()!=countMembers()) // not only pages -> classical layout
     {
       ol.writeRuler();
       ol.pushGeneratorState();
-      ol.disable(OutputGenerator::Latex);
-      ol.disable(OutputGenerator::RTF);
-      ol.writeAnchor(0,"_details");
+      ol.disableAllBut(OutputGenerator::Html);
+        ol.writeAnchor(0,"_details");
       ol.popGeneratorState();
       ol.startGroupHeader();
-      ol.parseText(theTranslator->trDetailedDescription());
+      ol.parseText(title);
       ol.endGroupHeader();
 
       // repeat brief description
       if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
       {
         ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
-        ol.newParagraph();
+      }
+      // write separator between brief and details
+      if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
+          !documentation().isEmpty())
+      {
+        ol.pushGeneratorState();
+          ol.disable(OutputGenerator::Man);
+          ol.disable(OutputGenerator::RTF);
+          ol.newParagraph();
+          ol.enableAll();
+          ol.disableAllBut(OutputGenerator::Man);
+          ol.writeString("\n\n");
+        ol.popGeneratorState();
       }
     }
 
-    // write documentation
+    // write detailed documentation
     if (!documentation().isEmpty())
     {
       ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
@@ -538,31 +542,37 @@ void GroupDef::writeDetailedDocumentation(OutputList &ol)
   }
 }
 
-
-void GroupDef::writeDocumentation(OutputList &ol)
+void GroupDef::writeBriefDescription(OutputList &ol)
 {
-  bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");  
-  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
-  ol.pushGeneratorState();
-  startFile(ol,getOutputFileBase(),name(),title);
-  startTitle(ol,getOutputFileBase());
-  ol.parseText(title);
-  addGroupListToTitle(ol,this);
-  endTitle(ol,getOutputFileBase(),title);
-
-  if (Config_getBool("SEARCHENGINE"))
+  if (!briefDescription().isEmpty())
   {
-    Doxygen::searchIndex->setCurrentDoc(title,getOutputFileBase());
-    static QRegExp we("[a-zA-Z_][a-zA-Z_0-9]*");
-    int i=0,p=0,l=0;
-    while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
+    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.writeString(" \n");
+    ol.enable(OutputGenerator::RTF);
+
+    if (Config_getBool("REPEAT_BRIEF") ||
+        !documentation().isEmpty()
+       )
     {
-      Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
-      p=i+l;
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.startTextLink(0,"_details");
+      ol.parseText(theTranslator->trMore());
+      ol.endTextLink();
     }
+    ol.popGeneratorState();
+
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.newParagraph();
+    ol.popGeneratorState();
   }
+}
 
-  if (Config_getBool("HAVE_DOT") && Config_getBool("GROUP_GRAPHS") )
+void GroupDef::writeGroupGraph(OutputList &ol)
+{
+  if (Config_getBool("HAVE_DOT") /*&& Config_getBool("GROUP_GRAPHS")*/ )
   {
     DotGroupCollaboration graph(this);
     if (!graph.isTrivial())
@@ -577,45 +587,15 @@ void GroupDef::writeDocumentation(OutputList &ol)
       ol.popGeneratorState();
     }
   }
+}
 
-
-  if (Config_getBool("DETAILS_AT_TOP"))
-  {
-    writeDetailedDocumentation(ol);
-    ol.newParagraph();
-  }
-  else if (!briefDescription().isEmpty())
-  {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
-    ol.writeString(" \n");
-    ol.pushGeneratorState();
-    ol.disable(OutputGenerator::Latex);
-    ol.disable(OutputGenerator::RTF);
-    ol.disable(OutputGenerator::Man);
-    ol.startTextLink(0,"_details");
-    ol.parseText(theTranslator->trMore());
-    ol.endTextLink();
-    ol.enableAll();
-    ol.disableAllBut(OutputGenerator::Man);
-    ol.newParagraph();
-    ol.popGeneratorState();
-  }
-
-  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
-  {
-    Doxygen::tagFile << "  <compound kind=\"group\">" << endl;
-    Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
-    Doxygen::tagFile << "    <title>" << convertToXML(title) << "</title>" << endl;
-    Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
-  }
-  
-  ol.startMemberSections();
-
+void GroupDef::writeFiles(OutputList &ol,const QCString &title)
+{
   // write list of files
   if (fileList->count()>0)
   {
     ol.startMemberHeader();
-    ol.parseText(theTranslator->trFile(TRUE,FALSE));
+    ol.parseText(title);
     ol.endMemberHeader();
     ol.startMemberList();
     FileDef *fd=fileList->first();
@@ -641,15 +621,21 @@ void GroupDef::writeDocumentation(OutputList &ol)
     }
     ol.endMemberList();
   }
+}
 
+void GroupDef::writeNamespaces(OutputList &ol,const QCString &title)
+{
   // write list of namespaces
-  namespaceSDict->writeDeclaration(ol);
+  namespaceSDict->writeDeclaration(ol,title);
+}
 
+void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
+{
   // write list of groups
   if (groupList->count()>0)
   {
     ol.startMemberHeader();
-    ol.parseText(theTranslator->trModules());
+    ol.parseText(title);
     ol.endMemberHeader();
     ol.startMemberList();
     GroupDef *gd=groupList->first();
@@ -676,12 +662,15 @@ void GroupDef::writeDocumentation(OutputList &ol)
     }
     ol.endMemberList();
   }
+}
 
+void GroupDef::writeDirs(OutputList &ol,const QCString &title)
+{
   // write list of directories
   if (dirList->count()>0)
   {
     ol.startMemberHeader();
-    ol.parseText(theTranslator->trDirectories());
+    ol.parseText(title);
     ol.endMemberHeader();
     ol.startMemberList();
     DirDef *dd=dirList->first();
@@ -708,46 +697,16 @@ void GroupDef::writeDocumentation(OutputList &ol)
 
     ol.endMemberList();
   }
-  
-  // write list of classes
-  classSDict->writeDeclaration(ol);
-
-  // write list of members
-  if (allMemberList->count()>0)
-  {
-    /* write user defined member groups */
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
-    {
-      mg->writeDeclarations(ol,0,0,0,this);
-    }
-
-    writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
-    writeMemberDeclarations(ol,MemberList::decProtoMembers,theTranslator->trFuncProtos());
-    writeMemberDeclarations(ol,MemberList::decTypedefMembers,theTranslator->trTypedefs());
-    writeMemberDeclarations(ol,MemberList::decEnumMembers,theTranslator->trEnumerations());
-    writeMemberDeclarations(ol,MemberList::decEnumValMembers,theTranslator->trEnumerationValues());
-    writeMemberDeclarations(ol,MemberList::decFuncMembers,
-                 fortranOpt ? theTranslator->trSubprograms()  : 
-                 vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
-                              theTranslator->trFunctions());
-    writeMemberDeclarations(ol,MemberList::decVarMembers,theTranslator->trVariables());
-    writeMemberDeclarations(ol,MemberList::decSignalMembers,theTranslator->trSignals());
-    writeMemberDeclarations(ol,MemberList::decPubSlotMembers,theTranslator->trPublicSlots());
-    writeMemberDeclarations(ol,MemberList::decProSlotMembers,theTranslator->trProtectedSlots());
-    writeMemberDeclarations(ol,MemberList::decPriSlotMembers,theTranslator->trPrivateSlots());
-    writeMemberDeclarations(ol,MemberList::decEventMembers,theTranslator->trEvents());
-    writeMemberDeclarations(ol,MemberList::decPropMembers,theTranslator->trProperties());
-    writeMemberDeclarations(ol,MemberList::decFriendMembers,theTranslator->trFriends());
-  }
-  ol.endMemberSections();
+}
 
-  if (!Config_getBool("DETAILS_AT_TOP"))
-  {
-    writeDetailedDocumentation(ol);
-  }
+void GroupDef::writeClasses(OutputList &ol,const QCString &title)
+{
+  // write list of classes
+  classSDict->writeDeclaration(ol,0,title,FALSE);
+}
 
+void GroupDef::writePageDocumentation(OutputList &ol)
+{
   PageDef *pd=0;
   PageSDict::Iterator pdi(*pageDict);
   for (pdi.toFirst();(pd=pdi.current());++pdi)
@@ -774,36 +733,258 @@ void GroupDef::writeDocumentation(OutputList &ol)
       ol.endTextBlock();
     }
   }
+}
 
-  writeMemberDocumentation(ol);
-
-  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+void GroupDef::writeMemberGroups(OutputList &ol)
+{
+  /* write user defined member groups */
+  if (memberGroupSDict)
   {
-    writeDocAnchorsToTagFile();
-    Doxygen::tagFile << "  </compound>" << endl;
+    /* write user defined member groups */
+    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      mg->writeDeclarations(ol,0,0,0,this);
+    }
   }
+}
 
-  endFile(ol); 
-  ol.popGeneratorState();
+void GroupDef::startMemberDeclarations(OutputList &ol)
+{
+  ol.startMemberSections();
+}
+
+void GroupDef::endMemberDeclarations(OutputList &ol)
+{
+  ol.endMemberSections();
+}
 
+void GroupDef::startMemberDocumentation(OutputList &ol)
+{
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
-    allMemberList->sort();
-    writeMemberPages(ol);
+    ol.disable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = TRUE;
   }
-
 }
 
-void GroupDef::writeMemberDocumentation(OutputList &ol)
+void GroupDef::endMemberDocumentation(OutputList &ol)
 {
-  bool  fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
-    ol.disable(OutputGenerator::Html);
+    ol.enable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = FALSE;
+  }
+}
+
+void GroupDef::writeAuthorSection(OutputList &ol)
+{
+  // write Author section (Man only)
+  ol.pushGeneratorState();
+  ol.disableAllBut(OutputGenerator::Man);
+  ol.startGroupHeader();
+  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+  ol.endGroupHeader();
+  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+  ol.popGeneratorState();
+}
+
+void GroupDef::writeDocumentation(OutputList &ol)
+{
+  ol.pushGeneratorState();
+  startFile(ol,getOutputFileBase(),name(),title);
+  startTitle(ol,getOutputFileBase());
+  ol.parseText(title);
+  addGroupListToTitle(ol,this);
+  endTitle(ol,getOutputFileBase(),title);
+
+  if (Config_getBool("SEARCHENGINE"))
+  {
+    Doxygen::searchIndex->setCurrentDoc(title,getOutputFileBase());
+    static QRegExp we("[a-zA-Z_][a-zA-Z_0-9]*");
+    int i=0,p=0,l=0;
+    while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
+    {
+      Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
+      p=i+l;
+    }
+  }
+
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+  {
+    Doxygen::tagFile << "  <compound kind=\"group\">" << endl;
+    Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
+    Doxygen::tagFile << "    <title>" << convertToXML(title) << "</title>" << endl;
+    Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
   }
   
+
+  //---------------------------------------- start flexible part -------------------------------
+
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT // new flexible layout
+
+  QListIterator<LayoutDocEntry> eli(
+      LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
+  LayoutDocEntry *lde;
+  for (eli.toFirst();(lde=eli.current());++eli)
+  {
+    switch (lde->kind())
+    {
+      case LayoutDocEntry::BriefDesc: 
+        writeBriefDescription(ol);
+        break; 
+      case LayoutDocEntry::MemberDeclStart: 
+        startMemberDeclarations(ol);
+        break; 
+      case LayoutDocEntry::GroupClasses: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeClasses(ol,ls->title);
+        }
+        break; 
+      case LayoutDocEntry::GroupNamespaces: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNamespaces(ol,ls->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberGroups: 
+        writeMemberGroups(ol);
+        break; 
+      case LayoutDocEntry::MemberDecl: 
+        {
+          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+          writeMemberDeclarations(ol,lmd->type,lmd->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberDeclEnd: 
+        endMemberDeclarations(ol);
+        break;
+      case LayoutDocEntry::DetailedDesc: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDetailedDescription(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::MemberDefStart: 
+        startMemberDocumentation(ol);
+        break; 
+      case LayoutDocEntry::MemberDef: 
+        {
+          LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+          writeMemberDocumentation(ol,lmd->type,lmd->title);
+        }
+        break;
+      case LayoutDocEntry::MemberDefEnd: 
+        endMemberDocumentation(ol);
+        break;
+      case LayoutDocEntry::GroupNestedGroups: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNestedGroups(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::GroupPageDocs: 
+        writePageDocumentation(ol);
+        break;
+      case LayoutDocEntry::GroupDirs: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDirs(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::GroupFiles: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeFiles(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::GroupGraph: 
+        writeGroupGraph(ol);
+        break;
+      case LayoutDocEntry::AuthorSection: 
+        writeAuthorSection(ol);
+        break;
+      case LayoutDocEntry::ClassIncludes:
+      case LayoutDocEntry::ClassInheritanceGraph:
+      case LayoutDocEntry::ClassNestedClasses:
+      case LayoutDocEntry::ClassCollaborationGraph:
+      case LayoutDocEntry::ClassAllMembersLink:
+      case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::NamespaceNestedNamespaces:
+      case LayoutDocEntry::NamespaceClasses:
+      case LayoutDocEntry::FileClasses:
+      case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileIncludes:
+      case LayoutDocEntry::FileIncludeGraph:
+      case LayoutDocEntry::FileIncludedByGraph: 
+      case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::DirSubDirs:
+      case LayoutDocEntry::DirFiles:
+      case LayoutDocEntry::DirGraph:
+        err("Internal inconsistency: member %d should not be part of "
+            "LayoutDocManager::Group entry list\n",lde->kind());
+        break;
+    }
+  }
+
+#else
+
+  bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");  
+  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
+
+
+  if (Config_getBool("DETAILS_AT_TOP"))
+  {
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
+  }
+  else
+  {
+    writeBriefDescription(ol);
+  }
+
+  writeGroupGraph(ol);
+
+  startMemberDeclarations(ol);
+
+  writeFiles(ol);
+  writeNamespaces(ol);
+  writeNestedGroups(ol);
+  writeDirs(ol);
+  writeClasses(ol);
+  writeMemberGroups(ol);
+
+  writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
+  writeMemberDeclarations(ol,MemberList::decTypedefMembers,theTranslator->trTypedefs());
+  writeMemberDeclarations(ol,MemberList::decEnumMembers,theTranslator->trEnumerations());
+  writeMemberDeclarations(ol,MemberList::decEnumValMembers,theTranslator->trEnumerationValues());
+  writeMemberDeclarations(ol,MemberList::decFuncMembers,
+      fortranOpt ? theTranslator->trSubprograms()  : 
+      vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
+      theTranslator->trFunctions());
+  writeMemberDeclarations(ol,MemberList::decVarMembers,theTranslator->trVariables());
+  writeMemberDeclarations(ol,MemberList::decSignalMembers,theTranslator->trSignals());
+  writeMemberDeclarations(ol,MemberList::decPubSlotMembers,theTranslator->trPublicSlots());
+  writeMemberDeclarations(ol,MemberList::decProSlotMembers,theTranslator->trProtectedSlots());
+  writeMemberDeclarations(ol,MemberList::decPriSlotMembers,theTranslator->trPrivateSlots());
+  writeMemberDeclarations(ol,MemberList::decEventMembers,theTranslator->trEvents());
+  writeMemberDeclarations(ol,MemberList::decPropMembers,theTranslator->trProperties());
+  writeMemberDeclarations(ol,MemberList::decFriendMembers,theTranslator->trFriends());
+
+  endMemberDeclarations(ol);
+
+  if (!Config_getBool("DETAILS_AT_TOP"))
+  {
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
+  }
+
+  startMemberDocumentation(ol);
+  
+  writePageDocumentation(ol);
+
   writeMemberDocumentation(ol,MemberList::docDefineMembers,theTranslator->trDefineDocumentation());
-  writeMemberDocumentation(ol,MemberList::docProtoMembers,theTranslator->trFunctionPrototypeDocumentation());
   writeMemberDocumentation(ol,MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation());
   writeMemberDocumentation(ol,MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
   writeMemberDocumentation(ol,MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
@@ -817,10 +998,27 @@ void GroupDef::writeMemberDocumentation(OutputList &ol)
   writeMemberDocumentation(ol,MemberList::docPropMembers,theTranslator->trProperties());  // todo: add trPropertyDocumentation()
   writeMemberDocumentation(ol,MemberList::docFriendMembers,theTranslator->trFriends());   // todo: add trFriendDocumentation()
 
+  endMemberDocumentation(ol);
+
+#endif
+
+  //---------------------------------------- end flexible part -------------------------------
+
+  endFile(ol); 
+  ol.popGeneratorState();
+
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
+  {
+    writeDocAnchorsToTagFile();
+    Doxygen::tagFile << "  </compound>" << endl;
+  }
+
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
-    ol.enable(OutputGenerator::Html);
+    allMemberList->sort();
+    writeMemberPages(ol);
   }
+
 }
 
 void GroupDef::writeMemberPages(OutputList &ol)
diff --git a/src/groupdef.h b/src/groupdef.h
index 06eb035..0b6278e 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -62,9 +62,7 @@ class GroupDef : public Definition
     bool insertMember(MemberDef *def,bool docOnly=FALSE);
     void removeMember(MemberDef *md);
     bool containsGroup(const GroupDef *def);    // true if def is already a subgroup
-    void writeDetailedDocumentation(OutputList &ol);
     void writeDocumentation(OutputList &ol);
-    void writeMemberDocumentation(OutputList &ol);
     void writeMemberPages(OutputList &ol);
     void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
     int countMembers() const;
@@ -116,6 +114,21 @@ class GroupDef : public Definition
     void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
     void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
     void removeMemberFromList(MemberList::ListType lt,MemberDef *md);
+    void writeGroupGraph(OutputList &ol);
+    void writeFiles(OutputList &ol,const QCString &title);
+    void writeNamespaces(OutputList &ol,const QCString &title);
+    void writeNestedGroups(OutputList &ol,const QCString &title);
+    void writeDirs(OutputList &ol,const QCString &title);
+    void writeClasses(OutputList &ol,const QCString &title);
+    void writePageDocumentation(OutputList &ol);
+    void writeDetailedDescription(OutputList &ol,const QCString &title);
+    void writeBriefDescription(OutputList &ol);
+    void writeMemberGroups(OutputList &ol);
+    void startMemberDeclarations(OutputList &ol);
+    void endMemberDeclarations(OutputList &ol);
+    void startMemberDocumentation(OutputList &ol);
+    void endMemberDocumentation(OutputList &ol);
+    void writeAuthorSection(OutputList &ol);
 
     QCString title;                      // title of the group
     bool titleSet;                       // true if title is not the same as the name
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 71f237d..bcc462c 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -37,6 +37,7 @@
 #include "debug.h"
 #include "dirdef.h"
 #include "vhdldocgen.h"
+#include "layout.h"
 
 // #define GROUP_COLOR "#ff8080"
 
@@ -1731,6 +1732,178 @@ static QCString fixSpaces(const QCString &s)
   return substitute(s," ","&nbsp;");
 }
 
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT
+
+static bool quickLinkVisible(LayoutNavEntry::Kind kind)
+{
+  switch (kind)
+  {
+    case LayoutNavEntry::MainPage:         return TRUE; 
+    case LayoutNavEntry::Pages:            return indexedPages>0;
+    case LayoutNavEntry::Modules:          return documentedGroups>0;
+    case LayoutNavEntry::Namespaces:       return documentedNamespaces>0;
+    case LayoutNavEntry::NamespaceMembers: return documentedNamespaceMembers[NMHL_All]>0;
+    case LayoutNavEntry::Classes:          return annotatedClasses>0;
+    case LayoutNavEntry::ClassAnnotated:   return annotatedClasses>0; 
+    case LayoutNavEntry::ClassHierarchy:   return hierarchyClasses>0;
+    case LayoutNavEntry::ClassMembers:     return documentedClassMembers[CMHL_All]>0;
+    case LayoutNavEntry::Files:            return documentedHtmlFiles>0;
+    case LayoutNavEntry::FileGlobals:      return documentedFileMembers[FMHL_All]>0;
+    case LayoutNavEntry::Dirs:             return documentedDirs>0;
+    case LayoutNavEntry::Examples:         return Doxygen::exampleSDict->count()>0;
+  }
+  return FALSE;
+}
+
+static void renderQuickLinksAsTree(QTextStream &t,const QCString &relPath,LayoutNavEntry *root)
+
+{
+  QListIterator<LayoutNavEntry> li(root->children());
+  LayoutNavEntry *entry;
+  int count=0;
+  for (li.toFirst();(entry=li.current());++li)
+  {
+    if (entry->visible() && quickLinkVisible(entry->kind())) count++;
+  }
+  if (count>0) // at least one item is visible
+  {
+    startQuickIndexList(t,FALSE);
+    for (li.toFirst();(entry=li.current());++li)
+    {
+      if (entry->visible() && quickLinkVisible(entry->kind()))
+      {
+        startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
+                            FALSE,FALSE,relPath);
+        t << fixSpaces(entry->title());
+        endQuickIndexItem(t);
+        // recursive into child list
+        renderQuickLinksAsTree(t,relPath,entry);
+      }
+    }
+    endQuickIndexList(t,FALSE);
+  }
+}
+
+
+static void renderQuickLinksAsTabs(QTextStream &t,const QCString &relPath,
+                             LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind,
+                             bool highlightParent,bool highlightSearch)
+{
+  if (hlEntry->parent()) // first draw the tabs for the parent of hlEntry
+  {
+    renderQuickLinksAsTabs(t,relPath,hlEntry->parent(),kind,highlightParent,highlightSearch);
+  }
+  if (hlEntry->parent() && hlEntry->parent()->children().count()>0) // draw tabs for row containing hlEntry
+  {
+    QListIterator<LayoutNavEntry> li(hlEntry->parent()->children());
+    LayoutNavEntry *entry;
+
+    int count=0;
+    for (li.toFirst();(entry=li.current());++li)
+    {
+      if (entry->visible() && quickLinkVisible(entry->kind())) count++;
+    }
+    if (count>0) // at least one item is visible
+    {
+      startQuickIndexList(t,TRUE);
+      for (li.toFirst();(entry=li.current());++li)
+      {
+        if (entry->visible() && quickLinkVisible(entry->kind()))
+        {
+          startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
+              entry==hlEntry  && (entry->children().count()>0 || (entry->kind()==kind && !highlightParent)),
+              TRUE,relPath);
+          t << fixSpaces(entry->title());
+          endQuickIndexItem(t);
+        }
+      }
+      if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry())
+      {
+        // last item of the top row -> special case for search engine
+        if (Config_getBool("SEARCHENGINE"))
+        {
+          QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
+          if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
+          t << "    <li>\n";
+          t << "      <form action=\"" << relPath << "search.php\" method=\"get\">\n";
+          t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
+          t << "          <tr>\n";
+          t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
+          if (!highlightSearch)
+          {
+            t << "            <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
+            t << "          </tr>\n";
+            t << "        </table>\n";
+            t << "      </form>\n";
+            t << "    </li>\n";
+          }
+        } 
+        if (!highlightSearch) // on the search page the page will be ended by the
+                              // page itself
+        {
+          endQuickIndexList(t,TRUE);
+        }
+      }
+      else // normal case
+      {
+        endQuickIndexList(t,TRUE);
+      }
+    }
+  }
+}
+
+static void writeDefaultQuickLinks(QTextStream &t,bool compact,
+                                   HighlightedItem hli,const QCString &relPath)
+{
+  LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry();
+  LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1;
+  bool highlightParent=FALSE;
+  switch (hli) // map HLI enums to LayoutNavEntry::Kind enums
+  {
+    case HLI_Main:             kind = LayoutNavEntry::MainPage;         break;
+    case HLI_Modules:          kind = LayoutNavEntry::Modules;          break;
+    case HLI_Directories:      kind = LayoutNavEntry::Dirs;             break;
+    case HLI_Namespaces:       kind = LayoutNavEntry::Namespaces;       break;
+    case HLI_Hierarchy:        kind = LayoutNavEntry::ClassHierarchy;   break;
+    case HLI_Classes:          kind = LayoutNavEntry::Classes;          break;
+    case HLI_Annotated:        kind = LayoutNavEntry::ClassAnnotated;   break;
+    case HLI_Files:            kind = LayoutNavEntry::Files;            break;
+    case HLI_NamespaceMembers: kind = LayoutNavEntry::NamespaceMembers; break;
+    case HLI_Functions:        kind = LayoutNavEntry::ClassMembers;     break;
+    case HLI_Globals:          kind = LayoutNavEntry::FileGlobals;      break;
+    case HLI_Pages:            kind = LayoutNavEntry::Pages;            break;
+    case HLI_Examples:         kind = LayoutNavEntry::Examples;         break;
+    case HLI_ClassVisible:     kind = LayoutNavEntry::Classes;    highlightParent = TRUE; break;
+    case HLI_NamespaceVisible: kind = LayoutNavEntry::Namespaces; highlightParent = TRUE; break;
+    case HLI_FileVisible:      kind = LayoutNavEntry::Files;      highlightParent = TRUE; break;
+    case HLI_None:   break;
+    case HLI_Search: break;
+  }
+  
+  if (compact)
+  {
+    // find highlighted index item
+    LayoutNavEntry *hlEntry = root->find(kind);
+    if (!hlEntry) // highlighted item not found in the index! -> just show the level 1 index...
+    {
+      highlightParent=TRUE;
+      hlEntry = root->children().getFirst();
+      if (hlEntry==0) 
+      {
+        return; // argl, empty index!
+      }
+    }
+    renderQuickLinksAsTabs(t,relPath,hlEntry,kind,highlightParent,hli==HLI_Search);
+  }
+  else
+  {
+    renderQuickLinksAsTree(t,relPath,root);
+  }
+}
+
+#else // old fixed layout
+
 static void writeNamespaceSubIndex(QTextStream &t,bool compact,
                                   HighlightedItem hli,const QCString &relPath
                                  )
@@ -1957,7 +2130,6 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,
     }
   }
 
-
   // -------------- File
 
   if (documentedHtmlFiles>0)
@@ -2047,6 +2219,7 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,
   }
   
 }
+#endif
 
 void HtmlGenerator::startQuickIndices()
 {
diff --git a/src/language.cpp b/src/language.cpp
index e1bd947..a56ed44 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -220,7 +220,7 @@ bool setTranslator(const char *langName)
 #ifdef LANG_FI
   else if (L_EQUAL("finnish"))
   {
-    theTranslator=new TranslatorDecoder(new TranslatorFinnish);
+    theTranslator=new TranslatorFinnish;
   }
 #endif
 #ifdef LANG_RU
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
index 0516e37..a1baa95 100644
--- a/src/latexdocvisitor.cpp
+++ b/src/latexdocvisitor.cpp
@@ -26,6 +26,7 @@
 #include "message.h"
 #include "parserintf.h"
 #include "msc.h"
+#include "htmlattrib.h"
 
 static QString escapeLabelName(const char *s)
 {
@@ -57,6 +58,21 @@ static const char *getSectionName(int level)
   return secLabels[QMIN(maxLevels-1,l)];
 }
 
+static int rowspan(DocHtmlCell *cell)
+{
+  int retval = 0;
+  HtmlAttribList attrs = cell->attribs ();
+  for (unsigned int i = 0; i < attrs.count(); ++i) 
+  {
+    if ("rowspan" == attrs.at(i)->name.lower())
+    {
+      retval = attrs.at(i)->value.toInt();
+      break;
+    }
+  }
+  return retval;
+}
+
 QString LatexDocVisitor::escapeMakeIndexChars(const char *s)
 {
   QString result;
@@ -84,7 +100,7 @@ LatexDocVisitor::LatexDocVisitor(QTextStream &t,CodeOutputInterface &ci,
                                  const char *langExt,bool insideTabbing) 
   : DocVisitor(DocVisitor_Latex), m_t(t), m_ci(ci), m_insidePre(FALSE), 
     m_insideItem(FALSE), m_hide(FALSE), m_insideTabbing(insideTabbing),
-    m_langExt(langExt)
+    m_langExt(langExt), m_currentColumn(0), m_inRowspan(FALSE)
 {
 }
 
@@ -672,6 +688,7 @@ void LatexDocVisitor::visitPost(DocHtmlDescData *)
 
 void LatexDocVisitor::visitPre(DocHtmlTable *t)
 {
+  m_rowspanIndices.clear();
   if (m_hide) return;
   if (t->hasCaption()) 
   {
@@ -707,21 +724,65 @@ void LatexDocVisitor::visitPost(DocHtmlCaption *)
 
 void LatexDocVisitor::visitPre(DocHtmlRow *)
 {
+  m_currentColumn = 0;
 }
 
 void LatexDocVisitor::visitPost(DocHtmlRow *) 
 {
   if (m_hide) return;
-  m_t << "\\\\\\hline\n";
+
+  m_t << "\\\\";
+  
+  QMap<int, int>::Iterator it;
+  int col = 1;
+    for (it = m_rowspanIndices.begin(); it != m_rowspanIndices.end(); ++it) 
+  {
+    it.data()--;
+    if (it.data () <= 0)
+      m_rowspanIndices.remove (it);
+    else if (0 < it.data() - col)
+      m_t << "\\cline{" << col << "-" << it.data() - col << "}";
+      
+    col = 1 + it.data ();
+    }
+
+  if (col <= m_currentColumn)
+    m_t << "\\cline{" << col << "-" << m_currentColumn << "}";
+
+  m_t << "\n";
 }
 
-void LatexDocVisitor::visitPre(DocHtmlCell *)
+void LatexDocVisitor::visitPre(DocHtmlCell *cell)
 {
+  if (m_hide) return;
+  
+  m_currentColumn++;
+  //Skip columns that span from above.
+  QMap<int, int>::Iterator it = m_rowspanIndices.find(m_currentColumn);
+  while (0 < it.data() && it != m_rowspanIndices.end())
+  {
+    m_t << "&";
+    m_currentColumn++;
+    it++;
+  }
+
+  int rs = rowspan(cell);
+  if (0 < rs)
+  {
+    m_inRowspan = TRUE;
+    m_rowspanIndices[m_currentColumn] = rs;
+    m_t << "\\multirow{" << rs << "}{\\linewidth}{";
+  }
 }
 
 void LatexDocVisitor::visitPost(DocHtmlCell *c) 
 {
   if (m_hide) return;
+  if (m_inRowspan)
+  {
+    m_inRowspan = FALSE;
+    m_t << "}";
+  }
   if (!c->isLast()) m_t << "&";
 }
 
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
index 413ea68..1f8f2a9 100644
--- a/src/latexdocvisitor.h
+++ b/src/latexdocvisitor.h
@@ -22,6 +22,7 @@
 #include "docvisitor.h"
 #include <qstack.h>
 #include <qcstring.h>
+#include <qmap.h>
 
 class QTextStream;
 class CodeOutputInterface;
@@ -160,6 +161,9 @@ class LatexDocVisitor : public DocVisitor
     bool m_insideTabbing;
     QStack<bool> m_enabled;
     QCString m_langExt;
+	QMap<int, int> m_rowspanIndices;
+	int m_currentColumn;
+	bool m_inRowspan;
 };
 
 #endif
diff --git a/src/layout.cpp b/src/layout.cpp
new file mode 100644
index 0000000..3a9949c
--- /dev/null
+++ b/src/layout.cpp
@@ -0,0 +1,1121 @@
+/******************************************************************************
+ *
+ * 
+ *
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "layout.h"
+#include "message.h"
+#include "language.h"
+#include "vhdldocgen.h"
+#include "util.h"
+
+#include <qxml.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qfileinfo.h>
+#include <qtextstream.h>
+
+static const char layout_default[] =
+#include "layout_default.h"
+;
+
+//---------------------------------------------------------------------------------
+
+LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const
+{
+  LayoutNavEntry *result=0;
+  QListIterator<LayoutNavEntry> li(m_children);
+  LayoutNavEntry *entry;
+  for (li.toFirst();(entry=li.current());++li)
+  {
+    // depth first search, needed to find the entry furthest from the 
+    // root in case an entry is in the tree twice
+    result = entry->find(kind);
+    if (result) return result;
+    if (entry->kind()==kind)
+    {
+      return entry;
+    }
+  }
+  return result;
+}
+
+//---------------------------------------------------------------------------------
+
+class LayoutParser : public QXmlDefaultHandler
+{
+  private:
+    class StartElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib); 
+      public:
+        StartElementHandler(LayoutParser *parent, Handler h) 
+          : m_parent(parent), m_handler(h) {}
+        virtual ~StartElementHandler() {}
+        virtual void operator()(const QXmlAttributes &attrib) 
+        { 
+          (m_parent->*m_handler)(attrib); 
+        }
+      protected:
+        StartElementHandler() : m_parent(0), m_handler(0) {}
+      private:
+        LayoutParser *m_parent;
+        Handler m_handler;
+    };
+
+    class StartElementHandlerKind : public StartElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
+                                              const QXmlAttributes &attrib); 
+      public:
+        StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h) 
+          : m_parent(parent), m_kind(k), m_handler(h) {}
+        void operator()(const QXmlAttributes &attrib) 
+        { 
+          (m_parent->*m_handler)(m_kind,attrib); 
+        }
+      private:
+        LayoutParser *m_parent;
+        LayoutDocEntry::Kind m_kind;
+        Handler m_handler;
+    };
+
+    class StartElementHandlerSection : public StartElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
+                                              const QXmlAttributes &attrib,
+                                              const QCString &title); 
+      public:
+        StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h,
+                                const QCString &title) 
+          : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {}
+        void operator()(const QXmlAttributes &attrib) 
+        { 
+          (m_parent->*m_handler)(m_kind,attrib,m_title); 
+        }
+      private:
+        LayoutParser *m_parent;
+        LayoutDocEntry::Kind m_kind;
+        Handler m_handler;
+        QCString m_title;
+    };
+
+    class StartElementHandlerMember : public StartElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib,
+                                              MemberList::ListType type,
+                                              const QCString &title,
+                                              const QCString &subtitle); 
+      public:
+        StartElementHandlerMember(LayoutParser *parent, 
+                                  Handler h,
+                                  MemberList::ListType type,
+                                  const QCString &tl,
+                                  const QCString &ss = QCString()
+                                 ) 
+          : m_parent(parent), m_handler(h), m_type(type),
+            m_title(tl), m_subscript(ss) {}
+        void operator()(const QXmlAttributes &attrib) 
+        { 
+          (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript); 
+        }
+      private:
+        LayoutParser *m_parent;
+        Handler m_handler;
+        MemberList::ListType m_type;
+        QCString m_title;
+        QCString m_subscript;
+    };
+
+    class StartElementHandlerNavEntry : public StartElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind,
+                                              const QXmlAttributes &attrib,
+                                              const QCString &title); 
+      public:
+        StartElementHandlerNavEntry(LayoutParser *parent,
+                               LayoutNavEntry::Kind kind, 
+                               Handler h,
+                               const QCString &tl
+                              ) 
+          : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {}
+        void operator()(const QXmlAttributes &attrib) 
+        { 
+          (m_parent->*m_handler)(m_kind,attrib,m_title); 
+        }
+      private:
+        LayoutParser *m_parent;
+        LayoutNavEntry::Kind m_kind;
+        Handler m_handler;
+        QCString m_title;
+    };
+
+    class EndElementHandler
+    {
+        typedef void (LayoutParser::*Handler)(); 
+      public:
+        EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
+        void operator()() { (m_parent->*m_handler)(); }
+      private:
+        LayoutParser *m_parent;
+        Handler m_handler;
+    };
+
+
+  public:
+    static LayoutParser &instance()
+    {
+      static LayoutParser *theInstance = new LayoutParser;
+      return *theInstance;
+    }
+    void init()
+    {
+      m_sHandler.setAutoDelete(TRUE);
+      m_eHandler.setAutoDelete(TRUE);
+      m_part = -1; // invalid
+      m_rootNav = 0;
+
+      bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+      bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
+      bool javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+
+      // start & end handlers
+      m_sHandler.insert("doxygenlayout", 
+          new StartElementHandler(this,&LayoutParser::startLayout));
+      m_eHandler.insert("doxygenlayout", 
+          new EndElementHandler(this,&LayoutParser::endLayout));
+
+      // class layout handlers
+      m_sHandler.insert("navindex", 
+          new StartElementHandler(this,&LayoutParser::startNavIndex));
+      m_sHandler.insert("navindex/tab", 
+          new StartElementHandler(this,&LayoutParser::startNavEntry));
+      m_eHandler.insert("navindex/tab", 
+          new EndElementHandler(this,&LayoutParser::endNavEntry));
+      m_eHandler.insert("navindex", 
+          new EndElementHandler(this,&LayoutParser::endNavIndex));
+
+      // class layout handlers
+      m_sHandler.insert("class", 
+          new StartElementHandler(this,&LayoutParser::startClass));
+      m_sHandler.insert("class/briefdescription", 
+          new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/detaileddescription", 
+          new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDetailedDescription()));
+      m_sHandler.insert("class/authorsection", 
+          new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/includes", 
+          new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/inheritancegraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/collaborationgraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/allmemberslink", 
+          new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/usedfiles", 
+          new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/memberdecl", 
+          new StartElementHandler(this,&LayoutParser::startMemberDecl));
+      m_sHandler.insert("class/memberdecl/membergroups", 
+          new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("class/memberdecl/nestedclasses", 
+          new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry,
+                                         vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+                                         fortranOpt ? theTranslator->trDataTypes() :
+                                         theTranslator->trCompounds() 
+                                         ));
+      m_sHandler.insert("class/memberdecl/publictypes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubTypes,theTranslator->trPublicTypes()));
+      m_sHandler.insert("class/memberdecl/publicslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubSlots,theTranslator->trPublicSlots())); 
+      m_sHandler.insert("class/memberdecl/signals", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::signals,theTranslator->trSignals())); 
+      m_sHandler.insert("class/memberdecl/publicmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubMethods,theTranslator->trPublicMembers())); 
+      m_sHandler.insert("class/memberdecl/publicstaticmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers())); 
+      m_sHandler.insert("class/memberdecl/publicattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubAttribs,theTranslator->trPublicAttribs())); 
+      m_sHandler.insert("class/memberdecl/publicstaticattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs())); 
+      m_sHandler.insert("class/memberdecl/protectedtypes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proTypes,theTranslator->trProtectedTypes())); 
+      m_sHandler.insert("class/memberdecl/protectedslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proSlots,theTranslator->trProtectedSlots())); 
+      m_sHandler.insert("class/memberdecl/protectedmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proMethods,theTranslator->trProtectedMembers())); 
+      m_sHandler.insert("class/memberdecl/protectedstaticmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers()));
+      m_sHandler.insert("class/memberdecl/protectedattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proAttribs,theTranslator->trProtectedAttribs())); 
+      m_sHandler.insert("class/memberdecl/protectedstaticattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs())); 
+      m_sHandler.insert("class/memberdecl/packagetypes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pacTypes,theTranslator->trPackageTypes())); 
+      m_sHandler.insert("class/memberdecl/packagemethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pacMethods,theTranslator->trPackageMembers())); 
+      m_sHandler.insert("class/memberdecl/packagestaticmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers())); 
+      m_sHandler.insert("class/memberdecl/packageattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pacAttribs,theTranslator->trPackageAttribs())); 
+      m_sHandler.insert("class/memberdecl/packagestaticattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs())); 
+      m_sHandler.insert("class/memberdecl/properties", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::properties,theTranslator->trProperties())); 
+      m_sHandler.insert("class/memberdecl/events", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::events,theTranslator->trEvents())); 
+      m_sHandler.insert("class/memberdecl/privatetypes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priTypes,theTranslator->trPrivateTypes())); 
+      m_sHandler.insert("class/memberdecl/privateslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priSlots,theTranslator->trPrivateSlots())); 
+      m_sHandler.insert("class/memberdecl/privatemethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priMethods,theTranslator->trPrivateMembers())); 
+      m_sHandler.insert("class/memberdecl/privatestaticmethods", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers())); 
+      m_sHandler.insert("class/memberdecl/privateattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priAttribs,theTranslator->trPrivateAttribs())); 
+      m_sHandler.insert("class/memberdecl/privatestaticattributes", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs())); 
+      m_sHandler.insert("class/memberdecl/friends", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::friends,theTranslator->trFriends()));
+      m_sHandler.insert("class/memberdecl/related", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::related,theTranslator->trRelatedFunctions(),
+                                        theTranslator->trRelatedSubscript())); 
+      m_eHandler.insert("class/memberdecl", 
+          new EndElementHandler(this,&LayoutParser::endMemberDecl));
+      m_sHandler.insert("class/memberdef", 
+          new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("class/memberdef/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation()));
+      m_sHandler.insert("class/memberdef/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation()));
+      m_sHandler.insert("class/memberdef/constructors", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::constructors,theTranslator->trConstructorDocumentation()));
+      m_sHandler.insert("class/memberdef/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::functionMembers,
+                                        fortranOpt ?
+                                        theTranslator->trMemberFunctionDocumentationFortran() :
+                                        theTranslator->trMemberFunctionDocumentation()));
+      m_sHandler.insert("class/memberdef/related", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation()));
+      m_sHandler.insert("class/memberdef/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::variableMembers,theTranslator->trMemberDataDocumentation()));
+      m_sHandler.insert("class/memberdef/properties", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::propertyMembers,theTranslator->trPropertyDocumentation()));
+      m_sHandler.insert("class/memberdef/events", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::eventMembers,theTranslator->trEventDocumentation()));
+      m_eHandler.insert("class/memberdef", 
+          new EndElementHandler(this,&LayoutParser::endMemberDef));
+      m_eHandler.insert("class", 
+          new EndElementHandler(this,&LayoutParser::endClass));
+
+
+      // namespace layout handlers
+      m_sHandler.insert("namespace", 
+          new StartElementHandler(this,&LayoutParser::startNamespace));
+      m_sHandler.insert("namespace/briefdescription", 
+          new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("namespace/detaileddescription", 
+          new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDetailedDescription()));
+      m_sHandler.insert("namespace/authorsection", 
+          new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("namespace/memberdecl", 
+          new StartElementHandler(this,&LayoutParser::startMemberDecl));
+      m_sHandler.insert("namespace/memberdecl/nestednamespaces", 
+          new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
+                                         javaOpt ? theTranslator->trPackages() :
+                                         fortranOpt ? theTranslator->trModules() :
+                                         theTranslator->trNamespaces()
+                                         ));
+      m_sHandler.insert("namespace/memberdecl/classes", 
+          new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
+                                         vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+                                         fortranOpt ? theTranslator->trDataTypes() :
+                                         theTranslator->trCompounds() 
+                                         ));
+      m_sHandler.insert("namespace/memberdecl/membergroups", 
+          new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("namespace/memberdecl/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+      m_sHandler.insert("namespace/memberdecl/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decEnumMembers,theTranslator->trEnumerations()));
+      m_sHandler.insert("namespace/memberdecl/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decFuncMembers,
+                                        fortranOpt ? theTranslator->trSubprograms()  : 
+                                        vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
+                                        theTranslator->trFunctions()));
+      m_sHandler.insert("namespace/memberdecl/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decVarMembers,theTranslator->trVariables()));
+      m_eHandler.insert("namespace/memberdecl", 
+          new EndElementHandler(this,&LayoutParser::endMemberDecl));
+      m_sHandler.insert("namespace/memberdef", 
+          new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("namespace/memberdef/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+      m_sHandler.insert("namespace/memberdef/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+      m_sHandler.insert("namespace/memberdef/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docFuncMembers,
+                                        fortranOpt ? 
+                                        theTranslator->trSubprogramDocumentation() :
+                                        theTranslator->trFunctionDocumentation()));
+      m_sHandler.insert("namespace/memberdef/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+      m_eHandler.insert("namespace/memberdef", 
+          new EndElementHandler(this,&LayoutParser::endMemberDef));
+      m_eHandler.insert("namespace", 
+          new EndElementHandler(this,&LayoutParser::endNamespace));
+
+      // file layout handlers
+      m_sHandler.insert("file", 
+          new StartElementHandler(this,&LayoutParser::startFile));
+      m_sHandler.insert("file/briefdescription", 
+          new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/detaileddescription", 
+          new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDetailedDescription()));
+      m_sHandler.insert("file/authorsection", 
+          new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/includes", 
+          new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/includegraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/includedbygraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/sourcelink", 
+          new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("file/memberdecl", 
+          new StartElementHandler(this,&LayoutParser::startMemberDecl));
+      m_sHandler.insert("file/memberdecl/classes", 
+          new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry,
+                                         vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+                                         fortranOpt ? theTranslator->trDataTypes() :
+                                         theTranslator->trCompounds() 
+                                         ));
+      m_sHandler.insert("file/memberdecl/namespaces", 
+          new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
+                                         javaOpt ? theTranslator->trPackages() :
+                                         fortranOpt ? theTranslator->trModules() :
+                                         theTranslator->trNamespaces()
+                                         ));
+      m_sHandler.insert("file/memberdecl/defines", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decDefineMembers,theTranslator->trDefines()));
+      m_sHandler.insert("file/memberdecl/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+      m_sHandler.insert("file/memberdecl/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decEnumMembers,theTranslator->trEnumerations()));
+      m_sHandler.insert("file/memberdecl/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decFuncMembers,
+                                        fortranOpt ? theTranslator->trSubprograms()  : 
+                                        vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
+                                        theTranslator->trFunctions())) ;
+      m_sHandler.insert("file/memberdecl/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decVarMembers,theTranslator->trVariables()));
+
+      m_eHandler.insert("file/memberdecl", 
+          new EndElementHandler(this,&LayoutParser::endMemberDecl));
+      m_sHandler.insert("file/memberdef", 
+          new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("file/memberdef/defines", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
+      m_sHandler.insert("file/memberdef/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+      m_sHandler.insert("file/memberdef/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+      m_sHandler.insert("file/memberdef/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docFuncMembers,theTranslator->trFunctionDocumentation()));
+      m_sHandler.insert("file/memberdef/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+      m_eHandler.insert("file/memberdef", 
+          new EndElementHandler(this,&LayoutParser::endMemberDef));
+      m_eHandler.insert("file", 
+          new EndElementHandler(this,&LayoutParser::endFile));
+
+      // group layout handlers
+      m_sHandler.insert("group", 
+          new StartElementHandler(this,&LayoutParser::startGroup));
+      m_sHandler.insert("group/briefdescription", 
+          new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("group/detaileddescription", 
+          new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDetailedDescription()));
+      m_sHandler.insert("group/authorsection", 
+          new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("group/groupgraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("group/memberdecl", 
+          new StartElementHandler(this,&LayoutParser::startMemberDecl));
+      m_sHandler.insert("group/memberdecl/classes", 
+          new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry,
+                                         vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
+                                         fortranOpt ? theTranslator->trDataTypes() :
+                                         theTranslator->trCompounds() 
+                                         ));
+      m_sHandler.insert("group/memberdecl/namespaces", 
+          new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry,
+                                         javaOpt ? theTranslator->trPackages() :
+                                         fortranOpt ? theTranslator->trModules() :
+                                         theTranslator->trNamespaces()
+                                         ));
+      m_sHandler.insert("group/memberdecl/dirs", 
+          new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDirectories()
+                                         ));
+      m_sHandler.insert("group/memberdecl/nestedgroups", 
+          new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry,
+                                         theTranslator->trModules()
+                                         ));
+      m_sHandler.insert("group/memberdecl/files", 
+          new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry,
+                                         theTranslator->trFile(TRUE,FALSE)
+                                         ));
+
+      m_sHandler.insert("group/memberdecl/defines", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decDefineMembers,theTranslator->trDefines()));
+      m_sHandler.insert("group/memberdecl/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decTypedefMembers,theTranslator->trTypedefs()));
+      m_sHandler.insert("group/memberdecl/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decEnumMembers,theTranslator->trEnumerations()));
+      m_sHandler.insert("group/memberdecl/enumvalues", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decEnumValMembers,theTranslator->trEnumerationValues()));
+      m_sHandler.insert("group/memberdecl/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decFuncMembers,
+                                            fortranOpt ? theTranslator->trSubprograms()  : 
+                                            vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
+                                            theTranslator->trFunctions()));
+      m_sHandler.insert("group/memberdecl/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decVarMembers,theTranslator->trVariables()));
+      m_sHandler.insert("group/memberdecl/signals", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decSignalMembers,theTranslator->trSignals()));
+      m_sHandler.insert("group/memberdecl/publicslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decPubSlotMembers,theTranslator->trPublicSlots()));
+      m_sHandler.insert("group/memberdecl/protectedslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decProSlotMembers,theTranslator->trProtectedSlots()));
+      m_sHandler.insert("group/memberdecl/privateslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decPriSlotMembers,theTranslator->trPrivateSlots()));
+      m_sHandler.insert("group/memberdecl/events", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decEventMembers,theTranslator->trEvents()));
+      m_sHandler.insert("group/memberdecl/properties", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decPropMembers,theTranslator->trProperties()));
+      m_sHandler.insert("group/memberdecl/friends", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
+                                        MemberList::decFriendMembers,theTranslator->trFriends()));
+      m_eHandler.insert("group/memberdecl", 
+          new EndElementHandler(this,&LayoutParser::endMemberDecl));
+      m_sHandler.insert("group/memberdef", 
+          new StartElementHandler(this,&LayoutParser::startMemberDef));
+      m_sHandler.insert("group/memberdef/pagedocs", 
+          new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("group/memberdef/defines", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
+      m_sHandler.insert("group/memberdef/typedefs", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
+      m_sHandler.insert("group/memberdef/enums", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
+      m_sHandler.insert("group/memberdef/enumvalues", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation()));
+      m_sHandler.insert("group/memberdef/functions", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docFuncMembers,
+                                        fortranOpt?
+                                        theTranslator->trSubprogramDocumentation():
+                                        theTranslator->trFunctionDocumentation()));
+      m_sHandler.insert("group/memberdef/variables", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
+      m_sHandler.insert("group/memberdef/signals", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docSignalMembers,theTranslator->trSignals())); 
+      m_sHandler.insert("group/memberdef/publicslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docPubSlotMembers,theTranslator->trPublicSlots()));
+      m_sHandler.insert("group/memberdef/protectedslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docProSlotMembers,theTranslator->trProtectedSlots()));
+      m_sHandler.insert("group/memberdef/privateslots", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docPriSlotMembers,theTranslator->trPrivateSlots()));
+      m_sHandler.insert("group/memberdef/events", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docEventMembers,theTranslator->trEvents()));
+      m_sHandler.insert("group/memberdef/properties", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docPropMembers,theTranslator->trProperties()));
+      m_sHandler.insert("group/memberdef/friends", 
+          new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
+                                        MemberList::docFriendMembers,theTranslator->trFriends()));
+      m_eHandler.insert("group/memberdef", 
+          new EndElementHandler(this,&LayoutParser::endMemberDef));
+      m_eHandler.insert("group", 
+          new EndElementHandler(this,&LayoutParser::endGroup));
+
+      // directory layout handlers
+      m_sHandler.insert("directory", 
+          new StartElementHandler(this,&LayoutParser::startDirectory));
+      m_sHandler.insert("directory/briefdescription", 
+          new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("directory/detaileddescription", 
+          new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
+                                         theTranslator->trDetailedDescription()));
+      m_sHandler.insert("directory/directorygraph", 
+          new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("directory/memberdecl", 
+          new StartElementHandler(this,&LayoutParser::startMemberDecl));
+      m_sHandler.insert("directory/memberdecl/dirs", 
+          new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry));
+      m_sHandler.insert("directory/memberdecl/files", 
+          new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry));
+      m_eHandler.insert("directory/memberdecl", 
+          new EndElementHandler(this,&LayoutParser::endMemberDecl));
+      m_eHandler.insert("directory", 
+          new EndElementHandler(this,&LayoutParser::endDirectory));
+    }
+
+    void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib)
+    {
+      QCString visible = convertToQCString(attrib.value("visible"));
+      bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+      if (m_part!=-1 && isVisible)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySimple(k));
+      }
+    }
+
+    void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib,
+                           const QCString &title)
+    {
+      QCString visible = convertToQCString(attrib.value("visible"));
+      bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+      QCString userTitle = convertToQCString(attrib.value("title"));
+      //printf("startSectionEntry: title='%s' userTitle='%s'\n",
+      //    title.data(),userTitle.data());
+      if (userTitle.isEmpty())  userTitle = title;
+      if (m_part!=-1 && isVisible)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySection(k,userTitle));
+      }
+    }
+
+
+    void startMemberDeclEntry(const QXmlAttributes &attrib,MemberList::ListType type,
+                              const QCString &title,const QCString &subscript)
+    {
+      //QCString visible = convertToQCString(attrib.value("visible"));
+      //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+      QCString userTitle     = convertToQCString(attrib.value("title"));
+      QCString userSubscript = convertToQCString(attrib.value("subtitle"));
+      if (userTitle.isEmpty())     userTitle     = title;
+      if (userSubscript.isEmpty()) userSubscript = subscript;
+      //printf("memberdecl: %s\n",userTitle.data());
+      if (m_part!=-1 /*&& isVisible*/)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntryMemberDecl(type,userTitle,userSubscript));
+      }
+    }
+
+    void startMemberDefEntry(const QXmlAttributes &attrib,MemberList::ListType type,
+                             const QCString &title,const QCString &)
+    {
+      //QCString visible = convertToQCString(attrib.value("visible"));
+      //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+      QCString userTitle = convertToQCString(attrib.value("title"));
+      if (userTitle.isEmpty()) userTitle = title;
+      //printf("memberdef: %s\n",userTitle.data());
+      if (m_part!=-1 /*&& isVisible*/)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntryMemberDef(type,userTitle));
+      }
+    }
+
+    void startLayout(const QXmlAttributes &)
+    {
+    }
+
+    void endLayout()
+    {
+    }
+
+    void startNavIndex(const QXmlAttributes &)
+    {
+      m_scope="navindex/";
+      m_rootNav = LayoutDocManager::instance().rootNavEntry();
+      m_rootNav->clear();
+    }
+
+    void endNavIndex()
+    {
+      m_scope="";
+      if (!m_rootNav->find(LayoutNavEntry::MainPage))
+      {
+        // no MainPage node... add one the first item of the root node...
+        new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, usingTreeIndex() ? "main" : "index",theTranslator->trMainPage(),TRUE);
+      }
+    }
+
+    void startNavEntry(const QXmlAttributes &attrib)
+    {
+      bool javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+      bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+      bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
+      static struct NavEntryMap
+      {
+        const char *typeStr;       // type attribute name in the XML file
+        LayoutNavEntry::Kind kind; // corresponding enum name
+        QCString mainName;         // default title for an item if it has children
+        QCString subName;          // optional name for an item if it is rendered as a child
+        QCString baseFile;         // base name of the file containing the index page
+      } mapping[] =
+      {
+        { "mainpage",         LayoutNavEntry::MainPage,         theTranslator->trMainPage(),     QCString(), usingTreeIndex() ? "main" : "index" },
+        { "pages",            LayoutNavEntry::Pages,            theTranslator->trRelatedPages(), QCString(), "pages"  },
+        { "modules",          LayoutNavEntry::Modules,          theTranslator->trModules(),      QCString(), "modules" },
+        { "namespaces",       LayoutNavEntry::Namespaces,       javaOpt    ? theTranslator->trPackages() : 
+                                                                fortranOpt ? theTranslator->trModules() : 
+                                                                theTranslator->trNamespaces(),        
+                                                                javaOpt    ? theTranslator->trPackages() :
+                                                                fortranOpt ? theTranslator->trModulesList() :
+                                                                theTranslator->trNamespaceList(), "namespaces" },
+        { "namespacemembers", LayoutNavEntry::NamespaceMembers, javaOpt    ? theTranslator->trPackageMembers() :
+                                                                fortranOpt ? theTranslator->trModulesMembers() :
+                                                                theTranslator->trNamespaceMembers(), QCString(), "namespacemembers" },
+        { "classindex",       LayoutNavEntry::Classes,          fortranOpt ? theTranslator->trDataTypes() :
+                                                                vhdlOpt    ? VhdlDocGen::trDesignUnits() :
+                                                                theTranslator->trCompoundIndex(),
+                                                                QCString(), "classes" },
+        { "classes",          LayoutNavEntry::ClassAnnotated,   fortranOpt ? theTranslator->trCompoundListFortran() :
+                                                                vhdlOpt    ? VhdlDocGen::trDesignUnitList() :
+                                                                theTranslator->trClasses(), 
+                                                                theTranslator->trCompoundList(), "annotated" },
+        { "hierarchy",        LayoutNavEntry::ClassHierarchy,   vhdlOpt    ? VhdlDocGen::trDesignUnitHierarchy() :
+                                                                theTranslator->trClassHierarchy(), QCString(), "hierarchy" },
+        { "classmembers",     LayoutNavEntry::ClassMembers,     fortranOpt ? theTranslator->trCompoundMembersFortran() :
+                                                                vhdlOpt    ? VhdlDocGen::trDesignUnitMembers() :
+                                                                theTranslator->trCompoundMembers(), QCString(), "functions" },
+        { "files",            LayoutNavEntry::Files,            theTranslator->trFile(TRUE,FALSE), 
+                                                                theTranslator->trFileList(), "files" },
+        { "globals",          LayoutNavEntry::FileGlobals,      theTranslator->trFileMembers(), QCString(), "globals" },
+        { "dirs",             LayoutNavEntry::Dirs,             theTranslator->trDirectories(), QCString(), "dirs" },
+        { "examples",         LayoutNavEntry::Examples,         theTranslator->trExamples(), QCString(), "examples" },
+        { 0,                 (LayoutNavEntry::Kind)0,           QCString(), QCString(), QCString() }
+      };
+      LayoutNavEntry::Kind kind;
+      // find type in the table
+      int i=0;
+      QString type = attrib.value("type");
+      while (mapping[i].typeStr)
+      {
+        if (mapping[i].typeStr==type)
+        {
+          kind = mapping[i].kind;
+          break;
+        }
+        i++;
+      }
+      if (mapping[i].typeStr==0) 
+      {
+        if (type.isEmpty())
+        {
+          err("Warning: an entry tag within a navindex has no type attribute! Check your layout file!\n");
+        }
+        else
+        {
+          err("Warning: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n");
+        }
+        return;
+      }
+      QCString baseFile = mapping[i].baseFile;
+      QCString title = convertToQCString(attrib.value("title"));
+      QCString visible = convertToQCString(attrib.value("visible"));
+      bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
+      if (title.isEmpty()) // use default title
+      { 
+        title = mapping[i].mainName; // use title for main row
+        if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty())
+        {
+          title = mapping[i].subName; // if this is a child of another row, use the subName if available
+                                      // this is mainly done to get compatible naming with older versions.
+        }
+      }
+      // create new item and make it the new root
+      m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title);
+    }
+
+    void endNavEntry()
+    {
+      // set the root back to the parent
+      m_rootNav = m_rootNav->parent();
+    }
+
+    void startClass(const QXmlAttributes &)
+    {
+      LayoutDocManager::instance().clear(LayoutDocManager::Class);
+      m_scope="class/";
+      m_part = (int)LayoutDocManager::Class;
+    }
+
+    void endClass()
+    {
+      m_scope="";
+      m_part = -1;
+    }
+
+    void startNamespace(const QXmlAttributes &)
+    {
+      LayoutDocManager::instance().clear(LayoutDocManager::Namespace);
+      m_scope="namespace/";
+      m_part = (int)LayoutDocManager::Namespace;
+    }
+
+    void endNamespace()
+    {
+      m_scope="";
+      m_part = -1;
+    }
+
+    void startFile(const QXmlAttributes &)
+    {
+      LayoutDocManager::instance().clear(LayoutDocManager::File);
+      m_scope="file/";
+      m_part = (int)LayoutDocManager::File;
+    }
+
+    void endFile()
+    {
+      m_scope="";
+      m_part = -1;
+    }
+
+    void startGroup(const QXmlAttributes &)
+    {
+      LayoutDocManager::instance().clear(LayoutDocManager::Group);
+      m_scope="group/";
+      m_part = (int)LayoutDocManager::Group;
+    }
+
+    void endGroup()
+    {
+      m_scope="";
+      m_part = -1;
+    }
+
+    void startDirectory(const QXmlAttributes &)
+    {
+      LayoutDocManager::instance().clear(LayoutDocManager::Directory);
+      m_scope="directory/";
+      m_part = (int)LayoutDocManager::Directory;
+    }
+
+    void endDirectory()
+    {
+      m_scope="";
+      m_part = -1;
+    }
+
+    void startMemberDef(const QXmlAttributes &)
+    {
+      m_scope+="memberdef/";
+      if (m_part!=-1)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySimple(LayoutDocEntry::MemberDefStart));
+      }
+    }
+
+    void endMemberDef()
+    {
+      int i=m_scope.findRev("memberdef/");
+      if (i!=-1)
+      {
+        m_scope=m_scope.left(i);
+        if (m_part!=-1)
+        {
+          LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySimple(LayoutDocEntry::MemberDefEnd));
+        }
+      }
+    }
+
+    void startMemberDecl(const QXmlAttributes &)
+    {
+      m_scope+="memberdecl/";
+      if (m_part!=-1)
+      {
+        LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclStart));
+      }
+    }
+
+    void endMemberDecl()
+    {
+      int i=m_scope.findRev("memberdecl/");
+      if (i!=-1)
+      {
+        m_scope=m_scope.left(i);
+        if (m_part!=-1)
+        {
+          LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
+                                              new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclEnd));
+        }
+      }
+    }
+
+    // reimplemented from QXmlDefaultHandler
+    bool startElement( const QString&, const QString&, 
+                       const QString& name, const QXmlAttributes& attrib )
+    {
+      //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
+      StartElementHandler *handler = m_sHandler[m_scope+name];
+      if (handler)
+      {
+        (*handler)(attrib);
+      }
+      else
+      {
+        err("Warning: Unexpected start tag `%s' found in scope='%s'!\n",
+            name.data(),m_scope.data());
+      }
+      return TRUE;
+    }
+    bool endElement( const QString&, const QString&, const QString& name )
+    {
+      //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
+      EndElementHandler *handler;
+      if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name+"/")
+      { // element ends current scope
+        handler = m_eHandler[m_scope.left(m_scope.length()-1)];
+      }
+      else // continue with current scope
+      {
+        handler = m_eHandler[m_scope+name];
+      }
+      if (handler)
+      {
+        (*handler)();
+      }
+      return TRUE;
+    }
+    bool startDocument()
+    {
+      return TRUE;
+    }
+
+  private:
+    LayoutParser() : m_sHandler(163), m_eHandler(17) { }
+
+    QDict<StartElementHandler> m_sHandler;
+    QDict<EndElementHandler>   m_eHandler;
+    QString m_scope;
+    int m_part;
+    LayoutNavEntry *m_rootNav;
+};
+
+//---------------------------------------------------------------------------------
+
+class LayoutErrorHandler : public QXmlErrorHandler
+{
+  public:
+    bool warning( const QXmlParseException &exception )
+    {
+      err("Warning at line %d column %d: %s\n",
+          exception.lineNumber(),exception.columnNumber(),
+          exception.message().data());
+      return FALSE;
+    }
+    bool error( const QXmlParseException &exception )
+    {
+      err("Error at line %d column %d: %s\n",
+          exception.lineNumber(),exception.columnNumber(),
+          exception.message().data());
+      return FALSE;
+    }
+    bool fatalError( const QXmlParseException &exception )
+    {
+      err("Fatal error at line %d column %d: %s\n",
+          exception.lineNumber(),exception.columnNumber(),
+          exception.message().data());
+      return FALSE;
+    }
+    QString errorString() { return ""; }
+
+  private:
+    QString errorMsg;
+};
+
+//---------------------------------------------------------------------------------
+
+class LayoutDocManager::Private
+{
+  public:
+    QList<LayoutDocEntry> docEntries[LayoutDocManager::NrParts];
+    LayoutNavEntry *rootNav;
+};
+
+LayoutDocManager::LayoutDocManager()
+{
+  d = new Private;
+  int i;
+  for (i=0;i<LayoutDocManager::NrParts;i++)
+  {
+    d->docEntries[i].setAutoDelete(TRUE);
+  }
+  d->rootNav = new LayoutNavEntry;
+  LayoutParser::instance().init();
+}
+
+
+void LayoutDocManager::init()
+{
+  // parse the default layout
+  LayoutErrorHandler errorHandler;
+  QXmlInputSource source;
+  source.setData( layout_default );
+  QXmlSimpleReader reader;
+  reader.setContentHandler( &LayoutParser::instance() );
+  reader.setErrorHandler( &errorHandler );
+  reader.parse( source );
+}
+
+LayoutDocManager::~LayoutDocManager()
+{
+  delete d->rootNav;
+  delete d;
+}
+
+LayoutDocManager & LayoutDocManager::instance()
+{
+  static LayoutDocManager *theInstance = new LayoutDocManager;
+  return *theInstance;
+}
+
+const QList<LayoutDocEntry> &LayoutDocManager::docEntries(LayoutDocManager::LayoutPart part) const
+{
+  return d->docEntries[(int)part];
+}
+
+LayoutNavEntry* LayoutDocManager::rootNavEntry() const
+{
+  return d->rootNav;
+}
+
+void LayoutDocManager::addEntry(LayoutDocManager::LayoutPart p,LayoutDocEntry *e)
+{
+  d->docEntries[(int)p].append(e);
+}
+
+void LayoutDocManager::clear(LayoutDocManager::LayoutPart p)
+{
+  d->docEntries[(int)p].clear();
+}
+
+void LayoutDocManager::parse(QTextStream &t)
+{
+  LayoutErrorHandler errorHandler;
+  QXmlInputSource source( t );
+  QXmlSimpleReader reader;
+  reader.setContentHandler( &LayoutParser::instance() );
+  reader.setErrorHandler( &errorHandler );
+  reader.parse( source );
+}
+
+//---------------------------------------------------------------------------------
+
+void writeDefaultLayoutFile(const char *fileName)
+{
+  QFile f(fileName);
+  if (!f.open(IO_WriteOnly))
+  {
+    err("Failed to open file %s for writing!\n",fileName);
+    return;
+  }
+  QTextStream t(&f);
+  t << layout_default;
+}
diff --git a/src/layout.h b/src/layout.h
new file mode 100644
index 0000000..f1228d1
--- /dev/null
+++ b/src/layout.h
@@ -0,0 +1,187 @@
+/******************************************************************************
+ *
+ * 
+ *
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef LAYOUT_H
+#define LAYOUT_H
+
+#include "qtbc.h"
+#include "memberlist.h"
+#include <qlist.h>
+
+class LayoutParser;
+
+/** @brief Base class representing a piece of a documentation page */
+struct LayoutDocEntry
+{
+  virtual ~LayoutDocEntry() {}
+  enum Kind { 
+              // Generic items for all pages
+              MemberGroups,
+              MemberDeclStart, MemberDeclEnd, MemberDecl,
+              MemberDefStart, MemberDefEnd, MemberDef,
+              BriefDesc, DetailedDesc,
+              AuthorSection,
+              
+              // Class specific items
+              ClassIncludes,
+              ClassInheritanceGraph, ClassNestedClasses,
+              ClassCollaborationGraph, ClassAllMembersLink,
+              ClassUsedFiles,
+
+              // Namespace specific items
+              NamespaceNestedNamespaces, NamespaceClasses,
+
+              // File specific items
+              FileClasses, FileNamespaces, 
+              FileIncludes, FileIncludeGraph, 
+              FileIncludedByGraph, FileSourceLink,
+
+              // Group specific items
+              GroupClasses, GroupNamespaces,
+              GroupDirs, GroupNestedGroups, GroupFiles,
+              GroupGraph, GroupPageDocs,
+
+              // Directory specific items
+              DirSubDirs, DirFiles, DirGraph
+
+            };
+  virtual Kind kind() const = 0;
+};
+
+/** @brief Represents of a piece of a documentation page without configurable parts */
+struct LayoutDocEntrySimple : LayoutDocEntry
+{
+  public:
+    LayoutDocEntrySimple(Kind k) : m_kind(k) {}
+    Kind kind() const { return m_kind; }
+  private:
+    Kind m_kind;
+};
+
+struct LayoutDocEntrySection: public LayoutDocEntrySimple
+{
+  LayoutDocEntrySection(Kind k,const QCString &tl) :
+    LayoutDocEntrySimple(k), title(tl) {}
+  QCString title;
+};
+
+/** @brief Represents of a member declaration list with configurable title and subtitle. */
+struct LayoutDocEntryMemberDecl: public LayoutDocEntry
+{
+  LayoutDocEntryMemberDecl(MemberList::ListType tp,
+                           const QCString &tl,const QCString &ss) 
+    : type(tp), title(tl),subscript(ss) {}
+
+  Kind kind() const { return MemberDecl; }
+  MemberList::ListType type;
+  QCString title;
+  QCString subscript;
+};
+
+/** @brief Represents of a member definition list with configurable title. */
+struct LayoutDocEntryMemberDef: public LayoutDocEntry
+{
+  LayoutDocEntryMemberDef(MemberList::ListType tp,const QCString &tl) 
+    : type(tp), title(tl) {}
+
+  Kind kind() const { return MemberDef; }
+  MemberList::ListType type;
+  QCString title;
+};
+
+/** @brief Base class for the layout of a navigation item at the top of the HTML pages. */
+struct LayoutNavEntry 
+{
+  public:
+    enum Kind { 
+      MainPage, 
+      Pages,
+      Modules, 
+      Namespaces, 
+      NamespaceMembers,
+      Classes, 
+      ClassAnnotated, 
+      ClassHierarchy, 
+      ClassMembers,
+      Files, 
+      FileGlobals,
+      Dirs, 
+      Examples
+    };
+    LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QString &bf, const QString &tl,bool prepend=FALSE) 
+      : m_parent(parent), m_kind(k), m_visible(vs), m_baseFile(bf), m_title(tl) 
+    { m_children.setAutoDelete(TRUE); 
+      if (parent) { if (prepend) parent->prependChild(this); else parent->addChild(this); }
+    }
+    LayoutNavEntry *parent() const   { return m_parent; }
+    Kind kind() const                { return m_kind; }
+    QCString baseFile() const        { return m_baseFile; }
+    QCString title() const           { return m_title; }
+    bool visible()                   { return m_visible; }
+    void clear()                     { m_children.clear(); }
+    void addChild(LayoutNavEntry *e) { m_children.append(e); }
+    void prependChild(LayoutNavEntry *e) { m_children.prepend(e); }
+    const QList<LayoutNavEntry> &children() const { return m_children; }
+    LayoutNavEntry *find(LayoutNavEntry::Kind k) const;
+
+  private:
+    LayoutNavEntry() : m_parent(0) {}
+    LayoutNavEntry *m_parent;
+    Kind m_kind;
+    bool m_visible;
+    QCString m_baseFile;
+    QCString m_title;
+    QList<LayoutNavEntry> m_children;
+    friend class LayoutDocManager;
+};
+
+/** @brief Singleton providing access to the (user configurable) layout of the documentation */
+class LayoutDocManager
+{
+    class Private;
+  public:
+    enum LayoutPart
+    {
+      Class, Namespace, File, Group, Directory,
+      NrParts
+    };
+    /** Returns a reference to this singleton. */
+    static LayoutDocManager &instance();
+
+    /** Returns the list of LayoutDocEntry's in representation order for a given page identified by @a part. */
+    const QList<LayoutDocEntry> &docEntries(LayoutPart part) const;
+
+    /** returns the (invisible) root of the navigation tree. */
+    LayoutNavEntry *rootNavEntry() const;
+
+    /** Parses a user provided layout */
+    void parse(QTextStream &t);
+    void init();
+  private:
+    void addEntry(LayoutPart p,LayoutDocEntry*e);
+    void clear(LayoutPart p);
+    LayoutDocManager();
+    ~LayoutDocManager();
+    Private *d;
+    friend class LayoutParser;
+};
+
+void writeDefaultLayoutFile(const char *fileName);
+
+#endif
+
diff --git a/src/layout_default.h b/src/layout_default.h
new file mode 100644
index 0000000..1067d12
--- /dev/null
+++ b/src/layout_default.h
@@ -0,0 +1,182 @@
+"<doxygenlayout version=\"1.0\">\n"
+"  <!-- Navigation index tabs for HTML output -->\n"
+"  <navindex>\n"
+"    <tab type=\"mainpage\" visible=\"yes\" title=\"\"/>\n"
+"    <tab type=\"pages\" visible=\"yes\" title=\"\"/>\n"
+"    <tab type=\"modules\" visible=\"yes\" title=\"\"/>\n"
+"    <tab type=\"namespaces\" visible=\"yes\" title=\"\">\n"
+"      <tab type=\"namespaces\" visible=\"yes\" title=\"\"/>\n"
+"      <tab type=\"namespacemembers\" visible=\"yes\" title=\"\"/>\n"
+"    </tab>\n"
+"    <tab type=\"classes\" visible=\"yes\" title=\"\">\n"
+"      <tab type=\"classes\" visible=\"yes\" title=\"\"/>\n"
+"      <tab type=\"classindex\" visible=\"no\" title=\"\"/> \n"
+"      <tab type=\"hierarchy\" visible=\"yes\" title=\"\"/>\n"
+"      <tab type=\"classmembers\" visible=\"yes\" title=\"\"/>\n"
+"    </tab>\n"
+"    <tab type=\"files\" visible=\"yes\" title=\"\">\n"
+"      <tab type=\"files\" visible=\"yes\" title=\"\"/>\n"
+"      <tab type=\"globals\" visible=\"yes\" title=\"\"/>\n"
+"    </tab>\n"
+"    <tab type=\"dirs\" visible=\"yes\" title=\"\"/>\n"
+"    <tab type=\"examples\" visible=\"yes\" title=\"\"/>  \n"
+"  </navindex>\n"
+"\n"
+"  <!-- Layout definition for a class page -->\n"
+"  <class>\n"
+"    <briefdescription visible=\"yes\"/>\n"
+"    <includes visible=\"yes\"/>\n"
+"    <inheritancegraph visible=\"yes\"/>\n"
+"    <collaborationgraph visible=\"yes\"/>\n"
+"    <allmemberslink visible=\"yes\"/>\n"
+"    <memberdecl>\n"
+"      <membergroups visible=\"yes\"/>\n"
+"      <nestedclasses visible=\"yes\" title=\"\"/>\n"
+"      <publictypes title=\"\"/>\n"
+"      <publicslots title=\"\"/>\n"
+"      <signals title=\"\"/>\n"
+"      <publicmethods title=\"\"/>\n"
+"      <publicstaticmethods title=\"\"/>\n"
+"      <publicattributes title=\"\"/>\n"
+"      <publicstaticattributes title=\"\"/>\n"
+"      <protectedtypes title=\"\"/>\n"
+"      <protectedslots title=\"\"/>\n"
+"      <protectedmethods title=\"\"/>\n"
+"      <protectedstaticmethods title=\"\"/>\n"
+"      <protectedattributes title=\"\"/>\n"
+"      <protectedstaticattributes title=\"\"/>\n"
+"      <packagetypes title=\"\"/>\n"
+"      <packagemethods title=\"\"/>\n"
+"      <packagestaticmethods title=\"\"/>\n"
+"      <packageattributes title=\"\"/>\n"
+"      <packagestaticattributes title=\"\"/>\n"
+"      <properties title=\"\"/>\n"
+"      <events title=\"\"/>\n"
+"      <privatetypes title=\"\"/>\n"
+"      <privateslots title=\"\"/>\n"
+"      <privatemethods title=\"\"/>\n"
+"      <privatestaticmethods title=\"\"/>\n"
+"      <privateattributes title=\"\"/>\n"
+"      <privatestaticattributes title=\"\"/>\n"
+"      <friends title=\"\"/>\n"
+"      <related title=\"\" subtitle=\"\"/>\n"
+"    </memberdecl>\n"
+"    <detaileddescription title=\"\"/>\n"
+"    <memberdef>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <constructors title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <related title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"      <properties title=\"\"/>\n"
+"      <events title=\"\"/>\n"
+"    </memberdef>\n"
+"    <usedfiles visible=\"yes\"/>\n"
+"    <authorsection visible=\"yes\"/>\n"
+"  </class>\n"
+"\n"
+"  <!-- Layout definition for a namespace page -->\n"
+"  <namespace>\n"
+"    <briefdescription visible=\"yes\"/>\n"
+"    <memberdecl>\n"
+"      <nestednamespaces visible=\"yes\" title=\"\"/>\n"
+"      <classes visible=\"yes\" title=\"\"/>\n"
+"      <membergroups visible=\"yes\"/>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"    </memberdecl>\n"
+"    <detaileddescription title=\"\"/>\n"
+"    <memberdef>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"    </memberdef>\n"
+"    <authorsection visible=\"yes\"/>\n"
+"  </namespace>\n"
+"\n"
+"  <!-- Layout definition for a file page -->\n"
+"  <file>\n"
+"    <briefdescription visible=\"yes\"/>\n"
+"    <includes visible=\"yes\"/>\n"
+"    <includegraph visible=\"yes\"/>\n"
+"    <includedbygraph visible=\"yes\"/>\n"
+"    <sourcelink visible=\"yes\"/>\n"
+"    <memberdecl>\n"
+"      <classes visible=\"yes\" title=\"\"/>\n"
+"      <namespaces visible=\"yes\" title=\"\"/>\n"
+"      <defines title=\"\"/>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"    </memberdecl>\n"
+"    <detaileddescription title=\"\"/>\n"
+"    <memberdef>\n"
+"      <defines title=\"\"/>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"    </memberdef>\n"
+"    <authorsection/>\n"
+"  </file>\n"
+"\n"
+"  <!-- Layout definition for a group page -->\n"
+"  <group>\n"
+"    <briefdescription visible=\"yes\"/>\n"
+"    <groupgraph visible=\"yes\"/>\n"
+"    <memberdecl>\n"
+"      <classes visible=\"yes\" title=\"\"/>\n"
+"      <namespaces visible=\"yes\" title=\"\"/>\n"
+"      <dirs visible=\"yes\" title=\"\"/>\n"
+"      <nestedgroups visible=\"yes\" title=\"\"/>\n"
+"      <files visible=\"yes\" title=\"\"/>\n"
+"      <defines title=\"\"/>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <enumvalues title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"      <signals title=\"\"/>\n"
+"      <publicslots title=\"\"/>\n"
+"      <protectedslots title=\"\"/>\n"
+"      <privateslots title=\"\"/>\n"
+"      <events title=\"\"/>\n"
+"      <properties title=\"\"/>\n"
+"      <friends title=\"\"/>\n"
+"    </memberdecl>\n"
+"    <detaileddescription title=\"\"/>\n"
+"    <memberdef>\n"
+"      <pagedocs/>\n"
+"      <defines title=\"\"/>\n"
+"      <typedefs title=\"\"/>\n"
+"      <enums title=\"\"/>\n"
+"      <enumvalues title=\"\"/>\n"
+"      <functions title=\"\"/>\n"
+"      <variables title=\"\"/>\n"
+"      <signals title=\"\"/>\n"
+"      <publicslots title=\"\"/>\n"
+"      <protectedslots title=\"\"/>\n"
+"      <privateslots title=\"\"/>\n"
+"      <events title=\"\"/>\n"
+"      <properties title=\"\"/>\n"
+"      <friends title=\"\"/>\n"
+"    </memberdef>\n"
+"    <authorsection visible=\"yes\"/>\n"
+"  </group>\n"
+"\n"
+"  <!-- Layout definition for a directory page -->\n"
+"  <directory>\n"
+"    <briefdescription visible=\"yes\"/>\n"
+"    <directorygraph visible=\"yes\"/>\n"
+"    <memberdecl>\n"
+"      <dirs visible=\"yes\"/>\n"
+"      <files visible=\"yes\"/>\n"
+"    </memberdecl>\n"
+"    <detaileddescription title=\"\"/>\n"
+"  </directory>\n"
+"</doxygenlayout>\n"
diff --git a/src/layout_default.xml b/src/layout_default.xml
new file mode 100644
index 0000000..6532a9e
--- /dev/null
+++ b/src/layout_default.xml
@@ -0,0 +1,182 @@
+<doxygenlayout version="1.0">
+  <!-- Navigation index tabs for HTML output -->
+  <navindex>
+    <tab type="mainpage" visible="yes" title=""/>
+    <tab type="pages" visible="yes" title=""/>
+    <tab type="modules" visible="yes" title=""/>
+    <tab type="namespaces" visible="yes" title="">
+      <tab type="namespaces" visible="yes" title=""/>
+      <tab type="namespacemembers" visible="yes" title=""/>
+    </tab>
+    <tab type="classes" visible="yes" title="">
+      <tab type="classes" visible="yes" title=""/>
+      <tab type="classindex" visible="no" title=""/> 
+      <tab type="hierarchy" visible="yes" title=""/>
+      <tab type="classmembers" visible="yes" title=""/>
+    </tab>
+    <tab type="files" visible="yes" title="">
+      <tab type="files" visible="yes" title=""/>
+      <tab type="globals" visible="yes" title=""/>
+    </tab>
+    <tab type="dirs" visible="yes" title=""/>
+    <tab type="examples" visible="yes" title=""/>  
+  </navindex>
+
+  <!-- Layout definition for a class page -->
+  <class>
+    <briefdescription visible="yes"/>
+    <includes visible="yes"/>
+    <inheritancegraph visible="yes"/>
+    <collaborationgraph visible="yes"/>
+    <allmemberslink visible="yes"/>
+    <memberdecl>
+      <membergroups visible="yes"/>
+      <nestedclasses visible="yes" title=""/>
+      <publictypes title=""/>
+      <publicslots title=""/>
+      <signals title=""/>
+      <publicmethods title=""/>
+      <publicstaticmethods title=""/>
+      <publicattributes title=""/>
+      <publicstaticattributes title=""/>
+      <protectedtypes title=""/>
+      <protectedslots title=""/>
+      <protectedmethods title=""/>
+      <protectedstaticmethods title=""/>
+      <protectedattributes title=""/>
+      <protectedstaticattributes title=""/>
+      <packagetypes title=""/>
+      <packagemethods title=""/>
+      <packagestaticmethods title=""/>
+      <packageattributes title=""/>
+      <packagestaticattributes title=""/>
+      <properties title=""/>
+      <events title=""/>
+      <privatetypes title=""/>
+      <privateslots title=""/>
+      <privatemethods title=""/>
+      <privatestaticmethods title=""/>
+      <privateattributes title=""/>
+      <privatestaticattributes title=""/>
+      <friends title=""/>
+      <related title="" subtitle=""/>
+    </memberdecl>
+    <detaileddescription title=""/>
+    <memberdef>
+      <typedefs title=""/>
+      <enums title=""/>
+      <constructors title=""/>
+      <functions title=""/>
+      <related title=""/>
+      <variables title=""/>
+      <properties title=""/>
+      <events title=""/>
+    </memberdef>
+    <usedfiles visible="yes"/>
+    <authorsection visible="yes"/>
+  </class>
+
+  <!-- Layout definition for a namespace page -->
+  <namespace>
+    <briefdescription visible="yes"/>
+    <memberdecl>
+      <nestednamespaces visible="yes" title=""/>
+      <classes visible="yes" title=""/>
+      <membergroups visible="yes"/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdecl>
+    <detaileddescription title=""/>
+    <memberdef>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </namespace>
+
+  <!-- Layout definition for a file page -->
+  <file>
+    <briefdescription visible="yes"/>
+    <includes visible="yes"/>
+    <includegraph visible="yes"/>
+    <includedbygraph visible="yes"/>
+    <sourcelink visible="yes"/>
+    <memberdecl>
+      <classes visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdecl>
+    <detaileddescription title=""/>
+    <memberdef>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <functions title=""/>
+      <variables title=""/>
+    </memberdef>
+    <authorsection/>
+  </file>
+
+  <!-- Layout definition for a group page -->
+  <group>
+    <briefdescription visible="yes"/>
+    <groupgraph visible="yes"/>
+    <memberdecl>
+      <classes visible="yes" title=""/>
+      <namespaces visible="yes" title=""/>
+      <dirs visible="yes" title=""/>
+      <nestedgroups visible="yes" title=""/>
+      <files visible="yes" title=""/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+    </memberdecl>
+    <detaileddescription title=""/>
+    <memberdef>
+      <pagedocs/>
+      <defines title=""/>
+      <typedefs title=""/>
+      <enums title=""/>
+      <enumvalues title=""/>
+      <functions title=""/>
+      <variables title=""/>
+      <signals title=""/>
+      <publicslots title=""/>
+      <protectedslots title=""/>
+      <privateslots title=""/>
+      <events title=""/>
+      <properties title=""/>
+      <friends title=""/>
+    </memberdef>
+    <authorsection visible="yes"/>
+  </group>
+
+  <!-- Layout definition for a directory page -->
+  <directory>
+    <briefdescription visible="yes"/>
+    <directorygraph visible="yes"/>
+    <memberdecl>
+      <dirs visible="yes"/>
+      <files visible="yes"/>
+    </memberdecl>
+    <detaileddescription title=""/>
+  </directory>
+</doxygenlayout>
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index 61218d8..c32b29f 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -61,6 +61,8 @@ HEADERS      =	bufstr.h \
 		language.h \
                 latexdocvisitor.h \
 		latexgen.h \
+                layout.h \
+                layout_default.h \
                 lockingptr.h \
 		logos.h \
 		mandocvisitor.h \
@@ -178,6 +180,7 @@ SOURCES      =	ce_lex.cpp \
 		language.cpp \
                 latexdocvisitor.cpp \
 		latexgen.cpp \
+                layout.cpp \
 		logos.cpp \
 		mandocvisitor.cpp \
 		mangen.cpp \
diff --git a/src/libdoxygen.t b/src/libdoxygen.t
index 42001de..b37eb1b 100644
--- a/src/libdoxygen.t
+++ b/src/libdoxygen.t
@@ -105,6 +105,9 @@ index_xsd.h: index.xsd
 compound_xsd.h: compound.xsd
 	cat compound.xsd | $(TO_C_CMD) >compound_xsd.h 
 
+layout_default.h: layout_default.xml
+	cat layout_default.xml | $(TO_C_CMD) >layout_default.h 
+
 search_php.h: search.php
 	cat search.php | $(TO_C_CMD) >search_php.h 
 
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index a57238b..960699a 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -1102,7 +1102,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
       case Enumeration: Doxygen::tagFile << "enumeration"; break;
       case Function:    Doxygen::tagFile << "function";    break;
       case Signal:      Doxygen::tagFile << "signal";      break;
-      case Prototype:   Doxygen::tagFile << "prototype";   break;
+      //case Prototype:   Doxygen::tagFile << "prototype";   break;
       case Friend:      Doxygen::tagFile << "friend";      break;
       case DCOP:        Doxygen::tagFile << "dcop";        break;
       case Slot:        Doxygen::tagFile << "slot";        break;
@@ -2320,7 +2320,6 @@ QCString MemberDef::memberTypeName() const
     case Typedef:     return "typedef";
     case Enumeration: return "enumeration"; 
     case EnumValue:   return "enumvalue";
-    case Prototype:   return "prototype";   
     case Signal:      return "signal";
     case Slot:        return "slot";
     case Friend:      return "friend";
diff --git a/src/memberdef.h b/src/memberdef.h
index 8dbcf0e..d476f5d 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -57,7 +57,6 @@ class MemberDef : public Definition
       Typedef, 
       Enumeration, 
       EnumValue,
-      Prototype,
       Signal,
       Slot,
       Friend,
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index a14dfeb..d6b389b 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -87,7 +87,7 @@ void MemberList::countDecMembers(bool countEnumValues)
                                        m_enumValCnt++,m_numDecMembers++; 
                                      break;
         case MemberDef::Typedef:     m_typeCnt++,m_numDecMembers++; break;
-        case MemberDef::Prototype:   m_protoCnt++,m_numDecMembers++; break;
+        //case MemberDef::Prototype:   m_protoCnt++,m_numDecMembers++; break;
         case MemberDef::Define:      if (Config_getBool("EXTRACT_ALL") || 
                                          md->argsString() || 
                                          !md->initializer().isEmpty() ||
@@ -200,7 +200,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
       switch(md->memberType())
       {
         case MemberDef::Define:    // fall through
-        case MemberDef::Prototype: // fall through
+        //case MemberDef::Prototype: // fall through
         case MemberDef::Typedef:   // fall through
         case MemberDef::Variable:  // fall through
         case MemberDef::Function:  // fall through
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 09dab2d..a396257 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -28,6 +28,9 @@
 #include "docparser.h"
 #include "searchindex.h"
 #include "vhdldocgen.h"
+#include "layout.h"
+
+//------------------------------------------------------------------
 
 NamespaceDef::NamespaceDef(const char *df,int dl,
                            const char *name,const char *lref,
@@ -202,10 +205,6 @@ void NamespaceDef::insertMember(MemberDef *md)
       break;
     case MemberDef::EnumValue:    
       break;
-    case MemberDef::Prototype:    
-      addMemberToList(MemberList::decProtoMembers,md);
-      addMemberToList(MemberList::docProtoMembers,md);
-      break;
     case MemberDef::Define:       
       addMemberToList(MemberList::decDefineMembers,md);
       addMemberToList(MemberList::docDefineMembers,md);
@@ -225,22 +224,21 @@ void NamespaceDef::computeAnchors()
   if (allMemberList) setAnchors(0,'a',allMemberList);
 }
 
-void NamespaceDef::writeDetailedDocumentation(OutputList &ol)
+void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)
 {
   if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
-      !documentation().isEmpty())
+      !documentation().isEmpty()
+     )
   {
     ol.writeRuler();
     ol.pushGeneratorState();
     ol.disableAllBut(OutputGenerator::Html);
-    //bool latexOn = ol.isEnabled(OutputGenerator::Latex);
-    //if (latexOn) ol.disable(OutputGenerator::Latex);
-    ol.writeAnchor(0,"_details"); 
-    //if (latexOn) ol.enable(OutputGenerator::Latex);
+      ol.writeAnchor(0,"_details"); 
     ol.popGeneratorState();
     ol.startGroupHeader();
-    ol.parseText(theTranslator->trDetailedDescription());
+    ol.parseText(title);
     ol.endGroupHeader();
+
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
@@ -251,6 +249,7 @@ void NamespaceDef::writeDetailedDocumentation(OutputList &ol)
     {
       ol.pushGeneratorState();
         ol.disable(OutputGenerator::Man);
+        ol.disable(OutputGenerator::RTF);
         ol.newParagraph();
         ol.enableAll();
         ol.disableAllBut(OutputGenerator::Man);
@@ -260,16 +259,112 @@ void NamespaceDef::writeDetailedDocumentation(OutputList &ol)
     if (!documentation().isEmpty())
     {
       ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
-      //ol.newParagraph();
     }
     ol.endTextBlock();
+    ol.newParagraph();
+  }
+}
+
+void NamespaceDef::writeBriefDescription(OutputList &ol)
+{
+  if (!briefDescription().isEmpty()) 
+  {
+    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.writeString(" \n");
+    ol.enable(OutputGenerator::RTF);
+
+    if (Config_getBool("REPEAT_BRIEF") ||
+        !documentation().isEmpty()
+       )
+    {
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.startTextLink(0,"_details");
+      ol.parseText(theTranslator->trMore());
+      ol.endTextLink();
+    }
+    ol.popGeneratorState();
+
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::RTF);
+    ol.newParagraph();
+    ol.popGeneratorState();
+  }
+  ol.writeSynopsis();
+}
+
+void NamespaceDef::startMemberDeclarations(OutputList &ol)
+{
+  ol.startMemberSections();
+}
+
+void NamespaceDef::endMemberDeclarations(OutputList &ol)
+{
+  ol.endMemberSections();
+}
+
+void NamespaceDef::startMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+  {
+    ol.disable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = TRUE;
+  }
+}
+
+void NamespaceDef::endMemberDocumentation(OutputList &ol)
+{
+  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
+  {
+    ol.enable(OutputGenerator::Html);
+    Doxygen::suppressDocWarnings = FALSE;
+  }
+}
+
+void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)
+{
+  if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);
+}
+
+void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
+{
+  if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
+}
+
+void NamespaceDef::writeMemberGroups(OutputList &ol)
+{
+  /* write user defined member groups */
+  if (memberGroupSDict)
+  {
+    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      if ((!mg->allMembersInSameSection() || !m_subGrouping) 
+          && mg->header()!="[NOHEADER]")
+      {
+        mg->writeDeclarations(ol,0,this,0,0);
+      }
+    }
   }
 }
   
+void NamespaceDef::writeAuthorSection(OutputList &ol)
+{
+  // write Author section (Man only)
+  ol.pushGeneratorState();
+  ol.disableAllBut(OutputGenerator::Man);
+  ol.startGroupHeader();
+  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
+  ol.endGroupHeader();
+  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
+  ol.popGeneratorState();
+}
+
 void NamespaceDef::writeDocumentation(OutputList &ol)
 {
   bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
-  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
 
   QCString pageTitle;
   if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
@@ -308,59 +403,123 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     Doxygen::tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
     Doxygen::tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
   }
-  
-  ol.startTextBlock();
+ 
+  //---------------------------------------- start flexible part -------------------------------
+
+#define NEW_LAYOUT
+#ifdef NEW_LAYOUT // new flexible layout
+
+  QListIterator<LayoutDocEntry> eli(
+      LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
+  LayoutDocEntry *lde;
+  for (eli.toFirst();(lde=eli.current());++eli)
+  {
+    switch (lde->kind())
+    {
+      case LayoutDocEntry::BriefDesc: 
+        writeBriefDescription(ol);
+        break; 
+      case LayoutDocEntry::MemberDeclStart: 
+        startMemberDeclarations(ol);
+        break; 
+      case LayoutDocEntry::NamespaceClasses: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeClassDeclarations(ol,ls->title);
+        }
+        break; 
+      case LayoutDocEntry::NamespaceNestedNamespaces: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeNamespaceDeclarations(ol,ls->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberGroups: 
+        writeMemberGroups(ol);
+        break; 
+      case LayoutDocEntry::MemberDecl: 
+        {
+          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
+          writeMemberDeclarations(ol,lmd->type,lmd->title);
+        }
+        break; 
+      case LayoutDocEntry::MemberDeclEnd: 
+        endMemberDeclarations(ol);
+        break;
+      case LayoutDocEntry::DetailedDesc: 
+        {
+          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
+          writeDetailedDescription(ol,ls->title);
+        }
+        break;
+      case LayoutDocEntry::MemberDefStart: 
+        startMemberDocumentation(ol);
+        break; 
+      case LayoutDocEntry::MemberDef: 
+        {
+          LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
+          writeMemberDocumentation(ol,lmd->type,lmd->title);
+        }
+        break;
+      case LayoutDocEntry::MemberDefEnd: 
+        endMemberDocumentation(ol);
+        break;
+      case LayoutDocEntry::AuthorSection: 
+        writeAuthorSection(ol);
+        break;
+      case LayoutDocEntry::ClassIncludes:
+      case LayoutDocEntry::ClassInheritanceGraph:
+      case LayoutDocEntry::ClassNestedClasses:
+      case LayoutDocEntry::ClassCollaborationGraph:
+      case LayoutDocEntry::ClassAllMembersLink:
+      case LayoutDocEntry::ClassUsedFiles:
+      case LayoutDocEntry::FileClasses:
+      case LayoutDocEntry::FileNamespaces:
+      case LayoutDocEntry::FileIncludes:
+      case LayoutDocEntry::FileIncludeGraph:
+      case LayoutDocEntry::FileIncludedByGraph: 
+      case LayoutDocEntry::FileSourceLink:
+      case LayoutDocEntry::GroupClasses: 
+      case LayoutDocEntry::GroupNamespaces:
+      case LayoutDocEntry::GroupDirs: 
+      case LayoutDocEntry::GroupNestedGroups: 
+      case LayoutDocEntry::GroupFiles:
+      case LayoutDocEntry::GroupGraph: 
+      case LayoutDocEntry::GroupPageDocs:
+      case LayoutDocEntry::DirSubDirs:
+      case LayoutDocEntry::DirFiles:
+      case LayoutDocEntry::DirGraph:
+        err("Internal inconsistency: member %d should not be part of "
+            "LayoutDocManager::Namespace entry list\n",lde->kind());
+        break;
+    }
+  }
+
+#else // old fixed layout
+
+  bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
+
+  //ol.startTextBlock();
     
   if (Config_getBool("DETAILS_AT_TOP"))
   {
-    writeDetailedDocumentation(ol);
-    ol.newParagraph();
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
   }
-  else if (!briefDescription().isEmpty()) 
+
+  if (!Config_getBool("DETAILS_AT_TOP"))
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
-    ol.writeString(" \n");
-    ol.pushGeneratorState();
-    ol.disableAllBut(OutputGenerator::Html);
-    ol.startTextLink(0,"_details");
-    ol.parseText(theTranslator->trMore());
-    ol.endTextLink();
-    ol.enableAll();
-    ol.disableAllBut(OutputGenerator::Man);
-    ol.newParagraph();
-    ol.popGeneratorState();
+    writeBriefDescription(ol);
   }
-  ol.disable(OutputGenerator::Man);
-  ol.disable(OutputGenerator::RTF);
-  ol.newParagraph();
-  ol.enable(OutputGenerator::Man);
-  ol.enable(OutputGenerator::RTF);
-  ol.writeSynopsis();
 
-  ol.endTextBlock();
+  //ol.endTextBlock();
   
-  ol.startMemberSections();
-  classSDict->writeDeclaration(ol,0,0,TRUE);
+  startMemberDeclarations(ol);
 
-  namespaceSDict->writeDeclaration(ol,TRUE);
-
-  /* write user defined member groups */
-  if (memberGroupSDict)
-  {
-    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
-    {
-      if ((!mg->allMembersInSameSection() || !m_subGrouping) 
-          && mg->header()!="[NOHEADER]")
-      {
-        mg->writeDeclarations(ol,0,this,0,0);
-      }
-    }
-  }
+  writeClassDeclarations(ol);
+  writeNamespaceDeclarations(ol);
+  writeMemberGroups(ol);
 
   writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
-  writeMemberDeclarations(ol,MemberList::decProtoMembers,theTranslator->trFuncProtos());
   writeMemberDeclarations(ol,MemberList::decTypedefMembers,theTranslator->trTypedefs());
   writeMemberDeclarations(ol,MemberList::decEnumMembers,theTranslator->trEnumerations());
   writeMemberDeclarations(ol,MemberList::decFuncMembers,
@@ -368,22 +527,31 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
       vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
                    theTranslator->trFunctions());
   writeMemberDeclarations(ol,MemberList::decVarMembers,theTranslator->trVariables());
-  ol.endMemberSections();
+  endMemberDeclarations(ol);
   
   if (!Config_getBool("DETAILS_AT_TOP"))
   {
-    writeDetailedDocumentation(ol);
+    writeDetailedDescription(ol,theTranslator->trDetailedDescription());
   }
 
-  writeMemberDocumentation(ol);
+  startMemberDocumentation(ol);
+  
+  writeMemberDocumentation(ol,MemberList::docDefineMembers,theTranslator->trDefineDocumentation());
+  writeMemberDocumentation(ol,MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation());
+  writeMemberDocumentation(ol,MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
+  writeMemberDocumentation(ol,MemberList::docFuncMembers,fortranOpt?theTranslator->trSubprogramDocumentation():theTranslator->trFunctionDocumentation());
+  writeMemberDocumentation(ol,MemberList::docVarMembers,theTranslator->trVariableDocumentation());
+
+  endMemberDocumentation(ol);
+
+  writeAuthorSection(ol);
+
+#endif
+
+  //---------------------------------------- end flexible part -------------------------------
+
+  endFile(ol);
 
-  // write Author section (Man only)
-  ol.pushGeneratorState();
-  ol.disableAllBut(OutputGenerator::Man);
-  ol.startGroupHeader();
-  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
-  ol.endGroupHeader();
-  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
@@ -391,9 +559,6 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     Doxygen::tagFile << "  </compound>" << endl;
   }
 
-  ol.popGeneratorState();
-  endFile(ol);
-
   if (Config_getBool("SEPARATE_MEMBER_PAGES"))
   {
     MemberList *allMemberList = getMemberList(MemberList::allMembersList);
@@ -402,27 +567,6 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
   }
 }
 
-void NamespaceDef::writeMemberDocumentation(OutputList &ol)
-{
-  bool fortranOpt=Config_getBool("OPTIMIZE_FOR_FORTRAN");
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    ol.disable(OutputGenerator::Html);
-  }
-  
-  writeMemberDocumentation(ol,MemberList::docDefineMembers,theTranslator->trDefineDocumentation());
-  writeMemberDocumentation(ol,MemberList::docProtoMembers,theTranslator->trFunctionPrototypeDocumentation());
-  writeMemberDocumentation(ol,MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation());
-  writeMemberDocumentation(ol,MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
-  writeMemberDocumentation(ol,MemberList::docFuncMembers,fortranOpt?theTranslator->trSubprogramDocumentation():theTranslator->trFunctionDocumentation());
-  writeMemberDocumentation(ol,MemberList::docVarMembers,theTranslator->trVariableDocumentation());
-
-  if (Config_getBool("SEPARATE_MEMBER_PAGES"))
-  {
-    ol.enable(OutputGenerator::Html);
-  }
-}
-
 void NamespaceDef::writeMemberPages(OutputList &ol)
 {
   ol.pushGeneratorState();
@@ -628,7 +772,7 @@ void NamespaceDef::combineUsingRelations()
   }
 }
 
-void NamespaceSDict::writeDeclaration(OutputList &ol,bool localName)
+void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)
 {
   if (count()==0) return; // no namespaces in the list
 
@@ -643,8 +787,9 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,bool localName)
 
   // write list of namespaces
   ol.startMemberHeader();
-  bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
+  bool javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
   bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
+#if 0
   if (javaOpt)
   {
     ol.parseText(theTranslator->trPackages());
@@ -657,6 +802,8 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,bool localName)
   {
     ol.parseText(theTranslator->trNamespaces());
   }
+#endif
+  ol.parseText(title);
   ol.endMemberHeader();
   ol.startMemberList();
   for (ni.toFirst();(nd=ni.current());++ni)
diff --git a/src/namespacedef.h b/src/namespacedef.h
index b8bc093..b492e7e 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -45,9 +45,7 @@ class NamespaceDef : public Definition
     QCString getOutputFileBase() const;
     void insertUsedFile(const char *fname);
     
-    void writeDetailedDocumentation(OutputList &ol);
     void writeDocumentation(OutputList &ol);
-    void writeMemberDocumentation(OutputList &ol);
     void writeMemberPages(OutputList &ol);
     void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
 
@@ -93,6 +91,16 @@ class NamespaceDef : public Definition
     void addMemberToList(MemberList::ListType lt,MemberDef *md);
     void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
     void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
+    void writeDetailedDescription(OutputList &ol,const QCString &title);
+    void writeBriefDescription(OutputList &ol);
+    void startMemberDeclarations(OutputList &ol);
+    void endMemberDeclarations(OutputList &ol);
+    void writeClassDeclarations(OutputList &ol,const QCString &title);
+    void writeNamespaceDeclarations(OutputList &ol,const QCString &title);
+    void writeMemberGroups(OutputList &ol);
+    void writeAuthorSection(OutputList &ol);
+    void startMemberDocumentation(OutputList &ol);
+    void endMemberDocumentation(OutputList &ol);
 
     QCString              fileName;
     QStrList              files;
@@ -146,7 +154,7 @@ class NamespaceSDict : public SDict<NamespaceDef>
                     ((NamespaceDef *)item2)->name()
                    );
     }
-    void writeDeclaration(OutputList &ol,bool localName=FALSE);
+    void writeDeclaration(OutputList &ol,const char *title,bool localName=FALSE);
 };
 
 
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 0c6d6c1..44a54e8 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -1430,7 +1430,7 @@ void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
   case MemberDef::Enumeration: memType="enum";      break;
   case MemberDef::Function:    memType="function";  isFunc=TRUE; break;
   case MemberDef::Signal:      memType="signal";    isFunc=TRUE; break;
-  case MemberDef::Prototype:   memType="prototype"; isFunc=TRUE; break;
+  //case MemberDef::Prototype:   memType="prototype"; isFunc=TRUE; break;
   case MemberDef::Friend:      memType="friend";    isFunc=TRUE; break;
   case MemberDef::DCOP:        memType="dcop";      isFunc=TRUE; break;
   case MemberDef::Slot:        memType="slot";      isFunc=TRUE; break;
diff --git a/src/pre.l b/src/pre.l
index 5d5a79c..0917d3a 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -170,14 +170,15 @@ static Define *isDefined(const char *name)
   return 0;
 }
 
-static FILE *checkAndOpenFile(const QCString &absName)
+static FILE *checkAndOpenFile(const QCString &fileName)
 {
   FILE *f = 0;
   //printf("checkAndOpenFile(%s)\n",absName.data());
-  QFileInfo fi(absName);
+  QFileInfo fi(fileName);
   if (fi.exists() && fi.isFile())
   {
-    // check include stack for absFileName
+    QCString absName = convertToQCString(fi.absFilePath());
+    // check include stack for absName
 
     QStack<FileState> tmpStack;
     g_includeStack.setAutoDelete(FALSE);
diff --git a/src/qtbc.h b/src/qtbc.h
index 22ab1d5..173728e 100644
--- a/src/qtbc.h
+++ b/src/qtbc.h
@@ -32,7 +32,7 @@
 
 #include <qcstring.h>
 #include <qstring.h>
-inline QCString convertToQCString(const QString &s) { return s.latin1(); }
+inline QCString convertToQCString(const QString &s) { return s.utf8(); }
 
 #else /* QT_VERSION < 200 */
 
diff --git a/src/translator_fi.h b/src/translator_fi.h
index eb4cf19..118e6f8 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -16,40 +16,43 @@
  */
 /*
 ==================================================================================
-Suomenkielinen k��nn�s:
+Suomenkielinen käännös:
 Olli Korhonen ( -> 0.49-990425)     <olli.korhonen@ccc.fi>
 Antti Laine   (0.49-990425 -> )     <antti.a.laine@tut.fi>
 ==================================================================================
 1999/10/19
-*  Alustava k��nn�s valmis.
-
-*  Huom: Kaikille termeille on keksitty k��nn�svastine, mik� ei ehk� ole 
-         kaikissa tapauksissa hyv� ratkaisu, ja parempikin termi voi 
-         olla vakiintuneessa k�yt�ss�.
-
-2008/04/08
-* K��nnetty versioon 1.5.5 asti.
-
-* Teht�v��: 
-        - Termien kokoaminen listaksi ja suomennosten j�rkevyyden tarkastelu. (lista on jo melko kattava)
-                Author          = Tekij�
+*  Alustava käännös valmis.
+
+*  Huom: Kaikille termeille on keksitty käännösvastine, mikä ei ehkä ole 
+         kaikissa tapauksissa hyvä ratkaisu, ja parempikin termi voi 
+         olla vakiintuneessa käytössä.
+
+2008-04-08
+* Käännetty versioon 1.5.5 asti.
+2008-08-26
+* MAX_DOT_GRAPH_HEIGHT poistettu, versio 1.5.6
+* Tekstit muutettu UTF-8:ksi
+*
+* Tehtävää: 
+        - Termien kokoaminen listaksi ja suomennosten järkevyyden tarkastelu. (lista on jo melko kattava)
+                Author          = Tekijä
                 Class           = Luokka
                 Compound        = Kooste
                 Data            = Data
                 Documentation   = Dokumentaatio
-                Defines         = M��rittelyt
+                Defines         = Määrittelyt
                 Description     = Selite
                 Detailed        = Yksityiskohtainen
                 Diagram         = Kaavio
                 Enum            = Enumeraatio / Luettelotyyppi
                 Exceptions      = Poikkeukset
                 File            = Tiedosto
-                Friends         = Yst�v�t
+                Friends         = Ystävät
                 Functions       = Funktiot
                 Hierarchical    = Hierarkinen
                 Index           = Indeksi
                 Inherits        = Perii
-                Member          = J�sen
+                Member          = Jäsen
                 Module          = Moduli
                 Namespace       = Nimiavaruus
                 Parameters      = Parametrit
@@ -57,19 +60,19 @@ Antti Laine   (0.49-990425 -> )     <antti.a.laine@tut.fi>
                 Protected       = Suojattu
                 Prototypes      = Prototyypit
                 Public          = Julkinen
-                Reference Manual= K�sikirja
+                Reference Manual= Käsikirja
                 Reimplemented   = Uudelleen toteutettu
-                Related         = Liittyv�
+                Related         = Liittyvä
                 Signals         = Signaalit
                 Slots           = Vastineet
                 Static          = Staattinen
                 Struct          = Tietue
-                Typedef         = Tyyppim��rittely
+                Typedef         = Tyyppimäärittely
                 Union           = Yhdiste
                 Variables       = Muuttujat
-        - Taivutusmuotojen virheett�myyden tarkastelu prepositioiden korvauskohdissa.
-        - Sanasta sanaan k��nn�skohtien mielekkyyden tarkastelu valmiista dokumentista.
-        - umlaut vastineiden k�ytt� scandien kohdalla.
+        - Taivutusmuotojen virheettömyyden tarkastelu prepositioiden korvauskohdissa.
+        - Sanasta sanaan käännöskohtien mielekkyyden tarkastelu valmiista dokumentista.
+        - umlaut vastineiden käyttö scandien kohdalla.
 
 positiiviset kommentit otetaan ilolla vastaan.
 ===================================================================================
@@ -78,7 +81,7 @@ positiiviset kommentit otetaan ilolla vastaan.
 #ifndef TRANSLATOR_FI_H
 #define TRANSLATOR_FI_H
 
-class TranslatorFinnish : public Translator
+class TranslatorFinnish : public TranslatorEnglish
 {
   public:
     /*! This method is used to generate a warning message to signal
@@ -125,18 +128,18 @@ class TranslatorFinnish : public Translator
     /*! 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 -------------------
 
     /*! used in the compound documentation before a list of related functions. */
     virtual QCString trRelatedFunctions()
-    { return "Liittyv�t funktiot"; } // "Related Functions";
+    { return "Liittyvät funktiot"; } // "Related Functions";
 
     /*! subscript for the related functions. */
     virtual QCString trRelatedSubscript()
-    { return "(Huomaa, ett� n�m� eiv�t ole j�senfunktioita.)"; } // "(Note that these are not member functions.)"
+    { return "(Huomaa, että nämä eivät ole jäsenfunktioita.)"; } // "(Note that these are not member functions.)"
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
     virtual QCString trDetailedDescription()
@@ -145,15 +148,15 @@ class TranslatorFinnish : public Translator
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
       // header that is put before the list of typedefs.
-    { return "J�sentyyppim��rittelyiden dokumentaatio"; } // "Member Typedef Documentation"
+    { return "Jäsentyyppimäärittelyiden dokumentaatio"; } // "Member Typedef Documentation"
 
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
-    { return "J�senenumeraatioiden dokumentaatio"; } // "Member Enumeration Documentation"
+    { return "Jäsenenumeraatioiden dokumentaatio"; } // "Member Enumeration Documentation"
 
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
-    { return "J�senfunktioiden dokumentaatio"; } // "Member Function Documentation"
+    { return "Jäsenfunktioiden dokumentaatio"; } // "Member Function Documentation"
 
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
@@ -164,42 +167,42 @@ class TranslatorFinnish : public Translator
       }
       else
       {
-        return "J�sendatan dokumentaatio"; // "Member Data Documentation"
+        return "Jäsendatan dokumentaatio"; // "Member Data Documentation"
       }
     }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore()
-    { return "Lis��..."; } // "More..."
+    { return "Lisää..."; } // "More..."
 
      /*! put in the class documentation */
     virtual QCString trListOfAllMembers()
-    { return "Lista kaikista j�senist�."; } // "List of all members."
+    { return "Lista kaikista jäsenistä."; } // "List of all members."
     virtual QCString trMemberList()
 
     /*! used as the title of the "list of all members" page of a class */
-    { return "J�senlista"; } // "Member List"
+    { return "Jäsenlista"; } // "Member List"
 
     /*! this is the first part of a sentence that is followed by a class name */
     virtual QCString trThisIsTheListOfAllMembers()
-    { return "T�m� on lista kaikista j�senist�"; } // "This is the complete list of members for "
+    { return "Tämä on lista kaikista jäsenistä"; } // "This is the complete list of members for "
 
     /*! this is the remainder of the sentence after the class name */
     virtual QCString trIncludingInheritedMembers()
-    { return ", sis�lt�en kaikki perityt j�senet."; } // ", including all inherited members."
+    { return ", sisältäen kaikki perityt jäsenet."; } // ", including all inherited members."
 
     /*! this is put at the author sections at the bottom of man pages.
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
     { QCString result=(QCString)"Automaattisesti generoitu Doxygenilla "
-                      "l�hdekoodista projektille "+s; // "Generated automatically by Doxygen" ... "for" ... "from the sourcecode"
+                      "lähdekoodista projektille "+s; // "Generated automatically by Doxygen" ... "for" ... "from the sourcecode"
       //if (s) result+=(QCString)" voor "+s;
-      // t�ss� on ongelma, kuinka taivuttaa parametria, esim. "Jcad"+"in"; "IFC2VRML konversio"+"n"
-      // mutta ratkaistaan ongelma k�tev�sti kaksoispisteell� -> "Jcad:n" / "IFC2VRML konversio:n"
-      // lopputulos on v�hemm�n k�kk� ja t�ysin luettava, mutta ei kuitenkaan t�ydellinen.
+      // tässä on ongelma, kuinka taivuttaa parametria, esim. "Jcad"+"in"; "IFC2VRML konversio"+"n"
+      // mutta ratkaistaan ongelma kätevästi kaksoispisteellä -> "Jcad:n" / "IFC2VRML konversio:n"
+      // lopputulos on vähemmän kökkö ja täysin luettava, mutta ei kuitenkaan täydellinen.
       //
-      // kierret��n ongelma taivuttamalla sanaa projekti :)
+      // kierretään ongelma taivuttamalla sanaa projekti :)
       return result;
     }
 
@@ -213,7 +216,7 @@ class TranslatorFinnish : public Translator
 
     /*! put after an undocumented member in the list of all members */
     virtual QCString trDefinedIn()
-    { return "m��ritelty"; } // "defined in"
+    { return "määritelty"; } // "defined in"
 
     // quick reference sections
 
@@ -249,11 +252,11 @@ class TranslatorFinnish : public Translator
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Tietueen kent�t"; // "Data Fields" 
+        return "Tietueen kentät"; // "Data Fields" 
       }
       else
       {
-        return "Luokan j�senet"; // "Class Members"
+        return "Luokan jäsenet"; // "Class Members"
       }
     }
     
@@ -266,13 +269,13 @@ class TranslatorFinnish : public Translator
       }
       else
       {
-        return "Tiedoston j�senet"; // "File Members"
+        return "Tiedoston jäsenet"; // "File Members"
       }
     }
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
-    { return "Liittyv�t sivut"; } // "Related Pages"
+    { return "Liittyvät sivut"; } // "Related Pages"
    
     /*! This is put above each page as a link to all examples. */ 
     virtual QCString trExamples()
@@ -284,14 +287,14 @@ class TranslatorFinnish : public Translator
    
     /*! This is an introduction to the class hierarchy. */ 
     virtual QCString trClassHierarchyDescription()
-    { return "T�m� periytymislista on p��tasoltaan aakkostettu " // "This inheritance list is sorted roughly, "
-             "mutta alij�senet on aakkostettu itsen�isesti:"; // "but not completely, alphabetically:";
+    { return "Tämä periytymislista on päätasoltaan aakkostettu " // "This inheritance list is sorted roughly, "
+             "mutta alijäsenet on aakkostettu itsenäisesti:"; // "but not completely, alphabetically:";
     }
 
     /*! This is an introduction to the list with all files. */
     virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista ";
+      QCString result="Tässä on lista kaikista ";
       if (!extractAll) result+="dokumentoiduista "; // "documented "
       result+="tiedostoista lyhyen selitteen kera:"; // "files with brief descriptions:"
       return result;
@@ -303,11 +306,11 @@ class TranslatorFinnish : public Translator
     
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "T�ll� ovat tietueet lyhyen selitteen kera:"; // "Here are the data structures with brief descriptions:"
+        return "Tässä ovat tietueet lyhyen selitteen kera:"; // "Here are the data structures with brief descriptions:"
       }
       else
       {
-        return "T�ss� ovat luokat, tietueet ja " // "Here are the classes, structs and "
+        return "Tässä ovat luokat, tietueet ja " // "Here are the classes, structs and "
              "yhdisteet lyhyen selitteen kera:"; // "unions with brief descriptions:"
       }
     }
@@ -315,29 +318,29 @@ class TranslatorFinnish : public Translator
     /*! This is an introduction to the page with all class members. */
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll)
       {
         result+="dokumentoiduista "; // "documented "
       }
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        result+="tietuiden ja yhdisteiden kentist�"; // "struct and union fields"
+        result+="tietuiden ja yhdisteiden kentistä"; // "struct and union fields"
       }
       else
       {
-        result+="luokkien j�senist�"; // "class members"
+        result+="luokkien jäsenistä"; // "class members"
       }
-      result+=" linkitettyin� "; // " with links to "
+      result+=" linkitettyinä "; // " with links to "
       if (!extractAll) 
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
-          result+="jokaisen kent�n tietueen/yhdisteen dokumentaatioon:"; // "the struct/union documentation for each field:"
+          result+="jokaisen kentän tietueen/yhdisteen dokumentaatioon:"; // "the struct/union documentation for each field:"
         }
         else
         {
-          result+="jokaisen j�senen luokkadokumentaatioon:"; // "the class documentation for each member:"
+          result+="jokaisen jäsenen luokkadokumentaatioon:"; // "the class documentation for each member:"
         }
       }
       else 
@@ -357,18 +360,18 @@ class TranslatorFinnish : public Translator
     /*! This is an introduction to the page with all file members. */
     virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll) result+="dokumentoiduista "; // "documented "
       
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        result+="funktioista, muuttujista, m��rittelyist�, luetteloista ja tyyppim��rittelyist�"; // "functions, variables, defines, enums, and typedefs"
+        result+="funktioista, muuttujista, määrittelyistä, luetteloista ja tyyppimäärittelyistä"; // "functions, variables, defines, enums, and typedefs"
       }
       else
       {
-        result+="tiedoston j�senist�"; // "file members"
+        result+="tiedoston jäsenistä"; // "file members"
       }
-      result+=" linkitettyin� "; // " with links to "
+      result+=" linkitettyinä "; // " with links to "
       if (extractAll) 
         result+="tiedostoon, johon ne kuuluvat:"; // "the files they belong to:"
       else 
@@ -378,15 +381,15 @@ class TranslatorFinnish : public Translator
     
     /*! This is an introduction to the page with the list of all examples */
     virtual QCString trExamplesDescription()
-    { return "T�ss� on lista kaikista esimerkeist�:"; } //  "Here is a list of all examples:"
+    { return "Tässä on lista kaikista esimerkeistä:"; } //  "Here is a list of all examples:"
    
     /*! This is an introduction to the page with the list of related pages */ 
     virtual QCString trRelatedPagesDescription()
-    { return "T�ss� on lista kaikista liittyvist� dokumentaatiosivuista:"; } // "Here is a list of all related documentation pages:"
+    { return "Tässä on lista kaikista liittyvistä dokumentaatiosivuista:"; } // "Here is a list of all related documentation pages:"
    
     /*! This is an introduction to the page with the list of class/file groups */ 
     virtual QCString trModulesDescription()
-    { return "T�ss� on lista kaikista moduleista:"; } // "Here is a list of all modules:"
+    { return "Tässä on lista kaikista moduleista:"; } // "Here is a list of all modules:"
     
     // index titles (the project name is prepended for these) 
     
@@ -468,13 +471,13 @@ class TranslatorFinnish : public Translator
     
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
-    { return "K�sikirja"; } // "Reference Manual"
+    { return "Käsikirja"; } // "Reference Manual"
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of defines
      */
     virtual QCString trDefines()
-    { return "M��rittelyt"; } // "Defines"
+    { return "Määrittelyt"; } // "Defines"
     
     /*! This is used in the documentation of a file as a header before the 
      *  list of function prototypes
@@ -486,7 +489,7 @@ class TranslatorFinnish : public Translator
      *  list of typedefs
      */
     virtual QCString trTypedefs()
-    { return "Tyyppim��rittelyt"; } // "Typedefs"
+    { return "Tyyppimäärittelyt"; } // "Typedefs"
     
     /*! This is used in the documentation of a file as a header before the 
      *  list of enumerations
@@ -516,7 +519,7 @@ class TranslatorFinnish : public Translator
      *  documentation blocks for defines
      */
     virtual QCString trDefineDocumentation()
-    { return "M��ritysten dokumentointi"; } // "Define Documentation"
+    { return "Määritysten dokumentointi"; } // "Define Documentation"
     
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for function prototypes
@@ -528,7 +531,7 @@ class TranslatorFinnish : public Translator
      *  of documentation blocks for typedefs
      */
     virtual QCString trTypedefDocumentation()
-    { return "Tyyppim��ritysten dokumentaatio"; } // "Typedef Documentation"
+    { return "Tyyppimääritysten dokumentaatio"; } // "Typedef Documentation"
     
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for enumeration types
@@ -568,7 +571,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trGeneratedAt(const char *date,const char *projName)
     { 
-        // funktio on hiukan vaikea k��nt�� prepositioihin sidotun rakenteen vuoksi.
+        // funktio on hiukan vaikea kääntää prepositioihin sidotun rakenteen vuoksi.
         // Muutetaan siis lauserakennetta suomalaisemmaksi
         // Generated on $date for $project by:
         // -> Generated for $project on $date by:
@@ -592,7 +595,7 @@ class TranslatorFinnish : public Translator
 
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
-    { return "Vain sis�iseen k�ytt��n."; } // "For internal use only."
+    { return "Vain sisäiseen käyttöön."; } // "For internal use only."
     
     /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
@@ -604,7 +607,7 @@ class TranslatorFinnish : public Translator
     
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
-    { return "P�iv�ys"; } // "Date"
+    { return "Päiväys"; } // "Date"
     
     /*! this text is generated when the \\return command is used. */
     virtual QCString trReturns()
@@ -612,7 +615,7 @@ class TranslatorFinnish : public Translator
     
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return "Katso my�s"; } // "See also"
+    { return "Katso myös"; } // "See also"
     
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
@@ -637,7 +640,7 @@ class TranslatorFinnish : public Translator
     /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll) result+="dokumentoiduista "; // "documented "
       result+="nimiavaruuksista lyhyen selitteen kera:"; // "namespaces with brief descriptions:"
       return result;
@@ -647,7 +650,7 @@ class TranslatorFinnish : public Translator
      *  friends of a class
      */
     virtual QCString trFriends()
-    { return "Yst�v�t"; } // "Friends"
+    { return "Ystävät"; } // "Friends"
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990405
@@ -657,7 +660,7 @@ class TranslatorFinnish : public Translator
      * related classes 
      */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Yst�v�t ja niihin liittyvien funktioiden dokumentaatio"; } // "Friends And Related Function Documentation"
+    { return "Ystävät ja niihin liittyvien funktioiden dokumentaatio"; } // "Friends And Related Function Documentation"
     
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
@@ -671,13 +674,13 @@ class TranslatorFinnish : public Translator
       QCString result=(QCString)clName;
       switch(compType)
       {
-        case ClassDef::Class:      result+=" Luokka"; break; // " Class"
-        case ClassDef::Struct:     result+=" Tietue"; break; // " Struct"
-        case ClassDef::Union:      result+=" Yhdiste"; break; // " Union"
-        case ClassDef::Interface:  result+=" Rajapinta"; break; // " Interface"
-        case ClassDef::Protocol:   result+=" Protokolla"; break; // " Protocol"
-        case ClassDef::Category:   result+=" Kategoria"; break; // " Category"
-        case ClassDef::Exception:  result+=" Poikkeus"; break; // " Exception"
+        case ClassDef::Class:      result+=" luokka"; break; // " Class"
+        case ClassDef::Struct:     result+=" tietue"; break; // " Struct"
+        case ClassDef::Union:      result+=" yhdiste"; break; // " Union"
+        case ClassDef::Interface:  result+=" rajapinta"; break; // " Interface"
+        case ClassDef::Protocol:   result+=" protokolla"; break; // " Protocol"
+        case ClassDef::Category:   result+=" kategoria"; break; // " Category"
+        case ClassDef::Exception:  result+=" poikkeus"; break; // " Exception"
       }
       if (isTemplate) result+="malli"; // " Template"
       result+="referenssi"; // " Reference"
@@ -688,7 +691,7 @@ class TranslatorFinnish : public Translator
     virtual QCString trFileReference(const char *fileName)
     {
       QCString result=fileName;
-      result+=" Tiedostoreferenssi"; // " File Reference"
+      result+=" tiedostoreferenssi"; // " File Reference"
       return result;
     }
     
@@ -696,30 +699,30 @@ class TranslatorFinnish : public Translator
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+=" Nimiavaruusreferenssi"; // " Namespace Reference"
+      result+=" nimiavaruusreferenssi"; // " Namespace Reference"
       return result;
     }
     
     virtual QCString trPublicMembers()
-    { return "Julkiset j�senfunktiot"; } // "Public Member Functions"
+    { return "Julkiset jäsenfunktiot"; } // "Public Member Functions"
     virtual QCString trPublicSlots()
     { return "Julkiset vastineet"; } // "Public Slots"
     virtual QCString trSignals()
     { return "Signaalit"; } // "Signals"
     virtual QCString trStaticPublicMembers()
-    { return "Staattiset julkiset j�senfunktiot"; } // "Static Public Member Functions"
+    { return "Staattiset julkiset jäsenfunktiot"; } // "Static Public Member Functions"
     virtual QCString trProtectedMembers()
-    { return "Suojatut j�senfunktiot"; } // "Protected Member Functions"
+    { return "Suojatut jäsenfunktiot"; } // "Protected Member Functions"
     virtual QCString trProtectedSlots()
     { return "Suojatut vastineet"; } // "Protected Slots"
     virtual QCString trStaticProtectedMembers()
-    { return "Staattiset suojatut j�senfunktiot"; } // "Static Protected Member Functions"
+    { return "Staattiset suojatut jäsenfunktiot"; } // "Static Protected Member Functions"
     virtual QCString trPrivateMembers()
-    { return "Yksityiset j�senfunktiot"; } // "Private Member Functions"
+    { return "Yksityiset jäsenfunktiot"; } // "Private Member Functions"
     virtual QCString trPrivateSlots()
     { return "Yksityiset vastineet"; } // "Private Slots"
     virtual QCString trStaticPrivateMembers()
-    { return "Staattiset yksityiset j�senfunktiot"; } // "Static Private Member Functions"
+    { return "Staattiset yksityiset jäsenfunktiot"; } // "Static Private Member Functions"
 
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
@@ -751,7 +754,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trInheritsList(int numEntries)
     {
-      return "Perij�t "+trWriteList(numEntries)+"."; // "Inherits "
+      return (QCString)"Periytyy "+(numEntries > 1 ? "luokista " : "luokasta ")+trWriteList(numEntries)+"."; // "Inherits "
     }
     
     /*! used in class documentation to produce a list of super classes,
@@ -759,7 +762,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trInheritedByList(int numEntries)
     {
-      return "Periytyy "+trWriteList(numEntries)+"."; // "Inherited by "
+      return (QCString)"Periytetään "+(numEntries > 1 ? "luokissa " : "luokassa ")+trWriteList(numEntries)+"."; // "Inherited by "
     }
     
     /*! used in member documentation blocks to produce a list of 
@@ -767,7 +770,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trReimplementedFromList(int numEntries)
     {
-      return "Uudelleen toteutettaa "+trWriteList(numEntries)+"."; // "Reimplemented from "
+      return (QCString)"Uudelleen toteuttaa "+(numEntries > 1 ? "luokat " : "luokan  ")+trWriteList(numEntries)+"."; // "Reimplemented from "
     }
     
     /*! used in member documentation blocks to produce a list of
@@ -775,19 +778,19 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trReimplementedInList(int numEntries)
     {
-      return "Uudelleen toteutettu "+trWriteList(numEntries)+"."; // "Reimplemented in "
+      return (QCString)"Uudelleen toteutettu "+(numEntries > 1 ? "luokissa " : "luokassa ")+trWriteList(numEntries)+"."; // "Reimplemented in "
     }
 
     /*! This is put above each page as a link to all members of namespaces. */
     virtual QCString trNamespaceMembers()
-    { return "Nimiavaruuden j�senet"; } // "Namespace Members"
+    { return "Nimiavaruuden jäsenet"; } // "Namespace Members"
     
     /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     { 
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll) result+="dokumentoiduista "; // "documented "
-      result+="nimiavaruuden j�senist� linkitettyn� "; // "namespace members with links to "
+      result+="nimiavaruuden jäsenistä linkitettynä "; // "namespace members with links to "
       if (extractAll) 
         result+="nimiavaruuden dokumentaatioon johon ne kuuluvat:"; // "the namespace documentation for each member:";
       else 
@@ -827,7 +830,7 @@ class TranslatorFinnish : public Translator
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"Dokumentaatio t�lle "; // "The documentation for this "
+      QCString result=(QCString)"Dokumentaatio tälle "; // "The documentation for this "
       switch(compType)
       {
         case ClassDef::Class:      result+="luokalle"; break; // "class"
@@ -860,7 +863,7 @@ class TranslatorFinnish : public Translator
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return "P��sivu"; } // "Main Page"
+    { return "Pääsivu"; } // "Main Page"
 
     /*! This is used in references to page that are put in the LaTeX 
      *  documentation. It should be an abbreviation of the word page.
@@ -874,11 +877,11 @@ class TranslatorFinnish : public Translator
 
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "M��rittely tiedoston @1 rivill� @0."; //  "Definition at line @0 of file @1."
+      return "Määrittely tiedoston @1 rivillä @0."; //  "Definition at line @0 of file @1."
     }
     virtual QCString trDefinedInSourceFile()
     {
-      return "M��rittely tiedostossa @0."; // "Definition in file @0."
+      return "Määrittely tiedostossa @0."; // "Definition in file @0."
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -897,12 +900,12 @@ class TranslatorFinnish : public Translator
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Yhteisty�kaavio luokalle "+clName+":"; // "Collaboration diagram for "+clName+":"
+      return (QCString)"Yhteistyökaavio luokalle "+clName+":"; // "Collaboration diagram for "+clName+":"
     }
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Sis�llytysriippuvuuskaavio tiedostolle "+fName+":"; // "Include dependency graph for "+fName+":"
+      return (QCString)"Sisällytysriippuvuuskaavio tiedostolle "+fName+":"; // "Include dependency graph for "+fName+":"
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
@@ -912,12 +915,12 @@ class TranslatorFinnish : public Translator
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return "Siirry t�m�n tiedoston l�hdekoodiin."; // "Go to the source code of this file."
+      return "Siirry tämän tiedoston lähdekoodiin."; // "Go to the source code of this file."
     }
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "Mene t�m�n tiedoston dokumentaatioon."; // "Go to the documentation of this file."
+      return "Mene tämän tiedoston dokumentaatioon."; // "Go to the documentation of this file."
     }
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
@@ -927,12 +930,12 @@ class TranslatorFinnish : public Translator
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return "J�lkiehto"; // "Postcondition"
+      return "Jälkiehto"; // "Postcondition"
     }
     /*! Text for the \\invariant command */
     virtual QCString trInvariant()
     {
-      return "Invariantti"; // vai "Pysyv�isv�itt�m�"? "Invariant"
+      return "Invariantti"; // vai "Pysyväisväittämä"? "Invariant"
     }
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
@@ -950,7 +953,7 @@ class TranslatorFinnish : public Translator
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "Siirry graafiseen luokkahiearkiaan"; // "Go to the graphical class hierarchy"
+      return "Siirry graafiseen luokkahierarkiaan"; // "Go to the graphical class hierarchy"
     }
     virtual QCString trGotoTextualHierarchy()
     {
@@ -967,7 +970,7 @@ class TranslatorFinnish : public Translator
     
     virtual QCString trNote()
     {
-        // FIXME: Miss�h�n merkityksess� t�t� k�ytet��n?
+        // FIXME: Missähän merkityksessä tätä käytetään?
       return "Huomautus"; // "Note"
     }
     virtual QCString trPublicTypes()
@@ -978,7 +981,7 @@ class TranslatorFinnish : public Translator
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Tietueen kent�t"; // "Data Fields"
+        return "Tietueen kentät"; // "Data Fields"
       }
       else
       {
@@ -999,7 +1002,7 @@ class TranslatorFinnish : public Translator
     }
     virtual QCString trStaticProtectedAttribs()
     {
-      return "Stattiset suojellut attribuutit"; // "Static Protected Attributes"
+      return "Staattiset suojellut attribuutit"; // "Static Protected Attributes"
     }
     virtual QCString trPrivateTypes()
     {
@@ -1021,12 +1024,12 @@ class TranslatorFinnish : public Translator
     /*! Used as a marker that is put before a \\todo item */
     virtual QCString trTodo()
     {
-      return "Viel� teht�v�"; // "Todo"
+      return "Vielä tehtävä"; // "Todo"
     }
     /*! Used as the header of the todo list */
     virtual QCString trTodoList()
     {
-      return "Teht�v�lista"; // "Todo List"
+      return "Tehtävälista"; // "Todo List"
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1047,15 +1050,15 @@ class TranslatorFinnish : public Translator
     }
     virtual QCString trInclByDepGraph()
     {
-      return "T�m� kaavio n�ytt��, mitk� tiedostot suorasti"
-             "tai ep�suorasti sis�llytt�v�t t�m�n tiedoston";
+      return "Tämä kaavio näyttää, mitkä tiedostot suorasti"
+             "tai epäsuorasti sisällyttävät tämän tiedoston";
              // "This graph shows which files directly or "
              // "indirectly include this file:"
     }
     virtual QCString trSince()
     {
-        // FIXME: Miss� merkityksess� t�t� k�ytet��n?
-      return "L�htien"; // "Since"
+        // FIXME: Missä merkityksessä tätä käytetään?
+      return "Lähtien"; // "Since"
     }
     
 //////////////////////////////////////////////////////////////////////////
@@ -1073,13 +1076,13 @@ class TranslatorFinnish : public Translator
     virtual QCString trLegendDocs()
     {
       return 
-        "T�m� sivu selitt��, kuinka doxygenin generoimia kaavioita tulkitaan.<p>\n"
+        "Tämä sivu selittää, kuinka doxygenin generoimia kaavioita tulkitaan.<p>\n"
         // "This page explains how to interpret the graphs that are generated "
         // "by doxygen.<p>\n"
-        "Ajattele seuraavaa esimerkki�:\n"
+        "Ajattele seuraavaa esimerkkiä:\n"
         // "Consider the following example:\n"
         "\\code\n"
-        "/*! N�kym�t�n luokka katkaisun vuoksi */\n"
+        "/*! Näkymätön luokka katkaisun vuoksi */\n"
         // "/*! Invisible class because of truncation */\n"
         "class Nakymaton { };\n\n"
         // "class Invisible { };\n\n"
@@ -1089,9 +1092,9 @@ class TranslatorFinnish : public Translator
         // "class Truncated : public Invisible { };\n\n"
         "/* Luokkaa ei ole dokumentoitu doxygen-kommenteilla */\n"
         // "/* Class not documented with doxygen comments */\n"
-        "class Dokumentoimaton {�};\n\n"
+        "class Dokumentoimaton { };\n\n"
         // "class Undocumented { };\n\n"
-        "/*! Julkista periytt�mist� k�ytt�en periytetty luokka */\n"
+        "/*! Julkista periyttämistä käyttäen periytetty luokka */\n"
         // "/*! Class that is inherited using public inheritance */\n"
         "class JulkinenKanta : public Katkaistu { };\n\n"
         // "class PublicBase : public Truncated { };\n\n"
@@ -1099,15 +1102,15 @@ class TranslatorFinnish : public Translator
         // "/*! A template class */\n"
         "template<class T> class Malli { };\n\n"
         // "template<class T> class Templ { };\n\n"
-        "/*! Suojeltua periytymist� k�ytt�en periytetty luokka */\n"
+        "/*! Suojeltua periytymistä käyttäen periytetty luokka */\n"
         // "/*! Class that is inherited using protected inheritance */\n"
         "class SuojeltuKanta { };\n\n"
         // "class ProtectedBase { };\n\n"
-        "/*! Yksityist� periytymist� k�ytt�en periytetty luokka */\n"
+        "/*! Yksityistä periytymistä käyttäen periytetty luokka */\n"
         // "/*! Class that is inherited using private inheritance */\n"
         "class YksityisKanta { };\n\n"
         // "class PrivateBase { };\n\n"
-        "/*! Luokka jota periytetty luokka k�ytt�� */\n"
+        "/*! Luokka jota periytetty luokka käyttää */\n"
         // "/*! Class that is used by the Inherited class */\n"
         "class Kaytetty { };\n\n"
         // "class Used { };\n\n"
@@ -1132,16 +1135,14 @@ class TranslatorFinnish : public Translator
         // "    Used *m_usedClass;\n"
         // "};\n"
         "\\endcode\n"
-        "Jos \\c MAX_DOT_GRAPH_HEIGHT-kentt� asetustiedostossa "
-        // "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
-        "on asetettu arvoon 240, on tuloksena seuraavanlainen kaavio:"
-        // "is set to 240 this will result in the following graph:"
+        "Tuloksena on seuraavanlainen kaavio:"
+        //"This will result in the following graph:"
         "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
-        "Yll�olevassa kaaviossa laatikoilla on seuraavat merkitykset\n:"
+        "Ylläolevassa kaaviossa laatikoilla on seuraavat merkitykset\n:"
         // "The boxes in the above graph have the following meaning:\n"
         "<ul>\n"
-        "<li>T�ytetty harmaa laatikko esitt�� tietuetta tai luokkaa, jolle "
+        "<li>Täytetty harmaa laatikko esittää tietuetta tai luokkaa, jolle "
         // "<li>%A filled gray box represents the struct or class for which the "
         "kaavio on generoitu.\n"
         // "graph is generated.\n"
@@ -1151,33 +1152,33 @@ class TranslatorFinnish : public Translator
         // "<li>%A box with a grey border denotes an undocumented struct or class.\n"
         "<li>Punareunainen laatikko merkistee dokumentoitua luokkaa tai structia "
         // "<li>%A box with a red border denotes a documented struct or class for"
-        "jolle ei n�ytet� kaikkia periytymis-/sis�llyssuhteita. Kaavio "
+        "jolle ei näytetä kaikkia periytymis-/sisällyssuhteita. Kaavio "
         // "which not all inheritance/containment relations are shown. %A graph is "
-        "katkaistaan, jos se ei mahdu m��riteltyjen rajojen sis��n.\n"
+        "katkaistaan, jos se ei mahdu määriteltyjen rajojen sisään.\n"
         // "truncated if it does not fit within the specified boundaries.\n"
         "</ul>\n"
         "Nuolilla on seuraavat merkitykset:\n"
         // "The arrows have the following meaning:\n"
         "<ul>\n"
-        "<li>Tummansinist� nuolta k�ytet��n osoittamaan julkista periytymis"
+        "<li>Tummansinistä nuolta käytetään osoittamaan julkista periytymis"
         // "<li>%A dark blue arrow is used to visualize a public inheritance "
-        "suhdetta kahden luokan v�lill�.\n"
+        "suhdetta kahden luokan välillä.\n"
         // "relation between two classes.\n"
-        "<li>Tummanvihre�� nuolta k�ytet��n suojellussa periytymisess�.\n"
+        "<li>Tummanvihreää nuolta käytetään suojellussa periytymisessä.\n"
         // "<li>%A dark green arrow is used for protected inheritance.\n"
-        "<li>Tummanpunaista nuolta k�ytet��n yksityisess� periytymisess�.\n"
+        "<li>Tummanpunaista nuolta käytetään yksityisessä periytymisessä.\n"
         // "<li>%A dark red arrow is used for private inheritance.\n"
-        "<li>Purppuranv�rist� katkoviivaa k�ytet��n, jos luokka sis�ltyy tai "
+        "<li>Purppuranväristä katkoviivaa käytetään, jos luokka sisältyy tai "
         // "<li>%A purple dashed arrow is used if a class is contained or used "
-        "on toisen luokan k�ytt�m�. Nuoli nimet��n sill� muuttujalla/muuttujilla "
+        "on toisen luokan käyttämä. Nuoli nimetään sillä muuttujalla/muuttujilla "
         // "by another class. The arrow is labeled with the variable(s) "
-        "jonka l�pi osoitettua luokkaa tai tietuetta k�ytet��n.\n"
+        "jonka läpi osoitettua luokkaa tai tietuetta käytetään.\n"
         // "through which the pointed class or struct is accessible.\n"
-        "<li>Keltainen katkoviivalla piirretty nuoli merkitsee suhdetta mallin esiintym�n ja "
+        "<li>Keltainen katkoviivalla piirretty nuoli merkitsee suhdetta mallin esiintymän ja "
         // "<li>%A yellow dashed arrow denotes a relation between a template instance and "
-        "malliluokan v�lill�. Nuoli nimet��n "
+        "malliluokan välillä. Nuoli nimetään "
         // "the template class it was instantiated from. The arrow is labeled with "
-        "mallin esiintym�n malliparametrilla.\n"
+        "mallin esiintymän malliparametrilla.\n"
         // "the template parameters of the instance.\n"
         "</ul>\n";
     }
@@ -1209,7 +1210,7 @@ class TranslatorFinnish : public Translator
     /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return "DCOP-j�senfunktiot"; // "DCOP Member Functions"
+      return "DCOP-jäsenfunktiot"; // "DCOP Member Functions"
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1256,7 +1257,7 @@ class TranslatorFinnish : public Translator
     /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-      return "T�ss� ovat paketit lyhyiden selitysten kanssa (jos saatavilla):"; // "Here are the packages with brief descriptions (if available):"
+      return "Tässä ovat paketit lyhyiden selitysten kanssa (jos saatavilla):"; // "Here are the packages with brief descriptions (if available):"
     }
     /*! The link name in the Quick links header for each page */
     virtual QCString trPackages()
@@ -1372,7 +1373,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trGroup(bool first_capital, bool singular)
     { 
-      QCString result((first_capital ? "Ryhm�" : "ryhm�")); // "Group" / "group"
+      QCString result((first_capital ? "Ryhmä" : "ryhmä")); // "Group" / "group"
       if (!singular)  result+="t"; // "+s"
       return result; 
     }
@@ -1394,7 +1395,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trMember(bool first_capital, bool singular)
     { 
-      QCString result((first_capital ? "J�sen" : "j�sen")); // "Member" / "member"
+      QCString result((first_capital ? "Jäsen" : "jäsen")); // "Member" / "member"
       if (!singular)  result+="et"; // "+s"
       return result; 
     }
@@ -1418,7 +1419,7 @@ class TranslatorFinnish : public Translator
      *  for the author section in man pages. */
     virtual QCString trAuthor(bool first_capital, bool singular)
     {                                                                         
-      QCString result((first_capital ? "Tekij�" : "tekij�")); // "Author" / "author"
+      QCString result((first_capital ? "Tekijä" : "tekijä")); // "Author" / "author"
       if (!singular)  result+="t"; // "+s"
       return result; 
     }
@@ -1443,7 +1444,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trImplementedFromList(int numEntries)
     {
-      return "Toteuttaa "+trWriteList(numEntries)+"."; // "Implements "
+      return "Toteuttaa luokan "+trWriteList(numEntries)+"."; // "Implements "
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -1451,7 +1452,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trImplementedInList(int numEntries)
     {
-      return "Toteutettu "+trWriteList(numEntries)+"."; // "Implemented in "
+      return "Toteutettu luokassa "+trWriteList(numEntries)+"."; // "Implemented in "
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1463,7 +1464,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trRTFTableOfContents()
     {
-      return "Sis�llysluettelo"; // "Table of Contents"
+      return "Sisällysluettelo"; // "Table of Contents"
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1548,7 +1549,7 @@ class TranslatorFinnish : public Translator
     /*! Put in front of the call graph for a function. */
     virtual QCString trCallGraph()
     {
-      return "T�ss� on kutsukaavio t�lle funktiolle:"; // "Here is the call graph for this function:"
+      return "Tässä on kutsukaavio tälle funktiolle:"; // "Here is the call graph for this function:"
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1582,16 +1583,16 @@ class TranslatorFinnish : public Translator
     {
       if (numDocuments==0)
       {
-        return "Valitettavasti yksik��n dokumentti ei vastannut hakuasi."; // "Sorry, no documents matching your query."
+        return "Valitettavasti yksikään dokumentti ei vastannut hakuasi."; // "Sorry, no documents matching your query."
       }
       else if (numDocuments==1)
       {
-        return "L�ytyi <b>1</b> dokumentti, joka vastasi hakuasi."; // "Found <b>1</b> document matching your query.";
+        return "Löytyi <b>1</b> dokumentti, joka vastasi hakuasi."; // "Found <b>1</b> document matching your query.";
       }
       else 
       {
-        return "L�ytyi <b>$num dokumenttia, jotka vastasivat hakuasi. " // "Found <b>$num</b> documents matching your query. "
-                "Parhaat tulokset n�ytet��n ensin."; // "Showing best matches first."
+        return "Löytyi <b>$num dokumenttia, jotka vastasivat hakuasi. " // "Found <b>$num</b> documents matching your query. "
+                "Parhaat tulokset näytetään ensin."; // "Showing best matches first."
       }
     }
     /*! This string is put before the list of matched words, for each search 
@@ -1610,7 +1611,7 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trSourceFile(QCString& filename)
     {
-      return filename + " l�hdekooditiedosto"; // " Source File"
+      return filename + " lähdekooditiedosto"; // " Source File"
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1639,7 +1640,7 @@ class TranslatorFinnish : public Translator
      *  and the fact that it is sorted alphabetically per level
      */
     virtual QCString trDirDescription()
-    { return "T�m� hakemistohierarkia on j�rjestetty aakkosellisesti tasoittain:";
+    { return "Tämä hakemistohierarkia on järjestetty aakkosellisesti tasoittain:";
              //This directory hierarchy is sorted roughly, "
              // "but not completely, alphabetically:";
     }
@@ -1648,7 +1649,7 @@ class TranslatorFinnish : public Translator
      *  directory is passed via \a dirName.
      */
     virtual QCString trDirReference(const char *dirName)
-    { QCString result=dirName; result+=" Hakemistoreferenssi"; return result; }
+    { QCString result=dirName; result+=" hakemistoreferenssi"; return result; }
         // " Directory Reference"
 
     /*! This returns the word directory with or without starting capital
@@ -1670,9 +1671,9 @@ class TranslatorFinnish : public Translator
      */
     virtual QCString trOverloadText()
     {
-       return "T�m� on ylikuormitettu j�senfunktio, ja se tarjotaan "
-              "k�yt�n helpottamiseksi. Se eroaa yll�olevasta "
-              "funktiosta ainoastaan hyv�ksymilt� parametreiltaan.";
+       return "Tämä on ylikuormitettu jäsenfunktio, ja se tarjotaan "
+              "käytön helpottamiseksi. Se eroaa ylläolevasta "
+              "funktiosta ainoastaan hyväksymiltä parametreiltaan.";
               // "This is an overloaded member function, "
               // "provided for convenience. It differs from the above "
               // "function only in what argument(s) it accepts."
@@ -1685,7 +1686,7 @@ class TranslatorFinnish : public Translator
     /*! This is used to introduce a caller (or called-by) graph */
     virtual QCString trCallerGraph()
     {
-      return "T�ss� on kutsukaavio t�lle funktiolle:"; // "Here is the caller graph for this function:"
+      return "Tässä on kutsukaavio tälle funktiolle:"; // "Here is the caller graph for this function:"
     }
 
     /*! This is used in the documentation of a file/namespace before the list 
@@ -1700,7 +1701,7 @@ class TranslatorFinnish : public Translator
     
     /*! header that is put before the list of member subprograms (Fortran). */
     virtual QCString trMemberFunctionDocumentationFortran()
-    { return "J�senfunktioiden/aliohjelmien dokumentaatio"; } // "Member Function/Subroutine Documentation"
+    { return "Jäsenfunktioiden/aliohjelmien dokumentaatio"; } // "Member Function/Subroutine Documentation"
 
     /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
     virtual QCString trCompoundListFortran()
@@ -1708,25 +1709,25 @@ class TranslatorFinnish : public Translator
 
     /*! This is put above each page as a link to all members of compounds (Fortran). */
     virtual QCString trCompoundMembersFortran()
-    { return "Kent�t"; } // "Data Fields";
+    { return "Kentät"; } // "Data Fields";
 
     /*! This is an introduction to the annotated compound list (Fortran). */
     virtual QCString trCompoundListDescriptionFortran()
-    { return "T�ss� ovat tietotyypit lyhyill� selityksill�:"; } // "Here are the data types with brief descriptions:"
+    { return "Tässä ovat tietotyypit lyhyillä selityksillä:"; } // "Here are the data types with brief descriptions:"
 
     /*! This is an introduction to the page with all data types (Fortran). */
     virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll)
       {
         result+="dokumentoiduista "; // "documented "
       }
-      result+="tietotyyppien j�senist�"; // "data types members"
-      result+=", sek� linkit "; // " with links to "
+      result+="tietotyyppien jäsenistä"; // "data types members"
+      result+=", sekä linkit "; // " with links to "
       if (!extractAll) 
       {
-         result+="tietueen dokumentaatioon jokaiselle j�senelle"; // "the data structure documentation for each member"
+         result+="tietueen dokumentaatioon jokaiselle jäsenelle"; // "the data structure documentation for each member"
       }
       else 
       {
@@ -1772,9 +1773,9 @@ class TranslatorFinnish : public Translator
     /*! used as an introduction to the modules list (Fortran) */
     virtual QCString trModulesListDescription(bool extractAll)
     {
-      QCString result="T�ss� on lista kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista kaikista "; // "Here is a list of all "
       if (!extractAll) result+="dokumentoiduista "; // "documented "
-      result+="moduuleista lyhill� selityksill�:"; // "modules with brief descriptions:"
+      result+="moduuleista lyhillä selityksillä:"; // "modules with brief descriptions:"
       return result;
     }
 
@@ -1786,13 +1787,13 @@ class TranslatorFinnish : public Translator
       QCString result=(QCString)clName;
       switch(compType)
       {
-        case ClassDef::Class:      result+=" Moduuli"; break; // " Module"
-        case ClassDef::Struct:     result+=" Tyyppi"; break; // " Type"
-        case ClassDef::Union:      result+=" Yhdiste"; break; // " Union"
-        case ClassDef::Interface:  result+=" Rajapinta"; break; // " Interface"
-        case ClassDef::Protocol:   result+=" Protokolla"; break; // " Protocol"
-        case ClassDef::Category:   result+=" Kategoria"; break; // " Category"
-        case ClassDef::Exception:  result+=" Poikkeus"; break; // " Exception"
+        case ClassDef::Class:      result+=" moduuli"; break; // " Module"
+        case ClassDef::Struct:     result+=" tyyppi"; break; // " Type"
+        case ClassDef::Union:      result+=" yhdiste"; break; // " Union"
+        case ClassDef::Interface:  result+=" rajapinta"; break; // " Interface"
+        case ClassDef::Protocol:   result+=" protokolla"; break; // " Protocol"
+        case ClassDef::Category:   result+=" kategoria"; break; // " Category"
+        case ClassDef::Exception:  result+=" poikkeus"; break; // " Exception"
       }
       if (isTemplate) result+="malli"; // " Template"
       result+="referenssi"; // " Reference"
@@ -1802,23 +1803,23 @@ class TranslatorFinnish : public Translator
     virtual QCString trModuleReference(const char *namespaceName)
     {
       QCString result=namespaceName;
-      result+=" Moduulin referenssi"; // " Module Reference"
+      result+=" moduulin referenssi"; // " Module Reference"
       return result;
     }
     
     /*! This is put above each page as a link to all members of modules. (Fortran) */
     virtual QCString trModulesMembers()
-    { return "Moduulin j�senet"; } // "Module Members"
+    { return "Moduulin jäsenet"; } // "Module Members"
 
     /*! This is an introduction to the page with all modules members (Fortran) */
     virtual QCString trModulesMemberDescription(bool extractAll)
     { 
-      QCString result="T�ss� on lista moduulin kaikista "; // "Here is a list of all "
+      QCString result="Tässä on lista moduulin kaikista "; // "Here is a list of all "
       if (!extractAll) result+="dokumentoiduista"; // "documented "
-      result+="j�senist�, sek� linkit "; // "module members with links to "
+      result+="jäsenistä, sekä linkit "; // "module members with links to "
       if (extractAll) 
       {
-        result+="moduulin dokumentaatioon jokaiselle j�senelle:"; // "the module documentation for each member:"
+        result+="moduulin dokumentaatioon jokaiselle jäsenelle:"; // "the module documentation for each member:"
       }
       else 
       {
@@ -1850,7 +1851,7 @@ class TranslatorFinnish : public Translator
         bool single)
     { // here s is one of " Module", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"Dokumentaatio t�lle "; // "The documentation for this "
+      QCString result=(QCString)"Dokumentaatio tälle "; // "The documentation for this "
       switch(compType)
       {
         case ClassDef::Class:      result+="moduulille"; break; // "module"
diff --git a/src/translator_ro.h b/src/translator_ro.h
index 7c93c87..af26d05 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -16,6 +16,7 @@
  */
 
 /* The translation from English to Romanian by Alexandru Iosup [aiosup@yahoo.com].
+ * Updated by Ionut Dumitrascu [reddumy@yahoo.com]
  *
  * Disclaimer: I hope I translated these to Romanian keeping
  * the meaning of the sentences intact. I used C-words were possible,
@@ -33,6 +34,7 @@
  *
  * Revision history
  * ----------------
+ * 28.07.2008 - Updated version - covering Doxygen 1.5.6 - and some minor changes
  * 01.Mar.2k5  Third revision, covering Doxygen 1.4.1
  *
  * 07.Mar.2k2  Second revision, covering Doxygen 1.2.14
@@ -657,13 +659,13 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
 	  QCString result="Referin�� la ";
       switch(compType)
       {
-        case ClassDef::Class:      result+="clasa"; break;
-        case ClassDef::Struct:     result+="structura"; break;
-        case ClassDef::Union:      result+="uniunea"; break;
-        case ClassDef::Interface:  result+="interfa�a"; break;
-        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
-        case ClassDef::Category:   result+="category"; break; // translate me!
-        case ClassDef::Exception:  result+="excep�ia"; break;
+        case ClassDef::Class:      result+="clasa "; break;
+        case ClassDef::Struct:     result+="structura "; break;
+        case ClassDef::Union:      result+="uniunea "; break;
+        case ClassDef::Interface:  result+="interfa�a "; break;
+        case ClassDef::Protocol:   result+="protocolul "; break;
+        case ClassDef::Category:   result+="categoria "; break;
+        case ClassDef::Exception:  result+="excep�ia "; break;
       }
 	  if (isTemplate) result+=" (Template) ";
 	  result+=(QCString)clName;
@@ -674,7 +676,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
     /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
-      QCString result="Referin�� la fi�ierul";
+      QCString result="Referin�� la fi�ierul ";
       result+=fileName;
       return result;
     }
@@ -823,8 +825,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
         case ClassDef::Struct:     result+="structur�"; break;
         case ClassDef::Union:      result+="uniune"; break;
         case ClassDef::Interface:  result+="interfa��"; break;
-        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
-        case ClassDef::Category:   result+="category"; break; // translate me!
+        case ClassDef::Protocol:   result+="protocol"; break;
+        case ClassDef::Category:   result+="categorie"; break;
         case ClassDef::Exception:  result+="excep�ie"; break;
       }
       result+=" a fost generat� din fi�ier";
@@ -1073,7 +1075,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
         "class Undocumented { };\n\n"
         "/*! Clas� care este mo�tenit� �n mod public */\n"
         "class PublicBase : public Truncated { };\n\n"
-        "/*! A template class */\n"
+        "/*! Clas� template */\n"
         "template<class T> class Templ { };\n\n"
         "/*! Clas� care este mo�tenit� �n mod protejat */\n"
         "class ProtectedBase { };\n\n"
@@ -1093,7 +1095,7 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
         "};\n"
         "\\endcode\n"
         "Dac� tagul \\c MAX_DOT_GRAPH_HEIGHT din fi�ierul de configura�ie "
-        "Este setat la 200 acesta este graful rezultat:"
+        "este setat la 200, acesta este graful rezultat:"
         "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
         "C�su�ele din partea de sus au urm�toarea semnifica�ie:\n"
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index 2906799..1ae435e 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -582,7 +582,6 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
     case MemberDef::Enumeration: memType="enum";      break;
     case MemberDef::Function:    memType="function";  isFunc=TRUE; break;
     case MemberDef::Signal:      memType="signal";    isFunc=TRUE; break;
-    case MemberDef::Prototype:   memType="prototype"; isFunc=TRUE; break;
     case MemberDef::Friend:      memType="friend";    isFunc=TRUE; break;
     case MemberDef::DCOP:        memType="dcop";      isFunc=TRUE; break;
     case MemberDef::Slot:        memType="slot";      isFunc=TRUE; break;
-- 
cgit v0.12

