From 47d9b2d70a4136d4df2a5c87ba33843b1520261b Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Sun, 22 Apr 2001 19:01:52 +0000
Subject: Release-1.2.6-20010422

---
 INSTALL                               |    4 +-
 README                                |    4 +-
 VERSION                               |    2 +-
 addon/doxywizard/Makefile.in          |    2 +-
 addon/doxywizard/doxywizard.cpp       |    2 +-
 addon/doxywizard/doxywizard.h         |    2 +-
 addon/doxywizard/doxywizard.pro.in    |    2 +-
 addon/doxywizard/doxywizard_templ.cpp |    2 +-
 addon/doxywizard/doxywizard_templ.h   |    2 +-
 addon/doxywizard/inputbool.cpp        |    2 +-
 addon/doxywizard/inputbool.h          |    2 +-
 addon/doxywizard/inputint.cpp         |    2 +-
 addon/doxywizard/inputint.h           |    2 +-
 addon/doxywizard/inputstring.cpp      |    2 +-
 addon/doxywizard/inputstring.h        |    2 +-
 addon/doxywizard/inputstrlist.cpp     |    2 +-
 addon/doxywizard/inputstrlist.h       |    2 +-
 addon/doxywizard/pagewidget.cpp       |    2 +-
 addon/doxywizard/pagewidget.h         |    2 +-
 addon/doxywizard/pixmaps.cpp          |    2 +-
 addon/doxywizard/pixmaps.h            |    2 +-
 addon/doxywizard/qtbc.h               |    2 +-
 addon/xmlgen/xml.cpp                  |   18 +-
 addon/xmlread/qtbc.h                  |    2 +-
 doc/config.doc                        |    8 +
 doc/docblocks.doc                     |   46 +-
 doc/install.doc                       |   33 +-
 doc/language.doc                      |    8 +-
 packages/rpm/doxygen.spec             |   55 +-
 qtools/Makefile.in                    |    2 +-
 qtools/qarray.h                       |    2 +-
 qtools/qasciidict.h                   |    2 +-
 qtools/qbuffer.cpp                    |    2 +-
 qtools/qbuffer.h                      |    2 +-
 qtools/qcollection.cpp                |    2 +-
 qtools/qcollection.h                  |    2 +-
 qtools/qcstring.cpp                   |    2 +-
 qtools/qcstring.h                     |    2 +-
 qtools/qdatastream.cpp                |    2 +-
 qtools/qdatastream.h                  |    2 +-
 qtools/qdatetime.cpp                  |    2 +-
 qtools/qdatetime.h                    |    2 +-
 qtools/qdict.h                        |    2 +-
 qtools/qdir.cpp                       |    2 +-
 qtools/qdir.h                         |    2 +-
 qtools/qdir_unix.cpp                  |    2 +-
 qtools/qdir_win32.cpp                 |    2 +-
 qtools/qfeatures.h                    |    2 +-
 qtools/qfile.cpp                      |    2 +-
 qtools/qfile.h                        |    2 +-
 qtools/qfile_unix.cpp                 |    2 +-
 qtools/qfile_win32.cpp                |    2 +-
 qtools/qfiledefs_p.h                  |    2 +-
 qtools/qfileinfo.cpp                  |    2 +-
 qtools/qfileinfo.h                    |    2 +-
 qtools/qfileinfo_unix.cpp             |    2 +-
 qtools/qfileinfo_win32.cpp            |    2 +-
 qtools/qgarray.cpp                    |    2 +-
 qtools/qgarray.h                      |    2 +-
 qtools/qgdict.cpp                     |    2 +-
 qtools/qgdict.h                       |    2 +-
 qtools/qgeneric.h                     |    2 +-
 qtools/qglist.cpp                     |    2 +-
 qtools/qglist.h                       |    2 +-
 qtools/qglobal.cpp                    |    2 +-
 qtools/qglobal.h                      |    2 +-
 qtools/qgvector.cpp                   |    2 +-
 qtools/qgvector.h                     |    2 +-
 qtools/qintdict.h                     |    2 +-
 qtools/qiodevice.cpp                  |    2 +-
 qtools/qiodevice.h                    |    2 +-
 qtools/qlist.h                        |    2 +-
 qtools/qmap.cpp                       |    2 +-
 qtools/qmap.h                         |    2 +-
 qtools/qptrdict.h                     |    2 +-
 qtools/qqueue.h                       |    2 +-
 qtools/qregexp.cpp                    |    2 +-
 qtools/qregexp.h                      |    2 +-
 qtools/qshared.h                      |    2 +-
 qtools/qsortedlist.h                  |    2 +-
 qtools/qstack.h                       |    2 +-
 qtools/qstring.cpp                    |    2 +-
 qtools/qstring.h                      |    2 +-
 qtools/qstringlist.cpp                |    2 +-
 qtools/qstringlist.h                  |    2 +-
 qtools/qstrlist.h                     |    2 +-
 qtools/qstrvec.h                      |    2 +-
 qtools/qtextcodec.cpp                 |    2 +-
 qtools/qtextcodec.h                   |    2 +-
 qtools/qtextstream.cpp                |    2 +-
 qtools/qtextstream.h                  |    2 +-
 qtools/qtl.h                          |    2 +-
 qtools/qvaluelist.h                   |    2 +-
 qtools/qvaluestack.h                  |    2 +-
 qtools/qvector.h                      |    2 +-
 qtools/qxml.cpp                       |    2 +-
 qtools/qxml.h                         |    2 +-
 src/classdef.cpp                      |  261 ++----
 src/classdef.h                        |    3 +-
 src/definition.cpp                    |    2 +-
 src/definition.h                      |    2 +-
 src/doc.l                             |  137 ++-
 src/doxygen.cpp                       |   24 +-
 src/filedef.cpp                       |  127 ++-
 src/filedef.h                         |   25 +-
 src/groupdef.cpp                      |  151 +--
 src/groupdef.h                        |   25 +-
 src/index.cpp                         |   14 +-
 src/language.cpp                      |    6 +-
 src/latexgen.cpp                      |   10 -
 src/memberdef.cpp                     |  765 ++++++++-------
 src/memberdef.h                       |   27 +-
 src/membergroup.cpp                   |   82 +-
 src/membergroup.h                     |   21 +-
 src/memberlist.cpp                    |  600 +++++-------
 src/memberlist.h                      |   43 +-
 src/message.cpp                       |    4 +
 src/namespacedef.cpp                  |  141 ++-
 src/namespacedef.h                    |   28 +-
 src/rtfgen.cpp                        |   16 +-
 src/scanner.l                         |   26 +-
 src/translator.h                      |   18 +
 src/translator_br.h                   |  786 +++++++++++-----
 src/translator_cz.h                   |  189 +++-
 src/translator_de.h                   |  155 ++--
 src/translator_ru.h                   | 1653 ++++++++++++++++++++-------------
 src/util.cpp                          |   91 +-
 src/util.h                            |    7 +-
 128 files changed, 3304 insertions(+), 2489 deletions(-)

diff --git a/INSTALL b/INSTALL
index 5bf3046..f11b8bd 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
-DOXYGEN Version 1.2.6-20010409
+DOXYGEN Version 1.2.6-20010422
 
 Please read the installation section of the manual for instructions.
 
 --------
-Dimitri van Heesch (09 April 2001)
+Dimitri van Heesch (22 April 2001)
diff --git a/README b/README
index afd334e..dbc2ab2 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.2.6_20010409
+DOXYGEN Version 1.2.6_20010422
 
 Please read INSTALL for compilation instructions.
 
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
 
 Enjoy,
 
-Dimitri van Heesch (09 April 2001)
+Dimitri van Heesch (22 April 2001)
diff --git a/VERSION b/VERSION
index ebc8ce8..3339dbc 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.6-20010409
+1.2.6-20010422
diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in
index 65995b5..1b56e9a 100644
--- a/addon/doxywizard/Makefile.in
+++ b/addon/doxywizard/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id$
+# 
 #
 # Copyright (C) 1997-2001 by Dimitri van Heesch.
 # 
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 8ceecbb..13d80f5 100644
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
index f78733e..be99539 100644
--- a/addon/doxywizard/doxywizard.h
+++ b/addon/doxywizard/doxywizard.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in
index 649c395..53847c2 100644
--- a/addon/doxywizard/doxywizard.pro.in
+++ b/addon/doxywizard/doxywizard.pro.in
@@ -1,5 +1,5 @@
 #
-# $Id$
+# 
 #
 # Copyright (C) 1997-2001 by Dimitri van Heesch.
 #
diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp
index 97fe34c..cafec21 100644
--- a/addon/doxywizard/doxywizard_templ.cpp
+++ b/addon/doxywizard/doxywizard_templ.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/doxywizard_templ.h b/addon/doxywizard/doxywizard_templ.h
index 4daf3fd..92e35e1 100644
--- a/addon/doxywizard/doxywizard_templ.h
+++ b/addon/doxywizard/doxywizard_templ.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp
index 4ac2f8a..c77578e 100644
--- a/addon/doxywizard/inputbool.cpp
+++ b/addon/doxywizard/inputbool.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h
index 9c2511f..2b4d869 100644
--- a/addon/doxywizard/inputbool.h
+++ b/addon/doxywizard/inputbool.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp
index d6173c4..702988c 100644
--- a/addon/doxywizard/inputint.cpp
+++ b/addon/doxywizard/inputint.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h
index 28da9cf..47fbf13 100644
--- a/addon/doxywizard/inputint.h
+++ b/addon/doxywizard/inputint.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp
index e43fc93..a20ba68 100644
--- a/addon/doxywizard/inputstring.cpp
+++ b/addon/doxywizard/inputstring.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
index 794f93e..1c4554d 100644
--- a/addon/doxywizard/inputstring.h
+++ b/addon/doxywizard/inputstring.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
index c6c34f4..9ab9a5b 100644
--- a/addon/doxywizard/inputstrlist.cpp
+++ b/addon/doxywizard/inputstrlist.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
index e60b036..115bad2 100644
--- a/addon/doxywizard/inputstrlist.h
+++ b/addon/doxywizard/inputstrlist.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/pagewidget.cpp b/addon/doxywizard/pagewidget.cpp
index 67d4d57..7e6920b 100644
--- a/addon/doxywizard/pagewidget.cpp
+++ b/addon/doxywizard/pagewidget.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/pagewidget.h b/addon/doxywizard/pagewidget.h
index 266fcc4..6d238df 100644
--- a/addon/doxywizard/pagewidget.h
+++ b/addon/doxywizard/pagewidget.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/pixmaps.cpp b/addon/doxywizard/pixmaps.cpp
index 6c7199b..5f2497b 100644
--- a/addon/doxywizard/pixmaps.cpp
+++ b/addon/doxywizard/pixmaps.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/pixmaps.h b/addon/doxywizard/pixmaps.h
index 144fee3..7ec854e 100644
--- a/addon/doxywizard/pixmaps.h
+++ b/addon/doxywizard/pixmaps.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/doxywizard/qtbc.h b/addon/doxywizard/qtbc.h
index 13b6fea..51f62dd 100644
--- a/addon/doxywizard/qtbc.h
+++ b/addon/doxywizard/qtbc.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/addon/xmlgen/xml.cpp b/addon/xmlgen/xml.cpp
index dbfb0e9..ea40d05 100644
--- a/addon/xmlgen/xml.cpp
+++ b/addon/xmlgen/xml.cpp
@@ -420,18 +420,18 @@ void generateXMLForFile(FileDef *fd,QTextStream &t)
   t << "      <compoundname>";
   writeXMLString(t,fd->name());
   t << "</compoundname>" << endl;
-  int numMembers = fd->defineMembers.count()+fd->protoMembers.count()+
-                   fd->typedefMembers.count()+fd->enumMembers.count()+
-                   fd->funcMembers.count()+fd->varMembers.count();
+  int numMembers = fd->decDefineMembers.count()+fd->decProtoMembers.count()+
+                   fd->decTypedefMembers.count()+fd->decEnumMembers.count()+
+                   fd->decFuncMembers.count()+fd->decVarMembers.count();
   if (numMembers>0)
   {
     t << "      <sectionlist>" << endl;
-    generateXMLFileSection(fd,t,&fd->defineMembers,"define");
-    generateXMLFileSection(fd,t,&fd->protoMembers,"prototype");
-    generateXMLFileSection(fd,t,&fd->typedefMembers,"typedef");
-    generateXMLFileSection(fd,t,&fd->enumMembers,"enum");
-    generateXMLFileSection(fd,t,&fd->funcMembers,"func");
-    generateXMLFileSection(fd,t,&fd->varMembers,"var");
+    generateXMLFileSection(fd,t,&fd->decDefineMembers,"define");
+    generateXMLFileSection(fd,t,&fd->decProtoMembers,"prototype");
+    generateXMLFileSection(fd,t,&fd->decTypedefMembers,"typedef");
+    generateXMLFileSection(fd,t,&fd->decEnumMembers,"enum");
+    generateXMLFileSection(fd,t,&fd->decFuncMembers,"func");
+    generateXMLFileSection(fd,t,&fd->decVarMembers,"var");
     t << "      </sectionlist>" << endl;
   }
   t << "    </compounddef>" << endl;
diff --git a/addon/xmlread/qtbc.h b/addon/xmlread/qtbc.h
index 13b6fea..51f62dd 100644
--- a/addon/xmlread/qtbc.h
+++ b/addon/xmlread/qtbc.h
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/doc/config.doc b/doc/config.doc
index afe2b8e..b819f53 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -164,6 +164,7 @@ followed by the descriptions of the tags grouped by category.
 <li> \refitem cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
 <li> \refitem cfg_search_includes SEARCH_INCLUDES
 <li> \refitem cfg_searchengine SEARCHENGINE
+<li> \refitem cfg_short_names SHORT_NAMES
 <li> \refitem cfg_show_include_files SHOW_INCLUDE_FILES
 <li> \refitem cfg_show_used_files SHOW_USED_FILES
 <li> \refitem cfg_sort_member_docs SORT_MEMBER_DOCS
@@ -351,6 +352,13 @@ followed by the descriptions of the tags grouped by category.
  classes or files whose names only differ in case and if your file system
  supports case sensitive file names.
 
+\anchor cfg_short_names
+<dt>\c SHORT_NAMES <dd>
+ \addindex SHORT_NAMES
+ If the \c SHORT_NAMES tag is set to \c YES, doxygen will generate much shorter
+ (but less readable) file names. This can be useful is your file systems
+ doesn't support long names like on DOS, Mac, or CD-ROM.
+
 \anchor cfg_hide_scope_names
 <dt>\c HIDE_SCOPE_NAMES <dd>
  \addindex HIDE_SCOPE_NAMES
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
index 95d13b5..d2df482 100644
--- a/doc/docblocks.doc
+++ b/doc/docblocks.doc
@@ -43,7 +43,7 @@ The following types of special documentation blocks are supported by doxygen:
 Doxygen only allows one brief and one detailed description. If there is
 one brief description before a declaration and one before a
 definition, only the one before the \e declaration will be used. If
-the same situation occurs for a detail description,
+the same situation occurs for a detailed description,
 the one before the \e definition is preferred and the one before the
 declaration will be ignored.
 
@@ -56,14 +56,15 @@ Here is an example of a documented piece of C++ code using the Qt style:
 
 The one-line comments should contain a brief description, 
 whereas the multi-line comment blocks contain a more detailed description.
-The brief descriptions are included in the member overview of a class, 
-namespace or file and are printed using a small italic font 
-(this description can be hidden by 
- setting \ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in 
-the config file). By default the brief descriptions are also the first 
-sentence of the detailed description 
-(this can be changed by setting the \ref cfg_repeat_brief "REPEAT_BRIEF" tag 
-to \c NO). Both the brief and the detailed descriptions are optional 
+Note that consecutive one-line comments are merged together in one brief 
+description. The brief descriptions are included in the member overview of a 
+class, namespace or file and are printed using a small italic font 
+(this description can be hidden by setting 
+\ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in 
+the config file). By default the brief descriptions become the first 
+sentence of the detailed descriptions 
+(but this can be changed by setting the \ref cfg_repeat_brief "REPEAT_BRIEF" 
+tag to \c NO). Both the brief and the detailed descriptions are optional 
 for the Qt style. 
 
 By default a JavaDoc style documentation block behaves the same way as a
@@ -71,7 +72,7 @@ Qt style documentation block. This is not according the JavaDoc specification
 however, where the first sentence of the documentation block is automatically
 treated as a brief description. To enable this behaviour you should set
 \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration
-file. If you enble this option and want to put a dot in the middle of a
+file. If you enable this option and want to put a dot in the middle of a
 sentence without ending it, you should put a backslash and a space after it.
 Here is an example:
 \verbatim
@@ -112,7 +113,8 @@ of a function or inside a normal C style comment block), as long as you put a
 structural command inside the documentation block.
 
 Structural commands (like all other commands) start with a backslash 
-(<tt>\\</tt>) followed by a command name and one or more parameters.
+(<tt>\\</tt>), or an at-sign (<tt>\@</tt>) in JavaDoc style, 
+followed by a command name and one or more parameters.
 For instance, if you want to document the class \c Test in the example
 above, you could have also put the following documentation block somewhere
 in the input that is read by doxygen:
@@ -124,7 +126,7 @@ in the input that is read by doxygen:
 */
 \endverbatim
 
-Here the special command \c \class is used to indicated that the
+Here the special command \c \class is used to indicate that the
 comment block contains documentation for the class \c Test.
 Other structural commands are:
 <ul>
@@ -142,11 +144,17 @@ commands. Note that the documentation block belonging to a file
 should always contain a structural command.
 
 To document a member of a C++ class, you must also document the class 
-itself. The same holds for namespaces. To document a C function, typedef, 
+itself. The same holds for namespaces. To document a global C function, typedef, 
 enum or preprocessor definition you must first document the file that 
 contains it (usually this will be a header file, because that file contains 
 the information that is exported to other source files).
 
+Let's repeat that, because it is often overlooked:
+to document global objects (functions, typedefs, enum, macros, etc), you
+<em>must</em> document the file in which they are defined. In other words, 
+there <em>must</em> at least be a \verbatim /*! \file */ \endverbatim
+or a \verbatim /** @file */ \endverbatim line in this file.
+
 Here is an example of a C header named \c structcmd.h that is documented 
 using structural commands:
 \verbinclude structcmd.h
@@ -164,7 +172,7 @@ using structural commands:
 
 \subsection memberdoc Documenting compound members.
 
-If you want to document the members of a file, struct, union, class, or enum 
+If you want to document the members of a file, struct, union, class, or enum,
 and you want to put the documentation for these members inside the compound,
 it is sometimes desired to place the documentation block after the member 
 instead of before. For this purpose doxygen has the following 
@@ -172,7 +180,7 @@ additional comment blocks:
 \verbatim
 /*!< ... */
 \endverbatim
-This block can be used to put a qt style documentation blocks after a member.
+This block can be used to put a Qt style documentation blocks after a member.
 The one line version look as follows:
 \verbatim
 //!< ...
@@ -189,7 +197,7 @@ Note that these blocks have the same structure and meaning as the
 special comment blocks above only the \< indicates that the member is 
 located in front of the block instead of after the block.
 
-Here is an example of a the use of these comment blocks:
+Here is an example of the use of these comment blocks:
 \verbinclude afterdoc.h
  \htmlonly
  Click <a href="$(DOXYGEN_DOCDIR)/examples/afterdoc/html/class_test.html">here</a>
@@ -198,9 +206,9 @@ Here is an example of a the use of these comment blocks:
 
 \warning These blocks can only be used to document \e members.
          They cannot be used to document files, classes, unions, structs,
-         groups, namespaces and enums. Furthermore, the structural commands 
-         mentioned in the previous section (like <code>\\class</code>) are ignored 
-         inside these comment blocks.
+         groups, namespaces and enums themselves. Furthermore, the structural 
+         commands mentioned in the previous section 
+         (like <code>\\class</code>) are ignored inside these comment blocks.
 
 \htmlonly
 Go to the <a href="lists.html">next</a> section or return to the
diff --git a/doc/install.doc b/doc/install.doc
index fe05177..30acc5c 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -358,11 +358,18 @@ Here is what is required:
 <li>The GNU tools flex, bison, and sed.
     To get these working on Windows you should install the 
     <a href="http://sources.redhat.com/cygwin/">cygwin tools</a>
-    \latexonly(see {\tt http://sources.redhat.com/cygwin/})\endlatexonly.
+    \latexonly(see {\tt http://sources.redhat.com/cygwin/})\endlatexonly
+    
+    Alternatively, you can also choose to 
+    download only a <a href="http://www.doxygen.org/dl/cygwin_tools.zip">small subset</a> 
+    \latexonly(see {\tt http://www.doxygen.org/dl/cygwin_tools.zip})\endlatexonly
+    of the cygwin tools that I put together just to compile doxygen.
     
     Make sure the <code>BISONLIB</code> environment variable points to the
     location where the files <code>bison.simple</code> and 
-    <code>bison.hairy</code> are located.
+    <code>bison.hairy</code> are located. For instance if these files are in
+    <code>c:\\tools\\cygwin\\share</code> then BISONLIB should 
+    be set to <code>//c/tools/cygwin/share/</code>
 
     Also make sure the tools are available from a dos box, by adding 
     the directory they are in to the search path.
@@ -377,16 +384,18 @@ Here is what is required:
     using WinZip -- as mentioned at the beginning of this list of
     steps.
 
-<li>Since Doxygen-1.2.2-20001015, the distribution includes the part
-    of Qt-2.x.x that is needed for compilation of doxygen, doxytag,
-    and doxysearch. The missing files for Windows were also created.
-    This allows compilation of doxygen on systems without X11 or the
-    full Qt. For doxywizard Qt-2.2 is still required however.
-
-    You may be interested in the professional license of 
-    <A HREF="http://www.trolltech.com/products/qt.html">Qt for Windows</A>
-    \latexonly\par (see 
-    {\tt http://www.trolltech.com/products/qt.html})\endlatexonly.
+<li>From Doxygen-1.2.2-20001015 onwards, the distribution includes the part
+    of Qt-2.x.x that is needed for to compile doxygen, doxytag,
+    and doxysearch. The Windows specific part were also created.
+    As a result doxygen can be compiled on systems without X11 or the
+    commerical version of Qt. 
+
+    For doxywizard, a complete Qt library this is 
+    still a requirement however. You may be interested in the professional 
+    license of <A HREF="http://www.trolltech.com/products/qt.html">Qt for 
+    Windows</A> \latexonly\par (see 
+    {\tt http://www.trolltech.com/products/qt.html})\endlatexonly. If you
+    donate me a professional license I'll port doxywizard for you :-)
    
 <li>To generate LaTeX documentation or formulas in HTML you need the tools:
     <code>latex</code>, <code>dvips</code> and <code>gswin32</code>. 
diff --git a/doc/language.doc b/doc/language.doc
index 595fa4e..d7b3a53 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -148,11 +148,11 @@ Here is a list of the languages and their current maintainers:
         Russian
       </TD>
       <TD>
-        Andrey V. Stolyarov
+        Alexandr Chelpanov
       </TD>
       <TD>
-        <a href="mailto:crocodil@NOSPAM.croco.net">
-                        crocodil@NOSPAM.croco.net</a>
+        <a href="mailto:cav@NOSPAM.cryptopro.ru">
+                        cav@NOSPAM.cryptopro.ru</a>
       </TD>
   </TR>
   <TR BGCOLOR="#ffffff">
@@ -246,7 +246,7 @@ Here is a list of the languages and their current maintainers:
   \hline
   Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
   \hline
-  Russian & Andrey V. Stolyarov & {\tt crocodil@croco.net} \\
+  Russian & Alexandr Chelpanov & {\tt cav@cryptopro.ru} \\
   \hline
   Korean  & Richard Kim & {\tt ryk@dspwiz.com} \\
   \hline
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index b5921f2..803b24c 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,8 +1,8 @@
 Name: doxygen
-Version: 1.2.6_20010409
+Version: 1.2.6_20010422
 Summary: documentation system for C, C++ and IDL
-Release: 1
-Source0: doxygen_%{version}.src.tar.gz
+Release: 2
+Source: doxygen_%{version}.src.tar.gz
 
 Copyright: GPL
 Group: unsorted
@@ -13,43 +13,54 @@ BuildRoot: /var/tmp/doxygen_%{version}.root
 # requires Perl for tmake (Troll's make)
 BuildPrereq: perl tetex
 
-%define prefix /usr
-
 %description
+Doxygen is a documentation system for C and C++. It can generate an
+on-line class browser (in HTML) and/or an off-line reference manual
+(in LaTeX) from a set of documented source files. The documentation is
+extracted directly from the sources. Doxygen is developed on a Linux
+platform, but it runs on most other UNIX flavors as well. An
+executable for Windows 95/NT is also available.
 
+Author:
+--------
+    Dimitri van Heesch <dimitri@stack.nl>
 
-%prep
-%setup -n doxygen-%{version}
+%description -l de
+Doxygen ist ein Dokumentationssystem f�r C und C++. Es kann eine
+Klassen�bersicht (in HTML) und/oder eine Referenz (in LaTeX) aus
+dokumentierten Quelldateien erzeugen. Die Dokumentation wird direkt aus
+den Quellen extrahiert. Doxygen wird auf einer Linux-Plattform
+entwickelt, funktioniert aber genauso auf den meisten andern Unix
+Dialekten. Das Programm ist auch f�r Windows 95/NT erh�ltlich.
 
+Author:
+--------
+    Dimitri van Heesch <dimitri@stack.nl>
 
+%prep
+%setup -n doxygen-%{version}
 
 %build
-CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix %{prefix} --with-doxywizard
+CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix /do_we_need_this_usr --with-doxywizard
 make
 
 %install
 rm -rf $RPM_BUILD_ROOT
-mkdir -p $RPM_BUILD_ROOT%{prefix}/usr
-
-# install
-make INSTALL=$RPM_BUILD_ROOT%{prefix} install
-( cd $RPM_BUILD_ROOT
-  mkdir -p ./usr/doc/packages
-  mv .%{prefix}/doc/doxygen ./usr/doc/packages/doxygen
-  mv .%{prefix}/doc/doxysearch ./usr/doc/packages/doxysearch
-  mv .%{prefix}/doc/doxytag ./usr/doc/packages/doxytag
-  mv .%{prefix}/doc/doxywizard ./usr/doc/packages/doxywizard
-)
+make install INSTALL=$RPM_BUILD_ROOT/usr DOCDIR=$RPM_BUILD_ROOT%{_docdir}/doxygen
+install -m 644 LICENSE LANGUAGE.HOWTO PLATFORMS README VERSION $RPM_BUILD_ROOT%{_docdir}/doxygen
 
 %files
 %defattr(-,root,root)
-%{prefix}/bin
-# %doc LANGUAGE.HOWTO LICENSE PLATFORMS VERSION README 
-%doc %{prefix}/doc/packages/doxygen
+%attr(755,root,root) /usr/bin/*
+%doc %{_docdir}/doxygen
 
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %changelog
+* Mon Apr 16 2001 Jens Seidel <jensseidel@users.sourceforge.net>
+ - new decription (english, german)
+ - use of %{_docdir}
+ - added README, LICENSE, ... to install section
 * Mon Mar 13 2000 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
  - inital version build with rpmify
diff --git a/qtools/Makefile.in b/qtools/Makefile.in
index 26a8e9c..78710fd 100644
--- a/qtools/Makefile.in
+++ b/qtools/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id$
+# 
 #
 # Copyright (C) 1997-2000 by Dimitri van Heesch.
 # 
diff --git a/qtools/qarray.h b/qtools/qarray.h
index 5fb6bf7..90dcbb7 100644
--- a/qtools/qarray.h
+++ b/qtools/qarray.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QArray template/macro class
 **
diff --git a/qtools/qasciidict.h b/qtools/qasciidict.h
index 23b85e5..3f2deaf 100644
--- a/qtools/qasciidict.h
+++ b/qtools/qasciidict.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QAsciiDict template class
 **
diff --git a/qtools/qbuffer.cpp b/qtools/qbuffer.cpp
index 59d20a2..beed0ba 100644
--- a/qtools/qbuffer.cpp
+++ b/qtools/qbuffer.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QBuffer class
 **
diff --git a/qtools/qbuffer.h b/qtools/qbuffer.h
index d3fdae1..9dcd286 100644
--- a/qtools/qbuffer.h
+++ b/qtools/qbuffer.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QBuffer class
 **
diff --git a/qtools/qcollection.cpp b/qtools/qcollection.cpp
index 21bf412..e70b64b 100644
--- a/qtools/qcollection.cpp
+++ b/qtools/qcollection.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of base class for all collection classes
 **
diff --git a/qtools/qcollection.h b/qtools/qcollection.h
index e672609..a169b7c 100644
--- a/qtools/qcollection.h
+++ b/qtools/qcollection.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of base class for all collection classes
 **
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp
index f128ae1..2d2e0c5 100644
--- a/qtools/qcstring.cpp
+++ b/qtools/qcstring.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of extended char array operations, and QByteArray and
 ** QCString classes
diff --git a/qtools/qcstring.h b/qtools/qcstring.h
index b9cad44..073a969 100644
--- a/qtools/qcstring.h
+++ b/qtools/qcstring.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of the extended char array operations,
 ** and QByteArray and QCString classes
diff --git a/qtools/qdatastream.cpp b/qtools/qdatastream.cpp
index c586570..7f63cbf 100644
--- a/qtools/qdatastream.cpp
+++ b/qtools/qdatastream.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QDataStream class
 **
diff --git a/qtools/qdatastream.h b/qtools/qdatastream.h
index dafab36..3d18062 100644
--- a/qtools/qdatastream.h
+++ b/qtools/qdatastream.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QDataStream class
 **
diff --git a/qtools/qdatetime.cpp b/qtools/qdatetime.cpp
index 026387a..cecb855 100644
--- a/qtools/qdatetime.cpp
+++ b/qtools/qdatetime.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of date and time classes
 **
diff --git a/qtools/qdatetime.h b/qtools/qdatetime.h
index 820fde3..2479dbf 100644
--- a/qtools/qdatetime.h
+++ b/qtools/qdatetime.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of date and time classes
 **
diff --git a/qtools/qdict.h b/qtools/qdict.h
index fdd9366..3b70336 100644
--- a/qtools/qdict.h
+++ b/qtools/qdict.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QDict template class
 **
diff --git a/qtools/qdir.cpp b/qtools/qdir.cpp
index b0d1c0d..ed7ed99 100644
--- a/qtools/qdir.cpp
+++ b/qtools/qdir.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QDir class
 **
diff --git a/qtools/qdir.h b/qtools/qdir.h
index 8fcadf5..dd74271 100644
--- a/qtools/qdir.h
+++ b/qtools/qdir.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QDir class
 **
diff --git a/qtools/qdir_unix.cpp b/qtools/qdir_unix.cpp
index 9ace60a..46a3b69 100644
--- a/qtools/qdir_unix.cpp
+++ b/qtools/qdir_unix.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QDirclass
 **
diff --git a/qtools/qdir_win32.cpp b/qtools/qdir_win32.cpp
index 832c86b..b1eee66 100644
--- a/qtools/qdir_win32.cpp
+++ b/qtools/qdir_win32.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/qtools/qfeatures.h b/qtools/qfeatures.h
index 9dc5107..84fa715 100644
--- a/qtools/qfeatures.h
+++ b/qtools/qfeatures.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Global feature selection
 **
diff --git a/qtools/qfile.cpp b/qtools/qfile.cpp
index 06300de..2222b5b 100644
--- a/qtools/qfile.cpp
+++ b/qtools/qfile.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QFile class
 **
diff --git a/qtools/qfile.h b/qtools/qfile.h
index e95cdf4..4ef0685 100644
--- a/qtools/qfile.h
+++ b/qtools/qfile.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QFile class
 **
diff --git a/qtools/qfile_unix.cpp b/qtools/qfile_unix.cpp
index a1beb31..e074eed 100644
--- a/qtools/qfile_unix.cpp
+++ b/qtools/qfile_unix.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QFileInfo class
 **
diff --git a/qtools/qfile_win32.cpp b/qtools/qfile_win32.cpp
index 12a0643..fd28d43 100644
--- a/qtools/qfile_win32.cpp
+++ b/qtools/qfile_win32.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/qtools/qfiledefs_p.h b/qtools/qfiledefs_p.h
index eeac5c5..4a1a154 100644
--- a/qtools/qfiledefs_p.h
+++ b/qtools/qfiledefs_p.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Common macros and system include files for QFile, QFileInfo and QDir.
 **
diff --git a/qtools/qfileinfo.cpp b/qtools/qfileinfo.cpp
index 7e30a9e..5053b76 100644
--- a/qtools/qfileinfo.cpp
+++ b/qtools/qfileinfo.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QFileInfo class
 **
diff --git a/qtools/qfileinfo.h b/qtools/qfileinfo.h
index 8543e1c..76ef8c2 100644
--- a/qtools/qfileinfo.h
+++ b/qtools/qfileinfo.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QFileInfo class
 **
diff --git a/qtools/qfileinfo_unix.cpp b/qtools/qfileinfo_unix.cpp
index fbeb363..5a8fe04 100644
--- a/qtools/qfileinfo_unix.cpp
+++ b/qtools/qfileinfo_unix.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QFileInfo class
 **
diff --git a/qtools/qfileinfo_win32.cpp b/qtools/qfileinfo_win32.cpp
index abb9b9d..bfcc6ac 100644
--- a/qtools/qfileinfo_win32.cpp
+++ b/qtools/qfileinfo_win32.cpp
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * $Id$
+ * 
  *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
diff --git a/qtools/qgarray.cpp b/qtools/qgarray.cpp
index b20caee..efc9de0 100644
--- a/qtools/qgarray.cpp
+++ b/qtools/qgarray.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QGArray class
 **
diff --git a/qtools/qgarray.h b/qtools/qgarray.h
index 971d6bf..12c463b 100644
--- a/qtools/qgarray.h
+++ b/qtools/qgarray.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QGArray class
 **
diff --git a/qtools/qgdict.cpp b/qtools/qgdict.cpp
index 545628e..c3b2f74 100644
--- a/qtools/qgdict.cpp
+++ b/qtools/qgdict.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QGDict and QGDictIterator classes
 **
diff --git a/qtools/qgdict.h b/qtools/qgdict.h
index cc9e262..6243364 100644
--- a/qtools/qgdict.h
+++ b/qtools/qgdict.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QGDict and QGDictIterator classes
 **
diff --git a/qtools/qgeneric.h b/qtools/qgeneric.h
index 312cb30..c2892a0 100644
--- a/qtools/qgeneric.h
+++ b/qtools/qgeneric.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Macros for pasting tokens; utilized by our generic classes
 **
diff --git a/qtools/qglist.cpp b/qtools/qglist.cpp
index 0ffddf0..f464a73 100644
--- a/qtools/qglist.cpp
+++ b/qtools/qglist.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QGList and QGListIterator classes
 **
diff --git a/qtools/qglist.h b/qtools/qglist.h
index 6949aa3..f400b64 100644
--- a/qtools/qglist.h
+++ b/qtools/qglist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QGList and QGListIterator classes
 **
diff --git a/qtools/qglobal.cpp b/qtools/qglobal.cpp
index 95075a9..50f5202 100644
--- a/qtools/qglobal.cpp
+++ b/qtools/qglobal.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Global functions
 **
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
index 7acd0de..9c2b53e 100644
--- a/qtools/qglobal.h
+++ b/qtools/qglobal.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Global type declarations and definitions
 **
diff --git a/qtools/qgvector.cpp b/qtools/qgvector.cpp
index a769a55..88409ce 100644
--- a/qtools/qgvector.cpp
+++ b/qtools/qgvector.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QGVector class
 **
diff --git a/qtools/qgvector.h b/qtools/qgvector.h
index b5fbde0..6a7999d 100644
--- a/qtools/qgvector.h
+++ b/qtools/qgvector.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QGVector class
 **
diff --git a/qtools/qintdict.h b/qtools/qintdict.h
index 52722ed..ddc5fdf 100644
--- a/qtools/qintdict.h
+++ b/qtools/qintdict.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QIntDict template class
 **
diff --git a/qtools/qiodevice.cpp b/qtools/qiodevice.cpp
index babe387..43b2787 100644
--- a/qtools/qiodevice.cpp
+++ b/qtools/qiodevice.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QIODevice class
 **
diff --git a/qtools/qiodevice.h b/qtools/qiodevice.h
index 6688bda..1c54217 100644
--- a/qtools/qiodevice.h
+++ b/qtools/qiodevice.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QIODevice class
 **
diff --git a/qtools/qlist.h b/qtools/qlist.h
index a7ad156..a4608fb 100644
--- a/qtools/qlist.h
+++ b/qtools/qlist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QList template/macro class
 **
diff --git a/qtools/qmap.cpp b/qtools/qmap.cpp
index 3f73f81..1d2510a 100644
--- a/qtools/qmap.cpp
+++ b/qtools/qmap.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QMap
 **
diff --git a/qtools/qmap.h b/qtools/qmap.h
index ecd355f..f384a3d 100644
--- a/qtools/qmap.h
+++ b/qtools/qmap.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QMap class
 **
diff --git a/qtools/qptrdict.h b/qtools/qptrdict.h
index 2ed1ef2..c075e30 100644
--- a/qtools/qptrdict.h
+++ b/qtools/qptrdict.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QPtrDict template class
 **
diff --git a/qtools/qqueue.h b/qtools/qqueue.h
index 36af518..94bc130 100644
--- a/qtools/qqueue.h
+++ b/qtools/qqueue.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QQueue template/macro class
 **
diff --git a/qtools/qregexp.cpp b/qtools/qregexp.cpp
index 99189a6..671867e 100644
--- a/qtools/qregexp.cpp
+++ b/qtools/qregexp.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QRegExp class
 **
diff --git a/qtools/qregexp.h b/qtools/qregexp.h
index a66453c..25868ce 100644
--- a/qtools/qregexp.h
+++ b/qtools/qregexp.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QRegExp class
 **
diff --git a/qtools/qshared.h b/qtools/qshared.h
index 338029e..79fab7b 100644
--- a/qtools/qshared.h
+++ b/qtools/qshared.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QShared struct
 **
diff --git a/qtools/qsortedlist.h b/qtools/qsortedlist.h
index 7b90da6..aeadd90 100644
--- a/qtools/qsortedlist.h
+++ b/qtools/qsortedlist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QList template/macro class
 **
diff --git a/qtools/qstack.h b/qtools/qstack.h
index 47311a5..c23215c 100644
--- a/qtools/qstack.h
+++ b/qtools/qstack.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QStack template/macro class
 **
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
index b9530a6..e13ffc8 100644
--- a/qtools/qstring.cpp
+++ b/qtools/qstring.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of the QString class and related Unicode functions
 **
diff --git a/qtools/qstring.h b/qtools/qstring.h
index b574b05..f131446 100644
--- a/qtools/qstring.h
+++ b/qtools/qstring.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of the QString class, and related Unicode
 ** functions.
diff --git a/qtools/qstringlist.cpp b/qtools/qstringlist.cpp
index d923f23..ff4f33e 100644
--- a/qtools/qstringlist.cpp
+++ b/qtools/qstringlist.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QStringList
 **
diff --git a/qtools/qstringlist.h b/qtools/qstringlist.h
index 04d11c6..03342c5 100644
--- a/qtools/qstringlist.h
+++ b/qtools/qstringlist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QStringList class
 **
diff --git a/qtools/qstrlist.h b/qtools/qstrlist.h
index abec631..c6a1864 100644
--- a/qtools/qstrlist.h
+++ b/qtools/qstrlist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QStrList, QStrIList and QStrListIterator classes
 **
diff --git a/qtools/qstrvec.h b/qtools/qstrvec.h
index 31d7d89..15d3abb 100644
--- a/qtools/qstrvec.h
+++ b/qtools/qstrvec.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QStrVec and QStrIVec classes
 **
diff --git a/qtools/qtextcodec.cpp b/qtools/qtextcodec.cpp
index b55345e..cdecfce 100644
--- a/qtools/qtextcodec.cpp
+++ b/qtools/qtextcodec.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QTextCodec class
 **
diff --git a/qtools/qtextcodec.h b/qtools/qtextcodec.h
index 9d5783f..18ece20 100644
--- a/qtools/qtextcodec.h
+++ b/qtools/qtextcodec.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QTextCodec class
 **
diff --git a/qtools/qtextstream.cpp b/qtools/qtextstream.cpp
index ae794df..6686f81 100644
--- a/qtools/qtextstream.cpp
+++ b/qtools/qtextstream.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QTextStream class
 **
diff --git a/qtools/qtextstream.h b/qtools/qtextstream.h
index 357447d..c5f5ba1 100644
--- a/qtools/qtextstream.h
+++ b/qtools/qtextstream.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QTextStream class
 **
diff --git a/qtools/qtl.h b/qtools/qtl.h
index ed1fe40..bd72e7d 100644
--- a/qtools/qtl.h
+++ b/qtools/qtl.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of Qt template library classes
 **
diff --git a/qtools/qvaluelist.h b/qtools/qvaluelist.h
index 246df84..a1014ed 100644
--- a/qtools/qvaluelist.h
+++ b/qtools/qvaluelist.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QValueList class
 **
diff --git a/qtools/qvaluestack.h b/qtools/qvaluestack.h
index e38edb2..9728d6c 100644
--- a/qtools/qvaluestack.h
+++ b/qtools/qvaluestack.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QValueStack class
 **
diff --git a/qtools/qvector.h b/qtools/qvector.h
index 9dd970c..36f0be7 100644
--- a/qtools/qvector.h
+++ b/qtools/qvector.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QVector template/macro class
 **
diff --git a/qtools/qxml.cpp b/qtools/qxml.cpp
index f437783..11a9b01 100644
--- a/qtools/qxml.cpp
+++ b/qtools/qxml.cpp
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Implementation of QXmlSimpleReader and related classes.
 **
diff --git a/qtools/qxml.h b/qtools/qxml.h
index 98d6641..ce40e5f 100644
--- a/qtools/qxml.h
+++ b/qtools/qxml.h
@@ -1,5 +1,5 @@
 /****************************************************************************
-** $Id$
+** 
 **
 ** Definition of QXmlSimpleReader and related classes.
 **
diff --git a/src/classdef.cpp b/src/classdef.cpp
index f477cb1..743ff4f 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -150,58 +150,31 @@ void ClassDef::insertSubClass(ClassDef *cd,Protection p,
   inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
 }
 
-void ClassDef::addMemberListToGroup(MemberList *ml)
-{
-  MemberListIterator mli(*ml);
-  MemberDef *md;
-  for (;(md=mli.current());++mli)
-  {
-    int groupId=md->getMemberGroupId();
-    if (groupId!=-1)
-    {
-      QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
-      QCString *pDocs      = Doxygen::memberDocDict[groupId];
-      if (pGrpHeader)
-      {
-        MemberGroup *mg = memberGroupDict->find(groupId);
-        if (mg==0)
-        {
-          mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
-          memberGroupDict->insert(groupId,mg);
-          memberGroupList->append(mg);
-        }
-        mg->insertMember(md);
-        md->setMemberGroup(mg);
-      }
-    }
-  }
-}
-
 void ClassDef::addMembersToMemberGroup()
 {
-  addMemberListToGroup(&pubTypes);
-  addMemberListToGroup(&pubMembers);
-  addMemberListToGroup(&pubAttribs);
-  addMemberListToGroup(&pubSlots);
-  addMemberListToGroup(&signals);
-  addMemberListToGroup(&dcopMethods);
-  addMemberListToGroup(&pubStaticMembers);
-  addMemberListToGroup(&pubStaticAttribs);
-  addMemberListToGroup(&proTypes);
-  addMemberListToGroup(&proMembers);
-  addMemberListToGroup(&proAttribs);
-  addMemberListToGroup(&proSlots);
-  addMemberListToGroup(&proStaticMembers);
-  addMemberListToGroup(&proStaticAttribs);
-  addMemberListToGroup(&priTypes);
-  addMemberListToGroup(&priMembers);
-  addMemberListToGroup(&priAttribs);
-  addMemberListToGroup(&priSlots);
-  addMemberListToGroup(&priStaticMembers);
-  addMemberListToGroup(&priStaticAttribs);
-  addMemberListToGroup(&friends);
-  addMemberListToGroup(&related);
-  addMemberListToGroup(&properties);
+  ::addMembersToMemberGroup(&pubTypes,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&pubMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&pubAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&pubSlots,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&signals,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&dcopMethods,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&pubStaticMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&pubStaticAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proTypes,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proSlots,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proStaticMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&proStaticAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priTypes,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priSlots,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priStaticMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&priStaticAttribs,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&friends,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&related,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&properties,memberGroupDict,memberGroupList);
 }
 
 // adds new member definition to the class
@@ -1037,85 +1010,26 @@ void ClassDef::writeDocumentation(OutputList &ol)
     writeTemplateSpec(ol,outerTempArgList,pageType,name());
   }
   
-  typedefMembers.countDocMembers();
-  if (typedefMembers.totalCount()>0)
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trMemberTypedefDocumentation());
-    ol.endGroupHeader();
-    typedefMembers.writeDocumentation(ol,name(),this);
-  }
+  typedefMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trMemberTypedefDocumentation());
 
-  enumMembers.countDocMembers();
-  if (enumMembers.totalCount()>0)
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trMemberEnumerationDocumentation());
-    ol.endGroupHeader();
-    enumMembers.writeDocumentation(ol,name(),this);
-  }
+  enumMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trMemberEnumerationDocumentation());
   
-  //enumValMembers.countDocMembers();
-  //if (enumValMembers.totalCount()>0)
-  //{
-  //  ol.writeRuler();
-  //  ol.startGroupHeader();
-  //  parseText(ol,theTranslator->trEnumerationValueDocumentation());
-  //  ol.endGroupHeader();
-  //  enumValMembers.writeDocumentation(ol,name());
-  //}
-
-  constructors.countDocMembers();
-  if (constructors.totalCount()>0) 
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trConstructorDocumentation());
-    ol.endGroupHeader();
-    constructors.writeDocumentation(ol,name(),this);
-  }
+  constructors.writeDocumentation(ol,name(),this,
+                         theTranslator->trConstructorDocumentation());
 
-  functionMembers.countDocMembers();
-  if (functionMembers.totalCount()>0) 
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trMemberFunctionDocumentation());
-    ol.endGroupHeader();
-    functionMembers.writeDocumentation(ol,name(),this);
-  }
+  functionMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trMemberFunctionDocumentation());
 
-  relatedMembers.countDocMembers();
-  if (relatedMembers.totalCount()>0)
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trRelatedFunctionDocumentation());
-    ol.endGroupHeader();
-    relatedMembers.writeDocumentation(ol,name(),this);
-  }
+  relatedMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trRelatedFunctionDocumentation());
 
-  variableMembers.countDocMembers();
-  if (variableMembers.totalCount()>0) 
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trMemberDataDocumentation());
-    ol.endGroupHeader();
-    variableMembers.writeDocumentation(ol,name(),this);
-  }
+  variableMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trMemberDataDocumentation());
   
-  propertyMembers.countDocMembers();
-  if (propertyMembers.totalCount()>0) 
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trPropertyDocumentation());
-    ol.endGroupHeader();
-    propertyMembers.writeDocumentation(ol,name(),this);
-  }
+  propertyMembers.writeDocumentation(ol,name(),this,
+                         theTranslator->trPropertyDocumentation());
   
   ol.startTextBlock();
 
@@ -1398,13 +1312,16 @@ bool ClassDef::hasNonReferenceSuperClass()
   return found;
 }
 
+/*! called from MemberDef::writeDeclaration() to (recusively) write the 
+ *  definition of an annonymous struct, union or class.
+ */
 void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
 {
   //ol.insertMemberAlign();
   //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
 
-  if (inGroup && md && md->getClassDef()==this) return;
-  
+  //if (inGroup && md && md->getClassDef()==this) return;
+
   ol.docify(compoundTypeString());
   int ri=name().findRev("::");
   if (ri==-1) ri=name().length();
@@ -1417,45 +1334,64 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
   ol.docify(" {");
   ol.endMemberItem(FALSE); 
 
-  // insert members of this class
-  if (inGroup)
+  // write user defined member groups
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
   {
-    MemberGroupListIterator mgli(*memberGroupList);
-    MemberGroup *mg;
-    for (;(mg=mgli.current());++mgli)
-    {
-      mg->writePlainDeclarations(ol,this,0,0,0);
-    }
+    mg->setInGroup(inGroup);
+    mg->writePlainDeclarations(ol,this,0,0,0);
   }
-  else
+
+  pubTypes.setInGroup(inGroup);
+  pubTypes.writePlainDeclarations(ol,this,0,0,0); 
+  pubMembers.setInGroup(inGroup);
+  pubMembers.writePlainDeclarations(ol,this,0,0,0); 
+  pubAttribs.setInGroup(inGroup);
+  pubAttribs.writePlainDeclarations(ol,this,0,0,0); 
+  pubSlots.setInGroup(inGroup);
+  pubSlots.writePlainDeclarations(ol,this,0,0,0); 
+  signals.setInGroup(inGroup);
+  signals.writePlainDeclarations(ol,this,0,0,0); 
+  dcopMethods.setInGroup(inGroup);
+  dcopMethods.writePlainDeclarations(ol,this,0,0,0); 
+  properties.setInGroup(inGroup);
+  properties.writePlainDeclarations(ol,this,0,0,0); 
+  pubStaticMembers.setInGroup(inGroup);
+  pubStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
+  pubStaticAttribs.setInGroup(inGroup);
+  pubStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
+  proTypes.setInGroup(inGroup);
+  proTypes.writePlainDeclarations(ol,this,0,0,0); 
+  proMembers.setInGroup(inGroup);
+  proMembers.writePlainDeclarations(ol,this,0,0,0); 
+  proAttribs.setInGroup(inGroup);
+  proAttribs.writePlainDeclarations(ol,this,0,0,0); 
+  proSlots.setInGroup(inGroup);
+  proSlots.writePlainDeclarations(ol,this,0,0,0); 
+  proStaticMembers.setInGroup(inGroup);
+  proStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
+  proStaticAttribs.setInGroup(inGroup);
+  proStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
+  if (Config_getBool("EXTRACT_PRIVATE"))
   {
-    pubTypes.writePlainDeclarations(ol,this,0,0,0); 
-    pubMembers.writePlainDeclarations(ol,this,0,0,0); 
-    pubAttribs.writePlainDeclarations(ol,this,0,0,0); 
-    pubSlots.writePlainDeclarations(ol,this,0,0,0); 
-    signals.writePlainDeclarations(ol,this,0,0,0); 
-    dcopMethods.writePlainDeclarations(ol,this,0,0,0); 
-    properties.writePlainDeclarations(ol,this,0,0,0); 
-    pubStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
-    pubStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
-    proTypes.writePlainDeclarations(ol,this,0,0,0); 
-    proMembers.writePlainDeclarations(ol,this,0,0,0); 
-    proAttribs.writePlainDeclarations(ol,this,0,0,0); 
-    proSlots.writePlainDeclarations(ol,this,0,0,0); 
-    proStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
-    proStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
-    if (Config_getBool("EXTRACT_PRIVATE"))
-    {
-      priTypes.writePlainDeclarations(ol,this,0,0,0); 
-      priMembers.writePlainDeclarations(ol,this,0,0,0); 
-      priAttribs.writePlainDeclarations(ol,this,0,0,0); 
-      priSlots.writePlainDeclarations(ol,this,0,0,0); 
-      priStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
-      priStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
-    }
-    friends.writePlainDeclarations(ol,this,0,0,0);
-    related.writePlainDeclarations(ol,this,0,0,0); 
+    priTypes.setInGroup(inGroup);
+    priTypes.writePlainDeclarations(ol,this,0,0,0); 
+    priMembers.setInGroup(inGroup);
+    priMembers.writePlainDeclarations(ol,this,0,0,0); 
+    priAttribs.setInGroup(inGroup); 
+    priAttribs.writePlainDeclarations(ol,this,0,0,0); 
+    priSlots.setInGroup(inGroup); 
+    priSlots.writePlainDeclarations(ol,this,0,0,0); 
+    priStaticMembers.setInGroup(inGroup); 
+    priStaticMembers.writePlainDeclarations(ol,this,0,0,0); 
+    priStaticAttribs.setInGroup(inGroup); 
+    priStaticAttribs.writePlainDeclarations(ol,this,0,0,0); 
   }
+  friends.setInGroup(inGroup);
+  friends.writePlainDeclarations(ol,this,0,0,0);
+  related.setInGroup(inGroup);
+  related.writePlainDeclarations(ol,this,0,0,0); 
 }
 
 /*! a link to this class is possible within this project */
@@ -1478,6 +1414,11 @@ bool ClassDef::isVisibleInHierarchy()
     (hasDocumentation() || !Config_getBool("HIDE_UNDOC_CLASSES") || isReference());
 }
 
+bool ClassDef::hasDocumentation() const
+{
+  return Definition::hasDocumentation();
+}
+
 //----------------------------------------------------------------------
 // recursive function:
 // returns TRUE iff class definition `bcd' represents an (in)direct base 
diff --git a/src/classdef.h b/src/classdef.h
index 2270d31..63dabd9 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -70,6 +70,8 @@ class ClassDef : public Definition
     QCString getFileBase() const;
     QCString getSourceFileBase() const; 
 
+    bool hasDocumentation() const;
+
     /*! Returns the name as it is appears in the documentation */
     QCString displayName() const;
 
@@ -247,7 +249,6 @@ class ClassDef : public Definition
 
   protected:
     void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
-    void addMemberListToGroup(MemberList *);
     bool hasExamples();
     bool hasNonReferenceSuperClass();
 
diff --git a/src/definition.cpp b/src/definition.cpp
index 78c2ded..1beeba9 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -400,7 +400,7 @@ void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
   ol.popGeneratorState();
 }
 
-bool Definition::hasDocumentation() 
+bool Definition::hasDocumentation() const
 { 
   return !doc.isEmpty() ||             // has detailed docs
          !brief.isEmpty() ||           // has brief description
diff --git a/src/definition.h b/src/definition.h
index 7353e38..2018525 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -73,7 +73,7 @@ class Definition
      */
     void setBriefDescription(const char *b);
     /*! Returns TRUE iff the definition is documented */
-    virtual bool hasDocumentation();
+    virtual bool hasDocumentation() const;
     virtual bool isLinkableInProject() = 0;
     virtual bool isLinkable() = 0;
 
diff --git a/src/doc.l b/src/doc.l
index 8bbf7a4..2f6dc97 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -1841,21 +1841,49 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
 					}
 					
 <DocScan,DocRefName>{ID}"<"[^>\ \t\n]*">"("::"{ID})+"("?[a-z_A-Z0-9,:\<\> \t\*\&]*")"?	{
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+  				          if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  BEGIN(DocScan);
   					}
 <DocScan,DocRefName>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" {
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+  					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  BEGIN(DocScan);
   					}
 <DocScan,DocRefName>{SCOPEMASK}("()")?	{
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+  					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  BEGIN(DocScan);
   					}
 <DocScan,DocRefName>({SCOPEMASK}"::")?"operator"{OPMASK} { 
 				          QCString oName=yytext;
-					  generateRef(*outDoc,className,
-					              removeRedundantWhiteSpace(oName),inSeeBlock);
+					  if (!insideHtmlLink)
+					  {
+					    generateRef(*outDoc,className,
+					                removeRedundantWhiteSpace(oName),inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  BEGIN(DocScan);
 					}
 <DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK}	{ outDoc->startHtmlLink(yytext); 
@@ -1864,10 +1892,24 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
                                                         }
 <DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+	{ outDoc->writeMailLink(yytext); }
 <DocScan>{FILESCHAR}*{FILEECHAR}+/".\\n" { // special exception that is otherwise matches by FILEMASK
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+  					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
   					}
 <DocScan>{FILEMASK}			{
-					  generateFileRef(*outDoc,yytext);
+  					  if (!insideHtmlLink)
+					  {
+					    generateFileRef(*outDoc,yytext);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					}
 <DocCodeBlock>{BN}*{CMD}"endcode"/[^a-z_A-Z0-9]  { // needed to match things like \endcode. (note the dot)
 				          parseCode(*outDoc,className,codeBlock,exampleDoc,exampleName);
@@ -2156,55 +2198,118 @@ OPMASK    ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
   					}
 <DocEmphasis>{FILEMASK}			{
   					  outDoc->startEmphasis();
-					  generateFileRef(*outDoc,yytext);
+  					  if (!insideHtmlLink)
+					  {
+					    generateFileRef(*outDoc,yytext);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endEmphasis();
 					  BEGIN( DocScan );
 					}
 <DocEmphasis>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()|\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
   					  outDoc->startEmphasis();
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endEmphasis();
 					  BEGIN( DocScan );
   					}
 <DocEmphasis>{WORD}			{ 
   					  outDoc->startEmphasis();
-  					  linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  if (!insideHtmlLink)
+					  {
+  					    linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endEmphasis();
 					  BEGIN( DocScan );
 					}
 <DocBold>{FILEMASK}			{
   					  outDoc->startBold();
-					  generateFileRef(*outDoc,yytext);
+					  if (!insideHtmlLink)
+					  {
+					    generateFileRef(*outDoc,yytext);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endBold();
 					  BEGIN( DocScan );
 					}
 <DocBold>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()|\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
   					  outDoc->startBold();
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endBold();
 					  BEGIN( DocScan );
   					}
 <DocBold>{WORD}				{ 
   					  outDoc->startBold();
-  					  linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  if (!insideHtmlLink)
+					  {
+  					    linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endBold();
 					  BEGIN( DocScan );
 					}
 <DocCode>{FILEMASK}			{
   					  outDoc->startTypewriter();
-					  generateFileRef(*outDoc,yytext);
+					  if (!insideHtmlLink)
+					  {
+					    generateFileRef(*outDoc,yytext);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endTypewriter();
 					  BEGIN( DocScan );
 					}
 <DocCode>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()!\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
   					  outDoc->startTypewriter();
-  					  generateRef(*outDoc,className,yytext,inSeeBlock);
+					  if (!insideHtmlLink)
+					  {
+  					    generateRef(*outDoc,className,yytext,inSeeBlock);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endTypewriter();
 					  BEGIN( DocScan );
   					}
 <DocCode>{WORD}				{ 
   					  outDoc->startTypewriter();
-  					  linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  if (!insideHtmlLink)
+					  {
+  					    linkifyText(TextGeneratorOLImpl(*outDoc),className,0,yytext,FALSE,FALSE);
+					  }
+					  else
+					  {
+					    outDoc->docify(yytext);
+					  }
 					  outDoc->endTypewriter();
 					  BEGIN( DocScan );
 					}
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 18610ac..73c765c 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -599,7 +599,7 @@ static bool addNamespace(Entry *root,ClassDef *cd)
       {
         NamespaceDef *nd=0;
         //printf("addNameSpace() trying: %s\n",e->name.data());
-        QCString nsName = stripAnnonymousNamespaceScope(e->name);
+        QCString nsName = stripAnonymousNamespaceScope(e->name);
         if (!nsName.isEmpty() && nsName.at(0)!='@' &&
             (nd=getResolvedNamespace(nsName))
            )
@@ -637,7 +637,7 @@ static void buildClassList(Entry *root)
     }
     else 
     {
-      fullName=stripAnnonymousNamespaceScope(fullName);
+      fullName=stripAnonymousNamespaceScope(fullName);
       Debug::print(Debug::Classes,0,"  Found class with name %s\n",fullName.data());
 
       bool ambig;
@@ -825,7 +825,7 @@ static void buildNamespaceList(Entry *root)
        !root->name.isEmpty()
      )
   {
-    QCString fullName=stripAnnonymousNamespaceScope(root->name.copy());
+    QCString fullName=stripAnonymousNamespaceScope(root->name.copy());
     if (!fullName.isEmpty())
     {
       //printf("Found namespace %s in %s at line %d\n",root->name.data(),
@@ -1199,13 +1199,14 @@ static MemberDef *addVariableToClass(
   md->setDefinition(def);
   md->setBitfields(root->bitfields);
   md->addSectionsToDefinition(root->anchors);
-  md->setFromAnnonymousScope(fromAnnScope);
-  md->setFromAnnonymousMember(fromAnnMemb);
+  md->setFromAnonymousScope(fromAnnScope);
+  md->setFromAnonymousMember(fromAnnMemb);
   md->setIndentDepth(indentDepth);
   md->setBodySegment(root->bodyLine,root->endBodyLine);
   md->setInitializer(root->initializer);
   md->setMaxInitLines(root->initLines);
   md->setMemberGroupId(root->mGrpId);
+  addMemberToGroups(root,md);
   //if (root->mGrpId!=-1) 
   //{
   //  printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
@@ -1356,8 +1357,8 @@ static MemberDef *addVariableToFile(
   md->setDocumentation(root->doc);
   md->setBriefDescription(root->brief);
   md->addSectionsToDefinition(root->anchors);
-  md->setFromAnnonymousScope(fromAnnScope);
-  md->setFromAnnonymousMember(fromAnnMemb);
+  md->setFromAnonymousScope(fromAnnScope);
+  md->setFromAnonymousMember(fromAnnMemb);
   md->setIndentDepth(indentDepth);
   md->setBodySegment(root->bodyLine,root->endBodyLine);
   md->setInitializer(root->initializer);
@@ -1366,6 +1367,7 @@ static MemberDef *addVariableToFile(
   md->setBodyDef(fd);
   md->setDefinition(def);
   md->setExplicitExternal(root->explicitExternal);
+  addMemberToGroups(root,md);
   //if (root->mGrpId!=-1) 
   //{
   //  md->setMemberGroup(memberGroupDict[root->mGrpId]);
@@ -1535,7 +1537,7 @@ void buildVarList(Entry *root)
     else
       mtype=MemberDef::Variable;
 
-    QCString classScope=stripAnnonymousNamespaceScope(scope);
+    QCString classScope=stripAnonymousNamespaceScope(scope);
     QCString annScopePrefix=scope.left(scope.length()-classScope.length());
     scope=classScope;
     if (!scope.isEmpty() && !name.isEmpty() && (cd=getClass(scope)))
@@ -1639,7 +1641,7 @@ static void buildMemberList(Entry *root)
       //printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
       //    root->parent->name.data(),getClass(root->parent->name),
       //    root->type.find(re,0));
-      QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy());
+      QCString scope=stripAnonymousNamespaceScope(root->parent->name.copy());
 
       bool isMember=FALSE;
       int memIndex=rname.find("::");
@@ -2475,7 +2477,7 @@ static void computeClassRelations(Entry *root)
   {
     ClassDef *cd;
     // strip any annonymous scopes first 
-    QCString bName=stripAnnonymousNamespaceScope(root->name);
+    QCString bName=stripAnonymousNamespaceScope(root->name);
     Debug::print(Debug::Classes,0,"  Class %s : \n",bName.data());
     if ((cd=getClass(bName)))
     {
@@ -3201,7 +3203,7 @@ static void findMember(Entry *root,
     Entry *p=root->parent;
     while (p) // get full scope as class name
     {
-      QCString sc = stripAnnonymousNamespaceScope(p->name);
+      QCString sc = stripAnonymousNamespaceScope(p->name);
       if ((p->section & Entry::SCOPE_MASK) 
           && !sc.isEmpty() && sc[0]!='@'
          )
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 741c76d..e2fcb76 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -114,7 +114,7 @@ void FileDef::writeDocumentation(OutputList &ol)
   //  fn.prepend(stripFromPath(getPath().copy()));
   //}
 
-  //printf("WriteDocumentation %p diskname=%s\n",this,diskname.data());
+  //printf("WriteDocumentation diskname=%s\n",diskname.data());
   
   QCString pageTitle=name()+" File Reference";
   startFile(ol,getOutputFileBase(),pageTitle);
@@ -311,7 +311,13 @@ void FileDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  allMemberList.writeDeclarations(ol,0,0,this,0,0,0);
+  //allMemberList.writeDeclarations(ol,0,0,this,0,0,0);
+  decDefineMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trDefines(),0);
+  decProtoMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trFuncProtos(),0);
+  decTypedefMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trTypedefs(),0);
+  decEnumMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trEnumerations(),0);
+  decFuncMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trFunctions(),0);
+  decVarMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trVariables(),0);
   ol.endMemberSections();
 
   //doc=doc.stripWhiteSpace();
@@ -366,65 +372,23 @@ void FileDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  defineMembers.countDocMembers();
-  if (defineMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trDefineDocumentation());
-    ol.endGroupHeader();
-    defineMembers.writeDocumentation(ol,name(),this);
-  }
+  docDefineMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trDefineDocumentation());
   
-  protoMembers.countDocMembers(); 
-  if (protoMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
-    ol.endGroupHeader();
-    protoMembers.writeDocumentation(ol,name(),this);
-  }
+  docProtoMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trFunctionPrototypeDocumentation());
 
-  typedefMembers.countDocMembers();
-  if (typedefMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trTypedefDocumentation());
-    ol.endGroupHeader();
-    typedefMembers.writeDocumentation(ol,name(),this);
-  }
+  docTypedefMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trTypedefDocumentation());
   
-  enumMembers.countDocMembers();
-  if (enumMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trEnumerationTypeDocumentation());
-    ol.endGroupHeader();
-    enumMembers.writeDocumentation(ol,name(),this);
-  }
+  docEnumMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trEnumerationTypeDocumentation());
 
-  funcMembers.countDocMembers();
-  if (funcMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionDocumentation());
-    ol.endGroupHeader();
-    funcMembers.writeDocumentation(ol,name(),this);
-  }
+  docFuncMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trFunctionDocumentation());
   
-  varMembers.countDocMembers();
-  if (varMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trVariableDocumentation());
-    ol.endGroupHeader();
-    varMembers.writeDocumentation(ol,name(),this);
-  }
+  docVarMembers.writeDocumentation(ol,name(),this,
+                            theTranslator->trVariableDocumentation());
   
   // write Author section (Man only)
   ol.disableAllBut(OutputGenerator::Man);
@@ -470,6 +434,7 @@ void FileDef::writeSource(OutputList &ol)
   ol.enableAll();
 }
 
+#if 0
 /*! Adds a member \a md to the member group with id \a groupId.
  */ 
 void FileDef::addMemberListToGroup(MemberList *ml,
@@ -501,15 +466,16 @@ void FileDef::addMemberListToGroup(MemberList *ml,
     }
   }
 }
+#endif
 
 void FileDef::addMembersToMemberGroup()
 {
-  addMemberListToGroup(&allMemberList,&MemberDef::isDefine);
-  addMemberListToGroup(&allMemberList,&MemberDef::isTypedef);
-  addMemberListToGroup(&allMemberList,&MemberDef::isEnumerate);
-  addMemberListToGroup(&allMemberList,&MemberDef::isEnumValue);
-  addMemberListToGroup(&allMemberList,&MemberDef::isFunction);
-  addMemberListToGroup(&allMemberList,&MemberDef::isVariable);
+  ::addMembersToMemberGroup(&decDefineMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decProtoMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decTypedefMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decEnumMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decFuncMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decVarMembers,memberGroupDict,memberGroupList);
 }
 
 /*! Adds member definition \a md to the list of all members of this file */
@@ -521,45 +487,56 @@ void FileDef::insertMember(MemberDef *md)
   switch(md->memberType())
   {
     case MemberDef::Variable:     
+    case MemberDef::Property:     
+      decVarMembers.append(md);
       if (sortMemberDocs)
-        varMembers.inSort(md); 
+        docVarMembers.inSort(md); 
       else
-        varMembers.append(md);
+        docVarMembers.append(md);
       break;
     case MemberDef::Function: 
+      decFuncMembers.append(md);
       if (sortMemberDocs)    
-        funcMembers.inSort(md); 
+        docFuncMembers.inSort(md); 
       else
-        funcMembers.append(md);
+        docFuncMembers.append(md);
       break;
     case MemberDef::Typedef:      
+      decTypedefMembers.append(md);
       if (sortMemberDocs)
-        typedefMembers.inSort(md); 
+        docTypedefMembers.inSort(md); 
       else
-        typedefMembers.append(md);
+        docTypedefMembers.append(md);
       break;
     case MemberDef::Enumeration:  
+      decEnumMembers.append(md);
       if (sortMemberDocs)
-        enumMembers.inSort(md); 
+        docEnumMembers.inSort(md); 
       else
-        enumMembers.append(md);
+        docEnumMembers.append(md);
       break;
     case MemberDef::EnumValue:    // enum values are shown inside their enums
       break;
     case MemberDef::Prototype:    
+      decProtoMembers.append(md);
       if (sortMemberDocs)
-        protoMembers.inSort(md); 
+        docProtoMembers.inSort(md); 
       else
-        protoMembers.append(md);
+        docProtoMembers.append(md);
       break;
     case MemberDef::Define:       
+      decDefineMembers.append(md);
       if (sortMemberDocs)
-        defineMembers.inSort(md); 
+        docDefineMembers.inSort(md); 
       else
-        defineMembers.append(md);
+        docDefineMembers.append(md);
       break;
     default:
-       err("FileDef::insertMembers(): unexpected member insert in file!\n");
+       err("FileDef::insertMembers(): "
+           "member `%s' with class scope `%s' inserted in file scope `%s'!\n",
+           md->name().data(),
+           md->getClassDef() ? md->getClassDef()->name().data() : "",
+           name().data());
   }
   //addMemberToGroup(md,groupId);
 }
diff --git a/src/filedef.h b/src/filedef.h
index d042601..26a297d 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -149,15 +149,22 @@ class FileDef : public Definition
     //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
 
     MemberList allMemberList;
-    MemberList defineMembers;
-    MemberList protoMembers;
-    MemberList typedefMembers;
-    MemberList enumMembers;
-    MemberList funcMembers;
-    MemberList varMembers;
-
-  protected:
-    void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
+
+    // members in the declaration part of the documentation
+    MemberList decDefineMembers;
+    MemberList decProtoMembers;
+    MemberList decTypedefMembers;
+    MemberList decEnumMembers;
+    MemberList decFuncMembers;
+    MemberList decVarMembers;
+
+    // members in the documentation part of the documentation
+    MemberList docDefineMembers;
+    MemberList docProtoMembers;
+    MemberList docTypedefMembers;
+    MemberList docEnumMembers;
+    MemberList docFuncMembers;
+    MemberList docVarMembers;
 
   private: 
     
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 765c95f..ccb81de 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -56,6 +56,22 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
   memberGroupList->setAutoDelete(TRUE);
   memberGroupDict = new MemberGroupDict(1009);
 
+  decDefineMembers.setInGroup(TRUE);
+  decProtoMembers.setInGroup(TRUE);
+  decTypedefMembers.setInGroup(TRUE);
+  decEnumMembers.setInGroup(TRUE);
+  decEnumValMembers.setInGroup(TRUE);
+  decFuncMembers.setInGroup(TRUE);
+  decVarMembers.setInGroup(TRUE);
+
+  docDefineMembers.setInGroup(TRUE);
+  docProtoMembers.setInGroup(TRUE);
+  docTypedefMembers.setInGroup(TRUE);
+  docEnumMembers.setInGroup(TRUE);
+  docEnumValMembers.setInGroup(TRUE);
+  docFuncMembers.setInGroup(TRUE);
+  docVarMembers.setInGroup(TRUE);
+
   visited = 0;
 }
 
@@ -119,6 +135,7 @@ void GroupDef::addExample(const PageInfo *def)
   exampleDict->append(def->name,def);
 }
 
+#if 0
 void GroupDef::addMemberListToGroup(MemberList *ml,
                                 bool (MemberDef::*func)() const)
 {
@@ -147,9 +164,12 @@ void GroupDef::addMemberListToGroup(MemberList *ml,
     }
   }
 }
+#endif
+
 
 void GroupDef::addMembersToMemberGroup()
 {
+#if 0
   addMemberListToGroup(allMemberList,&MemberDef::isDefine);
   addMemberListToGroup(allMemberList,&MemberDef::isTypedef);
   addMemberListToGroup(allMemberList,&MemberDef::isEnumerate);
@@ -158,6 +178,23 @@ void GroupDef::addMembersToMemberGroup()
   addMemberListToGroup(allMemberList,&MemberDef::isSlot);
   addMemberListToGroup(allMemberList,&MemberDef::isSignal);
   addMemberListToGroup(allMemberList,&MemberDef::isVariable);
+#endif
+
+  ::addMembersToMemberGroup(&decDefineMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decProtoMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decTypedefMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decEnumMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decEnumValMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decFuncMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decVarMembers,memberGroupDict,memberGroupList);
+
+  //printf("GroupDef::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
+  MemberGroupListIterator mgli(*memberGroupList);
+  MemberGroup *mg;
+  for (;(mg=mgli.current());++mgli)
+  {
+    mg->setInGroup(TRUE);
+  }
 }
 
 
@@ -189,49 +226,55 @@ void GroupDef::insertMember(MemberDef *md)
   switch(md->memberType())
   {
     case MemberDef::Variable:     
+      decVarMembers.append(md); 
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        varMembers.inSort(md); 
+        docVarMembers.inSort(md); 
       else
-        varMembers.append(md);
+        docVarMembers.append(md);
       break;
     case MemberDef::Function: 
+      decFuncMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))    
-        funcMembers.inSort(md); 
+        docFuncMembers.inSort(md); 
       else
-        funcMembers.append(md);
+        docFuncMembers.append(md);
       break;
     case MemberDef::Typedef:      
+      decTypedefMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        typedefMembers.inSort(md); 
+        docTypedefMembers.inSort(md); 
       else
-        typedefMembers.append(md);
+        docTypedefMembers.append(md);
       break;
     case MemberDef::Enumeration:  
+      decEnumMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        enumMembers.inSort(md); 
+        docEnumMembers.inSort(md); 
       else
-        enumMembers.append(md);
+        docEnumMembers.append(md);
       break;
     case MemberDef::EnumValue:    
-      if (Config_getBool("SORT_MEMBER_DOCS"))
-        enumValMembers.inSort(md); 
-      else
-        enumValMembers.append(md);
       break;
     case MemberDef::Prototype:    
+      decProtoMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        protoMembers.inSort(md); 
+        docProtoMembers.inSort(md); 
       else
-        protoMembers.append(md);
+        docProtoMembers.append(md);
       break;
     case MemberDef::Define:       
+      decDefineMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        defineMembers.inSort(md); 
+        docDefineMembers.inSort(md); 
       else
-        defineMembers.append(md);
+        docDefineMembers.append(md);
       break;
     default:
-      err("FileDef::insertMembers(): unexpected member insert in file!\n");
+      err("GroupDef::insertMembers(): "
+           "member `%s' with class scope `%s' inserted in group scope `%s'!\n",
+           md->name().data(),
+           md->getClassDef() ? md->getClassDef()->name().data() : "",
+           name().data());
   }
   //addMemberToGroup(md,groupId);
 }
@@ -410,7 +453,13 @@ void GroupDef::writeDocumentation(OutputList &ol)
       mg->writeDeclarations(ol,0,0,0,this);
     }
 
-    allMemberList->writeDeclarations(ol,0,0,0,this,0,0); 
+    //allMemberList->writeDeclarations(ol,0,0,0,this,0,0); 
+    decDefineMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trDefines(),0);
+    decProtoMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trFuncProtos(),0);
+    decTypedefMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trTypedefs(),0);
+    decEnumMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trEnumerations(),0);
+    decFuncMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trFunctions(),0);
+    decVarMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trVariables(),0);
   }
   ol.endMemberSections();
 
@@ -471,65 +520,23 @@ void GroupDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  defineMembers.countDocMembers(TRUE);
-  if (defineMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trDefineDocumentation());
-    ol.endGroupHeader();
-    defineMembers.writeDocumentation(ol,name(),this);
-  }
+  docDefineMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trDefineDocumentation());
   
-  protoMembers.countDocMembers(TRUE); 
-  if (protoMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
-    ol.endGroupHeader();
-    protoMembers.writeDocumentation(ol,name(),this);
-  }
+  docProtoMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trFunctionPrototypeDocumentation());
 
-  typedefMembers.countDocMembers(TRUE);
-  if (typedefMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trTypedefDocumentation());
-    ol.endGroupHeader();
-    typedefMembers.writeDocumentation(ol,name(),this);
-  }
+  docTypedefMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trTypedefDocumentation());
   
-  enumMembers.countDocMembers(TRUE);
-  if (enumMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trEnumerationTypeDocumentation());
-    ol.endGroupHeader();
-    enumMembers.writeDocumentation(ol,name(),this);
-  }
+  docEnumMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trEnumerationTypeDocumentation());
 
-  funcMembers.countDocMembers(TRUE);
-  if (funcMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionDocumentation());
-    ol.endGroupHeader();
-    funcMembers.writeDocumentation(ol,name(),this);
-  }
+  docFuncMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trFunctionDocumentation());
   
-  varMembers.countDocMembers(TRUE);
-  if (varMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trVariableDocumentation());
-    ol.endGroupHeader();
-    varMembers.writeDocumentation(ol,name(),this);
-  }
+  docVarMembers.writeDocumentation(ol,name(),this,
+                             theTranslator->trVariableDocumentation());
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
diff --git a/src/groupdef.h b/src/groupdef.h
index 8c586ba..e55c727 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -94,14 +94,23 @@ class GroupDef : public Definition
     MemberList *allMemberList;
     MemberNameInfoDict *allMemberNameInfoDict;
     
-    // members sorted by type
-    MemberList defineMembers;
-    MemberList protoMembers;
-    MemberList typedefMembers;
-    MemberList enumMembers;
-    MemberList enumValMembers;
-    MemberList funcMembers;
-    MemberList varMembers;
+    // members in the declaration part of the documentation
+    MemberList decDefineMembers;
+    MemberList decProtoMembers;
+    MemberList decTypedefMembers;
+    MemberList decEnumMembers;
+    MemberList decEnumValMembers;
+    MemberList decFuncMembers;
+    MemberList decVarMembers;
+
+    // members in the documentation part of the documentation
+    MemberList docDefineMembers;
+    MemberList docProtoMembers;
+    MemberList docTypedefMembers;
+    MemberList docEnumMembers;
+    MemberList docEnumValMembers;
+    MemberList docFuncMembers;
+    MemberList docVarMembers;
 
     /* user defined member groups */
     MemberGroupList *memberGroupList;   // list of member groups in this group
diff --git a/src/index.cpp b/src/index.cpp
index d37bef6..f7aa869 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -2239,13 +2239,13 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,bool subLevel)
       };
       MemInfo memberLists[] = 
       {
-        MemInfo(&gd->defineMembers,  theTranslator->trDefines()),
-        MemInfo(&gd->typedefMembers, theTranslator->trTypedefs()),
-        MemInfo(&gd->enumMembers,    theTranslator->trEnumerations()),
-        MemInfo(&gd->enumValMembers, theTranslator->trEnumerationValues()),
-        MemInfo(&gd->funcMembers,    theTranslator->trFunctions()),
-        MemInfo(&gd->varMembers,     theTranslator->trVariables()),
-        MemInfo(&gd->protoMembers,   theTranslator->trFuncProtos()),
+        MemInfo(&gd->docDefineMembers,  theTranslator->trDefines()),
+        MemInfo(&gd->docTypedefMembers, theTranslator->trTypedefs()),
+        MemInfo(&gd->docEnumMembers,    theTranslator->trEnumerations()),
+        MemInfo(&gd->docEnumValMembers, theTranslator->trEnumerationValues()),
+        MemInfo(&gd->docFuncMembers,    theTranslator->trFunctions()),
+        MemInfo(&gd->docVarMembers,     theTranslator->trVariables()),
+        MemInfo(&gd->docProtoMembers,   theTranslator->trFuncProtos()),
         MemInfo(0,0)
       };
 
diff --git a/src/language.cpp b/src/language.cpp
index 870a271..d8b2b86 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -61,10 +61,6 @@ bool setTranslator(const char *langName)
   }
   else if (L_EQUAL("czech"))
   {
-#ifndef _WIN32
-    err("Warning: The Czech translation uses the windows code page 1250 encoding.\n"
-        "Please convert translator_cz.h to ISO Latin-2 to use it under UNIX.\n");
-#endif
     theTranslator=new TranslatorCzech;
   }
   else if (L_EQUAL("french"))
@@ -133,7 +129,7 @@ bool setTranslator(const char *langName)
   }
   else if (L_EQUAL("brazilian"))
   {
-    theTranslator=new TranslatorBrazilianPortuguese;
+    theTranslator=new TranslatorBrazilian;
   }
 #endif
   else // use the default language (i.e. english)
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 9347c79..761845f 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -261,16 +261,6 @@ static void writeDefaultHeaderPart1(QTextStream &t)
       // The result of the LatexLanguageSupportCommand()
       // is empty, which means that the language prefers
       // the babel package, or no package is needed at all.
-      if (theTranslator->latexBabelPackage()=="russian")
-      {
-        // The russian babel package also needs an encoding.
-        // Assume the encoding matched the platform.
-#if defined(_WIN32)
-        t << "\\usepackage[cp1251]{inputenc}\n";
-#else
-        t << "\\usepackage[koi8-r]{inputenc}\n";
-#endif
-      }
       t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n";
     }
   }
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 9962576..75b5c21 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -182,7 +182,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
   }
 }
 
-static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
+static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
 {
   ol.docify("template<");
   Argument *a=al->first();
@@ -200,35 +200,29 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
     if (a) ol.docify(", ");
   }
   ol.docify("> ");
-  if (br)
-  {
-  //  ol.pushGeneratorState();
-  //  ol.disable(OutputGenerator::Man);
-  //  ol.disable(OutputGenerator::Latex);
-  //  ol.lineBreak();
-  //  ol.popGeneratorState();
-  }
 }
 
 //-----------------------------------------------------------------------------
 
 /*! Creates a new member definition.
- *  Members can be function/variables/enums/etc. inside a class or inside a 
- *  file.
  *
  * \param df File containing the definition of this member.
  * \param dl Line at which the member definition was found.
  * \param t  A string representing the type of the member.
- * \param n  A string representing the name of the member.
+ * \param na A string representing the name of the member.
  * \param a  A string representing the arguments of the member.
- * \param p  The type of protection of the member, possible values are:
+ * \param e  A string representing the throw clause of the members.
+ * \param p  The protection context of the member, possible values are:
  *           \c Public, \c Protected, \c Private.
- * \param v  The `virtualness' of the member, possible values are:
+ * \param v  The degree of `virtualness' of the member, possible values are:
  *           \c Normal, \c Virtual, \c Pure.
- * \param s  A boolean that is true if the member is static.
- * \param r  A boolean that is true if the member is only related.
+ * \param s  A boolean that is true iff the member is static.
+ * \param r  A boolean that is true iff the member is only related.
  * \param mt The kind of member. See #MemberDef::MemberType for a list of 
  *           all types.
+ * \param tal The template arguments of this member.
+ * \param al  The arguments of this member. This is a structured form of 
+ *            the string past as argument \a a.
  */
 
 MemberDef::MemberDef(const char *df,int dl,
@@ -240,7 +234,6 @@ MemberDef::MemberDef(const char *df,int dl,
   //printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
   classDef=0;
   fileDef=0;
-  //fileDec=0;
   redefines=0;
   redefinedBy=0;
   nspace=0;
@@ -268,7 +261,6 @@ MemberDef::MemberDef(const char *df,int dl,
   stat=s;
   mtype=mt;
   exception=e;
-  eUsed=FALSE;
   proto=FALSE;
   annScope=FALSE;
   memSpec=FALSE;
@@ -319,6 +311,7 @@ MemberDef::MemberDef(const char *df,int dl,
   }
 }
 
+/*! Destroys the member definition. */
 MemberDef::~MemberDef()
 {
   delete redefinedBy;
@@ -399,10 +392,6 @@ QCString MemberDef::getOutputFileBase() const
   {
     return fileDef->getOutputFileBase();
   }
-  //else if (fileDec)
-  //{
-  //  return fileDec->getOutputFileBase();
-  //}
   else if (nspace)
   {
     return nspace->getOutputFileBase();
@@ -454,7 +443,7 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
 {
   Definition *d=0;
   if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else if (gd) d=gd;
-  if (d==0) { err("Member %s without group! Please report this bug!\n",name().data()); return; }
+  if (d==0) { err("Member %s without definition! Please report this bug!\n",name().data()); return; }
   if (group!=0 && gd==0) // forward link to the group
   {
     ol.writeObjectLink(group->getReference(),group->getOutputFileBase(),anchor(),name());
@@ -465,422 +454,435 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd,
   }
 }
 
-
-void MemberDef::writeDeclaration(OutputList &ol,
-               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup
-               )
+/*! If this member has an anonymous class/struct/union as its type, then
+ *  this method will return the ClassDef that describes this return type.
+ */
+ClassDef *MemberDef::getClassDefOfAnonymousType(const char *scopeName) const
 {
-  int i,l;
-  bool hasDocs=hasDocumentation();
-  //printf("%s MemberDef::writeDeclaration(): hasDocs %d\n",name().data(),hasDocs);
-  //if (cd)
-  //{
-  //  printf("MemberDef: %s in class %s annScope=%d annMemb=%p\n",
-  //    name().data(),cd->name().data(),annScope,annMemb);
-  //}
-
-  // hide members in anonymous scopes 
-  // (they are displayed by there parent placeholder)
-  if (annScope) return;
-  // hide undocumented members unless overwritten by the configuration
-  if (!hasDocs && Config_getBool("HIDE_UNDOC_MEMBERS")) return;
-  // hide members with no detailed desciption and brief descriptions explicitly
-  // disabled.
-  if (Config_getBool("HIDE_UNDOC_MEMBERS") && documentation().isEmpty() && 
-      !Config_getBool("BRIEF_MEMBER_DESC") && !Config_getBool("REPEAT_BRIEF") 
-     ) return;
-  // hide static file & namespace members unless extract static is on
-  if (cd==0 && isStatic() && !Config_getBool("EXTRACT_STATIC")) return;
-
-  // hide private member that are put into a member group. Non-grouped
-  // members are not rendered anyway.
-  //printf("md->name()=`%s' Protection=%d\n",name().data(),protection());
-  if (inGroup && protection()==Private && !Config_getBool("EXTRACT_PRIVATE")) return;
-
-  QCString ltype=type.copy();
+  QCString cname=scopeName;
+  QCString ltype(type);
   // strip `static' keyword from ltype
   if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
   // strip `friend' keyword from ltype
   if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7);
   static QRegExp r("@[0-9]+");
-  i=-1;
-  if ((ltype.isEmpty() || (i=r.match(ltype,0,&l))==-1) || !enumUsed())
+  int l,i=r.match(ltype,0,&l);
+  // search for the last anonymous scope in the member type
+  ClassDef *annoClassDef=0;
+  if (i!=-1) // found anonymous scope in type
   {
-    
-    if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+    int il=i-1,ir=i+l;
+    // extract anonymous scope
+    while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--;
+    if (il>0) il++;
+    while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++;
+
+    //QCString annName = ltype.mid(i,l);
+    QCString annName = ltype.mid(il,ir-il);
+
+    // if inside a class or namespace try to prepend the scope name
+    if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::") 
     {
-      Doxygen::tagFile << "    <member kind=\"";
-      switch (mtype)
-      {
-        case Define:      Doxygen::tagFile << "define";      break;
-        case EnumValue:   Doxygen::tagFile << "enumvalue";   break;
-        case Property:    Doxygen::tagFile << "property";    break;
-        case Variable:    Doxygen::tagFile << "variable";    break;
-        case Typedef:     Doxygen::tagFile << "typedef";     break;
-        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 Friend:      Doxygen::tagFile << "friend";      break;
-        case DCOP:        Doxygen::tagFile << "dcop";        break;
-        case Slot:        Doxygen::tagFile << "slot";        break;
-      }
-      if (prot!=Public)
-      {
-        Doxygen::tagFile << "\" protection=\"";
-        if (prot==Protected) Doxygen::tagFile << "public";
-        else /* Private */   Doxygen::tagFile << "protected"; 
-      }
-      if (virt!=Normal)
-      {
-        Doxygen::tagFile << "\" virtualness=\"";
-        if (virt==Virtual) Doxygen::tagFile << "virtual";
-        else /* Pure */    Doxygen::tagFile << "pure"; 
-      }
-      if (isStatic())
-      {
-        Doxygen::tagFile << "\" static=\"yes";
-      }
-      Doxygen::tagFile << "\">" << endl;
-      Doxygen::tagFile << "      <name>" << convertToXML(name()) << "</name>" << endl;
-      Doxygen::tagFile << "      <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
-      Doxygen::tagFile << "      <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
-      writeDocAnchorsToTagFile();
-      Doxygen::tagFile << "    </member>" << endl;
+      QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName);
+      //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+      annoClassDef=getClass(ts);
     }
-      
-    Definition *d=0;
-    ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
-    if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
-    QCString cname  = d->name();
-    QCString cfname = d->getOutputFileBase();
-
-    //int gId = inGroup ? -1 : groupId();
-    //MemberGroup *mg = (gId!=prevGroupId && gId!=-1) ? memberGroupDict[gId] : 0;
-    //const char *gHeader = 0;
-    //const char *gFile = 0;
-    //if (mg)
-    //{
-    //  gHeader=mg->header();
-    //  gFile=mg->getOutputFileBase();
-    //}
-    //
-    //if (!inGroup)
-    //{
-    //  if (prevGroupId==-1 && gId!=-1)
-    //  {
-    //    ol.memberGroupSpacing(FALSE);
-    //    ol.memberGroupSeparator();
-    //  }
-    //  else if (prevGroupId!=-1 && gId==-1)
-    //  {
-    //    ol.memberGroupSpacing(TRUE);
-    //    ol.memberGroupSeparator();
-    //  }
-    //  else if (prevGroupId!=-1 && gId!=-1 && prevGroupId!=gId)
-    //  {
-    //    ol.memberGroupSpacing(TRUE);
-    //    ol.memberGroupSeparator();
-    //  }
-    //}
-    
-    HtmlHelp *htmlHelp=0;
-    bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
-    if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
-    
-    // search for the last anonymous scope in the member type
-    ClassDef *annoClassDef=0;
-    //while (i!=-1 && cname.find(ltype.mid(i,l))!=-1)
-    //{
-    //  i=r.match(ltype,i+l,&l);
-    //}
-    int il=i-1,ir=i+l;
-    if (i!=-1) // found anonymous scope in type
+    // if not found yet, try without scope name
+    if (annoClassDef==0)
     {
-      // extract anonymous scope
-      while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--;
-      if (il>0) il++;
-      while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++;
-
-      //QCString annName = ltype.mid(i,l);
-      QCString annName = ltype.mid(il,ir-il);
-      
-      // if inside a class or namespace try to prepend the scope name
-      if ((cd || nd) && annName.left(cname.length())!=cname) 
-      {
-        QCString ts=stripAnnonymousNamespaceScope(cname+"::"+annName);
-        //printf("Member::writeDeclaration: Trying %s\n",ts.data());
-        annoClassDef=getClass(ts);
-      }
-      // if not found yet, try without scope name
-      if (annoClassDef==0)
-      {
-        QCString ts=stripAnnonymousNamespaceScope(annName);
-        //printf("Member::writeDeclaration: Trying %s\n",ts.data());
-        annoClassDef=getClass(ts);
-      }
+      QCString ts=stripAnonymousNamespaceScope(annName);
+      //printf("Member::writeDeclaration: Trying %s\n",ts.data());
+      annoClassDef=getClass(ts);
     }
+  }
+  return annoClassDef;
+}
+    
+/*! This methods returns TRUE iff the brief section (also known as
+ *  declaration section) is visible in the documentation.
+ */
+bool MemberDef::isBriefSectionVisible() const
+{
+    // only include static members with file/namespace scope if 
+    // explicitly enabled in the config file
+    bool visibleIfStatic = !(getClassDef()==0 && 
+                             isStatic() && 
+                             !Config_getBool("EXTRACT_STATIC")
+                            );
 
-    // start a new member declaration
-    ol.startMemberItem((annoClassDef || annMemb || annEnumType) ? 1 : 0);
+    // only include members is the are documented or 
+    // HIDE_UNDOC_MEMBERS is NO in the config file
+    bool visibleIfDocumented = (!Config_getBool("HIDE_UNDOC_MEMBERS") || 
+                                hasDocumentation()
+                               );
+
+    // hide members with no detailed desciption and brief descriptions 
+    // explicitly disabled.
+    bool visibleIfEnabled = !(Config_getBool("HIDE_UNDOC_MEMBERS") && 
+                              documentation().isEmpty() &&
+                              !Config_getBool("BRIEF_MEMBER_DESC") && 
+                              !Config_getBool("REPEAT_BRIEF")
+                             );
+
+    // only include members that are non-private unless EXTRACT_PRIVATE is
+    // set to YES or the member is part of a group
+    bool visibleIfPrivate = (protection()!=Private || 
+                             Config_getBool("EXTRACT_PRIVATE")
+                            );
     
-    // If there is no detailed description we need to write the anchor here.
-    bool detailsVisible = detailsAreVisible();
-    if (!detailsVisible && !Config_getBool("EXTRACT_ALL") && !annMemb)
-    {
-      QCString doxyName=name().copy();
-      if (!cname.isEmpty()) doxyName.prepend(cname+"::");
-      ol.startDoxyAnchor(cfname,anchor(),doxyName);
+    return visibleIfStatic && visibleIfDocumented && 
+           visibleIfEnabled && visibleIfPrivate && !annScope;
+}
 
-      ol.addIndexItem(name(),cname);
-      ol.addIndexItem(cname,name());
+void MemberDef::writeDeclaration(OutputList &ol,
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
+               bool inGroup
+               )
+{
+  //printf("%s MemberDef::writeDeclaration()\n",name().data());
 
-      if (hasHtmlHelp)
-      {
-        htmlHelp->addIndexItem(cname,name(),cfname,anchor());
-      }
-      ol.pushGeneratorState();
-      ol.disable(OutputGenerator::Man);
-      ol.docify("\n");
-      ol.popGeneratorState();
-    }
+  // hide members whose brief section should not be visible
+  if (!isBriefSectionVisible()) return;
 
-    //printf("member name=%s indDepth=%d\n",name().data(),indDepth);
-    if (annoClassDef || annMemb)
-    {
-      int j;
-      for (j=0;j<indDepth;j++) 
-      {
-        ol.writeNonBreakableSpace(3);
-      }
-    }
-    
-    if (tArgList)
+  // write tag file information of this member
+  if (!Config_getString("GENERATE_TAGFILE").isEmpty())
+  {
+    Doxygen::tagFile << "    <member kind=\"";
+    switch (mtype)
     {
-      writeTemplatePrefix(ol,tArgList,FALSE);
+      case Define:      Doxygen::tagFile << "define";      break;
+      case EnumValue:   Doxygen::tagFile << "enumvalue";   break;
+      case Property:    Doxygen::tagFile << "property";    break;
+      case Variable:    Doxygen::tagFile << "variable";    break;
+      case Typedef:     Doxygen::tagFile << "typedef";     break;
+      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 Friend:      Doxygen::tagFile << "friend";      break;
+      case DCOP:        Doxygen::tagFile << "dcop";        break;
+      case Slot:        Doxygen::tagFile << "slot";        break;
     }
-    else if (membTAL)
+    if (prot!=Public)
     {
-      writeTemplatePrefix(ol,membTAL,FALSE);
+      Doxygen::tagFile << "\" protection=\"";
+      if (prot==Protected) Doxygen::tagFile << "public";
+      else /* Private */   Doxygen::tagFile << "protected"; 
     }
-    
-    if (i!=-1) // member has an anonymous type
+    if (virt!=Normal)
     {
-      //printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
-      //    annoClassDef,annMemb,cname.data(),ltype.mid(i,l).data());
-
-      if (annoClassDef) // type is an anonymous compound
-      {
-        //printf("class found!\n");
-        annoClassDef->writeDeclaration(ol,annMemb,inGroup);
-        ol.startMemberItem(2);
-        int j;
-        for (j=0;j<indDepth;j++) 
-        {
-          ol.writeNonBreakableSpace(3);
-        }
-        QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
-        ol.docify("}");
-        if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) 
-        {
-          ol.docify(";"); 
-        }
-        else 
-        {
-          ol.docify(varName);
-        }
-      }
-      else
-      {
-        if (getAnonymousEnumType()) // type is an anonymous enum
-        {
-          linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype.left(i),TRUE); 
-          ol+=*getAnonymousEnumType()->enumDecl();
-          linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype.right(ltype.length()-i-l),TRUE); 
-        }
-        else
-        {
-          ltype = ltype.left(i) + " { ... } " + ltype.right(ltype.length()-i-l);
-          linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype,TRUE); 
-        }
-      }
+      Doxygen::tagFile << "\" virtualness=\"";
+      if (virt==Virtual) Doxygen::tagFile << "virtual";
+      else /* Pure */    Doxygen::tagFile << "pure"; 
     }
-    else
-    {
-      linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype,TRUE); 
-    }
-    bool htmlOn = ol.isEnabled(OutputGenerator::Html);
-    if (htmlOn && Config_getBool("HTML_ALIGN_MEMBERS") && !ltype.isEmpty())
+    if (isStatic())
     {
-      ol.disable(OutputGenerator::Html);
+      Doxygen::tagFile << "\" static=\"yes";
     }
-    if (!ltype.isEmpty()) ol.docify(" ");
-    if (htmlOn) 
+    Doxygen::tagFile << "\">" << endl;
+    Doxygen::tagFile << "      <name>" << convertToXML(name()) << "</name>" << endl;
+    Doxygen::tagFile << "      <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
+    Doxygen::tagFile << "      <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
+    writeDocAnchorsToTagFile();
+    Doxygen::tagFile << "    </member>" << endl;
+  }
+
+  Definition *d=0;
+  ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
+  if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
+  QCString cname  = d->name();
+  QCString cfname = d->getOutputFileBase();
+
+  HtmlHelp *htmlHelp=0;
+  bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
+  if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
+
+  // search for the last anonymous scope in the member type
+  ClassDef *annoClassDef=getClassDefOfAnonymousType((cd||nd)?cname.data():0);
+
+  // start a new member declaration
+  ol.startMemberItem((annoClassDef || annMemb || annEnumType) ? 1 : 0);
+
+  // If there is no detailed description we need to write the anchor here.
+  bool detailsVisible = isDetailedSectionVisible();
+  if (!detailsVisible && !annMemb)
+  {
+    QCString doxyName=name().copy();
+    if (!cname.isEmpty()) doxyName.prepend(cname+"::");
+    ol.startDoxyAnchor(cfname,anchor(),doxyName);
+
+    ol.addIndexItem(name(),cname);
+    ol.addIndexItem(cname,name());
+
+    if (hasHtmlHelp)
     {
-      ol.enable(OutputGenerator::Html);
+      htmlHelp->addIndexItem(cname,name(),cfname,anchor());
     }
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::Man);
+    ol.docify("\n");
+    ol.popGeneratorState();
+  }
 
-    if (annMemb) 
+  //printf("member name=%s indDepth=%d\n",name().data(),indDepth);
+  if (annoClassDef || annMemb)
+  {
+    int j;
+    for (j=0;j<indDepth;j++) 
     {
-      //bool latexOn = ol.isEnabled(OutputGenerator::Latex);
-      //bool manOn   = ol.isEnabled(OutputGenerator::Man);
-      //if (latexOn) ol.disable(OutputGenerator::Latex);
-      //if (manOn)   ol.disable(OutputGenerator::Man);
-      ol.pushGeneratorState();
-      ol.disableAllBut(OutputGenerator::Html);
       ol.writeNonBreakableSpace(3);
-      ol.popGeneratorState();
-      //if (latexOn) ol.enable(OutputGenerator::Latex);
-      //if (manOn)   ol.enable(OutputGenerator::Man);
     }
-    else
+  }
+
+  if (tArgList)
+  {
+    writeTemplatePrefix(ol,tArgList);
+  }
+  else if (membTAL)
+  {
+    writeTemplatePrefix(ol,membTAL);
+  }
+
+  QCString ltype(type);
+  // strip `static' keyword from ltype
+  if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
+  // strip `friend' keyword from ltype
+  if (ltype.left(7)=="friend ") ltype=ltype.right(ltype.length()-7);
+  static QRegExp r("@[0-9]+");
+
+  int l,i=r.match(ltype,0,&l);
+  if (i!=-1) // member has an anonymous type
+  {
+    //printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
+    //    annoClassDef,annMemb,cname.data(),ltype.mid(i,l).data());
+
+    if (annoClassDef) // type is an anonymous compound
     {
-      ol.insertMemberAlign();
+      int ir=i+l;
+      //printf("class found!\n");
+      annoClassDef->writeDeclaration(ol,annMemb,inGroup);
+      ol.startMemberItem(2);
+      int j;
+      for (j=0;j<indDepth;j++) 
+      {
+        ol.writeNonBreakableSpace(3);
+      }
+      QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
+      //printf(">>>>>> indDepth=%d ltype=`%s' varName=`%s'\n",indDepth,ltype.data(),varName.data());
+      ol.docify("}");
+      if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@')) 
+      {
+        ol.docify(";"); 
+      }
+      //else 
+      //{
+      //  ol.docify(varName);
+      //}
     }
-    
-    // write name
-    if (!name().isEmpty() && name().at(0)!='@')
+    else
     {
-      if (isLinkable())
+      if (getAnonymousEnumType()) // type is an anonymous enum
       {
-        if (annMemb)
-        {
-          //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
-          annMemb->writeLink(ol,
-              annMemb->getClassDef(),
-              annMemb->getNamespaceDef(),
-              annMemb->getFileDef(),
-              annMemb->getGroupDef()
-                            );
-          annMemb->annUsed=annUsed=TRUE;
-        }
-        else
-          //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
-          writeLink(ol,cd,nd,fd,gd);
+        linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype.left(i),TRUE); 
+        ol+=*getAnonymousEnumType()->enumDecl();
+        linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype.right(ltype.length()-i-l),TRUE); 
       }
-      else // there is a brief member description and brief member 
-        // descriptions are enabled or there is no detailed description.
+      else
       {
-        if (annMemb) annMemb->annUsed=annUsed=TRUE;
-        ol.startBold();
-        ol.docify(name());
-        ol.endBold();
+        ltype = ltype.left(i) + " { ... } " + ltype.right(ltype.length()-i-l);
+        linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype,TRUE); 
       }
     }
+  }
+  else
+  {
+    linkifyText(TextGeneratorOLImpl(ol),cname,name(),ltype,TRUE); 
+  }
+  bool htmlOn = ol.isEnabled(OutputGenerator::Html);
+  if (htmlOn && Config_getBool("HTML_ALIGN_MEMBERS") && !ltype.isEmpty())
+  {
+    ol.disable(OutputGenerator::Html);
+  }
+  if (!ltype.isEmpty()) ol.docify(" ");
+  if (htmlOn) 
+  {
+    ol.enable(OutputGenerator::Html);
+  }
 
-    // if member template specifiers are not part of the name, but they are
-    // present, we add them
-    //if (tArgList && !(name().find('<')!=-1 && name().find('>')!=-1)
-    //    && cd && cd->templateArguments())
-    //{
-    //  ol.docify(tempArgListToString(tArgList));
-    //}
+  if (annMemb) 
+  {
+    ol.pushGeneratorState();
+    ol.disableAllBut(OutputGenerator::Html);
+    ol.writeNonBreakableSpace(3);
+    ol.popGeneratorState();
+  }
+  else
+  {
+    ol.insertMemberAlign();
+  }
 
-    if (argsString()) 
+  // write name
+  if (!name().isEmpty() && name().at(0)!='@')
+  {
+    if (isLinkable())
     {
-      if (!isDefine()) ol.writeString(" ");
-      //ol.docify(argsString());
-      linkifyText(TextGeneratorOLImpl(ol),cname,name(),argsString()); 
+      if (annMemb)
+      {
+        //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
+        annMemb->writeLink(ol,
+            annMemb->getClassDef(),
+            annMemb->getNamespaceDef(),
+            annMemb->getFileDef(),
+            annMemb->getGroupDef()
+                          );
+        annMemb->annUsed=annUsed=TRUE;
+      }
+      else
+        //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
+        writeLink(ol,cd,nd,fd,gd);
     }
-    
-    if (excpString())
+    else // there is a brief member description and brief member 
+      // descriptions are enabled or there is no detailed description.
     {
-      ol.writeString(" ");
-      ol.docify(excpString());
+      if (annMemb) annMemb->annUsed=annUsed=TRUE;
+      ol.startBold();
+      ol.docify(name());
+      ol.endBold();
     }
+  }
+
+  if (argsString()) 
+  {
+    if (!isDefine()) ol.writeString(" ");
+    //ol.docify(argsString());
+    linkifyText(TextGeneratorOLImpl(ol),cname,name(),argsString()); 
+  }
+
+  if (excpString())
+  {
+    ol.writeString(" ");
+    ol.docify(excpString());
+  }
 
-    if (!bitfields.isEmpty()) // add bitfields
+  if (!bitfields.isEmpty()) // add bitfields
+  {
+    linkifyText(TextGeneratorOLImpl(ol),cname,name(),bitfields.simplifyWhiteSpace());
+  }
+  else if (!init.isEmpty() && initLines==0 && // one line initializer
+      ((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
+          ) // add initializer
+  {
+    if (!isDefine()) 
     {
-      linkifyText(TextGeneratorOLImpl(ol),cname,name(),bitfields.simplifyWhiteSpace());
+      ol.writeString(" = "); 
+      linkifyText(TextGeneratorOLImpl(ol),cname,name(),init.simplifyWhiteSpace());
     }
-    else if (!init.isEmpty() && initLines==0 && // one line initializer
-             ((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
-            ) // add initializer
+    else 
     {
-      if (!isDefine()) 
-      {
-        ol.writeString(" = "); 
-        linkifyText(TextGeneratorOLImpl(ol),cname,name(),init.simplifyWhiteSpace());
-      }
-      else 
-      {
-        ol.writeNonBreakableSpace(3);
-        linkifyText(TextGeneratorOLImpl(ol),cname,name(),init);
-      }
+      ol.writeNonBreakableSpace(3);
+      linkifyText(TextGeneratorOLImpl(ol),cname,name(),init);
     }
+  }
 
-    if (!detailsVisible && !Config_getBool("EXTRACT_ALL") && !annMemb)
-    {
-      ol.endDoxyAnchor(cfname,anchor());
-    }
+  if (!detailsVisible && !annMemb)
+  {
+    ol.endDoxyAnchor(cfname,anchor());
+  }
 
-    ol.endMemberItem((annoClassDef!=0 && indDepth==0) || annEnumType);
-    
-    //ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
-    // write brief description
-    if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") && !annMemb)
+  ol.endMemberItem((annoClassDef!=0 && indDepth==0) || annEnumType);
+
+  //ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
+  // write brief description
+  if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") && !annMemb)
+  {
+    ol.startMemberDescription();
+    parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
+    if (detailsVisible) 
     {
-      ol.startMemberDescription();
-      parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
-      if (/*!documentation().isEmpty()*/ detailsAreVisible()) 
+      ol.pushGeneratorState();
+      ol.disableAllBut(OutputGenerator::Html);
+      ol.endEmphasis();
+      ol.docify(" ");
+      if (group!=0 && gd==0) // forward link to the group
       {
-        ol.pushGeneratorState();
-        ol.disableAllBut(OutputGenerator::Html);
-        ol.endEmphasis();
-        ol.docify(" ");
-        if (group!=0 && gd==0) // forward link to the group
-        {
-          ol.startTextLink(group->getOutputFileBase(),anchor());
-        }
-        else
-        {
-          ol.startTextLink(0,anchor());
-        }
-        parseText(ol,theTranslator->trMore());
-        ol.endTextLink();
-        ol.startEmphasis();
-        ol.popGeneratorState();
+        ol.startTextLink(group->getOutputFileBase(),anchor());
+      }
+      else
+      {
+        ol.startTextLink(0,anchor());
       }
-      //ol.newParagraph();
-      ol.endMemberDescription();
+      parseText(ol,theTranslator->trMore());
+      ol.endTextLink();
+      ol.startEmphasis();
+      ol.popGeneratorState();
     }
+    //ol.newParagraph();
+    ol.endMemberDescription();
   }
   warnIfUndocumented();
 }
 
+bool MemberDef::isDetailedSectionVisible(bool inGroup) const          
+{ 
+  // the member has details documentation for any of the following reasons
+  bool docFilter = 
+         // treat everything as documented
+         Config_getBool("EXTRACT_ALL") ||          
+         // has detailed docs
+         !documentation().isEmpty() ||             
+         // is an enum with values that are documented
+         (mtype==Enumeration && docEnumValues) ||  
+         // is documented enum value
+         (mtype==EnumValue && !briefDescription().isEmpty()) || 
+         // has brief description that is part of the detailed description
+         (!briefDescription().isEmpty() && 
+           (!Config_getBool("BRIEF_MEMBER_DESC") || 
+             Config_getBool("ALWAYS_DETAILED_SEC")) && 
+             Config_getBool("REPEAT_BRIEF"
+           ) 
+         ) ||
+         // has a multi-line initialization block
+         (initLines>0 && initLines<maxInitLines) || 
+         // has one or more documented arguments
+         (argList!=0 && argList->hasDocumentation()); 
+         
+  // this is not a global static or global statics should be extracted
+  bool staticFilter = getClassDef()!=0 || !isStatic() || Config_getBool("EXTRACT_STATIC"); 
+         
+  // details are not part of a group or this is for a group documentation page
+  bool groupFilter = getGroupDef()==0 || inGroup; 
+
+  // member is part of an anonymous scope that is the type of
+  // another member in the list.
+  //
+  bool inAnonymousScope = !briefDescription().isEmpty() && annUsed;
+
+  return ((docFilter && staticFilter) || inAnonymousScope) && groupFilter;
+}
+
 /*! Writes the "detailed documentation" section of this member to
  *  all active output formats.
  */
 void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
                                    const char *scName,
-                                   Definition *container
+                                   Definition *container,
+                                   bool inGroup
                                   )
 {
-  // hide global static functions unless extractStaticFlag is enabled
-  if (getClassDef()==0 && isStatic() && !Config_getBool("EXTRACT_STATIC")) return;
-  // hide member that are documented in their own group
-  if (group!=0 && container->definitionType()!=TypeGroup) return;
-
   // if this member is in a group find the real scope name.
-  QCString scopeName = scName;
-  if (container->definitionType()==TypeGroup)
+  bool hasDocs = isDetailedSectionVisible(inGroup);
+  //printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n",
+  //    name().data(),hasDocs,container->definitionType(),inGroup);
+  if ( hasDocs )
   {
-    if (getClassDef())          scopeName=getClassDef()->name();
-    else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
-    else if (getFileDef())      scopeName=getFileDef()->name();
-  }
+    QCString scopeName = scName;
+    if (container->definitionType()==TypeGroup)
+    {
+      if (getClassDef())          scopeName=getClassDef()->name();
+      else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
+      else if (getFileDef())      scopeName=getFileDef()->name();
+    }
   
-  bool hasDocs = detailsAreVisible();
-  //printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
-  if (
-      Config_getBool("EXTRACT_ALL") || hasDocs 
-      || /* member is part of an anonymous scope that is the type of
-          * another member in the list.
-          */ 
-       (!hasDocs && !briefDescription().isEmpty() && annUsed)
-     )
-  {
     // get definition. 
     QCString cname  = container->name();
     QCString cfname = container->getOutputFileBase();  
@@ -939,7 +941,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
       }
       if (!found) // anonymous compound
       {
-        //printf("Annonymous compound `%s'\n",cname.data());
+        //printf("Anonymous compound `%s'\n",cname.data());
         ol.startDoxyAnchor(cfname,anchor(),doxyName);
         ol.startMemberDoc(cname,name(),anchor(),name());
         if (hasHtmlHelp)
@@ -1429,30 +1431,17 @@ bool MemberDef::isLinkable()
   return isLinkableInProject() || isReference();
 }
 
-bool MemberDef::detailsAreVisible() const          
-{ 
-  return !documentation().isEmpty() || // has detailed docs
-         //((Config_getBool("SOURCE_BROWSER") || Config_getBool("INLINE_SOURCES")) && startBodyLine!=-1 && bodyDef) ||  // has reference to sources 
-         (mtype==Enumeration && docEnumValues) ||  // has enum values
-         (mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value
-         (!briefDescription().isEmpty() && 
-           (!Config_getBool("BRIEF_MEMBER_DESC") || Config_getBool("ALWAYS_DETAILED_SEC")) && 
-           Config_getBool("REPEAT_BRIEF") // has brief description inside detailed area
-         ) ||
-         (initLines>0 && initLines<maxInitLines) ||
-         (argList!=0 && argList->hasDocumentation())
-         ;
-}
-
 void MemberDef::setEnumDecl(OutputList &ed) 
 { 
   enumDeclList=new OutputList(&ed); 
   *enumDeclList+=ed;
 }
 
-bool MemberDef::hasDocumentation()
+bool MemberDef::hasDocumentation() const
 { 
-  return Definition::hasDocumentation() || (argList!=0 && argList->hasDocumentation()); 
+  return Definition::hasDocumentation() || 
+         (mtype==Enumeration && docEnumValues) ||  // has enum values
+         (argList!=0 && argList->hasDocumentation()); 
 }
 
 void MemberDef::setMemberGroup(MemberGroup *grp)
diff --git a/src/memberdef.h b/src/memberdef.h
index ee60338..4eda16b 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -95,6 +95,7 @@ class MemberDef : public Definition
     Specifier virtualness() const         { return virt; }
     MemberType memberType() const         { return mtype; }
 
+
     // convenience methods
     bool isSignal() const                 { return mtype==Signal;      }
     bool isSlot() const                   { return mtype==Slot;        }
@@ -117,8 +118,9 @@ class MemberDef : public Definition
     // output info
     bool isLinkableInProject();
     bool isLinkable();
-    bool detailsAreVisible() const;
-    bool hasDocumentation();  // overrides hasDocumentation in definition.h
+    bool hasDocumentation() const;  // overrides hasDocumentation in definition.h
+    bool isBriefSectionVisible() const;
+    bool isDetailedSectionVisible(bool inGroup=FALSE) const;
 
     // set functions
     void setMemberType(MemberType t)      { mtype=t; }
@@ -148,7 +150,8 @@ class MemberDef : public Definition
                    ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
                    bool inGroup); 
     void writeDocumentation(MemberList *ml,OutputList &ol,
-                            const char *scopeName,Definition *container);
+                            const char *scopeName,Definition *container,
+                            bool inGroup);
     void warnIfUndocumented();
     
     // relation to other members
@@ -162,8 +165,8 @@ class MemberDef : public Definition
     void setEnumScope(MemberDef *md)         { enumScope=md; }
     MemberDef *getEnumScope() const          { return enumScope; }
     void setEnumDecl(OutputList &ed);
-    void setEnumUsed()                       { eUsed=TRUE; }
-    bool enumUsed() const                    { return eUsed; }
+    //void setEnumUsed()                       { eUsed=TRUE; }
+    //bool enumUsed() const                    { return eUsed; }
     OutputList *enumDecl() const             { return enumDeclList; }
     MemberList *enumFieldList() const        { return enumFields; }
     void setDocumentedEnumValues(bool value) { docEnumValues=value; }
@@ -202,11 +205,11 @@ class MemberDef : public Definition
     void setMemberGroupId(int id) { grpId=id; }
     int getMemberGroupId() const { return grpId; }
     
-    // annonymous scope members
-    void setFromAnnonymousScope(bool b) { annScope=b; }    
-    void setFromAnnonymousMember(MemberDef *m) { annMemb=m; }    
-    bool fromAnnonymousScope() const { return annScope; }
-    bool annonymousDeclShown() const { return annUsed; }
+    // anonymous scope members
+    void setFromAnonymousScope(bool b) { annScope=b; }    
+    void setFromAnonymousMember(MemberDef *m) { annMemb=m; }    
+    bool fromAnonymousScope() const { return annScope; }
+    bool anonymousDeclShown() const { return annUsed; }
     void setIndentDepth( int i) { indDepth=i; }
     int  indentDepth() { return indDepth; }
 
@@ -214,7 +217,7 @@ class MemberDef : public Definition
 
     QCString getScopeString() const;
     
-    //void generateXML(QTextStream &t,Definition *def);
+    ClassDef *getClassDefOfAnonymousType(const char *scopeName) const;
     
   private:
     ClassDef   *classDef;     // member of or related to 
@@ -247,7 +250,7 @@ class MemberDef : public Definition
     bool    stat;             // is it a static function?
     int     memSpec;          // The specifiers present for this member
     MemberType mtype;         // returns the kind of member
-    bool eUsed;               // is the enumerate already placed in a list
+    //bool eUsed;               // is the enumerate already placed in a list
     bool proto;               // is it a prototype;
     bool docEnumValues;       // is an enum with documented enum values.
     bool annScope;            // member is part of an annoymous scope
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index f96dc06..83e4dd3 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -43,7 +43,7 @@ MemberGroup::MemberGroup(int id,const char *hdr,const char *d) /* : Definition(i
   scope          = 0;
   inSameSection  = TRUE;
   inDeclSection  = 0;
-  numDeclMembers = -1;
+  m_numDecMembers = -1;
   //printf("Member group docs=`%s'\n",doc.data());
 }
 
@@ -89,15 +89,22 @@ void MemberGroup::setAnchors()
 void MemberGroup::writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
 {
-  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE,TRUE);
+  //printf("MemberGroup::writeDeclarations() memberList->count()=%d\n",memberList->count());
+  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc/*,TRUE,TRUE*/);
 }
 
 void MemberGroup::writePlainDeclarations(OutputList &ol,
-               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup)
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
+              )
 {
   //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
-  memberList->writePlainDeclarations(ol,cd,nd,fd,gd,inGroup);
+  memberList->writePlainDeclarations(ol,cd,nd,fd,gd);
+}
+
+void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
+               Definition *container)
+{
+  memberList->writeDocumentation(ol,scopeName,container,0);
 }
 
 /*! Add this group as a subsection of the declaration section, instead
@@ -111,14 +118,14 @@ void MemberGroup::addToDeclarationSection()
   }
 }
 
-int MemberGroup::countDecMembers(bool sectionPerType)
+int MemberGroup::countDecMembers(/*bool sectionPerType*/)
 {
-  if (numDeclMembers==-1) /* number of member not cached */
+  if (m_numDecMembers==-1) /* number of member not cached */
   {
-    memberList->countDecMembers(TRUE,TRUE,sectionPerType);
-    numDeclMembers = memberList->totalCount();
+    memberList->countDecMembers(/*TRUE,TRUE,sectionPerType*/);
+    m_numDecMembers = memberList->numDecMembers();
   }
-  return numDeclMembers;
+  return m_numDecMembers;
 }
 
 void MemberGroup::distributeMemberGroupDocumentation()
@@ -141,3 +148,58 @@ void MemberGroup::distributeMemberGroupDocumentation()
     }
   }
 }
+
+int MemberGroup::varCount() const       
+{ 
+  return memberList->varCount(); 
+}
+
+int MemberGroup::funcCount() const      
+{ 
+  return memberList->funcCount(); 
+}
+
+int MemberGroup::enumCount() const      
+{ 
+  return memberList->enumCount(); 
+}
+
+int MemberGroup::enumValueCount() const 
+{ 
+  return memberList->enumValueCount(); 
+}
+
+int MemberGroup::typedefCount() const   
+{ 
+  return memberList->typedefCount(); 
+}
+
+int MemberGroup::protoCount() const     
+{ 
+  return memberList->protoCount(); 
+}
+
+int MemberGroup::defineCount() const    
+{ 
+  return memberList->defineCount(); 
+}
+
+int MemberGroup::friendCount() const    
+{ 
+  return memberList->friendCount(); 
+}
+
+int MemberGroup::numDecMembers() const  
+{ 
+  return memberList->numDecMembers(); 
+}
+
+int MemberGroup::numDocMembers() const  
+{ 
+  return memberList->numDocMembers(); 
+}
+
+void MemberGroup::setInGroup(bool b)
+{
+  memberList->setInGroup(b);
+}
diff --git a/src/membergroup.h b/src/membergroup.h
index 8ddcb66..833350e 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -43,15 +43,28 @@ class MemberGroup /* : public Definition */
     void insertMember(MemberDef *);
     void setAnchors();
     void writePlainDeclarations(OutputList &ol,
-               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup=TRUE);
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
     void writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
+
+    void writeDocumentation(OutputList &ol,const char *scopeName,
+               Definition *container);
     QCString documentation() { return doc; }
     bool allMembersInSameSection() { return inSameSection; }
     void addToDeclarationSection();
-    int countDecMembers(bool sectionPerType);
+    int countDecMembers(/*bool sectionPerType*/);
     void distributeMemberGroupDocumentation();
+    int varCount() const;
+    int funcCount() const;
+    int enumCount() const;
+    int enumValueCount() const;
+    int typedefCount() const;
+    int protoCount() const;
+    int defineCount() const;
+    int friendCount() const;
+    int numDecMembers() const;
+    int numDocMembers() const;
+    void setInGroup(bool b);
 
   private: 
     MemberList *memberList;      // list of all members in the group
@@ -62,7 +75,7 @@ class MemberGroup /* : public Definition */
     QCString doc;
     MemberList *inDeclSection;
     bool inSameSection;
-    int  numDeclMembers;
+    int  m_numDecMembers;
 };
 
 class MemberGroupList : public QList<MemberGroup>
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index d6d05e2..404c5a0 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -30,6 +30,9 @@
 MemberList::MemberList() : QList<MemberDef>()
 {
   memberGroupList=0;
+  m_numDecMembers=-1; // special value indicating that computation is needed
+  m_numDocMembers=-1; // special value indicating that computation is needed
+  m_inGroup=FALSE;
 }
 
 MemberList::~MemberList()
@@ -44,96 +47,98 @@ int MemberList::compareItems(GCI item1, GCI item2)
   return strcmp(c1->name(),c2->name());
 }
 
-void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPerType)
+/*! Count the number of members in this list that are visible in
+ *  the declaration part of a compound's documentation page.
+ */
+void MemberList::countDecMembers(/*bool inGroup,bool countSubGroups,bool sectionPerType*/)
 {
-  //printf("----- countDecMembers ----\n");
-  varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;
-  m_count=0;
-  MemberDef *md=first();
-  while (md)
+  if (m_numDecMembers!=-1) return; 
+  
+  //printf("----- countDecMembers count=%d ----\n",count());
+  m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
+  m_typeCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
+  m_numDecMembers=0;
+  QListIterator<MemberDef> mli(*this);
+  MemberDef *md;
+  for (mli.toFirst();(md=mli.current());++mli)
   {
-    //printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
-    //    md,md->name().data(),inGroup,md->getMemberGroup());
-    if (!(md->getClassDef()==0 && md->isStatic() && !Config_getBool("EXTRACT_STATIC")) &&
-        (!Config_getBool("HIDE_UNDOC_MEMBERS") || md->hasDocumentation()) &&
-        (
-         (!Config_getBool("HIDE_UNDOC_MEMBERS") || !md->documentation().isEmpty() || 
-          Config_getBool("BRIEF_MEMBER_DESC") || Config_getBool("REPEAT_BRIEF")
-         ) || Config_getBool("EXTRACT_ALL") || 
-         (md->isEnumerate() &&
-          md->hasDocumentedEnumValues()
-         )
-        ) && 
-        inGroup==md->visibleMemberGroup(sectionPerType) &&
-        !(inGroup && md->protection()==Private && !Config_getBool("EXTRACT_PRIVATE"))
-       )
+    if (md->isBriefSectionVisible())
     {
       switch(md->memberType())
       {
         case MemberDef::Variable:    // fall through
-        case MemberDef::Property:    varCnt++,m_count++;  
+        case MemberDef::Property:    m_varCnt++,m_numDecMembers++;  
                                      break;
         case MemberDef::Function:    // fall through
         case MemberDef::Signal:      // fall through
         case MemberDef::DCOP:        // fall through
         case MemberDef::Slot:        if (!md->isRelated() || md->getClassDef())
-                                       funcCnt++,m_count++; 
+                                       m_funcCnt++,m_numDecMembers++; 
                                      break;
-        case MemberDef::Enumeration: enumCnt++,m_count++; break;
-        case MemberDef::EnumValue:   enumValCnt++,m_count++; break;
-        case MemberDef::Typedef:     typeCnt++,m_count++; break;
-        case MemberDef::Prototype:   protoCnt++,m_count++; break;
+        case MemberDef::Enumeration: m_enumCnt++,m_numDecMembers++; break;
+        case MemberDef::EnumValue:   m_enumValCnt++,m_numDecMembers++; break;
+        case MemberDef::Typedef:     m_typeCnt++,m_numDecMembers++; break;
+        case MemberDef::Prototype:   m_protoCnt++,m_numDecMembers++; break;
         case MemberDef::Define:      if (Config_getBool("EXTRACT_ALL") || 
                                          md->argsString() || 
                                          !md->initializer().isEmpty() ||
                                          md->hasDocumentation() 
-                                        ) defCnt++,m_count++;     
+                                        ) m_defCnt++,m_numDecMembers++;     
                                      break;
-        case MemberDef::Friend:      friendCnt++,m_count++;  break;
+        case MemberDef::Friend:      m_friendCnt++,m_numDecMembers++;  break;
         default:
-          err("Error: Unknown member type found!");
+          err("Error: Unknown member type found for member `%s'\n!",md->name().data());
       }
     }
-    md=next();
   }
-  if (memberGroupList && countSubGroups)
+  if (memberGroupList /*&& countSubGroups*/)
   {
     MemberGroupListIterator mgli(*memberGroupList);
     MemberGroup *mg;
     for (;(mg=mgli.current());++mgli)
     {
-      int mgCount = mg->countDecMembers(sectionPerType);
-      //printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
-      m_count+=mgCount;
+      mg->countDecMembers();
+      m_varCnt+=mg->varCount();
+      m_funcCnt+=mg->funcCount();
+      m_enumCnt+=mg->enumCount();
+      m_enumValCnt+=mg->enumValueCount();
+      m_typeCnt+=mg->typedefCount();
+      m_protoCnt+=mg->protoCount();
+      m_defCnt+=mg->defineCount();
+      m_friendCnt+=mg->friendCount();
+      m_numDecMembers+=mg->numDecMembers();
     }
   }
   //printf("----- end countDecMembers ----\n");
 
-  //printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
+  //printf("MemberList::countDecMembers()=%d\n",m_numDecMembers);
 }
 
-void MemberList::countDocMembers(bool listOfGroup)
+void MemberList::countDocMembers()
 {
-  /*varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;*/
-  m_count=0;
-  MemberDef *md=first();
-  while (md)
+  if (m_numDocMembers!=-1) return; // used cached value
+  m_numDocMembers=0;
+  QListIterator<MemberDef> mli(*this);
+  MemberDef *md;
+  for (mli.toFirst();(md=mli.current());++mli)
   {
-    //printf("%s MemberList::countDocMembers() details=%d\n",
-    //    md->name().data(),md->detailsAreVisible());
-    bool visibleIfStatic = 
-      !(md->getClassDef()==0 && md->isStatic() && !Config_getBool("EXTRACT_STATIC"));
-
-    bool inOwnGroup = (md->getGroupDef()!=0 && !listOfGroup);
-    
-    if (visibleIfStatic && !inOwnGroup &&
-        (Config_getBool("EXTRACT_ALL") || md->detailsAreVisible()) 
-       )
+    if (md->isDetailedSectionVisible(m_inGroup)) 
+    {
+      // do not count enum values, since they do not produce entries of their own
+      if (md->memberType()!=MemberDef::EnumValue) m_numDocMembers++;
+    }
+  }
+  if (memberGroupList)
+  {
+    MemberGroupListIterator mgli(*memberGroupList);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
     {
-      if (md->memberType()!=MemberDef::EnumValue) m_count++;
+      mg->countDecMembers();
+      m_numDocMembers+=mg->numDocMembers();
     }
-    md=next();
   }
+  //printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
 }
 
 bool MemberList::insert(uint index,const MemberDef *md)
@@ -157,183 +162,88 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
 }
 
 void MemberList::writePlainDeclarations(OutputList &ol,
-                       ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-                       bool inGroup,bool countSubGroups
+                       ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
                       )
 {
-  bool sectionPerType = !inGroup && (fd || nd || gd);
   //printf("----- writePlainDeclaration() ----\n");
-  countDecMembers(inGroup,countSubGroups,sectionPerType);
-  if (totalCount()==0) return; // no members in this list
+  countDecMembers(/*inGroup,countSubGroups,sectionPerType*/);
+  if (numDecMembers()==0) return; // no members in this list
   //printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
   
   ol.pushGeneratorState();
 
-  //int prevGroupId = -1;
-  if (!sectionPerType) ol.startMemberList();
+  ol.startMemberList();
   MemberDef *md;
-
-  if (defineCount()>0)
-  {
-    if (sectionPerType)
-    {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trDefines());
-      ol.endMemberHeader();
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()); ++mli )
-    {
-      //printf("md->isDefined()=%d inGroup=%d md->getMemberGroup()=%p\n",
-      //   md->isDefine(),inGroup,md->getMemberGroup());
-      if (md->isDefine() && 
-          (md->argsString() || md->hasDocumentation() || 
-           !md->initializer().isEmpty() ||
-           Config_getBool("EXTRACT_ALL")) &&
-          inGroup==md->visibleMemberGroup(sectionPerType)         
-         ) 
-      {
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
-      }
-    }
-    if (sectionPerType)
-    {
-      ol.endMemberList();
-    }
-  }
-  
-  if (protoCount()>0)
-  {
-    //printf("There are %d prototypes\n",protoCount());
-    if (sectionPerType)
-    {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trFuncProtos());
-      ol.endMemberHeader();
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()); ++mli )
-    {
-      if (md->isPrototype() && inGroup==md->visibleMemberGroup(sectionPerType)) 
-      {
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
-      }
-    }
-    if (sectionPerType)
-    {
-      ol.endMemberList();
-    }
-  }
-  
-  if (typedefCount()>0)
-  {
-    //printf("There are %d typedefs\n",typedefCount());
-    if (sectionPerType) 
-    {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trTypedefs());
-      ol.endMemberHeader();
-      //ol.writeMemberHeader("Typedefs");
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()) ; ++mli )
-    {
-      if (md->isTypedef() && inGroup==md->visibleMemberGroup(sectionPerType)) 
-      {
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
-      }
-    }
-    if (sectionPerType) ol.endMemberList();
-  }
- 
-  // write enums 
-  if (enumCount()>0)
+  MemberListIterator mli(*this);
+  for ( ; (md=mli.current()); ++mli )
   {
-    //printf("There are %d enums\n",enumCount());
-    if (sectionPerType) 
+    //printf(">>> Member `%s' type=%d\n",md->name().data(),md->memberType());
+    switch(md->memberType())
     {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trEnumerations());
-      ol.endMemberHeader();
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()) ; ++mli ) // iterate through the members
-    {
-      // see if member is hidden by protection
-      if (md->protection()==Private && !Config_getBool("EXTRACT_PRIVATE")) continue;
-      
-      QCString type=md->typeString();
-      type=type.stripWhiteSpace();  // TODO: is this really needed?
-
-      // filter out enums that are in a group iff inGroup holds
-      if (md->isEnumerate() && inGroup==md->visibleMemberGroup(sectionPerType) /*&& (hasDocs || !Config_getBool("HIDE_UNDOC_MEMBERS"))*/) 
+      case MemberDef::Define:    // fall through
+      case MemberDef::Prototype: // fall through
+      case MemberDef::Typedef:   // fall through
+      case MemberDef::Variable:  // fall through
+      case MemberDef::Function:  // fall through
+      case MemberDef::Signal:    // fall through
+      case MemberDef::Slot:      // fall through
+      case MemberDef::DCOP:      // fall through
+      case MemberDef::Property:  
+        md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+        break;
+      case MemberDef::Enumeration: 
       {
-        // filter out invisible enums
-        if ( !Config_getBool("HIDE_UNDOC_MEMBERS") ||        // do not hide undocumented members or
-             !md->documentation().isEmpty() || // member has detailed descr. or
-             md->hasDocumentedEnumValues() ||  // member has documented enum vales.
-             ( 
-               !md->briefDescription().isEmpty() &&
-               Config_getBool("BRIEF_MEMBER_DESC")              // brief descr. is shown or
-             )                                        
-           )
+        OutputList typeDecl(&ol);
+        QCString name(md->name());
+        int i=name.findRev("::");
+        if (i!=-1) name=name.right(name.length()-i-2); // strip scope (TODO: is this needed?)
+        if (name[0]!='@') // not an anonymous enum
         {
-          OutputList typeDecl(&ol);
-          QCString name=md->name().copy();
-          int i=name.findRev("::");
-          if (i!=-1) name=name.right(name.length()-i-2); // strip scope
-          if (name[0]!='@') // not an anonymous enum
+          if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
           {
-            if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
-            {
-              if (!Config_getString("GENERATE_TAGFILE").isEmpty())
-              {
-                Doxygen::tagFile << "    <member kind=\"enumeration\">" << endl;
-                Doxygen::tagFile << "      <name>" << convertToXML(md->name()) << "</name>" << endl; 
-                Doxygen::tagFile << "      <anchor>" << convertToXML(md->anchor()) << "</anchor>" << endl; 
-                Doxygen::tagFile << "      <arglist>" << convertToXML(md->argsString()) << "</arglist>" << endl; 
-                Doxygen::tagFile << "    </member>" << endl;
-              }
-              md->writeLink(typeDecl,cd,nd,fd,gd);
-            }
-            else
+            if (!Config_getString("GENERATE_TAGFILE").isEmpty())
             {
-              typeDecl.startBold();
-              typeDecl.docify(name);
-              typeDecl.endBold();
+              Doxygen::tagFile << "    <member kind=\"enumeration\">" << endl;
+              Doxygen::tagFile << "      <name>" << convertToXML(md->name()) << "</name>" << endl; 
+              Doxygen::tagFile << "      <anchor>" << convertToXML(md->anchor()) << "</anchor>" << endl; 
+              Doxygen::tagFile << "      <arglist>" << convertToXML(md->argsString()) << "</arglist>" << endl; 
+              Doxygen::tagFile << "    </member>" << endl;
             }
-            typeDecl.writeChar(' ');
+            md->writeLink(typeDecl,cd,nd,fd,gd);
+          }
+          else
+          {
+            typeDecl.startBold();
+            typeDecl.docify(name);
+            typeDecl.endBold();
           }
+          typeDecl.writeChar(' ');
+        }
+
+        int enumMemCount=0;
 
-          int enumMemCount=0;
-          
-          uint enumValuesPerLine = 
-            (uint)Config_getInt("ENUM_VALUES_PER_LINE");
-          typeDecl.docify("{ ");
-          QList<MemberDef> *fmdl=md->enumFieldList();
-          if (fmdl)
+        uint enumValuesPerLine = (uint)Config_getInt("ENUM_VALUES_PER_LINE");
+        typeDecl.docify("{ ");
+        QList<MemberDef> *fmdl=md->enumFieldList();
+        if (fmdl)
+        {
+          MemberDef *fmd=fmdl->first();
+          while (fmd)
           {
-            MemberDef *fmd=fmdl->first();
-            while (fmd)
+            /* in html we start a new line after a number of items */
+            if (fmdl->count()>enumValuesPerLine
+                && (enumMemCount%enumValuesPerLine)==0
+               )
             {
-              /* in html we start a new line after a number of items */
-              if (fmdl->count()>enumValuesPerLine
-                  && (enumMemCount%enumValuesPerLine)==0
-                 )
-              {
-                typeDecl.pushGeneratorState();
-                typeDecl.disableAllBut(OutputGenerator::Html);
-                typeDecl.lineBreak(); 
-                typeDecl.writeString("&nbsp;&nbsp;");
-                typeDecl.popGeneratorState();
-              }
+              typeDecl.pushGeneratorState();
+              typeDecl.disableAllBut(OutputGenerator::Html);
+              typeDecl.lineBreak(); 
+              typeDecl.writeString("&nbsp;&nbsp;");
+              typeDecl.popGeneratorState();
+            }
 
-              if (fmd->hasDocumentation()) // enum value has docs
-              {
+            if (fmd->hasDocumentation()) // enum value has docs
+            {
               if (!Config_getString("GENERATE_TAGFILE").isEmpty())
               {
                 Doxygen::tagFile << "    <member kind=\"enumvalue\">" << endl;
@@ -342,130 +252,95 @@ void MemberList::writePlainDeclarations(OutputList &ol,
                 Doxygen::tagFile << "      <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl; 
                 Doxygen::tagFile << "    </member>" << endl;
               }
-                fmd->writeLink(typeDecl,cd,nd,fd,gd);
-              }
-              else // no docs for this enum value
-              {
-                typeDecl.startBold();
-                typeDecl.docify(fmd->name());
-                typeDecl.endBold();
-              }
-              if (!fmd->initializer().isEmpty()) // enum value has initializer
-              {
-                typeDecl.writeString(" = ");
-                parseText(typeDecl,fmd->initializer());
-              }
-              
-              fmd=fmdl->next();
-              if (fmd) typeDecl.writeString(", ");
-              typeDecl.disable(OutputGenerator::Man);
-              typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
-              typeDecl.enable(OutputGenerator::Man);
-              enumMemCount++;
+              fmd->writeLink(typeDecl,cd,nd,fd,gd);
             }
-            if (fmdl->count()>enumValuesPerLine)
+            else // no docs for this enum value
             {
-              typeDecl.pushGeneratorState();
-              typeDecl.disableAllBut(OutputGenerator::Html);
-              typeDecl.lineBreak(); 
-              typeDecl.popGeneratorState();
+              typeDecl.startBold();
+              typeDecl.docify(fmd->name());
+              typeDecl.endBold();
             }
+            if (!fmd->initializer().isEmpty()) // enum value has initializer
+            {
+              typeDecl.writeString(" = ");
+              parseText(typeDecl,fmd->initializer());
+            }
+
+            fmd=fmdl->next();
+            if (fmd) typeDecl.writeString(", ");
+            typeDecl.disable(OutputGenerator::Man);
+            typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
+            typeDecl.enable(OutputGenerator::Man);
+            enumMemCount++;
+          }
+          if (fmdl->count()>enumValuesPerLine)
+          {
+            typeDecl.pushGeneratorState();
+            typeDecl.disableAllBut(OutputGenerator::Html);
+            typeDecl.lineBreak(); 
+            typeDecl.popGeneratorState();
           }
-          typeDecl.docify(" }");
-          md->setEnumDecl(typeDecl);
-          int enumVars=0;
-          MemberListIterator vmli(*this);
-          MemberDef *vmd;
-          if (name[0]=='@') // anonymous enum => append variables
+        }
+        typeDecl.docify(" }");
+        md->setEnumDecl(typeDecl);
+        int enumVars=0;
+        MemberListIterator vmli(*this);
+        MemberDef *vmd;
+        if (name[0]=='@') // anonymous enum => append variables
+        {
+          for ( ; (vmd=vmli.current()) ; ++vmli)
           {
-            for ( ; (vmd=vmli.current()) ; ++vmli)
+            QCString vtype=vmd->typeString();
+            if ((vtype.find(name))!=-1) 
             {
-              QCString vtype=vmd->typeString();
-              if ((vtype.find(name))!=-1) 
-              {
-                enumVars++;
-                vmd->setAnonymousEnumType(md);
-              }
+              enumVars++;
+              vmd->setAnonymousEnumType(md);
             }
           }
-          // if this is an annoymous enum and there are variable of this
-          // enum type (i.e. enumVars>0), then we do not show the enum here.
-          if (enumVars==0) // show enum here
+        }
+        // if this is an anoymous enum and there are variable of this
+        // enum type (i.e. enumVars>0), then we do not show the enum here.
+        if (enumVars==0) // show enum here
+        {
+          ol.startMemberItem(0);
+          ol.writeString("enum ");
+          ol.insertMemberAlign();
+          ol+=typeDecl; // append the enum values.
+          ol.endMemberItem(FALSE);
+          if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
           {
-            ol.startMemberItem(0);
-            ol.writeString("enum ");
-            ol.insertMemberAlign();
-            ol+=typeDecl; // append the enum values.
-            ol.endMemberItem(FALSE);
-            if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
+            ol.startMemberDescription();
+            parseDoc(ol,
+                md->getDefFileName(),md->getDefLine(),
+                cd?cd->name().data():0,md->name().data(),
+                md->briefDescription()
+                    );
+            if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
             {
-              ol.startMemberDescription();
-              parseDoc(ol,
-                       md->getDefFileName(),md->getDefLine(),
-                       cd?cd->name().data():0,md->name().data(),
-                       md->briefDescription()
-                      );
-              if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
-              {
-                ol.disableAllBut(OutputGenerator::Html);
-                ol.endEmphasis();
-                ol.docify(" ");
-                ol.startTextLink(0,md->anchor());
-                parseText(ol,theTranslator->trMore());
-                ol.endTextLink();
-                ol.startEmphasis();
-                ol.enableAll();
-              }
-              ol.endMemberDescription();
+              ol.disableAllBut(OutputGenerator::Html);
+              ol.endEmphasis();
+              ol.docify(" ");
+              ol.startTextLink(0,md->anchor());
+              parseText(ol,theTranslator->trMore());
+              ol.endTextLink();
+              ol.startEmphasis();
+              ol.enableAll();
             }
+            ol.endMemberDescription();
           }
-          md->warnIfUndocumented();
         }
-      } // md->isEnumerate()
-    } // enum loop
-    if (sectionPerType) ol.endMemberList();
-  } // write enums
- 
-  // write functions
-  if (funcCount()>0)
-  {
-    //printf("There are %d functions\n",funcCount());
-    if (sectionPerType) 
-    {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trFunctions());
-      ol.endMemberHeader();
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()) ; ++mli )
-    {
-      if (
-          ( md->isFunction() || md->isSignal() || md->isSlot() || md->isDCOP()) &&
-          ( !md->isRelated() || md->getClassDef() ) &&
-          inGroup==md->visibleMemberGroup(sectionPerType)
-         ) 
-      {
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
+        md->warnIfUndocumented();
+        break;
       }
-    }
-    if (sectionPerType) ol.endMemberList();
-  }
-  
-  if (friendCount()>0)
-  {
-    //printf("There are %d friends\n",friendCount());
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()) ; ++mli )
-    {
-      if (md->isFriend() && inGroup==md->visibleMemberGroup(sectionPerType)) 
+      case MemberDef::Friend:
       {
+        //printf("Writing friend `%s'\n",md->name().data());
         QCString type=md->typeString();
         //printf("Friend: type=%s name=%s\n",type.data(),md->name().data());
         bool isFriendClass = type=="friend class";
         if (!isFriendClass)
         {
-          md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
+          md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
         }
         else // isFriendClass
              // friend is undocumented as a member but it is a class, 
@@ -499,52 +374,31 @@ void MemberList::writePlainDeclarations(OutputList &ol,
             ol.endMemberItem(FALSE);
           }
         }
+        break;
       }
+      case MemberDef::EnumValue: 
+        break;
     }
   }
 
-  // write variables
-  if (varCount()>0)
-  {
-    //printf("There are %d variables\n",varCount());
-    if (sectionPerType) 
-    {
-      ol.startMemberHeader();
-      parseText(ol,theTranslator->trVariables());
-      ol.endMemberHeader();
-      ol.startMemberList();
-    }
-    MemberListIterator mli(*this);
-    for ( ; (md=mli.current()) ; ++mli )
-    {
-      if ((md->isVariable() || md->isProperty()) && 
-          inGroup==md->visibleMemberGroup(sectionPerType)) 
-      {
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
-      }
-    }
-    if (sectionPerType) ol.endMemberList();
-  }
-
-  // handle members that are inside annonymous compounds and for which
-  // no variables of the annonymous compound type exist.
+  // handle members that are inside anonymous compounds and for which
+  // no variables of the anonymous compound type exist.
   if (cd)
   {
     MemberListIterator mli(*this);
     for  ( ; (md=mli.current()) ; ++mli )
     {
-      if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
-          && inGroup==md->visibleMemberGroup(sectionPerType))
+      if (md->fromAnonymousScope() && !md->anonymousDeclShown())
       {
-        //printf("annonymous compound members\n");
-        md->setFromAnnonymousScope(FALSE);
-        md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
-        md->setFromAnnonymousScope(TRUE);
+        //printf("anonymous compound members\n");
+        md->setFromAnonymousScope(FALSE);
+        md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
+        md->setFromAnonymousScope(TRUE);
       }
     }
   }
  
-  if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ }
+  ol.endMemberList(); 
 
   ol.popGeneratorState();
   //printf("----- end writePlainDeclaration() ----\n");
@@ -552,24 +406,13 @@ void MemberList::writePlainDeclarations(OutputList &ol,
 
 void MemberList::writeDeclarations(OutputList &ol,
              ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-             const char *title,const char *subtitle,
-             bool inGroup,bool countSubGroups)
+             const char *title,const char *subtitle
+             /*, bool inGroup,bool countSubGroups*/)
 {
   //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
   //printf("----- writeDeclaration() ----\n");
-  bool sectionPerType = !inGroup && (fd || nd || gd);
-  countDecMembers(FALSE,countSubGroups,sectionPerType); // count member not in group
-  int normalMembers = totalCount();
-  int ingroupMembers = 0;
-  //printf("Normal members %d\n",normalMembers);
-  if (inGroup)
-  {
-    countDecMembers(TRUE,countSubGroups,sectionPerType); // count member inside group
-    ingroupMembers = totalCount();
-  }
-  int totalMembers = normalMembers + ingroupMembers;
-  //printf("Total members %d\n",totalMembers);
-  if (totalMembers==0) return;
+  countDecMembers(); // count member not in group
+  if (numDecMembers()==0) return;
   if (title) 
   {
     ol.startMemberHeader();
@@ -580,15 +423,16 @@ void MemberList::writeDeclarations(OutputList &ol,
   {
     //printf("subtitle=`%s'\n",subtitle);
     ol.startMemberSubtitle();
-    if (inGroup)
+    if (m_inGroup)
       parseDoc(ol,"<generated>",1,0,0,subtitle);
     else
       parseText(ol,subtitle);
     ol.endMemberSubtitle();
   }
 
-  writePlainDeclarations(ol,cd,nd,fd,gd,inGroup,FALSE);
+  writePlainDeclarations(ol,cd,nd,fd,gd);
   
+  //printf("memberGroupList=%p\n",memberGroupList);
   if (memberGroupList)
   {
     MemberGroupListIterator mgli(*memberGroupList);
@@ -611,8 +455,8 @@ void MemberList::writeDeclarations(OutputList &ol,
       }
       ol.startMemberGroup();
       mg->writePlainDeclarations(ol,cd,nd,fd,gd);
-      ++mgli;
       ol.endMemberGroup(hasHeader);
+      ++mgli;
     }
   }
   //printf("----- end writeDeclaration() ----\n");
@@ -620,13 +464,37 @@ void MemberList::writeDeclarations(OutputList &ol,
 }
 
 void MemberList::writeDocumentation(OutputList &ol,
-                     const char *scopeName, Definition *container)
+                     const char *scopeName, Definition *container,
+                     const char *title)
 {
+  //printf("MemberList::writeDocumentation()\n");
+
+  countDocMembers();
+  if (numDocMembers()==0) return;
+
+  if (title)
+  {
+    ol.writeRuler();
+    ol.startGroupHeader();
+    parseText(ol,title);
+    ol.endGroupHeader();
+  }
+  
   MemberListIterator mli(*this);
   MemberDef *md;
   for ( ; (md=mli.current()) ; ++mli)
   {
-    md->writeDocumentation(this,ol,scopeName,container);
+    md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
+  }
+  if (memberGroupList)
+  {
+    //printf("MemberList::writeDocumentation()  --  member groups\n");
+    MemberGroupListIterator mgli(*memberGroupList);
+    MemberGroup *mg;
+    for (;(mg=mgli.current());++mgli)
+    {
+      mg->writeDocumentation(ol,scopeName,container);
+    }
   }
 }
 
diff --git a/src/memberlist.h b/src/memberlist.h
index 417abfd..9b8410f 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -33,36 +33,35 @@ class MemberList : public QList<MemberDef>
     void inSort(const MemberDef *md);
     void append(const MemberDef *md);
     int compareItems(GCI item1,GCI item2);
-    int varCount() const       { return varCnt;     }
-    int funcCount() const      { return funcCnt;    }
-    int enumCount() const      { return enumCnt;    }
-    int enumValueCount() const { return enumValCnt; }
-    int typedefCount() const   { return typeCnt;    }
-    int protoCount() const     { return protoCnt;   }
-    int defineCount() const    { return defCnt;     }
-    int friendCount() const    { return friendCnt;  }
-    void countDecMembers(bool inGroup,bool countSubGroups,bool sectionPerType);
-    void countDocMembers(bool listOfGroup=FALSE);
-    int totalCount() const 
-         { return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
-                  //protoCnt+defCnt+friendCnt; 
-                  m_count;
-         }
+    int varCount() const       { ASSERT(m_numDecMembers!=-1); return m_varCnt;     }
+    int funcCount() const      { ASSERT(m_numDecMembers!=-1); return m_funcCnt;    }
+    int enumCount() const      { ASSERT(m_numDecMembers!=-1); return m_enumCnt;    }
+    int enumValueCount() const { ASSERT(m_numDecMembers!=-1); return m_enumValCnt; }
+    int typedefCount() const   { ASSERT(m_numDecMembers!=-1); return m_typeCnt;    }
+    int protoCount() const     { ASSERT(m_numDecMembers!=-1); return m_protoCnt;   }
+    int defineCount() const    { ASSERT(m_numDecMembers!=-1); return m_defCnt;     }
+    int friendCount() const    { ASSERT(m_numDecMembers!=-1); return m_friendCnt;  }
+    int numDecMembers() const  { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
+    int numDocMembers() const  { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
+    void countDecMembers(/*bool inGroup,bool countSubGroups,bool sectionPerType*/);
+    void countDocMembers();
     void writePlainDeclarations(OutputList &ol,
-               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               bool inGroup=FALSE,bool countSubGroups=TRUE);
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
     void writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
-               const char *title,const char *subtitle,
-               bool inGroup=FALSE,bool countSubGroups=TRUE);
+               const char *title,const char *subtitle);
     void writeDocumentation(OutputList &ol,const char *scopeName,
-               Definition *container);
+               Definition *container,const char *title);
     void addMemberGroup(MemberGroup *mg);
+    void setInGroup(bool group) { m_inGroup=group; }
 
   private:
-    int varCnt,funcCnt,enumCnt,enumValCnt,typeCnt,protoCnt,defCnt,friendCnt; 
-    int m_count;
+    int m_varCnt,m_funcCnt,m_enumCnt,m_enumValCnt,m_typeCnt;
+    int m_protoCnt,m_defCnt,m_friendCnt; 
+    int m_numDecMembers; // number of members in the brief part of the memberlist
+    int m_numDocMembers; // number of members in the detailed part of the memberlist
     MemberGroupList *memberGroupList;
+    bool m_inGroup; // is this list part of a group
 };
 
 class MemberListIterator : public QListIterator<MemberDef>
diff --git a/src/message.cpp b/src/message.cpp
index 5c9e783..285f1c3 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -85,6 +85,10 @@ void initWarningFormat()
   {
     warnFile = fopen(Config_getString("WARN_LOGFILE"),"w");
   }
+  if (!warnFile) // point it to something valid, because warn() relies on it
+  {
+    warnFile = stderr;
+  }
 }
 
 
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index b214de6..efcd10f 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -87,6 +87,7 @@ void NamespaceDef::insertClass(ClassDef *cd)
   }
 }
 
+#if 0
 void NamespaceDef::addMemberListToGroup(MemberList *ml,
                                         bool (MemberDef::*func)() const)
 {
@@ -114,14 +115,16 @@ void NamespaceDef::addMemberListToGroup(MemberList *ml,
     }
   }
 }
+#endif
 
 void NamespaceDef::addMembersToMemberGroup()
 {
-  addMemberListToGroup(&allMemberList,&MemberDef::isTypedef);
-  addMemberListToGroup(&allMemberList,&MemberDef::isEnumerate);
-  addMemberListToGroup(&allMemberList,&MemberDef::isEnumValue);
-  addMemberListToGroup(&allMemberList,&MemberDef::isFunction);
-  addMemberListToGroup(&allMemberList,&MemberDef::isVariable);
+  ::addMembersToMemberGroup(&decDefineMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decProtoMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decTypedefMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decEnumMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decFuncMembers,memberGroupDict,memberGroupList);
+  ::addMembersToMemberGroup(&decVarMembers,memberGroupDict,memberGroupList);
 }
 
 void NamespaceDef::insertMember(MemberDef *md)
@@ -131,49 +134,55 @@ void NamespaceDef::insertMember(MemberDef *md)
   switch(md->memberType())
   {
     case MemberDef::Variable:     
+      decVarMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        varMembers.inSort(md); 
+        docVarMembers.inSort(md); 
       else
-        varMembers.append(md);
+        docVarMembers.append(md);
       break;
     case MemberDef::Function: 
+      decFuncMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))    
-        funcMembers.inSort(md); 
+        docFuncMembers.inSort(md); 
       else
-        funcMembers.append(md);
+        docFuncMembers.append(md);
       break;
     case MemberDef::Typedef:      
+      decTypedefMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        typedefMembers.inSort(md); 
+        docTypedefMembers.inSort(md); 
       else
-        typedefMembers.append(md);
+        docTypedefMembers.append(md);
       break;
     case MemberDef::Enumeration:  
+      decEnumMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        enumMembers.inSort(md); 
+        docEnumMembers.inSort(md); 
       else
-        enumMembers.append(md);
+        docEnumMembers.append(md);
       break;
     case MemberDef::EnumValue:    
-      if (Config_getBool("SORT_MEMBER_DOCS"))
-        enumValMembers.inSort(md); 
-      else
-        enumValMembers.append(md);
       break;
     case MemberDef::Prototype:    
+      decProtoMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        protoMembers.inSort(md); 
+        docProtoMembers.inSort(md); 
       else
-        protoMembers.append(md);
+        docProtoMembers.append(md);
       break;
     case MemberDef::Define:       
+      decDefineMembers.append(md);
       if (Config_getBool("SORT_MEMBER_DOCS"))
-        defineMembers.inSort(md); 
+        docDefineMembers.inSort(md); 
       else
-        defineMembers.append(md);
+        docDefineMembers.append(md);
       break;
     default:
-       err("NamespaceDef::insertMembers(): unexpected member inserted in namespace!\n");
+      err("NamespaceDef::insertMembers(): "
+           "member `%s' with class scope `%s' inserted in namespace scope `%s'!\n",
+           md->name().data(),
+           md->getClassDef() ? md->getClassDef()->name().data() : "",
+           name().data());
   }
   //addMemberToGroup(md,groupId);
 }
@@ -238,7 +247,14 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     mg->writeDeclarations(ol,0,this,0,0);
   }
   
-  allMemberList.writeDeclarations(ol,0,this,0,0,0,0);
+
+  //allMemberList.writeDeclarations(ol,0,this,0,0,0,0);
+  decDefineMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trDefines(),0);
+  decProtoMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trFuncProtos(),0);
+  decTypedefMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trTypedefs(),0);
+  decEnumMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trEnumerations(),0);
+  decFuncMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trFunctions(),0);
+  decVarMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trVariables(),0);
   ol.endMemberSections();
   
   if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || 
@@ -273,76 +289,23 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     ol.endTextBlock();
   }
 
-  //memList->countDocMembers();
-  defineMembers.countDocMembers();
-  if ( defineMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trDefineDocumentation());
-    ol.endGroupHeader();
-    defineMembers.writeDocumentation(ol,name(),this);
-  }
+  docDefineMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trDefineDocumentation());
   
-  protoMembers.countDocMembers(); 
-  if ( protoMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionPrototypeDocumentation());
-    ol.endGroupHeader();
-    protoMembers.writeDocumentation(ol,name(),this);
-  }
+  docProtoMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trFunctionPrototypeDocumentation());
 
-  typedefMembers.countDocMembers();
-  if ( typedefMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trTypedefDocumentation());
-    ol.endGroupHeader();
-    typedefMembers.writeDocumentation(ol,name(),this);
-  }
+  docTypedefMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trTypedefDocumentation());
   
-  enumMembers.countDocMembers();
-  if ( enumMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trEnumerationTypeDocumentation());
-    ol.endGroupHeader();
-    enumMembers.writeDocumentation(ol,name(),this);
-  }
+  docEnumMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trEnumerationTypeDocumentation());
 
-  //enumValMembers.countDocMembers();
-  //if ( enumValMembers.totalCount()>0 )
-  //{
-  //  ol.writeRuler();
-  //  ol.startGroupHeader();
-  //  parseText(ol,theTranslator->trEnumerationValueDocumentation());
-  //  ol.endGroupHeader();
-  //  enumValMembers.writeDocumentation(ol,name());
-  //}
-
-  funcMembers.countDocMembers();
-  if ( funcMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trFunctionDocumentation());
-    ol.endGroupHeader();
-    funcMembers.writeDocumentation(ol,name(),this);
-  }
+  docFuncMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trFunctionDocumentation());
   
-  varMembers.countDocMembers();
-  if ( varMembers.totalCount()>0 )
-  {
-    ol.writeRuler();
-    ol.startGroupHeader();
-    parseText(ol,theTranslator->trVariableDocumentation());
-    ol.endGroupHeader();
-    varMembers.writeDocumentation(ol,name(),this);
-  }
+  docVarMembers.writeDocumentation(ol,name(),this,
+                          theTranslator->trVariableDocumentation());
 
   // write Author section (Man only)
   ol.pushGeneratorState();
@@ -365,7 +328,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
 int NamespaceDef::countMembers()
 {
   allMemberList.countDocMembers();
-  return allMemberList.totalCount()+classList->count();
+  return allMemberList.numDocMembers()+classList->count();
 }
 
 void NamespaceDef::addUsingDirective(NamespaceDef *nd)
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 0e1d089..08a8701 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -66,8 +66,8 @@ class NamespaceDef : public Definition
     void addMembersToMemberGroup();
     void distributeMemberGroupDocumentation();
     
-  protected:
-    void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
+  //protected:
+  //  void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
 
   private:
     //QCString reference;
@@ -79,13 +79,23 @@ class NamespaceDef : public Definition
     ClassList *usingDeclList;
 
     MemberList allMemberList;
-    MemberList defineMembers;
-    MemberList protoMembers;
-    MemberList typedefMembers;
-    MemberList enumMembers;
-    MemberList enumValMembers;
-    MemberList funcMembers;
-    MemberList varMembers;
+
+    // members in the declaration part of the documentation
+    MemberList decDefineMembers;
+    MemberList decProtoMembers;
+    MemberList decTypedefMembers;
+    MemberList decEnumMembers;
+    MemberList decFuncMembers;
+    MemberList decVarMembers;
+
+    // members in the documentation part of the documentation
+    MemberList docAllMemberList;
+    MemberList docDefineMembers;
+    MemberList docProtoMembers;
+    MemberList docTypedefMembers;
+    MemberList docEnumMembers;
+    MemberList docFuncMembers;
+    MemberList docVarMembers;
 
     /* user defined member groups */
     MemberGroupList    *memberGroupList;
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 82f3396..be3b676 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -742,13 +742,17 @@ void RTFGenerator::beginRTFDocument()
   /* all the included RTF files should begin with the
    * same header
    */
-  t <<"{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
+  t <<"{\\rtf1\\ansi\\ansicpg" << theTranslator->trRTFansicp();
+  t <<"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
 
   DBG_RTF(t <<"{\\comment Begining font list}\n")
   t <<"{\\fonttbl ";
-  t <<"{\\f0\\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
-  t <<"{\\f1\\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
-  t <<"{\\f2\\fmodern\\fcharset0\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
+  t <<"{\\f0\\froman\\fcharset" << theTranslator->trRTFCharSet();
+  t <<"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
+  t <<"{\\f1\\fswiss\\fcharset" << theTranslator->trRTFCharSet();
+  t <<"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
+  t <<"{\\f2\\fmodern\\fcharset" << theTranslator->trRTFCharSet();
+  t <<"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
   t <<"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
   t <<"}\n";
   DBG_RTF(t <<"{\\comment begin colors}\n")
@@ -1332,9 +1336,9 @@ void RTFGenerator::endIndexSection(IndexSections is)
     case isEndIndex:
       beginRTFChapter();				  
       t << Rtf_Style["Heading1"]->reference;
-      t << "Index\\par "<< endl;
+      t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
       t << Rtf_Style_Reset << endl;
-      t << "{\\tc \\v Index}" << endl;
+      t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
       t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
 
       break;
diff --git a/src/scanner.l b/src/scanner.l
index cf35630..2a38b43 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -1248,7 +1248,7 @@ TITLE     [tT][iI][tT][lL][eE]
 					    BEGIN(AfterDoc);
 					  }
   					}
-<FindMembers,FindFields>"//"([!*]?){B}*{CMD}"{"|"/*"([!*]?){B}*{CMD}"{"	{
+<FindMembers,FindFields>"//"([!/]?){B}*{CMD}"{"|"/*"([!*]?){B}*{CMD}"{"	{
   					  startGroup();
 					  tmpDocType=-1;
 					  if (current_root->section & Entry::SCOPE_MASK)
@@ -1267,7 +1267,7 @@ TITLE     [tT][iI][tT][lL][eE]
 					    BEGIN( Doc );
 					  }
   					}
-<FindMembers,FindFields,ReadInitializer>"//"([!*]?){B}*{CMD}"}"|"/*"([!*]?){B}*{CMD}"}"{B}*"*/"	{
+<FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}"|"/*"([!*]?){B}*{CMD}"}"{B}*"*/"	{
   					  endGroup();
   					}
 <FindMembers>"="			{
@@ -1687,6 +1687,15 @@ TITLE     [tT][iI][tT][lL][eE]
 					    varEntry->doc = current->doc.copy();
 					    varEntry->brief = current->brief.copy();
 					    varEntry->mGrpId = current->mGrpId;
+
+					    // deep copy group list
+					    QListIterator<QCString> sli(*current->groups);
+					    QCString *s;
+					    for (;(s=sli.current());++sli)
+					    {
+					      varEntry->groups->append(new QCString(*s));
+					    }
+
 					    //printf("Add: type=`%s',name=`%s',args=`%s'\n",
 					    //      varEntry->type.data(),varEntry->name.data(),varEntry->args.data());
 					    current_root->addSubEntry(varEntry);
@@ -2313,7 +2322,6 @@ TITLE     [tT][iI][tT][lL][eE]
 					  BEGIN( ClassVar );
 					}
 <ClassVar>{SCOPENAME}{BN}*/"("		{
-                                          err("Inside IDL = %d\n",insideIDL);
   					  if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
 					  {
 					    // Corba IDL style union
@@ -3810,7 +3818,19 @@ static void parseCompounds(Entry *rt)
       mtype = Method;
       gstat = FALSE;
       virt = Normal;
+
+      memberGroupId = NOGROUP;
+      
+      // rebuild compound's group context 
+      QCString *s = ce->groups->first();
+      if (s)
+      {
+	lastDefGroup=*s;
+	startGroup();
+      }
+
       current->mGrpId = memberGroupId = ce->mGrpId;
+
       scanYYlex() ;
       delete current; current=0;
       ce->program.resize(0);
diff --git a/src/translator.h b/src/translator.h
index 9b6e413..d40e379 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -1276,6 +1276,24 @@ class Translator
       return "Bug List";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.?
+//////////////////////////////////////////////////////////////////////////
+    /*! Used as ansicpg for RTF file */
+    virtual QCString trRTFansicp()
+    {
+      return "1252";
+    }
+    /*! Used as ansicpg for RTF fcharset */
+    virtual QCString trRTFCharSet()
+    {
+      return "0";
+    }
+    /*! Used as header RTF general index */
+    virtual QCString trRTFGeneralIndex()
+    {
+      return "Index";
+    }
 };
 
 #endif
diff --git a/src/translator_br.h b/src/translator_br.h
index 4919737..ae8ed73 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -1,7 +1,4 @@
 /******************************************************************************
- *
- * 
- *
  * Copyright (C) 1997-2001 by Dimitri van Heesch.
  *
  * Permission to use, copy, modify, and distribute this software and its
@@ -13,10 +10,9 @@
  * Documents produced by Doxygen are derivative works derived from the
  * input used in their production; they are not affected by this license.
  *
- * The translation into Brasilian Portuguese was provided by
+ * Brazilian Portuguese version by
  *   Fabio "FJTC" Jun Takada Chino <chino@grad.icmc.sc.usp.br>
- * Based on the original translation to Portuguese provided by
- *   Rui Godinho Lopes <ruiglopes@yahoo.com>
+ *   Version: 1.2.6.1 (2001/04/13)
  */
 
 #ifndef TRANSLATOR_BR_H
@@ -24,450 +20,557 @@
 
 #include "translator.h"
 
-/*
-* I used the name brazilian in language.cpp.
-*/
-class TranslatorBrazilianPortuguese : public Translator
+class TranslatorBrazilian: public Translator
 {
   public:
-    QCString idLanguage()
-    { return "brazilian"; }
+
+    // --- Language contol methods -------------------
+
+    /*! Used for identification of the language. May resemble
+     * the string returned by latexBabelPackage(), but it is not used
+     * for the same purpose. The identification should not be translated.
+     * It should be replaced by the name of the language in English
+     * (e.g. Czech, Japanese, Russian, etc.). It should be equal to
+     * the identification in language.h.
+     */
+    virtual QCString idLanguage()
+    {
+      return "portuges";
+      /* I'm not sure if it is correct. I did not found the documentation of BabelPackage*/
+    }
+
+    /*! Used to get the command(s) for the language support. This method
+     *  was designed for languages which do not prefer babel package.
+     *  If this methods returns empty string, then the latexBabelPackage()
+     *  method is used to generate the command for using the babel package.
+     */
+    virtual QCString latexLanguageSupportCommand()
+    {
+      return "Brazilian";
+    }
+
     /*! returns the name of the package that is included by LaTeX */
-    QCString latexBabelPackage()
-    { return "portuguese_br"; }
+    virtual QCString latexBabelPackage()
+    { return ""; }
+
+    /*! return the language charset. This will be used for the HTML output */
+    virtual QCString idLanguageCharset()
+    {
+      return "iso-8859-1";
+    }
+
+    // --- Language translation methods -------------------
 
     /*! used in the compound documentation before a list of related functions. */
-    QCString trRelatedFunctions()
-    { return "Fun��es relacionadas"; }
+    virtual QCString trRelatedFunctions()
+    { return "Fun��es Relacionadas"; }
 
     /*! subscript for the related functions. */
-    QCString trRelatedSubscript()
-    { return "(Note que n�o s�o fun��es membro)"; }
+    virtual QCString trRelatedSubscript()
+    { return "(Note que estes n�o s�o fun��es membros.)"; }
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
-    QCString trDetailedDescription()
-    { return "Descri��o"; }
+    virtual QCString trDetailedDescription()
+    { return "Descri��o Detalhada"; }
 
     /*! header that is put before the list of typedefs. */
-    QCString trMemberTypedefDocumentation()
-    { return "Tipos definidos"; }
+    virtual QCString trMemberTypedefDocumentation()
+    { return "Defini��es de Tipos"; }
 
     /*! header that is put before the list of enumerations. */
-    QCString trMemberEnumerationDocumentation()
+    virtual QCString trMemberEnumerationDocumentation()
     { return "Enumera��es"; }
 
     /*! header that is put before the list of member functions. */
-    QCString trMemberFunctionDocumentation()
+    virtual QCString trMemberFunctionDocumentation()
     { return "M�todos"; }
 
     /*! header that is put before the list of member attributes. */
-    QCString trMemberDataDocumentation()
-    { return "Atributos"; }
+    virtual QCString trMemberDataDocumentation()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Campos e Atributos";
+      }
+      else
+      {
+        return "Constantes";
+      }
+    }
 
     /*! this is the text of a link put after brief descriptions. */
-    QCString trMore()
+    virtual QCString trMore()
     { return "Mais..."; }
 
     /*! put in the class documentation */
-    QCString trListOfAllMembers()
-    { return "Mostrar lista completa dos membros"; }
+    virtual QCString trListOfAllMembers()
+    { return "Lista de todos os Membros."; }
 
     /*! used as the title of the "list of all members" page of a class */
-    QCString trMemberList()
-    { return "Lista dos membros"; }
+    virtual QCString trMemberList()
+    { return "Lista de Membros"; }
 
     /*! this is the first part of a sentence that is followed by a class name */
-    QCString trThisIsTheListOfAllMembers()
-    { return "Esta � a lista de todos os membros de "; }
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return "Esta � a lista completa dos membros da "; }
 
     /*! this is the remainder of the sentence after the class name */
-    QCString trIncludingInheritedMembers()
-    { return ", incluindo os membros herdados."; }
+    virtual QCString trIncludingInheritedMembers()
+    { return ", incluindo todos os membros herdados."; }
 
     /*! this is put at the author sections at the bottom of man pages.
      *  parameter s is name of the project name.
      */
-    QCString trGeneratedAutomatically(const char *s)
+    virtual QCString trGeneratedAutomatically(const char *s)
     { QCString result="Gerado automaticamente por Doxygen";
       if (s) result+=(QCString)" para "+s;
-      result+=" a partir do c�digo fonte.";
+      result+=" a partir do c�digo-fonte.";
       return result;
     }
 
     /*! put after an enum name in the list of all members */
-    QCString trEnumName()
-    { return "enumera��o"; }
+    virtual QCString trEnumName()
+    { return "Nome da enumera��o"; }
 
     /*! put after an enum value in the list of all members */
-    QCString trEnumValue()
-    { return "valor enumerado"; }
+    virtual QCString trEnumValue()
+    { return "Valor enumerado"; }
 
     /*! put after an undocumented member in the list of all members */
-    QCString trDefinedIn()
-    { return "definido em"; }
+    virtual QCString trDefinedIn()
+    { return "definida em"; }
 
     /*! put as in introduction in the verbatim header file of a class.
      *  parameter f is the name of the include file.
      */
-    QCString trIncludeFile()
-    { return "Arquivo inclu�do"; }
-    QCString trVerbatimText(const char *f)
-    { return (QCString)"Este texto foi originado pelo arquivo inclu�do "+f+"."; }
+    virtual QCString trVerbatimText(const char *f)
+    { return (QCString)"Este � o texto original do arquivo "+f+"."; }
 
     // quick reference sections
 
     /*! This is put above each page as a link to the list of all groups of
-     *  compounds or files (see the \group command).
+     *  compounds or files (see the \\group command).
      */
-    QCString trModules()
-    { return "M�dulos"; }
+    virtual QCString trModules()
+    { return "Modulos"; }
 
     /*! This is put above each page as a link to the class hierarchy */
-    QCString trClassHierarchy()
-    { return "Hierarquia de classes"; }
+    virtual QCString trClassHierarchy()
+    { return "Hierarquia de Classes"; }
 
     /*! This is put above each page as a link to the list of annotated classes */
-    QCString trCompoundList()
-    { return "Lista de componentes";
+    virtual QCString trCompoundList()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Estrutura de Dados";
+      }
+      else
+      {
+        return "Lista de Componentes";
+      }
+    }
 
-    /*! This is put above each page as a link to the list of documented files */}
-    QCString trFileList()
-    { return "Lista de arquivos"; }
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return "Lista de Arquivos"; }
 
     /*! This is put above each page as a link to the list of all verbatim headers */
-    QCString trHeaderFiles()
-    { return "Arquivos Inclu�dos"; }
+    virtual QCString trHeaderFiles()
+    { return "Arquivos de Cabe�alho (Headers)"; }
 
     /*! This is put above each page as a link to all members of compounds. */
-    QCString trCompoundMembers()
-    { return "Componentes"; }
+    virtual QCString trCompoundMembers()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Campos de Dados";
+      }
+      else
+      {
+        return "Componentes Membros";
+      }
+    }
 
     /*! This is put above each page as a link to all members of files. */
-    QCString trFileMembers()
-    { return "Declara��es"; }
+    virtual QCString trFileMembers()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Globais";
+      }
+      else
+      {
+        return "Arquivos Membros";
+      }
+    }
 
     /*! This is put above each page as a link to all related pages. */
-    QCString trRelatedPages()
-    { return "Paginas relacionadas"; }
+    virtual QCString trRelatedPages()
+    { return "P�ginas relacionadas"; }
 
     /*! This is put above each page as a link to all examples. */
-    QCString trExamples()
+    virtual QCString trExamples()
     { return "Exemplos"; }
 
     /*! This is put above each page as a link to the search engine. */
-    QCString trSearch()
-    { return "Localizar"; }
+    virtual QCString trSearch()
+    { return "Busca"; }
 
     /*! This is an introduction to the class hierarchy. */
-    QCString trClassHierarchyDescription()
-    { return "Esta lista de heran�as est� organizada, dentro do poss�vel, por ordem alfab�tica:"; }
+    virtual QCString trClassHierarchyDescription()
+    { return "Esta lista de hierarquia � parcialmente ordenada em ordem alfab�tica:"; }
 
     /*! This is an introduction to the list with all files. */
-    QCString trFileListDescription(bool extractAll)
+    virtual QCString trFileListDescription(bool extractAll)
     {
-      QCString result="Lista de todos os arquivos ";
+      QCString result="Aqui est� a lista de todos os arquivos ";
       if (!extractAll) result+="documentados ";
-      result+="com uma breve descri��o:";
+      result+="com suas respectivas descri��es:";
       return result;
     }
 
     /*! This is an introduction to the annotated compound list. */
-    QCString trCompoundListDescription()
-    { return "Lista de classes, estruturas, uni�es e interfaces com breves descri��es:";
+    virtual QCString trCompoundListDescription()
+    {
+
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Aqui est�o as estruturas de dados e suas respectivas descri��es:";
+      }
+      else
+      {
+        return "Aqui est�o as classes, estruturas, uni�es e interfaces e suas respectivas descri��es:";
+      }
     }
 
     /*! This is an introduction to the page with all class members. */
-    QCString trCompoundMembersDescription(bool extractAll)
+    virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="Lista de todos os membros ";
+      QCString result="Aqui est� a lista de todos os membros de classes ";
       if (!extractAll) result+="documentados ";
       result+="com links para ";
-      if (extractAll) result+="a documenta��o das respectivas classes:";
-      else result+="o arquivo a que pertencem:";
+      if (extractAll)
+        result+="a documenta��o de suas respectivas classes:";
+      else
+        result+="suas respectivas classes:";
       return result;
     }
 
     /*! This is an introduction to the page with all file members. */
-    QCString trFileMembersDescription(bool extractAll)
+    virtual QCString trFileMembersDescription(bool extractAll)
     {
-      QCString result="Lista de todos os membros ";
-      if (!extractAll) result+="documentados ";
+      QCString result="Aqui esta a lista de ";
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="tadas as fun��es, vari�veis, defini��es, enumera��es e defini��es de tipos ";
+        if (!extractAll) result+="documentadas ";
+      }
+      else
+      {
+        result+="todos os membros dos arquivos ";
+        if (!extractAll) result+="documentados ";
+      }
+
+
       result+="com links para ";
-      if (extractAll) result+="a documenta��o correspondente:";
-      else result+="os arquivos onde foram definidos:";
+      if (extractAll)
+        result+="seus respectivos arquivos:";
+      else
+        result+="suas respectivas documenta��es:";
       return result;
     }
 
     /*! This is an introduction to the page with the list of all header files. */
-    QCString trHeaderFilesDescription()
-    { return "Lista de todos os arquivos cabe�alho que constituem a API:"; }
+    virtual QCString trHeaderFilesDescription()
+    { return "Aqui est�o os arquivos de cabe�alho que comp�e a API:"; }
 
     /*! This is an introduction to the page with the list of all examples */
-    QCString trExamplesDescription()
-    { return "Lista de todos os exemplos:"; }
+    virtual QCString trExamplesDescription()
+    { return "Aqui est� a lista de todos os exemplos:"; }
 
     /*! This is an introduction to the page with the list of related pages */
-    QCString trRelatedPagesDescription()
-    { return "Lista de documenta��o relacionada:"; }
+    virtual QCString trRelatedPagesDescription()
+    { return "Aqui est� a lista de toda a documenta��o relacionadas:"; }
 
     /*! This is an introduction to the page with the list of class/file groups */
-    QCString trModulesDescription()
-    { return "Lista de todos os m�dulos:"; }
+    virtual QCString trModulesDescription()
+    { return "Aqui est� a lista de todos os m�dulos:"; }
 
     /*! This sentences is used in the annotated class/file lists if no brief
      * description is given.
      */
-    QCString trNoDescriptionAvailable()
-    { return "Nenhuma descri��o dispon�vel"; }
+    virtual QCString trNoDescriptionAvailable()
+    { return "Sem descri��odispon�vel"; }
 
     // index titles (the project name is prepended for these)
 
 
     /*! This is used in HTML as the title of index.html. */
-    QCString trDocumentation()
+    virtual QCString trDocumentation()
     { return "Documenta��o"; }
 
     /*! This is used in LaTeX as the title of the chapter with the
      * index of all groups.
      */
-    QCString trModuleIndex()
-    { return "�ndice dos m�dulos"; }
+    virtual QCString trModuleIndex()
+    { return "�ndice de M�dulos"; }
 
     /*! This is used in LaTeX as the title of the chapter with the
      * class hierarchy.
      */
-    QCString trHierarchicalIndex()
-    { return "�ndice da hierarquia"; }
+    virtual QCString trHierarchicalIndex()
+    { return "�ndice Hier�rquico"; }
 
     /*! This is used in LaTeX as the title of the chapter with the
      * annotated compound index.
      */
-    QCString trCompoundIndex()
-    { return "�ndice dos componentes"; }
+    virtual QCString trCompoundIndex()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "�ndice das Estruturas de Dados";
+      }
+      else
+      {
+        return "�ndice dos Componentes";
+      }
+    }
 
     /*! This is used in LaTeX as the title of the chapter with the
      * list of all files.
      */
-    QCString trFileIndex()
-    { return "�ndice dos arquivos"; }
+    virtual QCString trFileIndex()
+    { return "�ndice dos Arquivos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all groups.
      */
-    QCString trModuleDocumentation()
-    { return "Documenta��o do m�dulo"; }
+    virtual QCString trModuleDocumentation()
+    { return "M�dulos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
      */
-    QCString trClassDocumentation()
-    { return "Documenta��o da classe"; }
+    virtual QCString trClassDocumentation()
+    { return "Classes"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all files.
      */
-    QCString trFileDocumentation()
-    { return "Documenta��o do arquivo"; }
+    virtual QCString trFileDocumentation()
+    { return "Arquivos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all examples.
      */
-    QCString trExampleDocumentation()
-    { return "Documenta��o do exemplo"; }
+    virtual QCString trExampleDocumentation()
+    { return "Exemplos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all related pages.
      */
-    QCString trPageDocumentation()
-    { return "Documenta��o da p�gina"; }
+    virtual QCString trPageDocumentation()
+    { return "Documenta��o Relacionada"; }
 
     /*! This is used in LaTeX as the title of the document */
-    QCString trReferenceManual()
-    { return "Manual de refer�ncia"; }
+    virtual QCString trReferenceManual()
+    { return "Manual de Refer�ncia"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of defines
      */
-    QCString trDefines()
-    { return "Defini��o de macros"; }
+    virtual QCString trDefines()
+    { return "Defini��es e Macros"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of function prototypes
      */
-    QCString trFuncProtos()
-    { return "Prot�tipos de fun��es"; }
+    virtual QCString trFuncProtos()
+    { return "Prot�tipos de Fun��es"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of typedefs
      */
-    QCString trTypedefs()
-    { return "Defini��es de tipos"; }
+    virtual QCString trTypedefs()
+    { return "Defini��es de Tipos"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of enumerations
      */
-    QCString trEnumerations()
+    virtual QCString trEnumerations()
     { return "Enumera��es"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of (global) functions
      */
-    QCString trFunctions()
+    virtual QCString trFunctions()
     { return "Fun��es"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
-    QCString trVariables()
+    virtual QCString trVariables()
     { return "Vari�veis"; }
 
     /*! This is used in the documentation of a file as a header before the
      *  list of (global) variables
      */
-    QCString trEnumerationValues()
-    { return "Valores da enumera��o"; }
+    virtual QCString trEnumerationValues()
+    { return "Valores Enumerados"; }
 
     /*! This is used in man pages as the author section. */
-    QCString trAuthor()
+    virtual QCString trAuthor()
     { return "Autor"; }
 
     /*! This is used in the documentation of a file before the list of
      *  documentation blocks for defines
      */
-    QCString trDefineDocumentation()
-    { return "Macros"; }
+    virtual QCString trDefineDocumentation()
+    { return "Deini��es e macros"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for function prototypes
      */
-    QCString trFunctionPrototypeDocumentation()
-    { return "Prot�tipos das fun��es"; }
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return "Prot�tipos de fun��es"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for typedefs
      */
-    QCString trTypedefDocumentation()
-    { return "Tipos"; }
+    virtual QCString trTypedefDocumentation()
+    { return "Defini��es de tipos"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for enumeration types
      */
-    QCString trEnumerationTypeDocumentation()
+    virtual QCString trEnumerationTypeDocumentation()
     { return "Enumera��es"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for enumeration values
      */
-    QCString trEnumerationValueDocumentation()
-    { return "Elementos da enumera��o"; }
+    virtual QCString trEnumerationValueDocumentation()
+    { return "Valores enumerados"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for functions
      */
-    QCString trFunctionDocumentation()
+    virtual QCString trFunctionDocumentation()
     { return "Fun��es"; }
 
     /*! This is used in the documentation of a file/namespace before the list
      *  of documentation blocks for variables
      */
-    QCString trVariableDocumentation()
+    virtual QCString trVariableDocumentation()
     { return "Vari�veis"; }
 
     /*! This is used in the documentation of a file/namespace/group before
      *  the list of links to documented compounds
      */
-    QCString trCompounds()
-    { return "Componentes"; }
+    virtual QCString trCompounds()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Estruturas de Dados";
+      }
+      else
+      {
+        return "Componentes";
+      }
+    }
 
     /*! This is used in the documentation of a group before the list of
      *  links to documented files
      */
-    QCString trFiles()
+    virtual QCString trFiles()
     { return "Arquivos"; }
 
     /*! This is used in the standard footer of each page and indicates when
      *  the page was generated
      */
-    QCString trGeneratedAt(const char *date,const char *projName)
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
     {
-      QCString result=(QCString)"Criado em "+date;
+      QCString result=(QCString)"Gerado em "+date;
       if (projName) result+=(QCString)" para "+projName;
       result+=(QCString)" por";
       return result;
     }
     /*! This is part of the sentence used in the standard footer of each page.
      */
-    QCString trWrittenBy()
+    virtual QCString trWrittenBy()
     {
       return "escrito por";
     }
 
     /*! this text is put before a class diagram */
-    QCString trClassDiagram(const char *clName)
+    virtual QCString trClassDiagram(const char *clName)
     {
-      return (QCString)"Diagrama de heran�as da classe "+clName;
+      return (QCString)"Diagrama de Hierarquia para "+clName+":";
     }
 
-    /*! this text is generated when the \internal command is used. */
-    QCString trForInternalUseOnly()
+    /*! this text is generated when the \\internal command is used. */
+    virtual QCString trForInternalUseOnly()
     { return "Apenas para uso interno."; }
 
-    /*! this text is generated when the \reimp command is used. */
-    QCString trReimplementedForInternalReasons()
-    { return "Redefinido por raz�es internas. A interface n�o foi afetada.";
-    }
+    /*! this text is generated when the \\reimp command is used. */
+    virtual QCString trReimplementedForInternalReasons()
+    { return "Reimplementado por raz�es internas. A API n�o foi modificada."; }
 
-    /*! this text is generated when the \warning command is used. */
-    QCString trWarning()
+    /*! this text is generated when the \\warning command is used. */
+    virtual QCString trWarning()
     { return "Aviso"; }
 
-    /*! this text is generated when the \bug command is used. */
-    QCString trBugsAndLimitations()
+    /*! this text is generated when the \\bug command is used. */
+    virtual QCString trBugsAndLimitations()
     { return "Bugs e limita��es"; }
 
-    /*! this text is generated when the \version command is used. */
-    QCString trVersion()
+    /*! this text is generated when the \\version command is used. */
+    virtual QCString trVersion()
     { return "Vers�o"; }
 
-    /*! this text is generated when the \date command is used. */
-    QCString trDate()
+    /*! this text is generated when the \\date command is used. */
+    virtual QCString trDate()
     { return "Data"; }
 
-    /*! this text is generated when the \author command is used. */
-    QCString trAuthors()
+    /*! this text is generated when the \\author command is used. */
+    virtual QCString trAuthors()
     { return "Autor(es)"; }
 
-    /*! this text is generated when the \return command is used. */
-    QCString trReturns()
+    /*! this text is generated when the \\return command is used. */
+    virtual QCString trReturns()
     { return "Retorna"; }
 
-    /*! this text is generated when the \sa command is used. */
-    QCString trSeeAlso()
+    /*! this text is generated when the \\sa command is used. */
+    virtual QCString trSeeAlso()
     { return "Veja tamb�m"; }
 
-    /*! this text is generated when the \param command is used. */
-    QCString trParameters()
+    /*! this text is generated when the \\param command is used. */
+    virtual QCString trParameters()
     { return "Par�metros"; }
 
-    /*! this text is generated when the \exception command is used. */
-    QCString trExceptions()
+    /*! this text is generated when the \\exception command is used. */
+    virtual QCString trExceptions()
     { return "Exce��es"; }
 
     /*! this text is used in the title page of a LaTeX document. */
-    QCString trGeneratedBy()
-    { return "Criado por"; }
+    virtual QCString trGeneratedBy()
+    { return "Gerado por"; }
 
-    // new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307
+//////////////////////////////////////////////////////////////////////////
 
+    /*! used as the title of page containing all the index of all namespaces. */
     virtual QCString trNamespaceList()
-    { return "Lista de namespaces"; }
+    { return "Lista de Namespaces"; }
 
     /*! used as an introduction to the namespace list */
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
-      QCString result="Lista ";
-      if (!extractAll) result+="de toda a documenta��o ";
-      result+="dos namespaces com uma breve descri��o:";
+      QCString result="Aqui esta a lista de todos os Namespaces ";
+      if (!extractAll) result+="documentados ";
+      result+="com suas respectivas descri��es:";
       return result;
     }
 
@@ -485,7 +588,7 @@ class TranslatorBrazilianPortuguese : public Translator
      * related classes
      */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Fun��es relacionadas e classes amigas"; }
+    { return "Amigos e Fun��es Relacionadas"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
@@ -496,19 +599,17 @@ class TranslatorBrazilianPortuguese : public Translator
                                     ClassDef::CompoundType compType,
                                     bool isTemplate)
     {
-      QCString result="Referencia ";
+      QCString result="Refer�ncia da";
+
+      if (isTemplate) result+=" Template de";
       switch(compType)
       {
-        case ClassDef::Class:      result+="� classe "; break;
-        case ClassDef::Struct:     result+="� estrutura "; break;
-        case ClassDef::Union:      result+="� uni�o "; break;
-        case ClassDef::Interface:  result+="� interface "; break;
-        case ClassDef::Exception:  result+="� excep��o "; break;
+        case ClassDef::Class:      result+=" Classe "; break;
+        case ClassDef::Struct:     result+=" Estrutura "; break;
+        case ClassDef::Union:      result+=" Uni�o "; break;
+        case ClassDef::Interface:  result+=" Interface "; break;
+        case ClassDef::Exception:  result+=" Exce��o "; break;
       }
-
-      if (isTemplate)
-        result+="<template> ";
-
       result+=(QCString)clName;
       return result;
     }
@@ -516,7 +617,7 @@ class TranslatorBrazilianPortuguese : public Translator
     /*! used as the title of the HTML page of a file */
     virtual QCString trFileReference(const char *fileName)
     {
-      QCString result= "Referencia ao arquivo ";
+      QCString result = "Refer�ncia do Arquivo ";
       result += fileName;
       return result;
     }
@@ -524,7 +625,7 @@ class TranslatorBrazilianPortuguese : public Translator
     /*! used as the title of the HTML page of a namespace */
     virtual QCString trNamespaceReference(const char *namespaceName)
     {
-      QCString result= "Referencia ao namespace ";
+      QCString result ="Ref�ncia do Namespace ";
       result += namespaceName;
       return result;
     }
@@ -533,25 +634,25 @@ class TranslatorBrazilianPortuguese : public Translator
      *  these are for the member sections of a class, struct or union
      */
     virtual QCString trPublicMembers()
-    { return "Membros p�blicos"; }
+    { return "M�todos P�blicos"; }
     virtual QCString trPublicSlots()
-    { return "Slots p�blicos"; }
+    { return "Slots P�blicos"; }
     virtual QCString trSignals()
-    { return "Sinais"; }
+    { return "Signals"; }
     virtual QCString trStaticPublicMembers()
-    { return "Membros p�blicos est�ticos"; }
+    { return "M�todos P�blicos Est�ticos"; }
     virtual QCString trProtectedMembers()
-    { return "Membros protegidos"; }
+    { return "M�todos Protegidos"; }
     virtual QCString trProtectedSlots()
-    { return "Slots protegidos"; }
+    { return "Slots Protegidos"; }
     virtual QCString trStaticProtectedMembers()
-    { return "Membros protegidos est�ticos"; }
+    { return "M�todos Protegidos Est�ticos"; }
     virtual QCString trPrivateMembers()
-    { return "Membros privados"; }
+    { return "M�todos Privados"; }
     virtual QCString trPrivateSlots()
-    { return "Slots privados"; }
+    { return "Slots Privados"; }
     virtual QCString trStaticPrivateMembers()
-    { return "Membros privados est�ticos"; }
+    { return "M�todos Privados Est�ticos"; }
     /*! \endmgroup */
 
     /*! this function is used to produce a comma-separated list of items.
@@ -573,7 +674,7 @@ class TranslatorBrazilianPortuguese : public Translator
           if (i<numEntries-2) // not the fore last entry
             result+=", ";
           else                // the fore last entry
-            result+=", e ";
+            result+=" e ";
         }
       }
       return result;
@@ -584,7 +685,7 @@ class TranslatorBrazilianPortuguese : public Translator
      */
     virtual QCString trInheritsList(int numEntries)
     {
-      return "Derivada de "+trWriteList(numEntries)+".";
+      return "Herdeiro de " + trWriteList(numEntries) + ".";
     }
 
     /*! used in class documentation to produce a list of super classes,
@@ -592,7 +693,7 @@ class TranslatorBrazilianPortuguese : public Translator
      */
     virtual QCString trInheritedByList(int numEntries)
     {
-      return "Herdado por "+trWriteList(numEntries)+".";
+      return "Superclasse de "+trWriteList(numEntries)+".";
     }
 
     /*! used in member documentation blocks to produce a list of
@@ -613,25 +714,25 @@ class TranslatorBrazilianPortuguese : public Translator
 
     /*! This is put above each page as a link to all members of namespaces. */
     virtual QCString trNamespaceMembers()
-    { return "Membros do namespace"; }
+    { return "Membros do Namespace"; }
 
     /*! This is an introduction to the page with all namespace members */
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     {
-      QCString result="Lista ";
-	  if (extractAll) result+="de todos os ";
-      else result+="de toda a documenta��o dos ";
-      result+="membros do namespace com links para ";
-      if (extractAll) result+="a documenta��o de cada membro:";
-      else result+="o namespace correspondente:";
+      QCString result="Aqui est� a lista de todos os membros do Namespace ";
+      if (!extractAll) result+="documentados ";
+      result+="com links para ";
+      if (extractAll)
+        result+="a documenta��o de seus respectivos Namespaces:";
+      else
+        result+="os seus respectivos namespaces:";
       return result;
     }
-
-	/*! This is used in LaTeX as the title of the chapter with the
+    /*! This is used in LaTeX as the title of the chapter with the
      *  index of all namespaces.
      */
     virtual QCString trNamespaceIndex()
-    { return "�ndice dos namespaces"; }
+    { return "�ndice de Namespaces"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all namespaces.
@@ -660,18 +761,17 @@ class TranslatorBrazilianPortuguese : public Translator
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"A documenta��o para ";
+      QCString result=(QCString)"A documenta��o para esta ";
       switch(compType)
       {
-        case ClassDef::Class:      result+="esta classe"; break;
-        case ClassDef::Struct:     result+="esta estrutura"; break;
-        case ClassDef::Union:      result+="esta uni�o"; break;
-        case ClassDef::Interface:  result+="esta interface"; break;
-        case ClassDef::Exception:  result+="esta exce��o"; break;
+        case ClassDef::Class:      result+="classe "; break;
+        case ClassDef::Struct:     result+="estrura "; break;
+        case ClassDef::Union:      result+="uni�o "; break;
+        case ClassDef::Interface:  result+="interface "; break;
+        case ClassDef::Exception:  result+="exce��o "; break;
       }
       result+=" foi gerada a partir ";
-      if (single) result+=" do seguinte arquivo:";
-      else result+="dos seguintes arquivos:";
+      if (single) result+="do seguinte arquivo:"; else result+="dos seguintes arquivos:";
       return result;
     }
 
@@ -679,10 +779,7 @@ class TranslatorBrazilianPortuguese : public Translator
      * list.
      */
     virtual QCString trAlphabeticalList()
-    {
-      return "Lista em ordem alfab�tica";
-    }
-
+    { return "Lista Alfab�tica"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
@@ -690,18 +787,18 @@ class TranslatorBrazilianPortuguese : public Translator
 
     /*! This is used as the heading text for the retval command. */
     virtual QCString trReturnValues()
-    { return "Valores retornados"; }
+    { return "Valores Retornados"; }
 
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return "P�gina principal"; }
+    { return "P�gina Principal"; }
 
     /*! This is used in references to page that are put in the LaTeX
      *  documentation. It should be an abbreviation of the word page.
      */
     virtual QCString trPageAbbreviation()
-    { return "p. "; }
+    { return "pag."; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-991003
@@ -713,11 +810,11 @@ class TranslatorBrazilianPortuguese : public Translator
     }
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "Definido na linha @0 do arquivo @1.";
+      return "Defini��o na linha @0 do arquivo @1.";
     }
     virtual QCString trDefinedInSourceFile()
     {
-      return "Definido no arquivo @0.";
+      return "Defini��o no arquivo @0.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -726,7 +823,10 @@ class TranslatorBrazilianPortuguese : public Translator
 
     virtual QCString trDeprecated()
     {
-      return "Desaprovado";
+      /* This note is for brazilians.
+       Esta � uma boa tradu��o para "deprecated"?
+      */
+      return "Descontinuada";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -741,42 +841,42 @@ class TranslatorBrazilianPortuguese : public Translator
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Diagrama de depend�ncias de inclus�o para "+fName+":";
+      return (QCString)"Gr�fico de depend�ncia de inclus�es para "+fName+":";
     }
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "Construtores e Destrutores"; 
+      return "Construtores & Destrutores";
     }
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return "Ir para o c�digo fonte deste arquivo.";
+      return "V� para o c�digo-fonte deste arquivo.";
     }
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "Ir para a documenta��o deste arquivo.";
+      return "V� para a documenta��o deste arquivo.";
     }
     /*! Text for the \pre command */
     virtual QCString trPrecondition()
     {
-      return "Precondi��o";
+      return "Pr�-Condi��o";
     }
     /*! Text for the \post command */
     virtual QCString trPostcondition()
     {
-      return "Poscondi��o";
+      return "P�s-Condi��o";
     }
     /*! Text for the \invariant command */
     virtual QCString trInvariant()
     {
-      return "Invariante";
+      return "Invari�vel";
     }
     /*! Text shown before a multi-line variable/enum initialization */
     virtual QCString trInitialValue()
     {
-      return "Valor inicial:";
+      return "Valor Inicial:";
     }
     /*! Text used the source code in the file index */
     virtual QCString trCode()
@@ -785,25 +885,25 @@ class TranslatorBrazilianPortuguese : public Translator
     }
     virtual QCString trGraphicalHierarchy()
     {
-      return "Representa��o gr�fica da hierarquia da classe";
+      return "Gr�fico de Hierarquia de Classes";
     }
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "Ir para a representa��o gr�fica da hierarquia da classe";
+      return "V� para o Gr�fico de Hierarquia de Classes";
     }
     virtual QCString trGotoTextualHierarchy()
     {
-      return "Ir para a representa��o textual da hierarquia da classe";
+      return "V� para a Hierarquia de Classes (texto)";
     }
     virtual QCString trPageIndex()
     {
-      return "�ndice da p�gina";
+      return "�ndice de P�gina";
     }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.1.0
 //////////////////////////////////////////////////////////////////////////
-    
+
     virtual QCString trNote()
     {
       return "Nota";
@@ -814,7 +914,14 @@ class TranslatorBrazilianPortuguese : public Translator
     }
     virtual QCString trPublicAttribs()
     {
-      return "Atributos P�blicos";
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Campos de Dados";
+      }
+      else
+      {
+        return "Atributos P�blicos";
+      }
     }
     virtual QCString trStaticPublicAttribs()
     {
@@ -852,12 +959,12 @@ class TranslatorBrazilianPortuguese : public Translator
     /*! Used as a marker that is put before a todo item */
     virtual QCString trTodo()
     {
-      return "Tarefa";
+      return "Tarefas Futuras";
     }
     /*! Used as the header of the todo list */
     virtual QCString trTodoList()
     {
-      return "Lista de tarefas";
+      return "Lista de tarefas futuras";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -870,7 +977,7 @@ class TranslatorBrazilianPortuguese : public Translator
     }
     virtual QCString trRemarks()
     {
-      return "Observa��es";
+      return "Anota��es";
     }
     virtual QCString trAttention()
     {
@@ -878,12 +985,193 @@ class TranslatorBrazilianPortuguese : public Translator
     }
     virtual QCString trInclByDepGraph()
     {
-      return "Este gr�fico mostra quais s�o os arquivos que incluem diretamente ou indiretamente este arquivo:";
+      return "Este grafo mostra quais arquivos est�o direta ou indiretamente "
+             "relacionados com este arquivo:";
     }
     virtual QCString trSince()
     {
       return "Desde";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! title of the graph legend page */
+    virtual QCString trLegendTitle()
+    {
+      return "Legenda do Grafo";
+    }
+    /*! page explaining how the dot graph's should be interpreted */
+    virtual QCString trLegendDocs()
+    {
+      return
+        "Esta p�gina explica como interpretar os grafos gerados pelo doxygen.<p>\n"
+        "Considere o seguinte exemplo:\n"
+        "\\code\n"
+        "/*! Invisible class because of truncation */\n"
+        "class Invisible { };\n\n"
+        "/*! Truncated class, inheritance relation is hidden */\n"
+        "class Truncated : public Invisible { };\n\n"
+        "/* Class not documented with doxygen comments */\n"
+        "class Undocumented { };\n\n"
+        "/*! Class that is inherited using public inheritance */\n"
+        "class PublicBase : public Truncated { };\n\n"
+        "/*! Class that is inherited using protected inheritance */\n"
+        "class ProtectedBase { };\n\n"
+        "/*! Class that is inherited using private inheritance */\n"
+        "class PrivateBase { };\n\n"
+        "/*! Class that is used by the Inherited class */\n"
+        "class Used { };\n\n"
+        "/*! Super class that inherits a number of other classes */\n"
+        "class Inherited : public PublicBase,\n"
+        "                  protected ProtectedBase,\n"
+        "                  private PrivateBase,\n"
+        "                  public Undocumented\n"
+        "{\n"
+        "  private:\n"
+        "    Used *m_usedClass;\n"
+        "};\n"
+        "\\endcode\n"
+
+        "Se a tag \\c MAX_DOT_GRAPH_HEIGHT no arquivo de configura��o tem o valor"
+        "200, o seguinte gr�fo ser� gerado:"
+        "<p><center><img src=\"graph_legend.gif\"></center>\n"
+        "<p>\n"
+        "As caixas no grafo acima tem as seguintes interpreta��es:\n"
+        "<ul>\n"
+        "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para qual "
+        "o grafo foi gerado.\n"
+        "<li>Uma caixa com bordas pretas denota uma estrutura ou classe documentada.\n"
+        "<li>Uma caixa com bordas cinzas denota uma estrutura ou classe n�o documentada.\n"
+
+        "<li>Uma caixa com bordas vermelhas denota uma estrutura ou classe documentada para\n"
+        "a qual nem todas as heran�as ou componentes s�o mostradas no grafo. Um grafo � "
+        "truncado quando este � maior que o tamanho especificado."
+        "</ul>\n"
+        "As setas tem os seguintes significados:\n"
+        "<ul>\n"
+        "<li>Uma seta azul escura � utilizada para denotar uma rela��o de heran�a "
+        "p�blica entre duas classes.\n"
+        "<li>Uma seta verde escura � utilizada para denotar uma heran�a protegida.\n"
+        "<li>Uma seta vermelho escura � utilizada para denotar uma heran�a privada.\n"
+        "<li>Uma seta p�rpura pontilhada � usada se uma classe est� contida ou � utilizada"
+        "por outra classe. A seta � marcada com a(s) vari�vel(eis) "
+        "atrav�s das quais a classe ou estrutura apontada est� acess�vel. \n"
+        "</ul>\n";
+    }
+    /*! text for the link to the legend page */
+    virtual QCString trLegend()
+    {
+      return "legenda";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a test item */
+    virtual QCString trTest()
+    {
+      return "Teste";
+    }
+    /*! Used as the header of the test list */
+    virtual QCString trTestList()
+    {
+      return "Lista de Teste";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for KDE-2 IDL methods */
+    virtual QCString trDCOPMethods()
+    {
+      return "M�todos DCOP";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for IDL properties */
+    virtual QCString trProperties()
+    {
+      return "Propriedades";
+    }
+    /*! Used as a section header for IDL property documentation */
+    virtual QCString trPropertyDocumentation()
+    {
+      return "Propriedades";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used for Java interfaces in the summary section of Java packages */
+    virtual QCString trInterfaces()
+    {
+      return "Interfaces";
+    }
+    /*! Used for Java classes in the summary section of Java packages */
+    virtual QCString trClasses()
+    {
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return "Estruturas de Dados";
+      }
+      else
+      {
+        return "Classes";
+      }
+    }
+    /*! Used as the title of a Java package */
+    virtual QCString trPackage(const char *name)
+    {
+      return (QCString)"Pacote "+name;
+    }
+    /*! Title of the package index page */
+    virtual QCString trPackageList()
+    {
+      return "Lista de Pacotes";
+    }
+    /*! The description of the package index page */
+    virtual QCString trPackageListDescription()
+    {
+      return "Aqui est� a lista de pacotes com suas respectivas descri��es (se dispon�veis):";
+    }
+    /*! The link name in the Quick links header for each page */
+    virtual QCString trPackages()
+    {
+      return "Pacotes";
+    }
+    /*! Used as a chapter title for Latex & RTF output */
+    virtual QCString trPackageDocumentation()
+    {
+      return "Pacotes";
+    }
+    /*! Text shown before a multi-line define */
+    virtual QCString trDefineValue()
+    {
+      return "Valor:";
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a \\bug item */
+    virtual QCString trBug()
+    {
+      return "Bug";
+    }
+    /*! Used as the header of the bug list */
+    virtual QCString trBugList()
+    {
+      return "Lista de Bug";
+    }
+
 };
 #endif
diff --git a/src/translator_cz.h b/src/translator_cz.h
index 732d4e1..41187da 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -97,6 +97,11 @@
 //  - Minor correction of comments which copied the same
 //    corrections in translator.h (doubled backslash) just after 
 //    1.2.6 release.
+//    
+// 2001/04/10 (Petr Prikryl)
+//  - Update for OPTIMIZE_OUTPUT_FOR_C (1.2.6-20010408).
+//  - Removed implementation of latexBabelPackage().
+//  - Removed implementation of trVerbatimText().
 //         
 // Notices:
 // -------- 
@@ -113,7 +118,7 @@ class TranslatorCzech : public Translator
 {
   private:
     /*! The Decode() inline assumes the source written in the 
-        Windows encoding (maintainer dependent). 
+        Windows encoding (maintainer only dependent). 
      */
     inline QCString Decode(const QCString & sInput)
     { 
@@ -133,10 +138,6 @@ class TranslatorCzech : public Translator
     virtual QCString latexLanguageSupportCommand()
     { return "\\usepackage{czech}\n"; }
     
-    /*! returns the name of the package that is included by LaTeX */
-    virtual QCString latexBabelPackage() 
-    { return ""; }
-
     /*! return the language charset. This will be used for the HTML output */
     virtual QCString idLanguageCharset()
     {
@@ -175,7 +176,16 @@ class TranslatorCzech : public Translator
     
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
-    { return Decode("Dokumentace k datov�m �len�m"); }
+    {       
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("Dokumentace k polo�k�m"); 
+      }
+      else
+      {
+        return Decode("Dokumentace k datov�m �len�m");
+      }
+    }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore() 
@@ -220,12 +230,6 @@ class TranslatorCzech : public Translator
     virtual QCString trDefinedIn()
     { return Decode("definov�n v"); }
 
-    /*! put as in introduction in the verbatim header file of a class.
-     *  parameter f is the name of the include file.
-     */
-    virtual QCString trVerbatimText(const char *f)
-    { return Decode((QCString)"�pln� text vkl�dan�ho souboru "+f+"."); }
-    
     // quick reference sections
 
     /*! This is put above each page as a link to the list of all groups of 
@@ -240,8 +244,17 @@ class TranslatorCzech : public Translator
     
     /*! This is put above each page as a link to the list of annotated classes */
     virtual QCString trCompoundList()
-    { return Decode("Seznam t��d"); }
-    
+    {  
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("Datov� struktury");
+      }
+      else
+      { 
+        return Decode("Seznam t��d"); 
+      }
+    }
+   
     /*! This is put above each page as a link to the list of documented files */
     virtual QCString trFileList()
     { return Decode("Seznam soubor�"); }
@@ -252,11 +265,29 @@ class TranslatorCzech : public Translator
 
     /*! This is put above each page as a link to all members of compounds. */
     virtual QCString trCompoundMembers()
-    { return Decode("Seznam �len� t��d"); }
-
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("Datov� polo�ky"); 
+      }
+      else
+      {
+        return Decode("Seznam �len� t��d"); 
+      }
+    }
+   
     /*! This is put above each page as a link to all members of files. */
     virtual QCString trFileMembers()
-    { return Decode("Symboly v souborech"); }
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("Glob�ln� symboly"); 
+      }
+      else
+      {
+        return Decode("Symboly v souborech"); 
+      }
+    }
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
@@ -287,22 +318,65 @@ class TranslatorCzech : public Translator
 
     /*! This is an introduction to the annotated compound list. */
     virtual QCString trCompoundListDescription()
-    { return Decode("N�sleduj�c� seznam obsahuje p�edev��m identifikace t��d, "
-             "ale nach�z� se zde i dal�� netrivi�ln� prvky, jako jsou "
-             "struktury (struct), unie (union) a rozhran� (interface). "
-             "V seznamu jsou uvedeny jejich stru�n� popisy:"); 
+    {       
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("N�sleduj�c� seznam obsahuje identifikace datov�ch "
+                      "struktur a jejich stru�n� popisy:"); 
+      }
+      else
+      {
+        return Decode("N�sleduj�c� seznam obsahuje p�edev��m identifikace "
+                      "t��d, ale nach�zej� se zde i dal�� netrivi�ln� prvky, "
+                      "jako jsou struktury (struct), unie (union) a rozhran� "
+                      "(interface). V seznamu jsou uvedeny jejich stru�n� "
+                      "popisy:");
+      }
     }
 
     /*! This is an introduction to the page with all class members. */
     virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-      QCString result="Zde naleznete seznam v�ech ";
-      if (!extractAll) result+="dokumentovan�ch ";
-      result+="�len� t��d s odkazy na ";
-      if (extractAll) 
-        result+="dokumentaci t��d, ke kter�m p��slu�ej�:";
-      else 
-        result+="t��dy, ke kter�m p��slu�ej�:";
+      QCString result= "Zde naleznete seznam v�ech ";
+      if (!extractAll) 
+      {
+        result += "dokumentovan�ch ";
+      }
+            
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result += "polo�ek struktur (struct) a uni� (union) ";
+      }
+      else
+      {
+        result += "�len� t��d ";
+      }
+      
+      result += "s odkazy na ";  
+      
+      if (extractAll)
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+          result += "dokumentaci struktur/uni�, ke kter�m p��slu�ej�:";
+        }
+        else
+        {
+          result += "dokumentaci t��d, ke kter�m p��slu�ej�:";
+        }
+      }
+      else
+      {
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+        {
+          result+="struktury/unie, ke kter�m p��slu�ej�:";
+        }
+        else
+        {
+          result+="t��dy, ke kter�m p��slu�ej�:";
+        }
+      }
+        
       return Decode(result);
     }
 
@@ -311,18 +385,22 @@ class TranslatorCzech : public Translator
     {
       QCString result="Zde naleznete seznam v�ech ";
       if (!extractAll) result+="dokumentovan�ch ";
-      result+="symbol�, kter� jsou definov�ny na �rovni sv�ch soubor�. "
-              "Pro ka�d� symbol je uveden odkaz na ";
+
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        result+="funkc�, prom�nn�ch, maker, v��t� a definic typ� (typedef) "
+                "s odkazy na ";
+      }
+      else
+      {
+        result+="symbol�, kter� jsou definov�ny na �rovni sv�ch soubor�. "
+                "Pro ka�d� symbol je uveden odkaz na ";
+      }
+        
       if (extractAll) 
-        result+="dokumentaci p��slu�n�ho souboru";
+        result+="soubory, ke kter�m p��slu�ej�:";
       else 
-        result+="soubor, ve kter�m je symbol definov�n";
-      result+=". Podle zp�sobu definice m��e b�t symbol glob�ln�m symbolem "
-              "nebo symbolem, kter� je viditeln� pouze z dan�ho souboru "
-              "(to se t�k� nap��klad statick�ch prom�nn�ch v C++). "
-              "Seznam neobsahuje symboly �len� t��d. "
-              "Symbol m��e ozna�ovat makro, typ, instanci t��dy, "
-              "prom�nnou, konstantu, funkci, v��et, hodnotu v��tu a podobn�:";  
+        result+="dokumentaci:";
         
       return Decode(result);
     }
@@ -374,8 +452,17 @@ class TranslatorCzech : public Translator
      * annotated compound index.
      */
     virtual QCString trCompoundIndex()
-    { return Decode("Rejst��k t��d"); }
-
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      { 
+        return Decode("Rejst��k datov�ch struktur");
+      }
+      else
+      {
+        return Decode("Rejst��k t��d"); 
+      }
+    }
+   
     /*! This is used in LaTeX as the title of the chapter with the
      * list of all files.
      */
@@ -508,8 +595,17 @@ class TranslatorCzech : public Translator
      *  the list of links to documented compounds
      */
     virtual QCString trCompounds()
-    { return Decode("T��dy"); }
-
+    { 
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      { 
+        return Decode("Datov� struktry");
+      }
+      else
+      {
+        return Decode("T��dy"); 
+      }
+    }
+   
     /*! This is used in the documentation of a group before the list of 
      *  links to documented files
      */
@@ -954,7 +1050,14 @@ class TranslatorCzech : public Translator
     }
     virtual QCString trPublicAttribs()
     {
-      return Decode("Ve�ejn� atributy");
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return Decode("Datov� polo�ky");
+      }
+      else
+      {
+        return Decode("Ve�ejn� atributy");
+      }
     }
     virtual QCString trStaticPublicAttribs()
     {
diff --git a/src/translator_de.h b/src/translator_de.h
index 8f0f75a..3d157ff 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -22,25 +22,30 @@
 //   RK (who are you?)
 //    - Update for "new since 1.1.3" version
 //
-//   2001/03/23 Jens Seidel (jens.seidel@mathematik.tu-chemnitz.de)
+//   2001/03/23 Jens Seidel (jensseidel@users.sourceforge.net)
 //    - fixed typos
 //    - changed trPageDocumentation() "Seitenbeschreibung" to
-//      "Zus&auml;tzliche Informationen"
+//      "Zus�tzliche Informationen"
 //    - removed old trGeneratedFrom()
-//    - /*! ==> /* (documentation is inherited from translator.h; 
-//      INHERIT_DOCS = YES)
+//    - changed "/*!" to "/*" (documentation is inherited from translator.h
+//      (INHERIT_DOCS = YES), there's no need to make changes twice)
 //    - Update for "new since 1.2.4" version
 //
+//   2001/04/17 Jens Seidel (jensseidel@users.sourceforge.net)
+//    - fixed typos ("Vererbunsbeziehung", "gesch&uumltzter")
+//    - use umlauts instead of html code ("&auml;",...)
+//      this makes it easier to read and fixes three problems (two in 
+//      \code segment)
+//
 // Todo: 
 //   - translation of all Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
 //     strings (see translator.h)
 //   - translation of "compound"
-//   - see FIXME for further changes
-//   - use "�",... (instead of "&auml;") in \code segments (or is there a bug
-//     in doxygen-1.2.6)?
+//   - see FIXME
 //   - was ist richtig: "Liste aller dokumentierter Elemente" oder
 //                      "Liste aller dokumentierten Elemente" (aktuell)
 //     (nach "aller" suchen)
+//     "Mithilfe" oder "Mit Hilfe"
 
 #ifndef TRANSLATOR_DE_H
 #define TRANSLATOR_DE_H
@@ -67,7 +72,7 @@ class TranslatorGerman : public Translator
 
     QCString trDetailedDescription()
       // header that is put before the detailed description of files, classes and namespaces.
-    { return "Ausf&uuml;hrliche Beschreibung"; }
+    { return "Ausf�hrliche Beschreibung"; }
 
     QCString trMemberTypedefDocumentation()
       // header that is put before the list of typedefs.
@@ -75,7 +80,7 @@ class TranslatorGerman : public Translator
     
     QCString trMemberEnumerationDocumentation()
       // header that is put before the list of enumerations.
-    { return "Dokumentation der Aufz&auml;hlungstypen"; }
+    { return "Dokumentation der Aufz�hlungstypen"; }
 
     QCString trMemberFunctionDocumentation()
       // header that is put before the list of member functions.
@@ -99,17 +104,17 @@ class TranslatorGerman : public Translator
 
     QCString trThisIsTheListOfAllMembers()
       // this is the first part of a sentence that is followed by a class name
-    { return "Vollst&auml;ndige Aufstellung aller Elemente f&uuml;r "; }
+    { return "Vollst�ndige Aufstellung aller Elemente f�r "; }
 
     QCString trIncludingInheritedMembers()
       // this is the remainder of the sentence after the class name
-    { return " einschlie&szlig;lich aller geerbten Elemente."; }
+    { return " einschlie�lich aller geerbten Elemente."; }
 
     QCString trGeneratedAutomatically(const char *s)
       // this is put at the author sections at the bottom of man pages.
       // parameter s is name of the project name.
     { QCString result="Automatisch erzeugt von Doxygen";
-      if (s) result+=(QCString)" f&uuml;r "+s;
+      if (s) result+=(QCString)" f�r "+s;
       result+=" aus dem Quellcode.";
       return result;
     }
@@ -129,7 +134,7 @@ class TranslatorGerman : public Translator
     QCString trVerbatimText(const char *f)
       // put as in introduction in the verbatim header file of a class.
       // parameter f is the name of the include file.
-    { return (QCString)"Dieses ist der unver&auml;nderte Text aus der "
+    { return (QCString)"Dieses ist der unver�nderte Text aus der "
              "Include-Datei "+f+"."; }
 
     // quick reference sections
@@ -145,7 +150,7 @@ class TranslatorGerman : public Translator
 
     QCString trCompoundList()
       // This is put above each page as a link to the list of annotated classes
-    { return "&Uuml;bersicht"; }
+    { return "�bersicht"; }
 
     QCString trFileList()
       // This is put above each page as a link to the list of documented files
@@ -157,7 +162,7 @@ class TranslatorGerman : public Translator
 
     QCString trCompoundMembers()
       // This is put above each page as a link to all members of compounds.
-    { return "Element&uuml;bersicht"; }
+    { return "Element�bersicht"; }
 
     QCString trFileMembers()
       // This is put above each page as a link to all members of files.
@@ -165,7 +170,7 @@ class TranslatorGerman : public Translator
 
     QCString trRelatedPages()
       // This is put above each page as a link to all related pages.
-    { return "Zus&auml;tzliche Informationen"; }
+    { return "Zus�tzliche Informationen"; }
 
     QCString trExamples()
       // This is put above each page as a link to all examples.
@@ -177,14 +182,14 @@ class TranslatorGerman : public Translator
 
     QCString trClassHierarchyDescription()
       // This is an introduction to the class hierarchy.
-    { return "Die Liste der Ableitungen ist -mit Einschr&auml;nkungen- "
+    { return "Die Liste der Ableitungen ist -mit Einschr�nkungen- "
              "alphabetisch sortiert:";
     }
 
     QCString trFileListDescription(bool extractAll)
       // This is an introduction to the list with all files.
     {
-      QCString result="Hier folgt die Aufz&auml;hlung aller ";
+      QCString result="Hier folgt die Aufz�hlung aller ";
       if (!extractAll) result+="dokumentierten ";
       result+="Dateien mit einer Kurzbeschreibung:";
       return result;
@@ -194,17 +199,17 @@ class TranslatorGerman : public Translator
       // This is an introduction to the annotated compound list
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-	return "Hier folgt die Aufz&auml;hlung aller Datenstrukturen "
+	return "Hier folgt die Aufz�hlung aller Datenstrukturen "
 	       "mit einer Kurzbeschreibung:";
       else
-	return "Hier folgt die Aufz&auml;hlung aller Klassen, Strukturen "
+	return "Hier folgt die Aufz�hlung aller Klassen, Strukturen "
 	       "und Varianten mit einer Kurzbeschreibung:"; // FIXME: "interfaces" = ??
     }
 
     QCString trCompoundMembersDescription(bool extractAll)
       // This is an introduction to the page with all class members
     {
-      QCString result="Hier folgt die Aufz&auml;hlung aller ";
+      QCString result="Hier folgt die Aufz�hlung aller ";
       if (!extractAll) result+="dokumentierten ";
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         result+="Strukturen und Varianten mit Verweisen auf ";
@@ -217,9 +222,9 @@ class TranslatorGerman : public Translator
           result+="die Klassendokumentation zu jedem Element:";
       } else { 
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-          result+="die zugeh&ouml;rigen Elemente:";
+          result+="die zugeh�rigen Elemente:";
         else
-          result+="die zugeh&ouml;rigen Klassen:";
+          result+="die zugeh�rigen Klassen:";
       }
       return result;
     }
@@ -227,11 +232,11 @@ class TranslatorGerman : public Translator
     QCString trFileMembersDescription(bool extractAll)
       // This is an introduction to the page with all file members
     {
-      QCString result="Hier folgt die Aufz&auml;hlung aller ";
+      QCString result="Hier folgt die Aufz�hlung aller ";
       if (!extractAll) result+="dokumentierten ";
       result+="Dateielemente mit Verweisen auf ";
       if (extractAll) result+="die Dateidokumentation zu jedem Element:";
-      else result+="die zugeh&ouml;rigen Dateien:";
+      else result+="die zugeh�rigen Dateien:";
       return result;
     }
 
@@ -245,16 +250,16 @@ class TranslatorGerman : public Translator
 
     QCString trRelatedPagesDescription()
       // This is an introduction to the page with the list of related pages
-    { return "Hier folgt eine Liste mit zusammengeh&ouml;rigen Themengebieten:"; }
+    { return "Hier folgt eine Liste mit zusammengeh�rigen Themengebieten:"; }
 
     QCString trModulesDescription()
       // This is an introduction to the page with the list of class/file groups
-    { return "Hier folgt die Aufz&auml;hlung aller Module:"; }
+    { return "Hier folgt die Aufz�hlung aller Module:"; }
 
     QCString trNoDescriptionAvailable()
       // This sentences is used in the annotated class/file lists if no brief
       // description is given.
-    { return "Keine Beschreibung verf&uuml;gbar"; }
+    { return "Keine Beschreibung verf�gbar"; }
 
     // index titles (the project name is prepended for these)
    
@@ -310,7 +315,7 @@ class TranslatorGerman : public Translator
     QCString trPageDocumentation()
       // This is used in LaTeX as the title of the chapter containing
       // the documentation of all related pages.
-    { return "Zus&auml;tzliche Informationen"; }
+    { return "Zus�tzliche Informationen"; }
 
     QCString trReferenceManual()
       // This is used in LaTeX as the title of the document
@@ -334,7 +339,7 @@ class TranslatorGerman : public Translator
     QCString trEnumerations()
       // This is used in the documentation of a file as a header before the
       // list of enumerations
-    { return "Aufz&auml;hlungen"; }
+    { return "Aufz�hlungen"; }
 
     QCString trFunctions()
       // This is used in the documentation of a file as a header before the
@@ -349,7 +354,7 @@ class TranslatorGerman : public Translator
     QCString trEnumerationValues()
       // This is used in the documentation of a file as a header before the
       // list of (global) variables
-    { return "Aufz&auml;hlungswerte"; }
+    { return "Aufz�hlungswerte"; }
 
     QCString trAuthor()
       // This is used in man pages as the author section.
@@ -373,12 +378,12 @@ class TranslatorGerman : public Translator
     QCString trEnumerationTypeDocumentation()
       // This is used in the documentation of a file/namespace before the list
       // of documentation blocks for enumeration types
-    { return "Dokumentation der Aufz&auml;hlungstypen"; }
+    { return "Dokumentation der Aufz�hlungstypen"; }
 
     QCString trEnumerationValueDocumentation()
       // This is used in the documentation of a file/namespace before the list
       // of documentation blocks for enumeration values
-    { return "Dokumentation des Wertebereiches der Aufz&auml;hlungstypen"; }
+    { return "Dokumentation des Wertebereiches der Aufz�hlungstypen"; }
 
     QCString trFunctionDocumentation()
       // This is used in the documentation of a file/namespace before the list
@@ -393,7 +398,7 @@ class TranslatorGerman : public Translator
     QCString trCompounds()
       // This is used in the documentation of a file/namespace/group before
       // the list of links to documented compounds
-    { return "&Uuml;bersicht"; }
+    { return "�bersicht"; }
 
     QCString trFiles()
       // This is used in the documentation of a group before the list of
@@ -403,7 +408,7 @@ class TranslatorGerman : public Translator
     QCString trGeneratedAt(const char *date,const char *projName)
     {
       QCString result=(QCString)"Erzeugt am "+date;
-      if (projName) result+=(QCString)" f&uuml;r "+projName;
+      if (projName) result+=(QCString)" f�r "+projName;
       result+=(QCString)" von";
       return result;
     }
@@ -416,17 +421,17 @@ class TranslatorGerman : public Translator
     QCString trClassDiagram(const char *clName)
       // this text is put before a class diagram
     {
-      return (QCString)"Klassendiagramm f&uuml;r "+clName;
+      return (QCString)"Klassendiagramm f�r "+clName;
     }
 
     QCString trForInternalUseOnly()
       // this text is generated when the \internal command is used.
-    { return "Nur f&uuml;r den internen Gebrauch."; }
+    { return "Nur f�r den internen Gebrauch."; }
 
     QCString trReimplementedForInternalReasons()
       // this text is generated when the \reimp command is used.
-    { return "Aus internen Gr&uuml;nden neu implementiert. "
-             "Das API wird davon nicht ber&uuml;hrt."; }
+    { return "Aus internen Gr�nden neu implementiert. "
+             "Das API wird davon nicht ber�hrt."; }
 
     QCString trWarning()
       // this text is generated when the \warning command is used.
@@ -434,7 +439,7 @@ class TranslatorGerman : public Translator
 
     QCString trBugsAndLimitations()
       // this text is generated when the \bug command is used.
-    { return "Fehler und Einschr&auml;nkungen"; }
+    { return "Fehler und Einschr�nkungen"; }
 
     QCString trVersion()
       // this text is generated when the \version command is used.
@@ -450,7 +455,7 @@ class TranslatorGerman : public Translator
 
     QCString trReturns()
       // this text is generated when the \return command is used.
-    { return "R&uuml;ckgabe"; }
+    { return "R�ckgabe"; }
 
     QCString trSeeAlso()
       // this text is generated when the \sa command is used.
@@ -539,25 +544,25 @@ class TranslatorGerman : public Translator
 
     // these are for the member sections of a class, struct or union
     QCString trPublicMembers()
-    { return "&Ouml;ffentliche Datenelemente"; }
+    { return "�ffentliche Datenelemente"; }
 
     QCString trPublicSlots()
-    { return "&Ouml;ffentliche Slots"; }
+    { return "�ffentliche Slots"; }
 
     QCString trSignals()
     { return "Signale"; }
 
     QCString trStaticPublicMembers()
-    { return "&Ouml;ffentliche, statische Datenelemente"; }
+    { return "�ffentliche, statische Datenelemente"; }
 
     QCString trProtectedMembers()
-    { return "Gesch&uuml;tzte Datenelemente"; }
+    { return "Gesch�tzte Datenelemente"; }
 
     QCString trProtectedSlots()
-    { return "Gesch&uuml;tzte Slots"; }
+    { return "Gesch�tzte Slots"; }
 
     QCString trStaticProtectedMembers()
-    { return "Gesch&uuml;tzte, statische Datenelemente"; }
+    { return "Gesch�tzte, statische Datenelemente"; }
 
     QCString trPrivateMembers()
     { return "Private Datenelemente"; }
@@ -605,7 +610,7 @@ class TranslatorGerman : public Translator
       // used in class documentation to produce a list of super classes,
       // if class diagrams are disabled.
     {
-      return "Basisklasse f&uuml;r "+trWriteList(numEntries)+".";
+      return "Basisklasse f�r "+trWriteList(numEntries)+".";
     }
 
     QCString trReimplementedFromList(int numEntries)
@@ -629,13 +634,13 @@ class TranslatorGerman : public Translator
     QCString trNamespaceMemberDescription(bool extractAll)
       // This is an introduction to the page with all namespace members
     {
-      QCString result="Hier folgt die Aufz&auml;hlung aller ";
+      QCString result="Hier folgt die Aufz�hlung aller ";
       if (!extractAll) result+="dokumentierten ";
       result+="Namensbereichselemente mit Verweisen auf ";
       if (extractAll)
-        result+="die Namensbereichsdokumentation f&uuml;r jedes Element:";
+        result+="die Namensbereichsdokumentation f�r jedes Element:";
       else
-        result+="die zugeh&ouml;rigen Dateien:";
+        result+="die zugeh�rigen Dateien:";
       return result;
     }
 
@@ -670,7 +675,7 @@ class TranslatorGerman : public Translator
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"Die Dokumentation f&uuml;r diese";
+      QCString result=(QCString)"Die Dokumentation f�r diese";
       switch(compType)
       {
         case ClassDef::Class:      result+=" Klasse"; break;
@@ -696,7 +701,7 @@ class TranslatorGerman : public Translator
 
     /* This is used as the heading text for the retval command. */
     virtual QCString trReturnValues()
-    { return "R&uuml;ckgabewerte"; }
+    { return "R�ckgabewerte"; }
 
     /* This is in the (quick) index as a link to the main page (index.html)
      */
@@ -744,14 +749,13 @@ class TranslatorGerman : public Translator
     /* this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Zusammengeh&ouml;rigkeiten von "+clName+":";
+      return (QCString)"Zusammengeh�rigkeiten von "+clName+":";
     }
 
-    //RK: Apparently Jens missed the Umlaut here. Corrected that.
     /* this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Include-Abh&auml;ngigkeitsdiagramm f&uuml;r "+fName+":";
+      return (QCString)"Include-Abh�ngigkeitsdiagramm f�r "+fName+":";
     }
 
     /* header that is put before the list of constructor/destructors. */
@@ -834,32 +838,32 @@ class TranslatorGerman : public Translator
 
     virtual QCString trPublicTypes()
     {
-      return "&Ouml;ffentliche Typen";
+      return "�ffentliche Typen";
     }
 
     virtual QCString trPublicAttribs()
     {
-      return "&Ouml;ffentliche Attribute";
+      return "�ffentliche Attribute";
     }
 
     virtual QCString trStaticPublicAttribs()
     {
-      return "Statische &ouml;ffentliche Attribute";
+      return "Statische �ffentliche Attribute";
     }
 
     virtual QCString trProtectedTypes()
     {
-      return "Gesch&uuml;tzte Typen";
+      return "Gesch�tzte Typen";
     }
 
     virtual QCString trProtectedAttribs()
     {
-      return "Gesch&uuml;tzte Attribute";
+      return "Gesch�tzte Attribute";
     }
 
     virtual QCString trStaticProtectedAttribs()
     {
-      return "Statische gesch&uuml;tzte Attribute";
+      return "Statische gesch�tzte Attribute";
     }
 
     virtual QCString trPrivateTypes()
@@ -881,7 +885,6 @@ class TranslatorGerman : public Translator
 // new since 1.1.3
 //////////////////////////////////////////////////////////////////////////
 
-//RK: Started from here
     /* Used as a marker that is put before a \todo item */
     virtual QCString trTodo()
     {
@@ -916,7 +919,7 @@ class TranslatorGerman : public Translator
     virtual QCString trInclByDepGraph()
     {
       return "Dieser Graph zeigt, welche Datei direkt oder "
-             "indirekt diese Datei enth&auml;lt:";
+             "indirekt diese Datei enth�lt:";
     }
 
     virtual QCString trSince()
@@ -931,26 +934,26 @@ class TranslatorGerman : public Translator
     /* title of the graph legend page */
     virtual QCString trLegendTitle()
     {
-      return "Erkl&auml;rung des Graphen";
+      return "Erkl�rung des Graphen";
     }
 
     /* page explaining how the dot graph's should be interpreted */
     virtual QCString trLegendDocs()
     {
       return 
-        "Diese Seite erkl&auml;rt die Interpretation der von doxygen "
+        "Diese Seite erkl�rt die Interpretation der von doxygen "
         "erzeugten Graphen.<p>\n"
         "Beispiel:\n"
         "\\code\n"
-        "/*! Wegen Verk&uuml;rzung unsichtbare Klasse */\n"
+        "/*! Wegen Verk�rzung unsichtbare Klasse */\n"
         "class Invisible { };\n\n"
-        "/*! Klasse verk&uuml;rzt dargestellt, Vererbunsbeziehung ist versteckt */\n"
+        "/*! Klasse verk�rzt dargestellt, Vererbungsbeziehung ist versteckt */\n"
         "class Truncated : public Invisible { };\n\n"
         "/* Nicht mit doxygen-Kommentaren dokumentierte Klasse */\n"
         "class Undocumented { };\n\n"
-        "/*! Mithilfe &ouml;ffentlicher Vererbung vererbte Klasse */\n"
+        "/*! Mithilfe �ffentlicher Vererbung vererbte Klasse */\n"
         "class PublicBase : public Truncated { };\n\n"
-        "/*! Mithilfe gesch&uumltzter Vererbung vererbte Klasse */\n"
+        "/*! Mithilfe gesch�tzter Vererbung vererbte Klasse */\n"
         "class ProtectedBase { };\n\n"
         "/*! Mithilfe privater Vererbung vererbte Klasse */\n"
         "class PrivateBase { };\n\n"
@@ -972,22 +975,22 @@ class TranslatorGerman : public Translator
         "<p>\n"
         "Die Rechtecke in obigem Graphen bedeuten:\n"
         "<ul>\n"
-        "<li>Ein schwarz gef&uuml;lltes Rechteck stellt die Struktur oder "
-        "Klasse dar, f&uuml;r die der Graph erzeugt wurde.\n"
+        "<li>Ein schwarz gef�lltes Rechteck stellt die Struktur oder "
+        "Klasse dar, f�r die der Graph erzeugt wurde.\n"
         "<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte "
         " Struktur oder Klasse.\n"
         "<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte "
         " Struktur oder Klasse.\n"
         "<li>Ein Rechteck mit rotem Rahmen kennzeichnet eine dokumentierte "
-        " Struktur oder Klasse, f&uuml;r die nicht alle Vererbungs-/"
-        "Enthaltenseinsbeziehungen dargestellt werden. Ein Graph wird gek&uuml;rzt, "
+        " Struktur oder Klasse, f�r die nicht alle Vererbungs-/"
+        "Enthaltenseinsbeziehungen dargestellt werden. Ein Graph wird gek�rzt, "
         "wenn er nicht in die angegebenen Schranken passt."  
         "</ul>\n"
         "Die Pfeile bedeuten:\n"
         "<ul>\n"
-        "<li>Ein dunkelblauer Pfeil stellt eine &ouml;ffentliche Vererbungsbeziehung "
+        "<li>Ein dunkelblauer Pfeil stellt eine �ffentliche Vererbungsbeziehung "
         "zwischen zwei Klassen dar.\n"
-        "<li>Ein dunkelgr&uuml;ner Pfeil stellt gesch&uuml;tzte Vererbung dar.\n"
+        "<li>Ein dunkelgr�ner Pfeil stellt gesch�tzte Vererbung dar.\n"
         "<li>Ein dunkelroter Pfeil stellt private Vererbung dar.\n"
         "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in einer "
         "anderen enthalten ist oder von einer anderen benutzt wird. Am Pfeil "
diff --git a/src/translator_ru.h b/src/translator_ru.h
index e16596e..e13591c 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -2,7 +2,7 @@
  *
  * 
  *
- * Copyright (C) 1997-1999 by Dimitri van Heesch.
+ * Copyright (C) 1997-2000 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 
@@ -10,13 +10,39 @@
  * for any purpose. It is provided "as is" without express or implied warranty.
  * See the GNU General Public License for more details.
  *
- * All output generated with Doxygen is not covered by this license.
- *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
  */
 
 /*
- *  Russian translation by Andrey V. Stolyarov <crocodil<AT>croco.net>
- *  released Feb 14, 2001
+ *
+ * Nickolay Semyonov
+ * Andrey V. Stolyarov released Feb 14, 2001
+ * Alexandr V. Chelpanov <cav@cryptopro.ru> released Apr 21, 2001
+ *
+ * �������� ��� �� ������� �������� �� ������� ���� �� email (��. ����)
+ *
+ * ��� �������� ���������� ����� list � documentation ������.
+ *
+ * Modules ���������� ��� ������, ��� ��� ������ ���� ����� � ������� 
+ *  �������� ����������� � ��������� ������ ��� ������� ����������, �����
+ *  � ��., ��� � ������ ������ �� ������ ��������, ��� ����� ��� 
+ *  ��������������� ������� � doxygen ��������� \group.
+ * 
+ * ������� �� �������������� decode �������� ���������, ��� ����� ��������
+ *  � ������������� ����� � ��� ����� ������� ���� ������.
+ *
+ * ������ ������������ ��� �������� related functions - "����������� � ������
+ *  �������", � �� "��������� �������", ��� ����� �� ��� ��� ���� ���� ������
+ *  related to class, � ��� related to template, package � �.�. ���������
+ *  ��������� �������� ����������� member.
+ *
+ * �� ����������� ��� �������� members ����������� ������ ���� ���� member
+ *  ��������. 
+ *
+ * Compounds ���������� ��� ������, �� ����������.
+ *
+ * ����������� ���������� ?? �������� ��������.
  */
 
 #ifndef TRANSLATOR_RU_H
@@ -26,195 +52,343 @@
 
 class TranslatorRussian : public Translator
 {
-  public:
-    QCString idLanguage()
-    { return "russian"; }
-    QCString latexBabelPackage()
-    { return "russian"; }
-    QCString idLanguageCharset()
-    {
-      return "koi8-r";
-    }
-    QCString trRelatedFunctions()
-    {
-	return "��������� �������";
-    }
-    QCString trRelatedSubscript()
-    {
-	return "(�������� ��������, ��� ��� ������� - �� ����� ������)";
-    }
-    QCString trDetailedDescription()
-    {
-	return "��������� ��������";
-    }
-    QCString trMemberTypedefDocumentation()
-    {
-	// Need additional translation
-	return "�������� typedef-������";
-    }
-    QCString trMemberEnumerationDocumentation()
-    {
-	return "�������� ������ ������������� ����";
-    }
-    QCString trMemberFunctionDocumentation()
-    {
-	return "�������� �������-������";
-    }
-    QCString trMemberDataDocumentation()
-    {
-      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
-      {
-        return "�������� �����";
+  protected:
+    /*! Returns the string converted from koi8-r to windows-1251. */
+    /* The method was designed initially for translator_cz.h. 
+       It is used for on-line encoding conversion related to conditional
+       compilation in Unix/MS Windows environments (both use different
+       encoding). 
+       Encoding table got from QT:qtextcodec.cpp
+     */
+    QCString Koi8RToWindows1251( const QCString sInput )
+    {
+      static Q_UINT16 koi8_r[128] = 
+      { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+        0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+        0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219/**/, 0x221A, 0x2248,
+        0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+        0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
+        0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
+        0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
+        0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
+        0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+        0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+        0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+        0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+        0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+        0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+        0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+        0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A 
+      };
+
+      QString result;
+      int len = sInput.length();
+
+      result.setUnicode(0, len);
+      QChar* uc = (QChar*)result.unicode(); // const_cast
+      const unsigned char * c = (const unsigned char *)(const char*)sInput;
+      for( int i=0; i<len; i++ ) {
+        if ( c[i] > 127 )
+	  uc[i] = koi8_r[c[i]-128];
+        else
+	  uc[i] = c[i];
       }
-      else
-      {
-        return "�������� ����������-������";
+      return result.local8Bit();
+    }
+    /*! returns the string converted from Windows-1251 to koi8-r */
+    /* See the comments of the Koi8RToWindows1251() method for details.
+       Encoding table got from QT:qtextcodec.cpp */
+    QCString Windows1251ToKoi8R( const QCString sInput )
+    {
+      static Q_UINT16 windows_1251[128] = 
+      { 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
+        0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+        0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+        0xFFFD, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+        0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
+        0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+        0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
+        0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+        0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+        0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+        0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+        0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+        0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+        0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+        0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+        0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
+      };
+
+      QString result;
+      int len = sInput.length();
+
+      result.setUnicode(0, len);
+      QChar* uc = (QChar*)result.unicode(); // const_cast
+      const unsigned char * c = (const unsigned char *)(const char*)sInput;
+      for( int i=0; i<len; i++ ) {
+        if ( c[i] > 127 )
+	  uc[i] = windows_1251[c[i]-128];
+        else
+	  uc[i] = c[i];
       }
+      return result.local8Bit();
     }
-    QCString trMore()
-    {
-	return "������...";
-    }
-    QCString trListOfAllMembers()
-    {
-	return "C����� ���� ������ ������.";
-    }
-    QCString trMemberList()
-    {
-	return "������ ������";
-    }
-    QCString trThisIsTheListOfAllMembers()
-    {
-	return "��� ������ ������ ������ ������/��������� ";
-    }
-    QCString trIncludeIncludingInheritedMembers()
-    {
-	return ", ������� ��� �������������� �����.";
-    }
-    QCString trGeneratedAutomatically(const char *s)
-    { QCString result="������������� ������� �������� Doxygen";
-      if (s) result+=(QCString)" ��� "+s;
-      result+=" �� ������ ��������� ������."; 
-      return result;
-    }
-    QCString trEnumName()
-    {
-	return "��� ������������";
-    }
-    QCString trEnumValue()
-    {
-	return "�������� ������������";
-    }
-    QCString trDefinedIn()
-    {
-	return "���������� �";
-    }
-    QCString trVerbatimText(const char* f)
-    {
-	return (QCString)"��� ������ ������� ������ �� ����������� �����"+f;
-    }
-    QCString trModules()
-    {
-	return "������";
-    }
-    QCString trClassHierarchy()
-    {
-	return "�������� �������";
+
+  private:
+    /*! The Decode() inline assumes the source written in the 
+        Koi8-R encoding (maintainer dependent). 
+     */
+    inline QCString decode(const QCString & sInput)
+    { 
+#ifdef _WIN32
+      return Koi8RToWindows1251(sInput);
+#else
+      return sInput;
+#endif
     }
-    QCString trCompoundList()
+
+  public:
+    /*! Used for identification of the language. */
+    virtual QCString idLanguage()
+    { return "russian"; }
+
+    /* Used to get the command(s) for the language support. */
+    // virtual QCString latexLanguageSupportCommand()
+
+    /*! Used to get the command(s) for the language support. This method
+     *  was designed for languages which do not prefer babel package.
+     *  If this methods returns empty string, then the latexBabelPackage()
+     *  method is used to generate the command for using the babel package.
+     */
+    virtual QCString latexBabelPackage()
+    { return "russianb"; }
+
+    /*! return the language charset. This will be used for the HTML output */
+    virtual QCString idLanguageCharset()
+#ifdef _WIN32
+    { return "Windows-1215"; }
+#else
+    { return "koi8-r"; }
+#endif
+
+    // --- Language translation methods -------------------
+
+    /*! used in the compound documentation before a list of related functions. */
+    virtual QCString trRelatedFunctions()
+    { return decode("����������� � ������ �������"); }
+
+    /*! subscript for the related functions. */
+    virtual QCString trRelatedSubscript()
+    { return decode("(�� ����� ������)"); }
+
+    /*! header that is put before the detailed description of files, classes and namespaces. */
+    virtual QCString trDetailedDescription()
+    { return decode("��������� ��������"); }
+
+    /*! header that is put before the list of typedefs. */
+    virtual QCString trMemberTypedefDocumentation()
+    { return decode("����������� �����"); }
+
+    /*! header that is put before the list of enumerations. */
+    virtual QCString trMemberEnumerationDocumentation()
+    { return decode("������������"); }
+
+    /*! header that is put before the list of member functions. */
+    virtual QCString trMemberFunctionDocumentation()
+    { return decode("������"); }
+
+    /*! header that is put before the list of member attributes. */
+    virtual QCString trMemberDataDocumentation()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "��������� ������";
+        return decode( "����" );
       }
       else
       {
-        // doubtful translation; originally - "Compound List"
-        return "������ ��������� ��������";
+        return decode( "������ ������" );
       }
     }
-    QCString trFileList()
+
+    /*! this is the text of a link put after brief descriptions. */
+    virtual QCString trMore()
+    { return decode("���������..."); }
+
+    /*! put in the class documentation */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trListOfAllMembers()
     {
-	return "������ ������";
+      return decode( "������ ������ ������ ������" );
     }
-    QCString trHeaderFiles()
+
+    /*! used as the title of the "list of all members" page of a class */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trMemberList()
     {
-	return "������������ �����";
+      return decode( "C����� ������ ������" );
     }
-    QCString trCompoundMembers()
+
+    /*! this is the first part of a sentence that is followed by a class name */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trThisIsTheListOfAllMembers()
+    { return decode("������ ������ ������ ������"); }
+
+    /*! this is the remainder of the sentence after the class name */
+    /* Dosn't use when optimization for C is on. */
+    virtual QCString trIncludingInheritedMembers()
+    { return decode(", ������� ����������� �� �������� ������"); }
+
+    /*! 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=decode("������������� ������� Doxygen");
+      if (s) result+=decode(" ��� ")+s;
+      result+=decode(" �� ��������� ������."); 
+      return result;
+    }
+
+    /*! put after an enum name in the list of all members */
+    virtual QCString trEnumName()
+    { return decode("������������"); }
+
+    /*! put after an enum value in the list of all members */
+    virtual QCString trEnumValue()
+    { return decode("�������� ������������"); }
+
+    /*! put after an undocumented member in the list of all members */
+    virtual QCString trDefinedIn()
+    { return decode("���������� �"); }
+
+    // TODO: trVerbatimText is no longer used => remove!
+    /*! put as in introduction in the verbatim header file of a class.
+     *  parameter f is the name of the include file.
+     */
+    virtual QCString trVerbatimText(const char *f)
+    { return decode( (QCString)"��� ������ ������� ������ �� ����������� �����")+f; }
+
+    // quick reference sections
+
+    /*! This is put above each page as a link to the list of all groups of 
+     *  compounds or files (see the \\group command).
+     */
+    virtual QCString trModules()
+    { return decode("������"); }
+
+    /*! This is put above each page as a link to the class hierarchy */
+    virtual QCString trClassHierarchy()
+    { return decode("�������� �������"); }
+
+    /*! This is put above each page as a link to the list of annotated classes */
+    virtual QCString trCompoundList()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "���� ��������";
+        return decode( "��������� ������" );
       }
       else
       {
-        return "�����-������";
+        return decode( "������" );
       }
     }
-    QCString trFileMembers()
+
+    /*! This is put above each page as a link to the list of documented files */
+    virtual QCString trFileList()
+    { return decode("�����"); }
+
+    /*! This is put above each page as a link to the list of all verbatim headers */
+    virtual QCString trHeaderFiles()
+    { return decode("������������ �����"); }
+
+    /*! This is put above each page as a link to all members of compounds. */
+    virtual QCString trCompoundMembers()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "���������� �����";
+        return decode( "���� ��������" );
       }
       else
       {
-         // doubtful translation 
-         // (originally - "File members", but not good for Russian)
-        return "����� �����";
+        return decode( "����� �������" );
       }
     }
-    QCString trRelatedPages()
-    {
-         // non-verbatim translation: originally "related pages"
-	return "��. �����: ";
-    }
-    QCString trExamples()
-    {
-	return "�������";
-    }
-    QCString trSearch()
-    {
-	return "�����";
-    }
-    QCString trClassHierarchyDescription()
+
+    /*! This is put above each page as a link to all members of files. */
+    /*??*/
+    virtual QCString trFileMembers()
     {
-	return "��� ������ ������������ ������������� �������������� "
-               "(�� �� ������) �� ��������";
+      return decode( "����� �����" );
     }
-    QCString trFileListDescription(bool extractAll)
+
+    /*! This is put above each page as a link to all related pages. */
+    virtual QCString trRelatedPages()
+    /* ?? ������� �������� "��. �����: " ����� �������, �� �� � ���������,
+     ��� � ������ ������. */
+    { return decode("��������"); }
+
+    /*! This is put above each page as a link to all examples. */
+    virtual QCString trExamples()
+    { return decode("�������"); }
+
+    /*! This is put above each page as a link to the search engine. */
+    virtual QCString trSearch()
+    { return decode("�����"); }
+
+    /*! This is an introduction to the class hierarchy. */
+    virtual QCString trClassHierarchyDescription()
+    { return decode("�������� �������."); }
+
+    /*! This is an introduction to the list with all files. */
+    virtual QCString trFileListDescription(bool extractAll)
     {
-	QCString result="������ ���� ";
-	if(!extractAll) result+="����������������� ";
-	result+="������ � ������� ���������:";
-	return result;
+      QCString result="������ ������ ";
+      if (!extractAll) result+="����������������� ";
+      result+="������.";
+      return decode(result);
     }
-    QCString trCompoundListDescription()
+
+    /*! This is an introduction to the annotated compound list. */
+    virtual QCString trCompoundListDescription()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "��������� ������ � �� ������� ��������: ";
+        return decode( "��������� ������ � �� ������� ���������." );
       }
       else
       {
-	return "������, ���������, ����������� � ���������� " 
-	       "� �� ������� ��������: ";
+	return decode( "������ � �� ������� ���������." );
       }
     }
-    QCString trCompoundMembersDescription(bool extractAll)
+
+    /*! This is an introduction to the page with all class members. */
+    virtual QCString trCompoundMembersDescription(bool extractAll)
     {
-	// Need additional translation
 	QCString result="������ ���� ";
 	if(!extractAll) result+="����������������� ";
-	result+="������ ������� �� �������� �� ";
+        if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+	  result+="������ �������� ������ �� �������� �� ";
+	else
+	  result+="������ ������� �� �������� �� ";
 	if(extractAll)
-	    result+="������������ �� ������ ��� ������� �����:";
+	{
+          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+	    result+="������������ �� ��������� ��� ������� �����.";
+	  else
+	    result+="������������ �� ������ ��� ������� �����.";
+	}
 	else
-	    result+="������, � ������� ��� �����������:";
-	return result;
+	{
+          if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+	    result += "���������";
+	  else
+	    result += "������";
+	  result+=", � ������� ��� �����������.";
+	}
+	return decode( result );
     }
-    QCString trFileMembersDescription(bool extractAll)
+
+    /*! This is an introduction to the page with all file members. */
+    virtual QCString trFileMembersDescription(bool extractAll)
     {
       QCString result="������ ���� ";
       if (!extractAll) result+="����������������� ";
@@ -230,598 +404,781 @@ class TranslatorRussian : public Translator
       }
       result+=" �� �������� �� ";
       if (extractAll)
-        result+="�����, � ������� ��� �����������:";
+        result+="�����, � ������� ��� �����������.";
       else
-        result+="������������:";
-      return result;
-    }
-    QCString trHeaderFilesDescription()
-    {
-	return "������ ������������ ������, ������������ API:";
-    }
-    QCString trExamplesDescription()
-    {
-	return "������ ���� ��������:";
-    }
-    QCString trRelatedPagesDescription()
-    {
-	return "������ ���� ����������� ������� ������������:";
+        result+="������������.";
+      return decode( result );
     }
-    QCString trModulesDescription()
-    {
-	return "������ ���� �������:";
-    }
-    QCString trNoDescriptionAvailable()
-    {
-	return "�������� �����������";
-    }
-    QCString trDocumentation()
-    {
-	return "������������";
-    }
-    QCString trModuleIndex()
-    {
-	return "��������� �������";
-    }
-    QCString trHierarchicalIndex()
-    {
-	return "������������� ������";
-    }
-    QCString trCompoundIndex()
+
+    /*! This is an introduction to the page with the list of all header files. */
+    virtual QCString trHeaderFilesDescription()
+    { return decode("������ ������ ������������ ������."); }
+
+    /*! This is an introduction to the page with the list of all examples */
+    virtual QCString trExamplesDescription()
+    { return decode("������ ������ ��������."); }
+
+    /*! This is an introduction to the page with the list of related pages */
+    virtual QCString trRelatedPagesDescription()
+    { return decode("������ ������ �������������� ��������."); }
+
+    /*! This is an introduction to the page with the list of class/file groups */
+    virtual QCString trModulesDescription()
+    { return decode("������ ������ �����."); }
+
+    /*! This sentences is used in the annotated class/file lists if no brief
+     * description is given. 
+     */
+    virtual QCString trNoDescriptionAvailable()
+    { return decode("�������� ����������"); }
+
+    // index titles (the project name is prepended for these) 
+
+
+    /*! This is used in HTML as the title of index.html. */
+    virtual QCString trDocumentation()
+    { return decode("������������"); }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * index of all groups.
+     */
+    virtual QCString trModuleIndex()
+    { return decode("���������� ��������� �����"); }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * class hierarchy.
+     */
+    virtual QCString trHierarchicalIndex()
+    { return decode("������������� ������ �������"); }
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     * annotated compound index.
+     */
+    virtual QCString trCompoundIndex()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "������ �������� ������";
+        return decode( "���������� ��������� �������� ������" );
       }
       else
       {
-          // originally "compound index"
-        return "������ ������� � ��������";
+        return decode( "���������� ��������� �������" );
       }
     }
-    QCString trFileIndex()
-    {
-	return "������ ������";
-    }
-    QCString trModuleDocumentation()
-    {
-	return "������������ �� �������";
-    }
-    QCString trClassDocumentation()
-    {
-	return "������������ �� �������";
-    }
-    QCString trFileDocumentation()
-    {
-	return "������������ �� ������";
-    }
-    QCString trExampleDocumentation()
-    {
-	return "�������� ��������";
-    }
-    QCString trPageDocumentation()
-    {
-	return "������������ �� ���������";
-    }
-    QCString trReferenceManual()
-    {
-           // originally reference manual
-	return "������� ����������";
-    }
-    QCString trDefines()
-    {
-	return "�����������";
-    }
-    QCString trFunctionPrototypes()
-    {
-	return "��������� �������";
-    }
-    QCString trTypedefs()
-    {
-	return "����������� �����";
-    }
-    QCString trEnumerations()
-    {
-	return "������������";
-    }
-    QCString trFunctions()
-    {
-	return "�������";
-    }
-    QCString trVariables()
-    {
-	return "����������";
-    }
-    QCString trEnumerationValues()
-    {
-	return "�������� ������������� ����";
-    }
-    QCString trAuthor()
-    {
-	return "�����";
-    }
-    QCString trDefineDocumentation()
-    {	
-	return "������������ �� ������������";
-    }
-    QCString trFunctionPrototypeDocumentation()
-    {
-	return "������������ �� ���������� �������";
-    }
-    QCString trTypedefDocumentation()
-    {
-	return "������������ �� ������������ �����"; 
-    }
-    QCString trEnumerationTypeDocumentation()
-    {
-	return "������������ �� ������������ �����";
-    }
-    QCString trEnumerationValueDocumentation()
-    {
-	return "������������ �� ��������� ������������ �����";
-    }
-    QCString trFunctionDocumentation()
-    {
-	return "������������ �� ��������";
-    }
-    QCString trVariableDocumentation()
+
+    /*! This is used in LaTeX as the title of the chapter with the
+     * list of all files.
+     */
+    virtual QCString trFileIndex()
+    { return decode( "������ ������" ); }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all groups.
+     */
+    virtual QCString trModuleDocumentation()
+    { return decode("������"); }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all classes, structs and unions.
+     */
+    virtual QCString trClassDocumentation()
     {
-	return "������������ �� ����������";
+      if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
+      {
+        return decode( "��������� ������" );
+      }
+      else
+      {
+        return decode( "������" );
+      }
     }
-    QCString trCompounds()
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all files.
+     */
+    virtual QCString trFileDocumentation()
+    { return decode("�����"); }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all examples.
+     */
+    virtual QCString trExampleDocumentation()
+    { return decode("�������"); }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all related pages.
+     */
+    virtual QCString trPageDocumentation()
+    { return decode("������������ ��������"); }
+
+    /*! This is used in LaTeX as the title of the document */
+    virtual QCString trReferenceManual()
+    { return decode("����������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of defines
+     */
+    virtual QCString trDefines()
+    { return decode("�������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of function prototypes
+     */
+    virtual QCString trFuncProtos()
+    { return decode("��������� �������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of typedefs
+     */
+    virtual QCString trTypedefs()
+    { return decode("����������� �����"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of enumerations
+     */
+    virtual QCString trEnumerations()
+    { return decode("������������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) functions
+     */
+    virtual QCString trFunctions()
+    { return decode("�������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trVariables()
+    { return decode("����������"); }
+
+    /*! This is used in the documentation of a file as a header before the 
+     *  list of (global) variables
+     */
+    virtual QCString trEnumerationValues()
+    { return decode("�������� ������������"); }
+
+    /*! This is used in man pages as the author section. */
+    virtual QCString trAuthor()
+    { return decode("�����"); }
+
+    /*! This is used in the documentation of a file before the list of
+     *  documentation blocks for defines
+     */
+    virtual QCString trDefineDocumentation()
+    { return decode("�������"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for function prototypes
+     */
+    virtual QCString trFunctionPrototypeDocumentation()
+    { return decode("��������� �������"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for typedefs
+     */
+    virtual QCString trTypedefDocumentation()
+    { return decode("����"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration types
+     */
+    virtual QCString trEnumerationTypeDocumentation()
+    { return decode("������������"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for enumeration values
+     */
+    virtual QCString trEnumerationValueDocumentation()
+    { return decode("�������� ������������"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for functions
+     */
+    virtual QCString trFunctionDocumentation()
+    { return decode("�������"); }
+
+    /*! This is used in the documentation of a file/namespace before the list 
+     *  of documentation blocks for variables
+     */
+    virtual QCString trVariableDocumentation()
+    { return decode("����������"); }
+
+    /*! This is used in the documentation of a file/namespace/group before 
+     *  the list of links to documented compounds
+     */
+    virtual QCString trCompounds()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "��������� ������";
+        return decode( "��������� ������" );
       }
       else
       { 
-          // originally "compounds"
-        return "��������� ����";
+        return decode( "������" );
       }
 
     }
-    QCString trFiles()
-    {
-	return "�����";
-    }
-    QCString trGeneratedAt(const char* date,const char* projName)
-    {
-	QCString result=(QCString)"������� "+date;
-	if(projName) result+=(QCString)" ��� "+projName;
-	result+=(QCString)" � ������� ";
-	return result;
-    }
-    QCString trWrittenBy()
-    {
-	return "�����������";
-    }
-    QCString trClassDiagram(const char* clName)
-    {
-	return (QCString)"��������� ������������ ��� "+clName+":";
-    }
-    QCString trForInternalUseOnly()
-    {
-	return "������ ��� ����������� �������������.";
-    }
-    QCString trReimplementedForInternalREasons()
-    {
-	return "���������� �������� �� ���������� ��������;"
-	       " ������������ ����� �� ����������.";
-    }
-    QCString trWarning()
-    {
-	return "��������������";
-    }
-    QCString trBugsAndLimitations()
-    {
-	return "������ � �����������";
-    }
-    QCString trVersion()
-    {
-	return "������";
-    }
-    QCString trDate()
-    {
-	return "����";
-    }
-    QCString trAuthors()
-    {
-	return "�����(�)";
-    }
-    QCString trReturns()
-    {
-	return "����������";
-    }
-    QCString trSeeAlso()
-    {
-	return "��. �����";
-    }
-    QCString trParameters()
-    {
-	return "���������";
-    }
-    QCString trExceptions()
-    {
-	return "����������";
-    }
-    QCString trGeneratedBy()
-    {
-	return "������� ��� ������";
+
+    /*! This is used in the documentation of a group before the list of 
+     *  links to documented files
+     */
+    virtual QCString trFiles()
+    { return decode("�����"); }
+
+    /*! This is used in the standard footer of each page and indicates when 
+     *  the page was generated 
+     */
+    virtual QCString trGeneratedAt(const char *date,const char *projName)
+    { 
+      QCString result=decode("������������ ");
+      if (projName) result+=decode("�� ")+projName;
+      result+=decode(". ��������� ���������: ")+date;
+      result+=decode(". ������� �������� ");
+      return result;
     }
-    QCString trNamespaceList()
+    /*! This is part of the sentence used in the standard footer of each page.
+     */
+    virtual QCString trWrittenBy()
     {
-	return "������ ����������� ���� (namespaces)";
+      return decode("�����:");
     }
-    QCString trNamespaceListDescription(bool extractAll)
+
+    /*! this text is put before a class diagram */
+    virtual QCString trClassDiagram(const char *clName)
     {
-	QCString result="������ ���� ";
-	if(!extractAll) result+="����������������� ";
-	result+="����������� ���� � ������� ���������:";
-	return result;
+      return decode("���� ������������:")+clName+":";
     }
-    QCString trFriends()
-    {
-	return "������";
+
+    /*! this text is generated when the \\internal command is used. */
+    virtual QCString trForInternalUseOnly()
+    { return decode("������ ��� ����������� �������������"); }
+
+    /*! this text is generated when the \\reimp command is used. */
+    virtual QCString trReimplementedForInternalReasons()
+    /*??*/
+    { return decode("�������� �� ���������� ��������"); 
     }
-    QCString trRelatedFunctionDocumentation()
+
+    /*! this text is generated when the \\warning command is used. */
+    virtual QCString trWarning()
+    { return decode("��������������"); }
+
+    /*! this text is generated when the \\bug command is used. */
+    virtual QCString trBugsAndLimitations()
+    { return decode("������ � �����������"); }
+
+    /*! this text is generated when the \\version command is used. */
+    virtual QCString trVersion()
+    { return decode("������"); }
+
+    /*! this text is generated when the \\date command is used. */
+    virtual QCString trDate()
+    { return decode("����"); }
+
+    /*! this text is generated when the \\author command is used. */
+    virtual QCString trAuthors()
+    { return decode("�����(�)"); }
+
+    /*! this text is generated when the \\return command is used. */
+    virtual QCString trReturns()
+    { return decode("����������"); }
+
+    /*! this text is generated when the \\sa command is used. */
+    virtual QCString trSeeAlso()
+    { return decode("��. �����"); }
+
+    /*! this text is generated when the \\param command is used. */
+    virtual QCString trParameters()
+    { return decode("���������"); }
+
+    /*! this text is generated when the \\exception command is used. */
+    virtual QCString trExceptions()
+    { return decode("����������"); }
+
+    /*! this text is used in the title page of a LaTeX document. */
+    virtual QCString trGeneratedBy()
+    { return decode("������� ��������"); }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990307 
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used as the title of page containing all the index of all namespaces. */
+    virtual QCString trNamespaceList()
+    { return decode("������������ ����"); }
+
+    /*! used as an introduction to the namespace list */
+    virtual QCString trNamespaceListDescription(bool extractAll)
     {
-	// need translation
-	return "������������ �� ������� ������ � ��������� ��������";
+      QCString result="������ ������ ";
+      if (!extractAll) result+="����������������� ";
+      result+="����������� ����.";
+      return decode(result);
     }
-    QCString trCompoundReference(const char* clName,
+
+    /*! used in the class documentation as a header before the list of all
+     *  friends of a class
+     */
+    virtual QCString trFriends()
+    { return decode("������"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990405
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! used in the class documentation as a header before the list of all
+     * related classes 
+     */
+    virtual QCString trRelatedFunctionDocumentation()
+    { return decode("������������ �� ������� ������ � �������� �������������"
+	"� ������"); }
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990425
+//////////////////////////////////////////////////////////////////////////
+
+    /*! used as the title of the HTML page of a class/struct/union */
+    virtual QCString trCompoundReference(const char *clName,
                                  ClassDef::CompoundType compType,
                                  bool isTemplate)
     {
-	QCString result=(QCString)"�������� ";
-        if (isTemplate){ 
-	  	switch(compType)
-	  	{
-	  	    case ClassDef::Struct: result+="��������� "; break;
-	  	    case ClassDef::Class: 
-	  	    case ClassDef::Union: 
-	  	    case ClassDef::Interface: 
-	  	    case ClassDef::Exception: 
-					result+="���������� "; break;
-	  	}
-	}   
+      QCString result;
+      if (isTemplate) 
+      {
+	result="������ ";
 	switch(compType)
 	{
-	    case ClassDef::Class: result+="������ "; break;
-	    case ClassDef::Struct: result+="��������� "; break;
-	    case ClassDef::Union: result+="����������� "; break;
-	    case ClassDef::Interface: result+="���������� "; break;
-	    case ClassDef::Exception: result+="���������� "; break;
+	  case ClassDef::Class:  result+="������"; break;
+	  case ClassDef::Struct: result+="���������"; break;
+	  case ClassDef::Union:  result+="�����������"; break;
+	  case ClassDef::Interface:  result+="����������"; break;
+	  case ClassDef::Exception:  result+="����������"; break;
 	}
-	result+=clName;
-	return result;
-    }
-    QCString trFileReference(const char* fileName)
-    {
-	QCString result;
-	result+=(QCString)"�������� ����� "+fileName;
-	return result;
-    }
-    QCString trNamespaceReference(const char* namespaceName)
-    {
-	QCString result=(QCString)"�������� ������������ ���� "+namespaceName;
-	return result;
-    }
-    QCString trPublicMembers()
-    {
-	return "�������� �����";
-    }
-    QCString trPublicSlots()
-    {
-	return "�������� �����";
-    }
-    QCString trSignals()
-    {
-	return "�������";
-    }
-    QCString trStaticPublicMembers()
-    {
-	return "����������� �������� �����";
-    }
-    QCString trProtectedMembers()
-    {
-	return "���������� �����";
-    }
-    QCString trProtectedSlots()
-    {
-	return "���������� �����";
-    }
-    QCString trStaticProtectedSlots()
-    {
-	return "����������� ���������� �����";
-    }
-    QCString trPrivateMembers()
-    {
-	return "�������� �����";
-    }
-    QCString trPrivateSlots()
-    {
-	return "�������� �����";
-    }
-    QCString trStaticPrivateMembers()
-    {
-	return "�������� ����������� �����";
-    }
-    QCString trWriteList(int numEntries)
-    {
-	QCString result;
-	int i;
-	for(i=0;i<numEntries;i++)
+      }
+      else
+      {
+	switch(compType)
 	{
-	    result+=generateMarker(i);
-	    if(i!=numEntries-1)
-	    {
-		if(i<numEntries-2)
-		    result+=", ";
-		else
-		    result+=" � ";
-	    }
+	  case ClassDef::Class:  result+="�����"; break;
+	  case ClassDef::Struct: result+="���������"; break;
+	  case ClassDef::Union:  result+="�����������"; break;
+	  case ClassDef::Interface:  result+="���������"; break;
+	  case ClassDef::Exception:  result+="����������"; break;
 	}
-	return result;
-    }
-    QCString trInheritsList(int numEntries)
-    {
-	return "����������� �� "+trWriteList(numEntries)+".";
-    }
-    QCString trInheritedByList(int numEntries)
-    {
-	return "����������� "+trWriteList(numEntries)+".";
+      }
+      result+=" ";
+      return decode(result)+clName;
     }
 
-    QCString trReimplementedFromList(int numEntries)
-    {
-        // Originally: "reimplemented from"
-        // This translation assumes numEntries is always 1
-        //    which is true as of 1.2.5 and it's hard for me to 
-        //    imagine a situation when it could be wrong. 
-      return "�������������� ����� ������ "+trWriteList(numEntries)+".";
-    }
-    QCString trReimplementedInList(int numEntries)
+    /*! used as the title of the HTML page of a file */
+    virtual QCString trFileReference(const char *fileName)
     {
-	return "���������������� � "+trWriteList(numEntries)+".";
+      return decode("���� ")+fileName;
     }
-    QCString trNamespaceMembers()
-    {
-	return "����� ����������� ����";
-    }
-    QCString trNamespaceMemberDescription(bool extractAll)
-    {
-	QCString result="������ ���� ";
-	if(!extractAll) result+="����������������� ";
-	result+="������ ����������� ���� �� �������� �� ";
-	if(extractAll)
-	    result+="������������ �� ������� �����:";
-	else
-	    result+="������������ ����, � ������� ��� �����������:";
-	return result;
-    }
-    QCString trNamespaceIndex()
-    {
-	return "������ ����������� ����";
-    }
-    QCString trNamespaceDocumentation()
-    {
-	return "������������ ����������� ����";
+
+    /*! used as the title of the HTML page of a namespace */
+    virtual QCString trNamespaceReference(const char *namespaceName)
+    {
+      return decode("������������ ���� ")+namespaceName;
+    }
+    
+    virtual QCString trPublicMembers()
+    { return decode("��������� �����"); }
+    virtual QCString trPublicSlots()
+    { return decode("��������� �����"); }
+    virtual QCString trSignals()
+    { return decode("�������"); }
+    virtual QCString trStaticPublicMembers()
+    { return decode("��������� ����������� �����"); }
+    virtual QCString trProtectedMembers()
+    { return decode("���������� �����"); }
+    virtual QCString trProtectedSlots()
+    { return decode("���������� �����"); }
+    virtual QCString trStaticProtectedMembers()
+    { return decode("���������� ����������� �����"); }
+    virtual QCString trPrivateMembers()
+    { return decode("��������� �����"); }
+    virtual QCString trPrivateSlots()
+    { return decode("��������� �����"); }
+    virtual QCString trStaticPrivateMembers()
+    { return decode("��������� ����������� �����"); }
+    
+    /*! this function is used to produce a comma-separated list of items.
+     *  use generateMarker(i) to indicate where item i should be put.
+     */
+    virtual QCString trWriteList(int numEntries)
+    {
+      QCString result;
+      int i;
+      // the inherits list contain `numEntries' classes
+      for (i=0;i<numEntries;i++) 
+      {
+        // use generateMarker to generate placeholders for the class links!
+        result+=generateMarker(i); // generate marker for entry i in the list 
+                                   // (order is left to right)
+        
+        if (i!=numEntries-1)  // not the last entry, so we need a separator
+        {
+          if (i<numEntries-2) // not the fore last entry 
+            result+=", ";
+          else                // the fore last entry
+            result+=decode( " � " );
+        }
+      }
+      return result; 
     }
-    QCString trNamespaces()
+    
+    /*! used in class documentation to produce a list of base classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritsList(int numEntries)
     {
-	return "������������ ����";
+      return decode("������� ������:")+trWriteList(numEntries)+".";
     }
-    QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single)
+
+    /*! used in class documentation to produce a list of super classes,
+     *  if class diagrams are disabled.
+     */
+    virtual QCString trInheritedByList(int numEntries)
     {
-	QCString result=(QCString)"������������ ��� ���";
-	switch(compType)
-	{
-	    case ClassDef::Class: result+="�� ������"; break;
-	    case ClassDef::Struct: result+="� ���������"; break;
-	    case ClassDef::Union: result+="�� �����������"; break;
-	    case ClassDef::Interface: result+="�� ����������"; break;
-	    case ClassDef::Exception: result+="�� ����������"; break;
-	}
-	result+=" ���� ������� �� ����";
-	if(single) 
-	    result+="�:"; 
-	else
-	    result+="��:";
-	return result;
+      return decode("����������� ������:")+trWriteList(numEntries)+".";
     }
-    QCString trAlphabeticalList()
+
+    /*! used in member documentation blocks to produce a list of 
+     *  members that are hidden by this one.
+     */
+    virtual QCString trReimplementedFromList(int numEntries)
     {
-	return "���������� ������";
+      return decode("�������������� ����� ������ ")+trWriteList(numEntries)+".";
     }
-    QCString trReturnValues()
+
+    /*! used in member documentation blocks to produce a list of
+     *  all member that overwrite the implementation of this member.
+     */
+    virtual QCString trReimplementedInList(int numEntries)
     {
-	return "������������ ��������";
+      return decode("���������������� � ")+trWriteList(numEntries)+".";
     }
-    QCString trMainPage()
+
+    /*! This is put above each page as a link to all members of namespaces. */
+    virtual QCString trNamespaceMembers()
+    { return decode("����� ������������ ����"); }
+
+    /*! This is an introduction to the page with all namespace members */
+    virtual QCString trNamespaceMemberDescription(bool extractAll)
     {
-	return "������� ��������";
+      QCString result="������ ������ ";
+      if (!extractAll) result+="����������������� ";
+      result+="������ ����������� ����.";
+      return decode(result);
     }
-    QCString trPageAbbreviation()
-    {
-	return "���.";
+
+    /*! This is used in LaTeX as the title of the chapter with the 
+     *  index of all namespaces.
+     */
+    virtual QCString trNamespaceIndex()
+    { return decode("���������� ��������� ������������ ����"); }
+
+    /*! This is used in LaTeX as the title of the chapter containing
+     *  the documentation of all namespaces.
+     */
+    virtual QCString trNamespaceDocumentation()
+    { return decode("������������ ����"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990522
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in the documentation before the list of all
+     *  namespaces in a file.
+     */
+    virtual QCString trNamespaces()
+    { return decode( "������������ ����" ); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990728
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is put at the bottom of a class documentation page and is
+     *  followed by a list of files that were used to generate the page.
+     */
+    virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
+        bool single)
+    { // here s is one of " Class", " Struct" or " Union"
+      // single is true implies a single file
+      QCString result=(QCString)"���������� � �������� ������ ";
+      switch(compType)
+      {
+        case ClassDef::Class:      result+="�����"; 
+	  if (single) result+='�'; else result+="��";
+	  break;
+        case ClassDef::Struct:     result+="��������"; 
+	  if (single) result+='�';
+	  break;
+        case ClassDef::Union:      result+="����������";
+	  if (single) result+='�'; else result+='�';
+	  break;
+        case ClassDef::Interface:  result+="���������";
+	  if (single) result+='�'; else result+="��";
+	  break;
+        case ClassDef::Exception:  result+="���������";
+	  if (single) result+='�'; else result+='�';
+	  break;
+      }
+      result+=" ��������� � ����";
+      if (single) result+="�:"; else result+="��:";
+      return decode(result);
     }
-    QCString trSources()
+
+    /*! This is in the (quick) index as a link to the alphabetical compound
+     * list.
+     */
+    virtual QCString trAlphabeticalList()
+    { return decode("���������� ���������"); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-990901
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used as the heading text for the retval command. */
+    virtual QCString trReturnValues()
+    { return decode("������������ ��������"); }
+
+    /*! This is in the (quick) index as a link to the main page (index.html)
+     */
+    virtual QCString trMainPage()
+    { return decode("��������� ��������"); }
+
+    /*! This is used in references to page that are put in the LaTeX 
+     *  documentation. It should be an abbreviation of the word page.
+     */
+    virtual QCString trPageAbbreviation()
+    { return decode("���."); }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991106
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trSources()
     {
-	return "�������� ������";
+      return decode("�������� ������.");
     }
-    QCString trDefinedAtLineInSourceFile()
+    virtual QCString trDefinedAtLineInSourceFile()
     {
-	return "������������ � ������ @0 ����� @1.";
+      return decode("��. ����������� � ����� @1 ������ @0");
     }
-    QCString trDefinedInSourceFile()
+    virtual QCString trDefinedInSourceFile()
     {
-	return "������������ � ����� @0.";
+      return decode("��. ����������� � ����� @0");
     }
-    QCString trDeprecated()
+
+//////////////////////////////////////////////////////////////////////////
+// new since 0.49-991205
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trDeprecated()
     {
-	return "��������";
+      return decode("���.");
     }
-    QCString trCollaborationDiagram(const char* clName)
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.0.0
+//////////////////////////////////////////////////////////////////////////
+
+    /*! this text is put before a collaboration diagram */
+    virtual QCString trCollaborationDiagram(const char *clName)
     {
-           // originally "collaboration diagram"
-	return (QCString)"��������� ������������� ��� "+clName+":";
+      return (QCString)decode("���� ������ ������ ")+clName+":";
     }
-    QCString trInclDepGraph(const char* fName)
+    /*! this text is put before an include dependency graph */
+    virtual QCString trInclDepGraph(const char *fName)
     {
-	return (QCString)"���� ������������ �� ���������� "
-                         "������ ��� "+fName+":";
+      return decode("���� ���������� ������������ ������ ��� ")+fName+":";
     }
-    QCString trConstructorDocumentation()
+    /*! header that is put before the list of constructor/destructors. */
+    virtual QCString trConstructorDocumentation()
     {
-	return "������������ �� ������������ � �����������";
+      return decode("�����������(�)"); 
     }
-    QCString trGotoSourceCode()
+    /*! Used in the file documentation to point to the corresponding sources. */
+    virtual QCString trGotoSourceCode()
     {
-	return "������� � ��������� ������ ����� �����.";
+      return decode("��. �������� ������.");
     }
-    QCString trGotoDocumentation()
+    /*! Used in the file sources to point to the corresponding documentation. */
+    virtual QCString trGotoDocumentation()
     {
-	return "������� � ������������ �� ���� ����.";
+      return decode("��. ������������.");
     }
-    QCString trPrecondition()
+    /*! Text for the \pre command */
+    virtual QCString trPrecondition()
     {
-	return "�����������";
+      return decode("�����������");
     }
-    QCString trPostcondition()
+    /*! Text for the \post command */
+    virtual QCString trPostcondition()
     {
-	return "�����������";
+      return decode("�����������");
     }
-    QCString trInvariant()
+    /*! Text for the \invariant command */
+    virtual QCString trInvariant()
     {
-	return "���������";
+      return decode("���������");
     }
-    QCString trInitialValue()
+    /*! Text shown before a multi-line variable/enum initialization */
+    virtual QCString trInitialValue()
     {
-	return "��������� ��������:";
+      return decode("�������������");
     }
-    QCString trCode()
+    /*! Text used the source code in the file index */
+    virtual QCString trCode()
     {
-	return "�������� �����";
+      return decode("�������� ������");
     }
-    QCString trGraphicalHierarchy()
+    virtual QCString trGraphicalHierarchy()
     {
-	return "����������� �������� ������(��)";
+      return decode("�������� �������. ����������� ���.");
     }
-    QCString trGotoGraphicalHierarchy()
+    virtual QCString trGotoGraphicalHierarchy()
     {
-	return "������� � ����������� ��������";
+      return decode("��. ����������� ���.");
     }
-    QCString trGotoTextualHierarchy()
+    virtual QCString trGotoTextualHierarchy()
     {
-	return "������� � ��������� ��������";
+      return decode("��. ��������� ���.");
     }
-    QCString trPageIndex()
+    virtual QCString trPageIndex()
     {
-	return "������ �������";
+      return decode("���������� ��������� ������������ ��������");
     }
-    QCString trNote()
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.0
+//////////////////////////////////////////////////////////////////////////
+    
+    virtual QCString trNote()
     {
-	return "����������";
+      return decode("�������");
     }
-    QCString trPublicTypes()
+    virtual QCString trPublicTypes()
     {
-	return "�������� ����";
+      return decode("��������� ����");
     }
-    QCString trPublicAttribs()
+    virtual QCString trPublicAttribs()
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "���� ������";
+        return decode( "���� ������" );
       }
       else
       {
-	return "�������� ��������";
+	return decode( "�������� ��������" );
       }
     }
-    QCString trStaticPublicAttribs()
+    virtual QCString trStaticPublicAttribs()
     {
-	return "�������� ����������� ��������";
+      return decode("����������� ��������� ������");
     }
-    QCString trProtectedTypes()
+    virtual QCString trProtectedTypes()
     {
-	return "���������� ����";
+      return decode("���������� ����");
     }
-    QCString trProtectedAttribs()
+    virtual QCString trProtectedAttribs()
     {
-	return "���������� ��������";
+      return decode("���������� ������");
     }
-    QCString trStaticProtectedAttribs()
+    virtual QCString trStaticProtectedAttribs()
     {
-	return "����������� ����������  ��������";
+      return decode("����������� ���������� ������");
     }
-    QCString trPrivateTypes()
+    virtual QCString trPrivateTypes()
     {
-	return "�������� ����";
+      return decode("��������� ����");
     }
-    QCString trPrivateAttribs()
+    virtual QCString trPrivateAttribs()
     {
-	return "�������� ��������";
+      return decode("��������� ������");
     }
-    QCString trStaticPrivateAttribs()
+    virtual QCString trStaticPrivateAttribs()
     {
-	return "�������� ����������� ��������";
+      return decode("��������� ����������� ������");
     }
-    QCString trTodo()
+
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.3
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a marker that is put before a todo item */
+    virtual QCString trTodo()
+    /*??*/
     {
-      return "���������� �������:";
+      return decode("���������� �������");
     }
-    QCString trTodoList()
+    /*! Used as the header of the todo list */
+    virtual QCString trTodoList()
+    /*??*/
     {
-      return "������ ���";
+      return decode("������ �����");
     }
-    QCString trReferencedBy()
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.4
+//////////////////////////////////////////////////////////////////////////
+
+    virtual QCString trReferencedBy()
     {
-      return "����������� �";
+      return decode("������������ �");
     }
-    QCString trRemarks()
+    virtual QCString trRemarks()
     {
-      return "����������";
+      return decode("����.");
     }
-    QCString trAttention()
+    virtual QCString trAttention()
     {
-      return "��������";
+      return decode("��������");
     }
-    QCString trInclByDepGraph()
+    virtual QCString trInclByDepGraph()
     {
-      return "���� ���� ����������, ����� ����� ����� ��� "
-             "�������� �������� ������ ����:";
+      return decode("���� ������, � ������� ���������� ���� ����:");
     }
-    QCString trSince()
+    virtual QCString trSince()
+    /*??*/
     {
-      return "������� �";
+      return decode("������� �");
     }
-    QCString trLegendTitle()
+    
+//////////////////////////////////////////////////////////////////////////
+// new since 1.1.5
+//////////////////////////////////////////////////////////////////////////
+
+    /*! title of the graph legend page */
+    virtual QCString trLegendTitle()
     {
-      return "�������� �����������";
+      return decode("�������");
     }
-    QCString trLegendDocs()
+    /*! page explaining how the dot graph's should be interpreted */
+    virtual QCString trLegendDocs()
     {
-      return 
-        //"�������� ����������� �� ������, ������������ ���������� "
-        //"doxygen.<p>\n"
+      return decode( 
+        "�����������, ������������ � ������.<p>\n"
         "���������� ��������� ������:\n"
         "\\code\n"
         "/*! ��������� ����� ��-�� �������� */\n"
         "class Invisible { };\n\n"
         "/*! ��������� �����, ��������� ������������ ������ */\n"
         "class Truncated : public Invisible { };\n\n"
-        "/* �����, �� ����������������� ������������� doxygen */\n"
+        "/* ������������������� ����� */\n"
         "class Undocumented { };\n\n"
-        "/*! �����, ������������ �������� ������������ */\n"
+        "/*! ��������� ������������ */\n"
         "class PublicBase : public Truncated { };\n\n"
-        "/*! �����, ������������ ���������� ������������ */\n"
+        "/*! ���������� ������������ */\n"
         "class ProtectedBase { };\n\n"
-        "/*! �����, ������������ �������� ������������ */\n"
+        "/*! ��������� ������������ */\n"
         "class PrivateBase { };\n\n"
-        "/*! �����, ������������ � ������ Inherited */\n"
+        "/*! �����, ������������ ������� Inherited */\n"
         "class Used { };\n\n"
-        "/*! ����������, �������������� �� ���������� ������� */\n"
+        "/*! �����, ����������� �� ������ ������� */\n"
         "class Inherited : public PublicBase,\n"
         "                  protected ProtectedBase,\n"
         "                  private PrivateBase,\n"
@@ -831,92 +1188,140 @@ class TranslatorRussian : public Translator
         "    Used *m_usedClass;\n"
         "};\n"
         "\\endcode\n"
-        "���� ��� \\c MAX_DOT_GRAPH_HEIGHT � ���������������� ����� "
-        "����� �������� 200, ������� ��������� ����:"
+        "���� \\c MAX_DOT_GRAPH_HEIGHT � ���������������� ����� "
+        "���������� � 200, ��������� ��������� ����:"
         "<p><center><img src=\"graph_legend.gif\"></center>\n"
         "<p>\n"
-        "�������������� � ���� ����� ����� ��������� ��������:\n"
+        "�������������� � ���� ����� ����� ��������� ��������:\n"
         "<ul>\n"
-        "<li>����������� ������ ������������� ������������ ��������� ��� �����, "
-	"��� �������� ������ ������ ����.\n"
+        "<li>����������� ������� ������������� ������������ ��������� ��� �����, "
+	"��� �������� ������ ����.\n"
         "<li>������������� � ������ �������� ���������� ����������������� ��������� ��� �����.\n"
         "<li>������������� � ����� �������� ���������� ������������������� ��������� ��� �����.\n"
         "<li>������������� � ������� �������� ���������� ����������������� ��������� ��� �����, ��� ��������\n"
-        " �� ��� ��������� ������������/���������� ��������. ���� ���������, "
-        "���� �� �� ���������� � ��������� �������."
+        " �� ��� ��������� ������������/���������� ��������. ���� ������, "
+        "���� �� �� ���������� � ��������� ��������."
         "</ul>\n"
-        "������� ����� ��������� ��������:\n"
+        "������� ����� ��������� ��������:\n"
         "<ul>\n"
-        "<li>���������� ������� ������������ ��� ����������� ��������� ��������� ������������ "
+        "<li>���������� ������� ������������ ��� ����������� ��������� ���������� ������������ "
         "����� ����� ��������.\n"
         "<li>������������ ������� ������������ ��� ���������� ������������.\n"
-        "<li>������������ ������� ������������ ��� �������� ������������.\n"
-        "<li>���������� ���������� ������� ������������, ���� ����� ���������� "
-        "� ������ ������ ��� ������������ ������ �������. "
-        "������� ����������� ������ ����������, "
+        "<li>������������ ������� ������������ ��� ��������� ������������.\n"
+        "<li>���������� ������� ������������, ���� ����� ���������� �"
+	"������ ����� ��� ������������ ������ �������."
+        "�� �������� ����������� ����������, "
         "����� ������� �������� ����������� ����� ��� ���������. \n"
-        "</ul>\n";
+        "</ul>\n");
     }
-    QCString trLegend()
+    /*! text for the link to the legend page */
+    virtual QCString trLegend()
     {
-      return "�����������";
+      return decode("��. �������");
     }
-    QCString trTest()
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.0
+//////////////////////////////////////////////////////////////////////////
+    
+    /*! Used as a marker that is put before a test item */
+    virtual QCString trTest()
     {
-      return "����";
+      return decode("����");
     }
-    QCString trTestList()
+    /*! Used as the header of the test list */
+    virtual QCString trTestList()
     {
-      return "������ ������";
+      return decode("������ ������");
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.1
+//////////////////////////////////////////////////////////////////////////
+
+    /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return "������ DCOP";
+      return decode("DCOP ������");
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.2
+//////////////////////////////////////////////////////////////////////////
 
+    /*! Used as a section header for IDL properties */
     virtual QCString trProperties()
     {
-      return "��������";
+      return decode("��������");
     }
+    /*! Used as a section header for IDL property documentation */
     virtual QCString trPropertyDocumentation()
     {
-      return "������������ �������";
+      return decode("������ ������ �������");
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.4
+//////////////////////////////////////////////////////////////////////////
 
+    /*! Used for Java interfaces in the summary section of Java packages */
     virtual QCString trInterfaces()
     {
-      return "����������";
+      return decode("����������");
     }
+    /*! Used for Java classes in the summary section of Java packages */
     virtual QCString trClasses()
     {
-      return "������";
+      return decode("������");
     }
+    /*! Used as the title of a Java package */
     virtual QCString trPackage(const char *name)
     {
-      return (QCString)"����� "+name;
+      return decode("����� ")+name;
     }
+    /*! Title of the package index page */
     virtual QCString trPackageList()
     {
-      return "������ �������";
+      return decode("������ ������ ������� ");
     }
+    /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-      return "������ ������� � ������� ��������� (���� ����):";
+      return decode("������ ������ ����������������� �������.");
     }
+    /*! The link name in the Quick links header for each page */
     virtual QCString trPackages()
     {
-      return "������";
+      return decode("������");
     }
+    /*! Used as a chapter title for Latex & RTF output */
     virtual QCString trPackageDocumentation()
     {
-      return "������������ �������";
+      return decode("������");
     }
+    /*! Text shown before a multi-line define */
     virtual QCString trDefineValue()
     {
-      return "��������:";
+      return decode("����������������:");
+    }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.2.?
+//////////////////////////////////////////////////////////////////////////
+    /*! Used as ansicpg for RTF file */
+    virtual QCString trRTFansicp()
+    {
+      return "1251";
+    }
+    /*! Used as ansicpg for RTF fcharset */
+    virtual QCString trRTFCharSet()
+    {
+      return "204";
+    }
+    /*! Used as header RTF general index */
+    virtual QCString trRTFGeneralIndex()
+    {
+      return decode("���������� ���������");
     }
 };
 
diff --git a/src/util.cpp b/src/util.cpp
index bcbf077..0add74d 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -179,21 +179,6 @@ bool isId(char c)
   return c=='_' || isalnum(c);
 }
 
-// strip annonymous left hand side part of the scope
-//QCString stripAnnonymousScope(const QCString &s)
-//{
-//  QCString result=s;
-//  int i=0;
-//  while (!result.isEmpty() && result.at(0)=='@' && (i=result.find("::"))!=-1)
-//  { 
-//    result=result.right(result.length()-i-2);
-//  }
-//  //if (result.at(0)=='@')
-//  //{
-//  //  result.resize(0);
-//  //}
-//  return result;
-//}
 
 /*! 
   Removes all anoymous scopes from string s
@@ -256,7 +241,7 @@ QCString replaceAnonymousScopes(const QCString &s)
 
 
 // strip annonymous left hand side part of the scope
-QCString stripAnnonymousNamespaceScope(const QCString &s)
+QCString stripAnonymousNamespaceScope(const QCString &s)
 {
   int oi=0,i=0,p=0;
   if (s.isEmpty()) return s;
@@ -264,12 +249,12 @@ QCString stripAnnonymousNamespaceScope(const QCString &s)
          Doxygen::namespaceDict[s.left(i)]!=0) { oi=i; p=i+2; }
   if (oi==0) 
   {
-    //printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.data());
+    //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.data());
     return s;
   }
   else 
   {
-    //printf("stripAnnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.right(s.length()-oi-2).data());
+    //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.right(s.length()-oi-2).data());
     return s.right(s.length()-oi-2);
   }
 }
@@ -2537,39 +2522,6 @@ bool hasVisibleRoot(BaseClassList *bcl)
 
 //----------------------------------------------------------------------
 
-#if 0
-QCString convertFileName(const QCString &s)
-{
-  if (Config_getBool("SHORT_NAMES")) 
-  {
-    printf("convertFileName(%s)\n",s.data());
-    return convertNameToFile(s,FALSE);
-  }
-  QCString result;
-  int i,l=s.length();
-  for (i=0;i<l;i++)
-  {
-    if (s.at(i)!='/' && s.at(i)!='.')
-    {
-      if (Config_getBool("CASE_SENSE_NAMES"))
-      {
-        result+=s[i]; 
-      }
-      else
-      {
-        result+=tolower(s[i]); 
-      }
-    }
-    else 
-    {
-      result+="_";
-    }
-  }
-  return result;
-}
-#endif
-
-
 /*! This function determines the file name on disk of an item
  *  given its name, which could be a class name with templete 
  *  arguments, so special characters need to be escaped.
@@ -2754,3 +2706,40 @@ const char *getOverloadDocs()
          "function only in what argument(s) it accepts.";
 }
       
+void addMembersToMemberGroup(MemberList *ml,MemberGroupDict *memberGroupDict,
+                             MemberGroupList *memberGroupList)
+{
+  MemberListIterator mli(*ml);
+  MemberDef *md;
+  uint index;
+  for (index=0;(md=mli.current());)
+  {
+    int groupId=md->getMemberGroupId();
+    if (groupId!=-1)
+    {
+      QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
+      QCString *pDocs      = Doxygen::memberDocDict[groupId];
+      if (pGrpHeader)
+      {
+        MemberGroup *mg = memberGroupDict->find(groupId);
+        if (mg==0)
+        {
+          mg = new MemberGroup(groupId,*pGrpHeader,pDocs ? pDocs->data() : 0);
+          memberGroupDict->insert(groupId,mg);
+          memberGroupList->append(mg);
+        }
+        md = ml->take(index);
+        mg->insertMember(md);
+        md->setMemberGroup(mg);
+      }
+      else
+      {
+        ++mli;++index;
+      }
+    }
+    else
+    {
+      ++mli;++index;
+    }
+  }
+}
diff --git a/src/util.h b/src/util.h
index adf79de..65f5819 100644
--- a/src/util.h
+++ b/src/util.h
@@ -38,6 +38,8 @@ class ClassList;
 class BaseClassList;
 class GroupDef;
 class NamespaceList;
+class MemberGroupList;
+class MemberGroupDict;
 
 //--------------------------------------------------------------------
 
@@ -123,8 +125,7 @@ QCString generateMarker(int id);
 void writeExample(OutputList &ol,ExampleList *el);
 //void setFileNameForSections(QList<QCString> *anchorList,const char *fileName,
 //                            PageInfo *pi=0);
-QCString stripAnnonymousScope(const QCString &s);
-QCString stripAnnonymousNamespaceScope(const QCString &s);
+QCString stripAnonymousNamespaceScope(const QCString &s);
 QCString stripFromPath(const QCString &path);
 bool rightScopeMatch(const QCString &scope, const QCString &name);
 bool leftScopeMatch(const QCString &scope, const QCString &name);
@@ -144,6 +145,8 @@ int iSystem(const char *command,const char *args,bool isBatchFile=FALSE);
 QCString convertToHtml(const char *s);
 QCString convertToXML(const char *s);
 const char * getOverloadDocs();
+void addMembersToMemberGroup(MemberList *ml,MemberGroupDict *memberGroupDict,
+                             MemberGroupList *memberGroupList);
 
 #endif
 
-- 
cgit v0.12