Index: src/classlist.cpp
===================================================================
--- src/classlist.cpp	(revision 637)
+++ src/classlist.cpp	(working copy)
@@ -153,9 +153,13 @@
           ol.endMemberItem();
           if (!cd->briefDescription().isEmpty())
           {
+            QList<ParseRequest> l_requests;
+            ParseRequest l_brief = {cd->briefFile(), cd->briefDescription(), cd->briefLine()};
+            l_requests.append(&l_brief);
+
             ol.startMemberDescription();
-            ol.parseDoc(cd->briefFile(),cd->briefLine(),cd,0,
-                cd->briefDescription(),FALSE,FALSE);
+            ol.parseDoc(l_requests,cd,0,FALSE,FALSE);
+
             if (//(!cd->briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
                 //!cd->documentation().isEmpty())
                 cd->isLinkableInProject()
Index: src/rtfdocvisitor.cpp
===================================================================
--- src/rtfdocvisitor.cpp	(revision 637)
+++ src/rtfdocvisitor.cpp	(working copy)
@@ -661,6 +661,8 @@
       m_t << theTranslator->trRemarks(); break;
     case DocSimpleSect::Attention:
       m_t << theTranslator->trAttention(); break;
+    case DocSimpleSect::Progression:
+      m_t << theTranslator->trProgression(); break;
     case DocSimpleSect::User: break;
     case DocSimpleSect::Rcs: break;
     case DocSimpleSect::Unknown:  break;
Index: src/translator_fa.h
===================================================================
--- src/translator_fa.h	(revision 637)
+++ src/translator_fa.h	(working copy)
@@ -32,7 +32,7 @@
 #define HtmlDivEnd          QCString("</div>")
 
 
-class TranslatorPersian : public Translator
+class TranslatorPersian : public TranslatorAdapter_1_5_6
 {
   public:
 
Index: src/translatordecoder.h
===================================================================
--- src/translatordecoder.h	(revision 637)
+++ src/translatordecoder.h	(working copy)
@@ -707,6 +707,11 @@
     QCString trTypeConstraints()
     { return toUtf8(m_translator->trTypeConstraints()); }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.4
+//////////////////////////////////////////////////////////////////////////
+    QCString trProgression()  
+    { return toUtf8(m_translator->trProgression()); }
 
 //////////////////////////////////////////////////////////////////////////
   private:
Index: src/translator_hr.h
===================================================================
--- src/translator_hr.h	(revision 637)
+++ src/translator_hr.h	(working copy)
@@ -71,7 +71,7 @@
 #ifndef TRANSLATOR_HR_H
 #define TRANSLATOR_HR_H
 
-class TranslatorCroatian : public Translator
+class TranslatorCroatian : public TranslatorAdapter_1_5_6
 {
   private:
         /*! to avoid macro redefinition from translator_cz.h */
Index: src/translator.h
===================================================================
--- src/translator.h	(revision 637)
+++ src/translator.h	(working copy)
@@ -72,6 +72,7 @@
 
     virtual QCString trRelatedFunctions() = 0;
     virtual QCString trRelatedSubscript() = 0;
+    
     virtual QCString trDetailedDescription() = 0;
     virtual QCString trMemberTypedefDocumentation() = 0;
     virtual QCString trMemberEnumerationDocumentation() = 0;
@@ -476,6 +477,11 @@
     virtual QCString trSubprogram(bool first_capital, bool singular) = 0;
     virtual QCString trTypeConstraints() = 0;
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.6
+//////////////////////////////////////////////////////////////////////////
+    virtual QCString trProgression() = 0;
+    
 };
 
 #endif
Index: src/util.cpp
===================================================================
--- src/util.cpp	(revision 637)
+++ src/util.cpp	(working copy)
@@ -6395,7 +6395,16 @@
   QString result;
   if (doc.isEmpty()) return result.data();
   QTextStream t(&result,IO_WriteOnly);
-  DocNode *root = validatingParseDoc(fileName,lineNr,Doxygen::globalScope,0,doc,FALSE,FALSE);
+
+  QList<ParseRequest> l_requests;
+  ParseRequest l_doc = {
+    QCString(fileName),
+    QCString(doc),
+    lineNr
+  };
+  l_requests.append(&l_doc);
+  
+  DocNode *root = validatingParseDoc(l_requests,Doxygen::globalScope,0,FALSE,FALSE);
   TextDocVisitor *visitor = new TextDocVisitor(t);
   root->accept(visitor);
   delete visitor;
@@ -6596,7 +6605,16 @@
     linkifyText(TextGeneratorOLImpl(ol),d,0,0,a->type);
     ol.endConstraintType();
     ol.startConstraintDocs();
-    ol.parseDoc(d->docFile(),d->docLine(),d,0,a->docs,TRUE,FALSE);
+
+    QList<ParseRequest> l_requests;
+    ParseRequest l_doc = {
+      d->docFile(),
+      a->docs,
+      d->docLine()
+    };
+    l_requests.append(&l_doc);
+
+    ol.parseDoc(l_requests,d,0,TRUE,FALSE);
     ol.endConstraintDocs();
   }
   ol.endConstraintList();
Index: src/translator_cn.h
===================================================================
--- src/translator_cn.h	(revision 637)
+++ src/translator_cn.h	(working copy)
@@ -24,7 +24,7 @@
 */
 #define CN_SPC
 
-class TranslatorChinese : public Translator
+class TranslatorChinese : public TranslatorAdapter_1_5_6
 {
   public:
 		/*! Used for identification of the language. The identification
Index: src/translator_cz.h
===================================================================
--- src/translator_cz.h	(revision 637)
+++ src/translator_cz.h	(working copy)
@@ -77,7 +77,7 @@
 //    something else.  It is difficult to find the general translation
 //    for all kinds in the Czech language.
 
-class TranslatorCzech : public Translator
+class TranslatorCzech : public TranslatorAdapter_1_5_6
 {
   public:
     // --- Language control methods -------------------
Index: src/translator_kr.h
===================================================================
--- src/translator_kr.h	(revision 637)
+++ src/translator_kr.h	(working copy)
@@ -50,7 +50,7 @@
  Translator class (by the local maintainer) when the localized
  translator is made up-to-date again.
 */
-class TranslatorKorean : public Translator
+class TranslatorKorean : public TranslatorAdapter_1_5_6
 {
   protected:
     friend class TranslatorAdapterBase;
Index: src/dirdef.cpp
===================================================================
--- src/dirdef.cpp	(revision 637)
+++ src/dirdef.cpp	(working copy)
@@ -124,14 +124,22 @@
     // repeat brief description
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+      l_requests.append(&l_brief);
+
+      ol.parseDoc(l_requests,this,0,FALSE,FALSE);
       ol.newParagraph();
     }
 
     // write documentation
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_doc = { docFile(), documentation()+"\n", docLine() };
+      l_requests.append(&l_doc);
+
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     }
   }
 }
@@ -168,7 +176,11 @@
   }
   else if (!briefDescription().isEmpty())
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     ol.writeString(" \n");
     ol.pushGeneratorState();
     ol.disable(OutputGenerator::Latex);
@@ -229,8 +241,12 @@
       }
       if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), dd->briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),
+        ol.parseDoc(l_requests,dd,0,
             FALSE, // indexWords
             FALSE, // isExample
             0,     // exampleName
@@ -288,8 +304,12 @@
       ol.endMemberItem();
       if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), fd->briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),
+        ol.parseDoc(l_requests,fd,0,
             FALSE, // indexWords
             FALSE, // isExample
             0,     // exampleName
Index: src/translator_de.h
===================================================================
--- src/translator_de.h	(revision 637)
+++ src/translator_de.h	(working copy)
@@ -120,7 +120,7 @@
 #ifndef TRANSLATOR_DE_H
 #define TRANSLATOR_DE_H
 
-class TranslatorGerman : public Translator
+class TranslatorGerman : public TranslatorAdapter_1_5_6
 {
   public:
 
Index: src/compound_xsd.h
===================================================================
--- src/compound_xsd.h	(revision 637)
+++ src/compound_xsd.h	(working copy)
@@ -753,6 +753,7 @@
 "      <xsd:enumeration value=\"attention\" />\n"
 "      <xsd:enumeration value=\"par\" />\n"
 "      <xsd:enumeration value=\"rcs\" />\n"
+"      <xsd:enumeration value=\"progression\" />\n"
 "    </xsd:restriction>\n"
 "  </xsd:simpleType>\n"
 "\n"
Index: src/cmdmapper.cpp
===================================================================
--- src/cmdmapper.cpp	(revision 637)
+++ src/cmdmapper.cpp	(working copy)
@@ -111,6 +111,8 @@
   { "endmanonly",    CMD_ENDMANONLY },
   { "includelineno", CMD_INCWITHLINES },
   { "inheritdoc",    CMD_INHERITDOC },
+  { "progression",   CMD_PROGRESSION },
+  { "ps",            CMD_PROGRESSION },
   { 0,               0 }
 };
 
Index: src/vhdldocgen.cpp
===================================================================
--- src/vhdldocgen.cpp	(revision 637)
+++ src/vhdldocgen.cpp	(working copy)
@@ -2010,8 +2010,12 @@
   ol.endMemberItem();
   if (!mdef->briefDescription().isEmpty() &&   Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */)
   {
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = { mdef->briefFile(), mdef->briefDescription(), mdef->briefLine() };
+    l_requests.append(&l_brief);
+
     ol.startMemberDescription();
-    ol.parseDoc(mdef->briefFile(),mdef->briefLine(),mdef->getOuterScope()?mdef->getOuterScope():d,mdef,mdef->briefDescription(),TRUE,FALSE);
+    ol.parseDoc(l_requests,mdef->getOuterScope()?mdef->getOuterScope():d,mdef,TRUE,FALSE);
     if (detailsVisible) 
     {
       ol.pushGeneratorState();
@@ -2125,7 +2129,12 @@
   if (subtitle && subtitle[0]!=0) 
   {
     ol.startMemberSubtitle();
-    ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE);
+
+    QList<ParseRequest> l_requests;
+    ParseRequest l_gen = {"[generated]", subtitle, -1 };
+    l_requests.append(&l_gen);
+
+    ol.parseDoc(l_requests,0,0,FALSE,FALSE);
     ol.endMemberSubtitle();
   } //printf("memberGroupList=%p\n",memberGroupList);
 
@@ -2149,9 +2158,13 @@
         ol.endMemberGroupHeader();
         if (!mg->documentation().isEmpty())
         {
+          QList<ParseRequest> l_requests;
+          ParseRequest l_doc = {"[generated]",mg->documentation()+"\n",-1};
+          l_requests.append(&l_doc);
+
           //printf("Member group has docs!\n");
           ol.startMemberGroupDocs();
-          ol.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
+          ol.parseDoc(l_requests,0,0,FALSE,FALSE);
           ol.endMemberGroupDocs();
         }
         ol.startMemberGroup();
Index: src/mandocvisitor.cpp
===================================================================
--- src/mandocvisitor.cpp	(revision 637)
+++ src/mandocvisitor.cpp	(working copy)
@@ -446,6 +446,8 @@
       m_t << theTranslator->trRemarks(); break;
     case DocSimpleSect::Attention:
       m_t << theTranslator->trAttention(); break;
+    case DocSimpleSect::Progression:
+      m_t << theTranslator->trProgression(); break;
     case DocSimpleSect::User: break;
     case DocSimpleSect::Rcs: break;
     case DocSimpleSect::Unknown:  break;
Index: src/latexdocvisitor.cpp
===================================================================
--- src/latexdocvisitor.cpp	(revision 637)
+++ src/latexdocvisitor.cpp	(working copy)
@@ -525,6 +525,8 @@
       filter(theTranslator->trRemarks()); break;
     case DocSimpleSect::Attention:
       filter(theTranslator->trAttention()); break;
+    case DocSimpleSect::Progression:
+      filter(theTranslator->trProgression()); break;
     case DocSimpleSect::User: break;
     case DocSimpleSect::Rcs: break;
     case DocSimpleSect::Unknown:  break;
Index: src/perlmodgen.cpp
===================================================================
--- src/perlmodgen.cpp	(revision 637)
+++ src/perlmodgen.cpp	(working copy)
@@ -24,6 +24,7 @@
 #include "message.h"
 #include "doxygen.h"
 #include "pagedef.h"
+#include "outputlist.h"
 
 #include <qdir.h>
 #include <qstack.h>
@@ -787,31 +788,14 @@
 
 void PerlModDocVisitor::visitPre(DocSimpleSect *s)
 {
-  const char *type = 0;
-  switch (s->type())
-  {
-  case DocSimpleSect::See:		type = "see"; break;
-  case DocSimpleSect::Return:		type = "return"; break;
-  case DocSimpleSect::Author:		type = "author"; break;
-  case DocSimpleSect::Authors:		type = "authors"; break;
-  case DocSimpleSect::Version:		type = "version"; break;
-  case DocSimpleSect::Since:		type = "since"; break;
-  case DocSimpleSect::Date:		type = "date"; break;
-  case DocSimpleSect::Note:		type = "bug"; break;
-  case DocSimpleSect::Warning:		type = "warning"; break;
-  case DocSimpleSect::Pre:		type = "pre"; break;
-  case DocSimpleSect::Post:		type = "post"; break;
-  case DocSimpleSect::Invar:		type = "invariant"; break;
-  case DocSimpleSect::Remark:		type = "remark"; break;
-  case DocSimpleSect::Attention:	type = "attention"; break;
-  case DocSimpleSect::User:		type = "par"; break;
-  case DocSimpleSect::Rcs:		type = "rcs"; break;
-  case DocSimpleSect::Unknown:
+  QCString l_input(getSimpleSectTypeString(s->type()));
+
+  if( s->type() == DocSimpleSect::Unknown ) {
     err("Error: unknown simple section found\n");
-    break;
   }
+  
   openOther();
-  openSubBlock(type);
+  openSubBlock(l_input);
 }
 
 void PerlModDocVisitor::visitPost(DocSimpleSect *)
@@ -1312,10 +1296,15 @@
 			    const QCString &text)
 {
   QCString stext = text.stripWhiteSpace();
+
   if (stext.isEmpty())
     output.addField(name).add("{}");
   else {
-    DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE,0);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_doc = {fileName, stext, lineNr};
+    l_requests.append(&l_doc);
+
+    DocNode *root = validatingParseDoc(l_requests,scope,md,FALSE,0);
     output.openHash(name);
     PerlModDocVisitor *visitor = new PerlModDocVisitor(output);
     root->accept(visitor);
Index: src/filedef.cpp
===================================================================
--- src/filedef.cpp	(revision 637)
+++ src/filedef.cpp	(working copy)
@@ -172,7 +172,11 @@
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+      l_requests.append(&l_brief);
+
+      ol.parseDoc(l_requests,this,0,FALSE,FALSE);
     }
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") && 
         !documentation().isEmpty())
@@ -187,9 +191,13 @@
     }
     if (!documentation().isEmpty())
     {
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = { docFile(), documentation() + "\n", docLine()};
+      l_requests.append(&l_brief);
+
       //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') 
       //  doc+='.';
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     }
     //printf("Writing source ref for file %s\n",name().data());
     if (Config_getBool("SOURCE_BROWSER")) 
@@ -301,7 +309,11 @@
   }
   else if (!briefDescription().isEmpty()) 
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     //ol.writeString(" \n");
     ol.disableAllBut(OutputGenerator::Html);
     ol.startTextLink(0,"_details");
Index: src/memberlist.cpp
===================================================================
--- src/memberlist.cpp	(revision 637)
+++ src/memberlist.cpp	(working copy)
@@ -246,14 +246,13 @@
               ol.endMemberItem();
               if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
               {
+                QList<ParseRequest> l_requests;
+                ParseRequest l_brief = {md->briefFile(),md->briefDescription(),md->briefLine()};
+                l_requests.append(&l_brief);
+
                 ol.startMemberDescription();
-                ol.parseDoc(
-                    md->briefFile(),md->briefLine(),
-                    cd,md,
-                    md->briefDescription(),
-                    TRUE,
-                    FALSE
-                    );
+
+                ol.parseDoc(l_requests,cd,md,TRUE,FALSE);
                 if (md->isDetailedSectionLinkable())
                 {
                   ol.disableAllBut(OutputGenerator::Html);
@@ -336,9 +335,13 @@
   }
   if (subtitle && subtitle[0]!=0) 
   {
+    QList<ParseRequest> l_requests;
+    ParseRequest l_gen = { "[generated]", subtitle, -1 };
+    l_requests.append(&l_gen);
+
     //printf("subtitle=`%s'\n",subtitle);
     ol.startMemberSubtitle();
-    ol.parseDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE);
+    ol.parseDoc(l_requests,ctx,0,FALSE,FALSE);
     ol.endMemberSubtitle();
   }
 
@@ -361,9 +364,13 @@
       ol.endMemberGroupHeader();
       if (!mg->documentation().isEmpty())
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_gen = {"[generated]",mg->documentation()+"\n",-1};
+        l_requests.append(&l_gen);
+
         //printf("Member group has docs!\n");
         ol.startMemberGroupDocs();
-        ol.parseDoc("[generated]",-1,ctx,0,mg->documentation()+"\n",FALSE,FALSE);
+        ol.parseDoc(l_requests,ctx,0,FALSE,FALSE);
         ol.endMemberGroupDocs();
       }
       ol.startMemberGroup();
Index: src/xmldocvisitor.cpp
===================================================================
--- src/xmldocvisitor.cpp	(revision 637)
+++ src/xmldocvisitor.cpp	(working copy)
@@ -423,6 +423,8 @@
       m_t << "par"; break;
     case DocSimpleSect::Rcs: 
       m_t << "rcs"; break;
+    case DocSimpleSect::Progression:
+      m_t << "progression"; break;
     case DocSimpleSect::Unknown:  break;
   }
   m_t << "\">";
Index: src/commentscan.l
===================================================================
--- src/commentscan.l	(revision 637)
+++ src/commentscan.l	(working copy)
@@ -219,6 +219,8 @@
   { "tparam",          0,                       TRUE  },
   { "post",            0,                       TRUE  },
   { "pre",             0,                       TRUE  },
+  { "progression",     0,                       TRUE  },
+  { "ps",              0,                       TRUE  },
   { "remark",          0,                       TRUE  },
   { "remarks",         0,                       TRUE  },
   { "result",          0,                       TRUE  },
@@ -777,7 +779,8 @@
 DCMD9     ("see"|"since"|"subsection"|"subsubsection")
 DCMD10    ("throw"|"until"|"verbatim")
 DCMD11    ("verbinclude"|"version"|"warning")
-DETAILEDCMD {CMD}({DCMD1}|{DCMD2}|{DCMD3}|{DCMD4}|{DCMD5}|{DCMD6}|{DCMD7}|{DCMD8}|{DCMD9}|{DCMD10}|{DCMD11})
+DCMD12    ("progression"|"ps")
+DETAILEDCMD {CMD}({DCMD1}|{DCMD2}|{DCMD3}|{DCMD4}|{DCMD5}|{DCMD6}|{DCMD7}|{DCMD8}|{DCMD9}|{DCMD10}|{DCMD11}|{DCMD12})
 XREFCMD   {CMD}("bug"|"deprecated"|"test"|"todo"|"xrefitem")  
 PRE       [pP][rR][eE]
 TABLE	  [tT][aA][bB][lL][eE]
Index: src/printdocvisitor.h
===================================================================
--- src/printdocvisitor.h	(revision 637)
+++ src/printdocvisitor.h	(working copy)
@@ -287,6 +287,7 @@
 	case DocSimpleSect::Attention: printf("attention"); break;
 	case DocSimpleSect::User: printf("user"); break;
 	case DocSimpleSect::Rcs: printf("rcs"); break;
+  case DocSimpleSect::Progression: printf("progression"); break; 
 	case DocSimpleSect::Unknown: printf("unknown"); break;
       }
       printf(">\n");
Index: src/doxygen.cpp
===================================================================
--- src/doxygen.cpp	(revision 637)
+++ src/doxygen.cpp	(working copy)
@@ -7953,11 +7953,18 @@
     startTitle(*outputList,n);
     outputList->docify(pd->name());
     endTitle(*outputList,n,0);
-    outputList->parseDoc(pd->docFile(),                            // file
-                         pd->docLine(),                            // startLine
+
+    QList<ParseRequest> l_requests;
+    ParseRequest l_doc = { 
+      pd->docFile(),                                              // file
+   		pd->documentation()+"\n\n\\include "+pd->name(),            // docs
+      pd->docLine() 											                        // startLine
+    };
+    l_requests.append(&l_doc);
+
+    outputList->parseDoc(l_requests,
                          pd,                                       // context
                          0,                                        // memberDef
-                         pd->documentation()+"\n\n\\include "+pd->name(),          // docs
                          TRUE,                                     // index words
                          TRUE,                                     // is example
                          pd->name()
Index: src/config.l
===================================================================
--- src/config.l	(revision 637)
+++ src/config.l	(working copy)
@@ -2010,7 +2010,16 @@
 		   "is used as the file version. See the manual for examples. \n"
               );
   cs->setWidgetType(ConfigString::File);
-  
+  cl = addList(
+                    "GROUPED_SECTIONS",
+					"With this setting it is possible to alter the behavior of the section \n"
+					"commands including return, author, authors, version, since, date, note, \n"
+					"warning, pre, post, invariant, remark, attention and par. Each of these \n"
+					"commands, when specified in this configuration option, causes doxygen \n"
+					"to join all content associated with that command into a single \n"
+					"section."
+                 );
+
   //-----------------------------------------------------------------------------------------------
   addInfo(  "Messages","configuration options related to warning and progress messages");
   //-----------------------------------------------------------------------------------------------
@@ -3178,7 +3187,7 @@
   addObsolete("DOC_ABSPATH");
   addObsolete("BIN_ABSPATH");
   addObsolete("EXT_DOC_PATHS");
-
+  
   // The IMAGE_PATTERNS tag is now officially obsolete.
 }
 
Index: src/outputlist.h
===================================================================
--- src/outputlist.h	(revision 637)
+++ src/outputlist.h	(working copy)
@@ -42,6 +42,12 @@
 class SectionDict;
 class DotGroupCollaboration;
 
+struct ParseRequest {
+	QCString fileName;
+	QCString docString;
+	int startLine;
+};
+
 class OutputList : public OutputDocInterface
 {
   public:
@@ -64,8 +70,8 @@
     // OutputDocInterface implementation
     //////////////////////////////////////////////////
 
-    void parseDoc(const char *fileName,int startLine,
-                  Definition *ctx,MemberDef *md,const QCString &docStr,
+    void parseDoc(QList<ParseRequest> requests,
+                  Definition *ctx,MemberDef *md,
                   bool indexWords,bool isExample,const char *exampleName=0,
                   bool singleLine=FALSE,bool linkFromIndex=FALSE);
     void parseText(const QCString &textStr);
Index: src/translator_ru.h
===================================================================
--- src/translator_ru.h	(revision 637)
+++ src/translator_ru.h	(working copy)
@@ -26,7 +26,7 @@
 #ifndef TRANSLATOR_RU_H
 #define TRANSLATOR_RU_H
 
-class TranslatorRussian : public Translator
+class TranslatorRussian : public TranslatorAdapter_1_5_6
 {
   public:
     /*! Used for identification of the language. */
Index: src/namespacedef.cpp
===================================================================
--- src/namespacedef.cpp	(revision 637)
+++ src/namespacedef.cpp	(working copy)
@@ -244,7 +244,11 @@
     ol.startTextBlock();
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = {briefFile(),briefDescription(),briefLine()};
+      l_requests.append(&l_brief);
+
+      ol.parseDoc(l_requests,this,0,FALSE,FALSE);
     }
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
         !documentation().isEmpty())
@@ -259,7 +263,12 @@
     }
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      
+      QList<ParseRequest> l_requests;
+      ParseRequest l_doc = {docFile(),documentation()+"\n",docLine()};
+      l_requests.append(&l_doc);
+
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
       //ol.newParagraph();
     }
     ol.endTextBlock();
@@ -318,7 +327,11 @@
   }
   else if (!briefDescription().isEmpty()) 
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = {briefFile(),briefDescription(),briefLine()};
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     ol.writeString(" \n");
     ol.pushGeneratorState();
     ol.disableAllBut(OutputGenerator::Html);
@@ -694,8 +707,12 @@
       ol.endMemberItem();
       if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = {nd->briefFile(),nd->briefDescription(),nd->briefLine()};
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE);
+        ol.parseDoc(l_requests,nd,0,FALSE,FALSE);
         ol.endMemberDescription();
         ol.newParagraph();
       }
Index: src/docparser.cpp
===================================================================
--- src/docparser.cpp	(revision 637)
+++ src/docparser.cpp	(working copy)
@@ -42,6 +42,8 @@
 #include "language.h"
 #include "portable.h"
 
+#include "outputlist.h"
+
 // debug off
 #define DBG(x) do {} while(0)
 
@@ -3758,6 +3760,40 @@
 
 //--------------------------------------------------------------------------
 
+QCString DocTitle::internalName() const {
+	QListIterator<DocNode> l_iter(m_children);
+	DocNode *l_node;
+	QCString l_retval("");
+    //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: internal name begin");
+	for(l_iter.toFirst();(l_node=l_iter.current());++l_iter){
+        //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: Node Type %d", l_node->kind());
+		switch(l_node->kind()) {
+		case Kind_Word:
+		{
+    		//warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: found word");
+			DocWord *l_word = (DocWord*)l_node;
+			l_retval.append(l_word->word());
+			break;
+		}
+		case Kind_WhiteSpace:
+		{
+    		//warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: found whitespace");
+			DocWhiteSpace *l_whitespace = (DocWhiteSpace*)l_node;
+			l_retval.append(l_whitespace->chars());
+			break;
+		}
+		// TODO: Handle other valid nodes of a DocTitle
+		// 			see: defaultHandleToken()
+		default: 
+    		//warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: found default");
+			break;
+	    }
+	}
+	l_retval = l_retval.stripWhiteSpace();
+    //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: internal name result '%s'", l_retval.data());
+	return l_retval;
+}
+
 void DocTitle::parse()
 {
   DBG(("DocTitle::parse() start\n"));
@@ -3820,17 +3856,17 @@
   v->visitPost(this);
 }
 
-int DocSimpleSect::parse(bool userTitle)
+int DocSimpleSect::parse()
 {
   DBG(("DocSimpleSect::parse() start\n"));
   g_nodeStack.push(this);
 
   // handle case for user defined title
-  if (userTitle)
-  {
-    m_title = new DocTitle(this);
-    m_title->parse();
-  }
+  //if (userTitle)
+  //{
+  //  m_title = new DocTitle(this);
+  //  m_title->parse();
+  //}
   
   // add new paragraph as child
   DocPara *par = new DocPara(this);
@@ -3955,6 +3991,7 @@
     case Attention:  return "attention";
     case User:       return "user";
     case Rcs:        return "rcs";
+    case Progression: return "progression";
   }
   return "unknown";
 }
@@ -4121,20 +4158,163 @@
 
 //--------------------------------------------------------------------------
 
+QCString getSimpleSectTypeString(DocSimpleSect::Type t) 
+{
+  switch (t)
+  {
+	case DocSimpleSect::Unknown:    break;
+    case DocSimpleSect::See:        return "see";
+    case DocSimpleSect::Return:     return "return";
+    case DocSimpleSect::Author:     // fall through
+    case DocSimpleSect::Authors:    return "author";
+    case DocSimpleSect::Version:    return "version";
+    case DocSimpleSect::Since:      return "since";
+    case DocSimpleSect::Date:       return "date";
+    case DocSimpleSect::Note:       return "note";
+    case DocSimpleSect::Warning:    return "warning";
+    case DocSimpleSect::Pre:        return "pre";
+    case DocSimpleSect::Post:       return "post";
+    case DocSimpleSect::Invar:      return "invariant";
+    case DocSimpleSect::Remark:     return "remark";
+    case DocSimpleSect::Attention:  return "attention";
+    case DocSimpleSect::User:       return "user";
+    case DocSimpleSect::Rcs:        return "rcs";
+    case DocSimpleSect::Progression: return "progression";
+  }
+  return "unknown";
+}
+
+bool shouldGroup(DocSimpleSect::Type t, DocTitle *title) {
+  if( t == DocSimpleSect::Progression ) return TRUE;
+
+  QStrList l_list = Config_getList("GROUPED_SECTIONS");
+  QCString l_type = getSimpleSectTypeString(t);
+    
+  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: checking for grouping");
+  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: type string is: %s", l_type.data());
+
+  if( t == DocSimpleSect::User  ) {
+	  if( title == NULL ) return FALSE;
+	  l_type = title->internalName();
+  	  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: got internal name: %s", l_type.data());
+  }
+
+  for( char *l_str = l_list.first() ; l_str != NULL ; l_str = l_list.next() ) {
+	QCString l_elem(l_str);
+	if( t==DocSimpleSect::User ) {
+  	  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: checking rule: %s", l_elem.data());
+  	  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: checking rule for paragraph: %s", l_elem.left(4).data());
+      if( !l_elem.stripPrefix("par:") ) continue;
+  	  //warn_doc_error(g_fileName,doctokenizerYYlineno,"Debug: checking paragraph title: %s", l_elem.data());
+	}
+	if( l_elem == l_type ) return TRUE;
+  }
+  return FALSE;
+}
+
+
 int DocPara::handleSimpleSection(DocSimpleSect::Type t, bool xmlContext)
 {
   DocSimpleSect *ss=0;
-  if (!m_children.isEmpty() &&                           // previous element
+
+  DocTitle *l_title = NULL;
+  if( t == DocSimpleSect::User ) {
+	  g_nodeStack.push(this);
+	  l_title = new DocTitle(NULL);
+	  l_title->parse();
+	  DocNode *n=g_nodeStack.pop();
+	  ASSERT(n==this);
+  }
+
+  if( shouldGroup(t, l_title) ) {
+	  DocNode *l_node;
+	  DocSimpleSect *l_targetNode = NULL;
+
+	  // If there is a Doc Root To search from then start there
+	  if( parent() != NULL && parent()->kind() == Kind_Root &&
+		  !((DocRoot*)parent())->children().isEmpty() ) 
+	  {
+	    DocRoot *l_root = (DocRoot*)parent();
+      QListIterator<DocNode> l_iter(l_root->children());
+	    for( l_iter.toFirst();(l_node=l_iter.current());++l_iter) {
+		    if( l_node->kind() == Kind_Para )
+		    {
+          DocPara *l_para = (DocPara*)l_node;
+          QListIterator<DocNode> l_paraIter(l_para->children());
+          DocNode *l_child = NULL;
+          for( l_paraIter.toFirst();(l_child=l_paraIter.current());++l_paraIter) 
+          {
+            if( l_child->kind() == Kind_SimpleSect ) 
+            {
+              DocSimpleSect *l_sect = (DocSimpleSect*)l_child;
+              if( l_sect->type() != t ) continue;
+              if( t != DocSimpleSect::User ) {
+                l_targetNode = l_sect;
+                break;
+              }
+              else if( l_title != NULL )
+              { 
+                QCString l_myTitle(l_title->internalName());
+                QCString l_otherTitle(l_sect->title()->internalName());
+                if( l_myTitle == l_otherTitle ) 
+                {
+                  l_targetNode = l_sect;
+                  break;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    // If we haven't already found a node to group with search our own children
+    if( l_targetNode == NULL )	
+    {
+      // Search All Nodes In the this node for an existing
+      //  simple section to group with
+      QListIterator<DocNode> l_iter(m_children);
+      for( l_iter.toFirst();(l_node=l_iter.current());++l_iter) {
+        if( l_node->kind() == Kind_SimpleSect ) {
+          DocSimpleSect *l_sect = (DocSimpleSect*)l_node;
+          if( l_sect->type() != t ) continue;
+          if( t != DocSimpleSect::User ) {
+            l_targetNode = l_sect;
+            break;
+          }
+          else {
+            QCString l_myTitle(l_title->internalName());
+            QCString l_otherTitle(l_title->internalName());
+            if( l_myTitle == l_otherTitle ) {
+              l_targetNode = l_sect;
+              break;
+            }
+          }
+        }
+      }
+    }
+    if( l_targetNode != NULL ) {
+      ss = l_targetNode;
+      delete l_title;
+    }
+  }
+  if (ss == NULL &&
+      !m_children.isEmpty() &&                           // previous element
       m_children.last()->kind()==Kind_SimpleSect &&      // was a simple sect
       ((DocSimpleSect *)m_children.last())->type()==t && // of same type
       t!=DocSimpleSect::User)                            // but not user defined
   {
     // append to previous section
     ss=(DocSimpleSect *)m_children.last();
+    delete l_title;
   }
-  else // start new section
+  else 
+  if( ss == NULL )// start new section
   {
     ss=new DocSimpleSect(this,t);
+    if( l_title != NULL ) {
+      l_title->setParent(ss);
+      ss->setTitle(l_title);
+    }
     m_children.append(ss);
   }
   int rv = RetVal_OK;
@@ -4144,8 +4324,9 @@
   }
   else
   {
-    rv = ss->parse(t==DocSimpleSect::User);
+    rv = ss->parse();
   }
+  
   return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
 }
 
@@ -4586,6 +4767,9 @@
     case CMD_ATTENTION:
       retval = handleSimpleSection(DocSimpleSect::Attention);
       break;
+    case CMD_PROGRESSION:
+      retval = handleSimpleSection(DocSimpleSect::Progression);
+      break;
     case CMD_PAR:
       retval = handleSimpleSection(DocSimpleSect::User);
       break;
@@ -5968,18 +6152,17 @@
   doctokenizerYYsetStatePara();
   int retval=0;
 
-  // first parse any number of paragraphs
-  bool isFirst=TRUE;
-  DocPara *lastPar=0;
+  if( m_lastPar ) m_lastPar->markLast(FALSE);
+
   do
   {
     DocPara *par = new DocPara(this);
-    if (isFirst) { par->markFirst(); isFirst=FALSE; }
+    if (m_children.isEmpty()) { par->markFirst(); }
     retval=par->parse();
     if (!par->isEmpty()) 
     {
       m_children.append(par);
-      lastPar=par;
+      m_lastPar=par;
     }
     else
     {
@@ -6002,7 +6185,7 @@
       warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found paragraph command outside of subsubsection context!");
     }
   } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal);
-  if (lastPar) lastPar->markLast();
+  if (m_lastPar) m_lastPar->markLast();
 
   // then parse any number of level1 sections
   while (retval==RetVal_Section)
@@ -6038,9 +6221,9 @@
 
 //--------------------------------------------------------------------------
 
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocNode *validatingParseDoc(QList<ParseRequest> requests,
                             Definition *ctx,MemberDef *md,
-                            const char *input,bool indexWords,
+                            bool indexWords,
                             bool isExample, const char *exampleName,
                             bool singleLine, bool linkFromIndex)
 {
@@ -6155,38 +6338,51 @@
     g_searchUrl="";
   }
 
-  g_fileName = fileName;
-  g_relPath = (!linkFromIndex && ctx) ? 
+  DocRoot *root = new DocRoot(md!=0,singleLine);
+
+  QListIterator<ParseRequest> l_requests(requests);
+  ParseRequest *l_request;
+  for( l_requests.toFirst();(l_request=l_requests.current());++l_requests)
+  {
+    g_fileName = l_request->fileName;
+  	g_relPath = (!linkFromIndex && ctx) ? 
                QString(relativePathToRoot(ctx->getOutputFileBase())) : 
                QString("");
-  //printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
-  g_memberDef = md;
-  g_nodeStack.clear();
-  g_styleStack.clear();
-  g_initialStyleStack.clear();
-  g_inSeeBlock = FALSE;
-  g_insideHtmlLink = FALSE;
-  g_includeFileText = "";
-  g_includeFileOffset = 0;
-  g_includeFileLength = 0;
-  g_isExample = isExample;
-  g_exampleName = exampleName;
-  g_hasParamCommand = FALSE;
-  g_hasReturnCommand = FALSE;
-  g_paramsFound.setAutoDelete(FALSE);
-  g_paramsFound.clear();
-  g_sectionDict = 0; //sections;
+  	//printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
+  	g_memberDef = md;
+  	g_nodeStack.clear();
+  	g_styleStack.clear();
+  	g_initialStyleStack.clear();
+  	g_inSeeBlock = FALSE;
+  	g_insideHtmlLink = FALSE;
+  	g_includeFileText = "";
+  	g_includeFileOffset = 0;
+  	g_includeFileLength = 0;
+  	g_isExample = isExample;
+  	g_exampleName = exampleName;
+  	g_hasParamCommand = FALSE;
+  	g_hasReturnCommand = FALSE;
+  	g_paramsFound.setAutoDelete(FALSE);
+  	g_paramsFound.clear();
+  	g_sectionDict = 0; //sections;
   
-  //printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
-  doctokenizerYYlineno=startLine;
-  doctokenizerYYinit(input,g_fileName);
+  	//printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
+  	doctokenizerYYlineno=l_request->startLine;
 
+    QCString l_input(l_request->docString);
+    if( l_input.at(l_input.length()-1) != '\n' ) {
+      l_input += '\n';
+    }
+    doctokenizerYYinit(l_input.data(),g_fileName.data());
 
-  // build abstract syntax tree
-  DocRoot *root = new DocRoot(md!=0,singleLine);
-  root->parse();
+  	// build abstract syntax tree
+  	root->parse();
+    
+    checkUndocumentedParams();
+    detectNoDocumentedParams();
+  }
 
-
+  //if( true )
   if (Debug::isFlagSet(Debug::PrintTree))
   {
     // pretty print the result
@@ -6196,8 +6392,6 @@
   }
 
 
-  checkUndocumentedParams();
-  detectNoDocumentedParams();
 
   // TODO: These should be called at the end of the program.
   //doctokenizerYYcleanup();
Index: src/classdef.cpp
===================================================================
--- src/classdef.cpp	(revision 637)
+++ src/classdef.cpp	(working copy)
@@ -866,7 +866,10 @@
     // repeat brief description
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = {briefFile(), briefDescription(), briefLine()};
+      l_requests.append(&l_brief);
+      ol.parseDoc(l_requests,this,0,FALSE,FALSE);
     }
     if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
         !documentation().isEmpty())
@@ -883,8 +886,11 @@
     // write documentation
     if (!documentation().isEmpty())
     {
+      QList<ParseRequest> l_requests;
+      ParseRequest l_docs = {docFile(), documentation(), docLine()};
+      l_requests.append(&l_docs);
       //ol.newParagraph();
-      ol.parseDoc(docFile(),docLine(),this,0,documentation(),TRUE,FALSE);
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     }
     // write type constraints
     writeTypeConstraints(ol,this,m_impl->typeConstraints);
@@ -1254,7 +1260,11 @@
   {
     if (!Config_getBool("DETAILS_AT_TOP")) 
     {
-      ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_brief = {briefFile(), briefDescription(), briefLine()};
+      l_requests.append(&l_brief);
+
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
       ol.pushGeneratorState();
       ol.disable(OutputGenerator::RTF);
       ol.writeString(" \n");
Index: src/htmldocvisitor.cpp
===================================================================
--- src/htmldocvisitor.cpp	(revision 637)
+++ src/htmldocvisitor.cpp	(working copy)
@@ -514,6 +514,8 @@
       m_t << theTranslator->trRemarks(); break;
     case DocSimpleSect::Attention:
       m_t << theTranslator->trAttention(); break;
+    case DocSimpleSect::Progression:
+      m_t << theTranslator->trProgression(); break;
     case DocSimpleSect::User: break;
     case DocSimpleSect::Rcs: break;
     case DocSimpleSect::Unknown:  break;
Index: src/translator_br.h
===================================================================
--- src/translator_br.h	(revision 637)
+++ src/translator_br.h	(working copy)
@@ -32,7 +32,7 @@
 #ifndef TRANSLATOR_BR_H
 #define TRANSLATOR_BR_H
 
-class TranslatorBrazilian : public Translator
+class TranslatorBrazilian : public TranslatorAdapter_1_5_6
 {
   public:
 
Index: src/memberdef.cpp
===================================================================
--- src/memberdef.cpp	(revision 637)
+++ src/memberdef.cpp	(working copy)
@@ -1453,7 +1453,11 @@
      )
   {
     ol.startMemberDescription();
-    ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():d,this,briefDescription(),TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = {briefFile(), briefDescription(), briefLine()};
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,getOuterScope()?getOuterScope():d,this,TRUE,FALSE);
     if (detailsVisible) 
     {
       ol.pushGeneratorState();
@@ -1938,27 +1942,43 @@
       ) 
      )  
   { 
-    ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = {briefFile(),brief,briefLine()};
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,getOuterScope()?getOuterScope():container,this,FALSE,FALSE);
     ol.newParagraph();
   }
 
   /* write detailed description */
   if (!detailed.isEmpty() || !m_impl->inbodyDocs.isEmpty())
   { 
-    ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_doc = {docFile(),detailed+"\n",docLine()};
+    ParseRequest l_inbody;
+	
+    l_requests.append(&l_doc);
     if (!m_impl->inbodyDocs.isEmpty())
     {
-      ol.newParagraph();
-      ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_impl->inbodyDocs+"\n",TRUE,FALSE);
+      l_inbody.fileName = inbodyFile();
+      l_inbody.startLine = inbodyLine();
+      l_inbody.docString = m_impl->inbodyDocs+"\n";
+      l_requests.append(&l_inbody);
     }
+	
+    ol.parseDoc(l_requests,getOuterScope()?getOuterScope():container,this,TRUE,FALSE);
   }
   else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
         !Config_getBool("BRIEF_MEMBER_DESC")))
   {
     if (!m_impl->inbodyDocs.isEmpty())
     {
+      QList<ParseRequest> l_requests;
+      ParseRequest l_inbody = {inbodyFile(),m_impl->inbodyDocs+"\n",inbodyLine()};
+      l_requests.append(&l_inbody);
+
       ol.newParagraph();
-      ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_impl->inbodyDocs+"\n",TRUE,FALSE);
+      ol.parseDoc(l_requests,getOuterScope()?getOuterScope():container,this,TRUE,FALSE);
     }
   }
 
@@ -1982,10 +2002,14 @@
         ol.docify(a->name);
         ol.endDescTableTitle();
         ol.startDescTableData();
-        ol.parseDoc(docFile(),docLine(),
+		
+        QList<ParseRequest> l_requests;
+        ParseRequest l_doc = {docFile(),a->docs+"\n",docLine()};
+        l_requests.append(&l_doc);
+
+        ol.parseDoc(l_requests,
                     getOuterScope()?getOuterScope():container,
                     this,         // memberDef
-                    a->docs+"\n", // docStr
                     TRUE,         // indexWords
                     FALSE         // isExample
                    );
@@ -2051,7 +2075,11 @@
 
           if (!fmd->briefDescription().isEmpty())
           { 
-            ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE);
+            QList<ParseRequest> l_requests;
+            ParseRequest l_brief = {fmd->briefFile(),fmd->briefDescription(),fmd->briefLine()};
+            l_requests.append(&l_brief);
+
+            ol.parseDoc(l_requests,getOuterScope()?getOuterScope():container,fmd,TRUE,FALSE);
             //ol.newParagraph();
           }
           if (!fmd->briefDescription().isEmpty() && 
@@ -2061,7 +2089,11 @@
           }
           if (!fmd->documentation().isEmpty())
           { 
-            ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE);
+            QList<ParseRequest> l_requests;
+            ParseRequest l_doc = {fmd->docFile(),fmd->documentation()+"\n",fmd->docLine()};
+            l_requests.append(&l_doc);
+
+            ol.parseDoc(l_requests,getOuterScope()?getOuterScope():container,fmd,TRUE,FALSE);
           }
           ol.endDescTableData();
         }
Index: src/docparser.h
===================================================================
--- src/docparser.h	(revision 637)
+++ src/docparser.h	(working copy)
@@ -33,6 +33,7 @@
 class Definition;
 class MemberGroup;
 class SectionDict;
+struct ParseRequest;
 
 //---------------------------------------------------------------------------
 
@@ -42,13 +43,10 @@
 void finializeDocParser();
 
 /*! Main entry point for the documentation parser.
- *  @param fileName  File in which the documentation block is found (or the
- *                   name of the example file in case isExample is TRUE).
- *  @param startLine Line at which the documentation block is found.
+ *  @param requests  List of Inputs To Parse, Each in the form of a ParseRequest
  *  @param context   Class or namespace to which this block belongs.
  *  @param md        Member definition to which the documentation belongs.
  *                   Can be 0.
- *  @param input     String representation of the documentation block.
  *  @param indexWords Indicates whether or not words should be put in the 
  *                   search index.
  *  @param isExample TRUE if the documentation belongs to an example.
@@ -61,9 +59,9 @@
  *  @returns         Root node of the abstract syntax tree. Ownership of the
  *                   pointer is handed over to the caller.
  */
-DocNode *validatingParseDoc(const char *fileName,int startLine,
+DocNode *validatingParseDoc(QList<ParseRequest> requests,
                             Definition *context, MemberDef *md,
-                            const char *input,bool indexWords,
+                            bool indexWords,
                             bool isExample,const char *exampleName=0,
                             bool singleLine=FALSE,bool linkFromIndex=FALSE);
 
@@ -78,6 +76,7 @@
                      MemberGroup *m,
                      const char *fileName);
 
+
 //---------------------------------------------------------------------------
 
 /*! @brief Abstract node interface with type information. */
@@ -146,6 +145,8 @@
     /*! Returns the parent of this node or 0 for the root node. */
     virtual DocNode *parent() const = 0;
 
+	virtual void setParent(DocNode *n) = 0;
+
     /*! Acceptor function for node visitors. Part of the visitor pattern. 
      *  @param v Abstract visitor.
      */
@@ -178,6 +179,8 @@
       v->visitPost(obj); 
     }
   
+ 	QList<DocNode> &children() { return m_children; }
+
   protected:
     QList<DocNode> m_children;
 };
@@ -193,6 +196,7 @@
     Kind kind() const { return Kind_Word; }
     DocNode *parent() const { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -216,6 +220,7 @@
     QString anchor() const     { return m_anchor; }
     QString tooltip() const    { return m_tooltip; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -238,6 +243,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
     bool isEmail() const       { return m_isEmail; }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -254,6 +260,7 @@
     Kind kind() const          { return Kind_LineBreak; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -268,6 +275,7 @@
     Kind kind() const          { return Kind_HorRuler; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -283,6 +291,7 @@
     QString anchor() const     { return m_anchor; }
     QString file() const       { return m_file; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -310,6 +319,7 @@
     DocNode *parent() const               { return m_parent; }
     void accept(DocVisitor *v)            { v->visit(this); }
     const HtmlAttribList &attribs() const { return m_attribs; }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -336,6 +346,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
     static SymType decodeSymbol(const QString &symName,char *letter);
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -353,6 +364,7 @@
     QString chars() const      { return m_chars; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
   private:
     DocNode *m_parent;
     QString  m_chars;
@@ -375,6 +387,7 @@
     bool isExample() const      { return m_isExample; }
     QString exampleFile() const { return m_exampleFile; }
     QString relPath() const     { return m_relPath; }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -413,6 +426,7 @@
     QString exampleFile() const { return m_exampleFile; }
     void accept(DocVisitor *v)  { v->visit(this); }
     void parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -448,6 +462,7 @@
     bool isExample() const      { return m_isExample; }
     QString exampleFile() const { return m_exampleFile; }
     void parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -473,6 +488,7 @@
     int id() const             { return m_id; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { v->visit(this); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -492,6 +508,7 @@
     DocNode *parent() const      { return m_parent; }
     void accept(DocVisitor *v)   { v->visit(this); }
     QString entry()              { return m_entry; }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -512,6 +529,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocCopy>::accept(this,v); }
     void parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -535,6 +553,7 @@
     int depth() const          { return m_depth; }
     void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -555,6 +574,9 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocTitle>::accept(this,v); }
 
+	QCString internalName() const;
+	void setParent(DocNode*n) { m_parent = n; };
+
   private:
     DocNode *m_parent;
 };
@@ -574,6 +596,7 @@
     QString key() const        { return m_key; }
     void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); }
     bool parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -602,6 +625,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
     void parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -629,6 +653,8 @@
     DocNode *parent() const    { return m_parent; }
     QString context() const    { return m_context; }
     void accept(DocVisitor *v) { CompAccept<DocDotFile>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
+
   private:
     DocNode *m_parent;
     QString  m_name;
@@ -652,6 +678,7 @@
     QString anchor() const     { return m_anchor; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocLink>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -679,6 +706,7 @@
     bool refToAnchor() const     { return m_refToAnchor; }
     bool refToSection() const    { return m_refToSection; }
     void accept(DocVisitor *v)   { CompAccept<DocRef>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode * m_parent;
@@ -703,6 +731,7 @@
     QString anchor() const       { return m_anchor; }
     DocNode *parent() const      { return m_parent; }
     void accept(DocVisitor *v)   { CompAccept<DocInternalRef>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode * m_parent;
@@ -740,6 +769,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); }
     const HtmlAttribList &attribs() const { return m_attribs; }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode * m_parent;
@@ -759,6 +789,7 @@
     DocNode *parent() const               { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocHtmlHeader>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -777,6 +808,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     void accept(DocVisitor *v) { CompAccept<DocHtmlDescTitle>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -794,6 +826,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     void accept(DocVisitor *v) { CompAccept<DocHtmlDescList>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -815,6 +848,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocSection>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -838,6 +872,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); }
     void parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -855,6 +890,7 @@
     Kind kind() const          { return Kind_SecRefList; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocSecRefList>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode  *m_parent;
@@ -869,6 +905,7 @@
     Kind kind() const          { return Kind_Internal; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocInternal>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode  *m_parent;
@@ -883,6 +920,7 @@
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocSimpleList>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -902,6 +940,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
     int parseXml();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -916,7 +955,8 @@
     enum Type 
     {  
        Unknown, See, Return, Author, Authors, Version, Since, Date,
-       Note, Warning, Pre, Post, Invar, Remark, Attention, User, Rcs
+       Note, Warning, Pre, Post, Invar, Remark, Attention, User, Rcs,
+       Progression
     };
     DocSimpleSect(DocNode *parent,Type t);
     virtual ~DocSimpleSect();
@@ -925,11 +965,15 @@
     QCString typeString() const;
     DocNode *parent() const { return m_parent; }
     void accept(DocVisitor *v);
-    int parse(bool userTitle);
+    int parse();
     int parseRcs();
     int parseXml();
     void appendLinkWord(const QString &word);
 
+    void setParent(DocNode*n) { m_parent = n; };
+	  void setTitle(DocTitle *t) { m_title = t; };
+    const DocTitle *title() const { return m_title; }
+
   private:
     DocNode *       m_parent;
     Type            m_type;
@@ -955,6 +999,7 @@
     Type type() const          { return m_type; }
     DocNode *parent() const    { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *       m_parent;
@@ -1000,6 +1045,8 @@
     int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level);
     bool injectToken(int tok,const QString &tokText);
 
+	void setParent(DocNode *n) { m_parent = n; };
+
   private:
     DocNode *m_parent;
     QString  m_sectionId;
@@ -1035,6 +1082,8 @@
     int parse(const QString &cmdName);
     int parseXml(const QString &paramName);
 
+	void setParent(DocNode*n) { m_parent = n; };
+
   private:
     DocNode *               m_parent;
     QList<DocPara>          m_paragraphs;
@@ -1063,6 +1112,7 @@
     }
     int parse();
 
+	void setParent(DocNode*n) { m_parent = n; };
   private:
     DocNode *m_parent;
     DocPara *m_paragraph;
@@ -1085,6 +1135,7 @@
       m_paragraph->accept(v);
       v->visitPost(this); 
     }
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *m_parent;
@@ -1104,6 +1155,7 @@
     void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); }
     int parse();
     int parseXml();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *      m_parent;
@@ -1122,6 +1174,7 @@
     DocNode *parent() const               { return m_parent; }
     void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -1146,6 +1199,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
     int parseXml();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *      m_parent;
@@ -1166,6 +1220,7 @@
     void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); }
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *     m_parent;
@@ -1186,6 +1241,7 @@
     const HtmlAttribList &attribs() const { return m_attribs; }
     int parse();
     int parseXml(bool header);
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *  m_parent;
@@ -1209,6 +1265,7 @@
     int parseXml();
     uint numCols() const;
     void accept(DocVisitor *v);
+	void setParent(DocNode*n) { m_parent = n; };
 
   private:
     DocNode *          m_parent;
@@ -1225,24 +1282,30 @@
     DocNode *parent() const { return 0; }
     void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
     void parse();
+	void setParent(DocNode*) { };
 };
 
 /*! @brief Root node of documentation tree */
 class DocRoot : public CompAccept<DocRoot>, public DocNode
 {
   public:
-    DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl) {}
+    DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl), m_lastPar(NULL) {}
     Kind kind() const       { return Kind_Root; }
     DocNode *parent() const { return 0; }
     void accept(DocVisitor *v) { CompAccept<DocRoot>::accept(this,v); }
     void parse();
     bool indent() const { return m_indent; }
     bool singleLine() const { return m_singleLine; }
+	void setParent(DocNode*) { };
 
   private:
     bool m_indent;
     bool m_singleLine;
+
+	DocPara *m_lastPar;
 };
 
 
+QCString getSimpleSectTypeString(DocSimpleSect::Type t);
+
 #endif
Index: src/translator_nl.h
===================================================================
--- src/translator_nl.h	(revision 637)
+++ src/translator_nl.h	(working copy)
@@ -18,7 +18,7 @@
 #ifndef TRANSLATOR_NL_H
 #define TRANSLATOR_NL_H
 
-class TranslatorDutch : public Translator
+class TranslatorDutch : public TranslatorAdapter_1_5_6
 {
   public:
     QCString idLanguage()
Index: src/xmlgen.cpp
===================================================================
--- src/xmlgen.cpp	(revision 637)
+++ src/xmlgen.cpp	(working copy)
@@ -27,6 +27,7 @@
 #include "util.h"
 #include "defargs.h"
 #include "outputgen.h"
+#include "outputlist.h"
 #include "dot.h"
 #include "pagedef.h"
 #include "filename.h"
@@ -479,7 +480,12 @@
   QCString stext = text.stripWhiteSpace();
   if (stext.isEmpty()) return;
   // convert the documentation string into an abstract syntax tree
-  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE,FALSE);
+
+  QList<ParseRequest> l_requests;
+  ParseRequest l_text = {fileName,text+"\n",lineNr};
+  l_requests.append(&l_text);
+
+  DocNode *root = validatingParseDoc(l_requests,scope,md,FALSE,FALSE);
   // create a code generator
   XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
   // create a parse tree visitor for XML
Index: src/pagedef.cpp
===================================================================
--- src/pagedef.cpp	(revision 637)
+++ src/pagedef.cpp	(working copy)
@@ -104,8 +104,12 @@
   if (!title().isEmpty() && !name().isEmpty() &&
       (si=Doxygen::sectionDict.find(pageName))!=0)
   {
+    QList<ParseRequest> l_requests;
+    ParseRequest l_doc = {docFile(),si->title,docLine()};
+    l_requests.append(&l_doc);
+
     ol.startSection(si->label,si->title,si->type);
-    ol.parseDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE);
+    ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     stringToSearchIndex(getOutputFileBase(),
                         theTranslator->trPage(TRUE,TRUE)+" "+si->title,
                         si->title);
@@ -146,12 +150,14 @@
 
 void PageDef::writePageDocumentation(OutputList &ol)
 {
+  QList<ParseRequest> l_requests;
+  ParseRequest l_doc = {docFile(),documentation(),docLine()};
+  l_requests.append(&l_doc);
+
   ol.startTextBlock();
-  ol.parseDoc(docFile(),   // fileName
-      docLine(),           // startLine
+  ol.parseDoc(l_requests,  // parse requests
       this,                // context
       0,                   // memberdef
-      documentation(),     // docStr
       TRUE,                // index words
       FALSE                // not an example
       );
Index: src/translator_adapter.h
===================================================================
--- src/translator_adapter.h	(revision 637)
+++ src/translator_adapter.h	(working copy)
@@ -41,10 +41,22 @@
 
 };
 
-class TranslatorAdapter_1_5_4 : public TranslatorAdapterBase
+class TranslatorAdapter_1_5_6 : public TranslatorAdapterBase
 {
   public:
     virtual QCString updateNeededMessage()
+    { return createUpdateNeededMessage(idLanguage(),"release 1.5.6"); }
+
+    virtual QCString trProgression()
+    {
+      return english.trProgression();
+    }
+};
+
+class TranslatorAdapter_1_5_4 : public TranslatorAdapter_1_5_6
+{
+  public:
+    virtual QCString updateNeededMessage()
     { return createUpdateNeededMessage(idLanguage(),"release 1.5.4"); }
 
     virtual QCString trMemberFunctionDocumentationFortran()
Index: src/index.cpp
===================================================================
--- src/index.cpp	(revision 637)
+++ src/index.cpp	(working copy)
@@ -834,10 +834,17 @@
         if (hasBrief)
         {
           //ol.docify(" (");
+          QList<ParseRequest> l_requests;
+          ParseRequest l_brief = { 
+            fd->briefFile(), 
+            abbreviate(fd->briefDescription(), fd->name()),
+            fd->briefLine()
+          };
+          l_requests.append(&l_brief);
+
           ol.parseDoc(
-              fd->briefFile(),fd->briefLine(),
+              l_requests,
               fd,0,
-              abbreviate(fd->briefDescription(),fd->name()),
               FALSE, // index words
               FALSE, // isExample
               0,     // example name
@@ -953,10 +960,17 @@
       if (hasBrief)
       {
         //ol.docify(" (");
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = {
+          nd->briefFile(),
+          abbreviate(nd->briefDescription(),nd->displayName()),
+          nd->briefLine()
+        };
+        l_requests.append(&l_brief);
+
         ol.parseDoc(
-                 nd->briefFile(),nd->briefLine(),
+                 l_requests,
                  nd,0,
-                 abbreviate(nd->briefDescription(),nd->displayName()),
                  FALSE, // index words
                  FALSE, // isExample
                  0,     // example name
@@ -1061,10 +1075,17 @@
       ol.startIndexValue(hasBrief);
       if (hasBrief)
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = {
+          cd->briefFile(),
+          abbreviate(cd->briefDescription(),cd->displayName()),
+          cd->briefLine()
+        };
+        l_requests.append(&l_brief);
+
         ol.parseDoc(
-                 cd->briefFile(),cd->briefLine(),
+                 l_requests,
                  cd,0,
-                 abbreviate(cd->briefDescription(),cd->displayName()),
                  FALSE,  // indexWords
                  FALSE,  // isExample
                  0,     // example name
@@ -2340,7 +2361,12 @@
   bool oldStripCommentsState = Config_getBool("STRIP_CODE_COMMENTS");
   // temporarily disable the stripping of comments for our own code example!
   Config_getBool("STRIP_CODE_COMMENTS") = FALSE;
-  ol.parseDoc("graph_legend",1,0,0,theTranslator->trLegendDocs(),FALSE,FALSE);
+
+  QList<ParseRequest> l_requests;
+  ParseRequest l_legend = {"graph_legend",theTranslator->trLegendDocs(), 1};
+  l_requests.append(&l_legend);
+
+  ol.parseDoc(l_requests,0,0,FALSE,FALSE);
   Config_getBool("STRIP_CODE_COMMENTS") = oldStripCommentsState;
   endFile(ol);
   ol.popGeneratorState();
@@ -2859,7 +2885,16 @@
   if (!Config_getString("PROJECT_NUMBER").isEmpty())
   {
     ol.startProjectNumber();
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),TRUE,FALSE);
+
+    QList<ParseRequest> l_requests;
+    ParseRequest l_def = {
+        defFileName,
+        Config_getString("PROJECT_NUMBER"),
+        defLine
+    };
+    l_requests.append(&l_def);
+
+    ol.parseDoc(l_requests,Doxygen::mainPage,0,TRUE,FALSE);
     ol.endProjectNumber();
   }
   if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) 
@@ -2870,8 +2905,16 @@
   if (Doxygen::mainPage)
   {
     Doxygen::insideMainPage=TRUE;
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
-                Doxygen::mainPage->documentation(),TRUE,FALSE
+	
+    QList<ParseRequest> l_requests;
+    ParseRequest l_def = {
+      defFileName,
+      Doxygen::mainPage->documentation(),
+      defLine
+    };
+    l_requests.append(&l_def);
+
+    ol.parseDoc(l_requests,Doxygen::mainPage,0,TRUE,FALSE
                 /*,Doxygen::mainPage->sectionDict*/);
 
     if (!Config_getString("GENERATE_TAGFILE").isEmpty())
@@ -2920,8 +2963,16 @@
 
   if (!Config_getString("PROJECT_NUMBER").isEmpty())
   {
+    QList<ParseRequest> l_requests;
+    ParseRequest l_def = {
+      defFileName,
+      Config_getString("PROJECT_NUMBER"),
+      defLine
+    };
+    l_requests.append(&l_def);
+
     ol.startProjectNumber(); 
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
+    ol.parseDoc(l_requests,Doxygen::mainPage,0,FALSE,FALSE);
     ol.endProjectNumber();
   }
   ol.endIndexSection(isTitlePageStart);
@@ -3074,9 +3125,16 @@
     ol.disable(OutputGenerator::Man);
     startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
     ol.startTextBlock();
-    ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
-                Doxygen::mainPage->documentation(),FALSE,FALSE
-               );
+
+    QList<ParseRequest> l_requests;
+    ParseRequest l_def = {
+      defFileName,
+      Doxygen::mainPage->documentation(),
+      defLine
+    };
+    l_requests.append(&l_def);
+
+    ol.parseDoc(l_requests,Doxygen::mainPage,0,FALSE,FALSE);
     ol.endTextBlock();
     endFile(ol);
     ol.enable(OutputGenerator::Man);
Index: src/translator_tw.h
===================================================================
--- src/translator_tw.h	(revision 637)
+++ src/translator_tw.h	(working copy)
@@ -41,7 +41,7 @@
 // Translator class (by the local maintainer) when the localized
 // translator is made up-to-date again.
 
-class TranslatorChinesetraditional : public Translator
+class TranslatorChinesetraditional : public TranslatorAdapter_1_5_6
 {
   public:
 
Index: src/groupdef.cpp
===================================================================
--- src/groupdef.cpp	(revision 637)
+++ src/groupdef.cpp	(working copy)
@@ -525,7 +525,11 @@
       // repeat brief description
       if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
       {
-        ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
+        ol.parseDoc(l_requests,this,0,FALSE,FALSE);
         ol.newParagraph();
       }
     }
@@ -533,7 +537,11 @@
     // write documentation
     if (!documentation().isEmpty())
     {
-      ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
+      QList<ParseRequest> l_requests;
+      ParseRequest l_doc = { docFile(), documentation()+"\n", docLine() };
+      l_requests.append(&l_doc);
+
+      ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     }
   }
 }
@@ -586,7 +594,11 @@
   }
   else if (!briefDescription().isEmpty())
   {
-    ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
+    QList<ParseRequest> l_requests;
+    ParseRequest l_brief = { briefFile(), briefDescription(), briefLine() };
+    l_requests.append(&l_brief);
+
+    ol.parseDoc(l_requests,this,0,TRUE,FALSE);
     ol.writeString(" \n");
     ol.pushGeneratorState();
     ol.disable(OutputGenerator::Latex);
@@ -632,8 +644,12 @@
       ol.endMemberItem();
       if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), fd->briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE);
+        ol.parseDoc(l_requests,fd,0,FALSE,FALSE);
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -667,8 +683,12 @@
       ol.endMemberItem();
       if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), gd->briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE);
+        ol.parseDoc(l_requests,gd,0,FALSE,FALSE);
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -698,8 +718,12 @@
       }
       if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
       {
+        QList<ParseRequest> l_requests;
+        ParseRequest l_brief = { briefFile(), dd->briefDescription(), briefLine() };
+        l_requests.append(&l_brief);
+
         ol.startMemberDescription();
-        ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE);
+        ol.parseDoc(l_requests,dd,0,FALSE,FALSE);
         ol.endMemberDescription();
         ol.newParagraph();
       }
@@ -770,7 +794,12 @@
         ol.endSection(si->label,SectionInfo::Subsection);
       }
       ol.startTextBlock();
-      ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation(),TRUE,FALSE);
+
+      QList<ParseRequest> l_requests;
+      ParseRequest l_doc = { pd->docFile(), pd->documentation(), pd->docLine() };
+      l_requests.append(&l_doc);
+
+      ol.parseDoc(l_requests,pd,0,TRUE,FALSE);
       ol.endTextBlock();
     }
   }
Index: src/cmdmapper.h
===================================================================
--- src/cmdmapper.h	(revision 637)
+++ src/cmdmapper.h	(working copy)
@@ -112,7 +112,8 @@
   CMD_INHERITDOC   = 78,
   CMD_TPARAM       = 79 | SIMPLESECT_BIT,
   CMD_COPYBRIEF    = 80,
-  CMD_COPYDETAILS  = 81
+  CMD_COPYDETAILS  = 81,
+  CMD_PROGRESSION  = 82 | SIMPLESECT_BIT
 };
 
 enum HtmlTagType
Index: src/translator_en.h
===================================================================
--- src/translator_en.h	(revision 637)
+++ src/translator_en.h	(working copy)
@@ -1776,6 +1776,14 @@
       return "Type Constraints";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.5.6 
+//////////////////////////////////////////////////////////////////////////
+    
+    virtual QCString trProgression()
+    {
+      return "Progression of Events";
+    }
 };
 
 #endif
Index: src/translator_it.h
===================================================================
--- src/translator_it.h	(revision 637)
+++ src/translator_it.h	(working copy)
@@ -80,7 +80,7 @@
 #ifndef TRANSLATOR_IT_H
 #define TRANSLATOR_IT_H
 
-class TranslatorItalian : public Translator
+class TranslatorItalian : public TranslatorAdapter_1_5_6
 {
   public:
 
Index: src/outputlist.cpp
===================================================================
--- src/outputlist.cpp	(revision 637)
+++ src/outputlist.cpp	(working copy)
@@ -130,14 +130,14 @@
   }
 }
 
-void OutputList::parseDoc(const char *fileName,int startLine,
+void OutputList::parseDoc(QList<ParseRequest> requests,
                   Definition *ctx,MemberDef * md,
-                  const QCString &docStr,bool indexWords,
+                  bool indexWords,
                   bool isExample,const char *exampleName,
                   bool singleLine,bool linkFromIndex)
 {
   int count=0;
-  if (docStr.isEmpty()) return;
+  if (requests.isEmpty()) return;
   
   OutputGenerator *og=outputs->first();
   while (og)
@@ -148,18 +148,7 @@
   if (count==0) return; // no output formats enabled.
 
   DocNode *root=0;
-  if (docStr.at(docStr.length()-1)=='\n')
-  {
-    root = validatingParseDoc(fileName,startLine,
-                              ctx,md,docStr,indexWords,isExample,exampleName,
-                              singleLine,linkFromIndex);
-  }
-  else
-  {
-    root = validatingParseDoc(fileName,startLine,
-                              ctx,md,docStr+"\n",indexWords,isExample,exampleName,
-                              singleLine,linkFromIndex);
-  }
+  root = validatingParseDoc(requests,ctx,md,indexWords,isExample,exampleName,singleLine,linkFromIndex);
 
   og=outputs->first();
   while (og)
Index: doc/language.doc
===================================================================
--- doc/language.doc	(revision 637)
+++ doc/language.doc	(working copy)
@@ -23,7 +23,7 @@
 than English (the default). The output language is chosen through the
 configuration file (with default name and known as Doxyfile).
 
-Currently (version 1.5.5), 34 languages 
+Currently (version 1.5.6), 34 languages 
 are supported (sorted alphabetically):
 Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
 Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
@@ -67,7 +67,7 @@
     <td>Brazilian Portuguese</td>
     <td>Fabio "FJTC" Jun Takada Chino</td>
     <td>jun-chino at uol dot com dot br</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Catalan</td>
@@ -79,25 +79,25 @@
     <td>Chinese</td>
     <td>Li Daobing<br>Wei Liu</td>
     <td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese Traditional</td>
     <td>Daniel YC Lin<br>Gary Lee</td>
     <td>dlin.tw at gmail dot com<br>garywlee at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Croatian</td>
     <td>Boris Bralo</td>
     <td>boris.bralo at zg dot htnet dot hr</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Czech</td>
     <td>Petr P&#x0159;ikryl</td>
     <td>prikrylp at skil dot cz</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Danish</td>
@@ -109,7 +109,7 @@
     <td>Dutch</td>
     <td>Dimitri van Heesch</td>
     <td>dimitri at stack dot nl</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>English</td>
@@ -133,7 +133,7 @@
     <td>German</td>
     <td>Jens Seidel</td>
     <td>jensseidel at users dot sf dot net</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Greek</td>
@@ -157,7 +157,7 @@
     <td>Italian</td>
     <td>Alessandro Falappa<br>Ahmed Aldo Faisal</td>
     <td>alessandro at falappa dot net<br>aaf23 at cam dot ac dot uk</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Japanese</td>
@@ -175,7 +175,7 @@
     <td>Korean</td>
     <td>Kim Taedong<br>SooYoung Jung<br>Richard Kim</td>
     <td>fly1004 at gmail dot com<br>jung5000 at gmail dot com<br>ryk at dspwiz dot com</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>KoreanEn</td>
@@ -205,7 +205,7 @@
     <td>Persian</td>
     <td>Ali Nadalizadeh</td>
     <td>nadalizadeh at gmail dot com</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Polish</td>
@@ -229,7 +229,7 @@
     <td>Russian</td>
     <td>Alexandr Chelpanov</td>
     <td>cav at cryptopro dot ru</td>
-    <td>up-to-date</td>
+    <td>1.5.6</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Serbian</td>
@@ -253,7 +253,7 @@
     <td>Spanish</td>
     <td>Bartomeu<br>Francisco Oltra Thennet</td>
     <td>bartomeu at loteria3cornella dot com<br>foltra at puc dot cl</td>
-    <td>up-to-date</td>
+    <td>1.5.06</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Swedish</td>
@@ -286,24 +286,24 @@
   \hline
   Arabic & Moaz Reyad & {\tt\tiny moazreyad@yahoo.com} & 1.4.6 \\
   \hline
-  Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino@uol.com.br} & up-to-date \\
+  Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino@uol.com.br} & 1.5.6 \\
   \hline
   Catalan & Maximiliano Pin & {\tt\tiny max.pin@bitroit.com} & 1.5.4 \\
   ~ & Albert Mora & {\tt\tiny amora@iua.upf.es} & ~ \\
   \hline
-  Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & up-to-date \\
+  Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.5.6 \\
   ~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\
   \hline
-  Chinese Traditional & Daniel YC Lin & {\tt\tiny dlin.tw@gmail.com} & up-to-date \\
+  Chinese Traditional & Daniel YC Lin & {\tt\tiny dlin.tw@gmail.com} & 1.5.6 \\
   ~ & Gary Lee & {\tt\tiny garywlee@gmail.com} & ~ \\
   \hline
-  Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & up-to-date \\
+  Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & 1.5.6 \\
   \hline
-  Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\
+  Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & 1.5.6 \\
   \hline
   Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & 1.5.4 \\
   \hline
-  Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
+  Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & 1.5.6 \\
   \hline
   English & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
   \hline
@@ -311,7 +311,7 @@
   \hline
   French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & 1.5.4 \\
   \hline
-  German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & up-to-date \\
+  German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & 1.5.6 \\
   \hline
   Greek & Paul Gessos & {\tt\tiny nickreserved@yahoo.com} & 1.5.4 \\
   \hline
@@ -320,7 +320,7 @@
   \hline
   Indonesian & Hendy Irawan & {\tt\tiny ceefour@gauldong.net} & 1.4.6 \\
   \hline
-  Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\
+  Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & 1.5.6 \\
   ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\
   \hline
   Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.5.4 \\
@@ -329,7 +329,7 @@
   \hline
   JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
   \hline
-  Korean & Kim Taedong & {\tt\tiny fly1004@gmail.com} & up-to-date \\
+  Korean & Kim Taedong & {\tt\tiny fly1004@gmail.com} & 1.5.6 \\
   ~ & SooYoung Jung & {\tt\tiny jung5000@gmail.com} & ~ \\
   ~ & Richard Kim & {\tt\tiny ryk@dspwiz.com} & ~ \\
   \hline
@@ -343,7 +343,7 @@
   \hline
   Norwegian & Lars Erik Jordet & {\tt\tiny lejordet@gmail.com} & 1.4.6 \\
   \hline
-  Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh@gmail.com} & up-to-date \\
+  Persian & Ali Nadalizadeh & {\tt\tiny nadalizadeh@gmail.com} & 1.5.6 \\
   \hline
   Polish & Piotr Kaminski & {\tt\tiny Piotr.Kaminski@ctm.gdynia.pl} & 1.4.6 \\
   ~ & Grzegorz Kowal & {\tt\tiny g\_kowal@poczta.onet.pl} & ~ \\
@@ -352,7 +352,7 @@
   \hline
   Romanian & Alexandru Iosup & {\tt\tiny aiosup@yahoo.com} & 1.4.1 \\
   \hline
-  Russian & Alexandr Chelpanov & {\tt\tiny cav@cryptopro.ru} & up-to-date \\
+  Russian & Alexandr Chelpanov & {\tt\tiny cav@cryptopro.ru} & 1.5.6 \\
   \hline
   Serbian & Dejan Milosavljevic & {\tt\tiny dmilos@email.com} & 1.4.1 \\
   \hline
@@ -360,7 +360,7 @@
   \hline
   Slovene & Matja\v{z} Ostrover\v{s}nik & {\tt\tiny matjaz.ostroversnik@ostri.org} & 1.4.6 \\
   \hline
-  Spanish & Bartomeu & {\tt\tiny bartomeu@loteria3cornella.com} & up-to-date \\
+  Spanish & Bartomeu & {\tt\tiny bartomeu@loteria3cornella.com} & 1.5.06 \\
   ~ & Francisco Oltra Thennet & {\tt\tiny foltra@puc.cl} & ~ \\
   \hline
   Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.4.6 \\
Index: doc/translator_report.txt
===================================================================
--- doc/translator_report.txt	(revision 637)
+++ doc/translator_report.txt	(working copy)
@@ -1,4 +1,4 @@
-(1.5.5)
+(1.5.6)
 
 Doxygen supports the following 34 languages (sorted alphabetically):
 
@@ -9,29 +9,17 @@
 Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and
 Ukrainian.
 
-Of them, 14 translators are up-to-date, 20 translators are based on
+Of them, 2 translators are up-to-date, 32 translators are based on
 some adapter class, and 2 are English based.
 
 ----------------------------------------------------------------------
 The following translator classes are up-to-date (sorted
 alphabetically). This means that they derive from the Translator class
-and they implement all 216 of the required methods. Anyway, there
+and they implement all 217 of the required methods. Anyway, there
 still may be some details listed even for them:
 
-  TranslatorBrazilian
-  TranslatorChinesetraditional
-  TranslatorChinese
-  TranslatorCroatian
-  TranslatorCzech
-  TranslatorDutch
   TranslatorEnglish
   TranslatorFinnish
-  TranslatorGerman
-  TranslatorItalian
-  TranslatorKorean
-  TranslatorPersian
-  TranslatorRussian
-  TranslatorSpanish -- Change the base class to Translator.
 
 ----------------------------------------------------------------------
 The following translator classes need some maintenance (the most
@@ -39,28 +27,42 @@
 version when the class was last updated and number of methods that
 must be implemented to become up-to-date:
 
-  TranslatorMacedonian            1.5.04	22 methods to implement
+  TranslatorSpanish               1.5.06	 1 method to implement
+	Note: Change the base class to TranslatorAdapter_1_5_6.
+
+  TranslatorRussian               1.5.6 	 1 method to implement
+  TranslatorPersian               1.5.6 	 1 method to implement
+  TranslatorKorean                1.5.6 	 1 method to implement
+  TranslatorItalian               1.5.6 	 1 method to implement
+  TranslatorGerman                1.5.6 	 1 method to implement
+  TranslatorDutch                 1.5.6 	 1 method to implement
+  TranslatorCzech                 1.5.6 	 1 method to implement
+  TranslatorCroatian              1.5.6 	 1 method to implement
+  TranslatorChinese               1.5.6 	 1 method to implement
+  TranslatorChinesetraditional    1.5.6 	 1 method to implement
+  TranslatorBrazilian             1.5.6 	 1 method to implement
+  TranslatorMacedonian            1.5.04	23 methods to implement
 	Note: Change the base class to TranslatorAdapter_1_5_4.
 
-  TranslatorJapanese              1.5.4 	22 methods to implement
-  TranslatorGreek                 1.5.4 	22 methods to implement
-  TranslatorFrench                1.5.4 	22 methods to implement
-  TranslatorDanish                1.5.4 	22 methods to implement
-  TranslatorCatalan               1.5.4 	22 methods to implement
-  TranslatorSwedish               1.4.6 	24 methods to implement
-  TranslatorSlovene               1.4.6 	24 methods to implement
-  TranslatorPolish                1.4.6 	23 methods to implement
-  TranslatorNorwegian             1.4.6 	23 methods to implement
-  TranslatorLithuanian            1.4.6 	24 methods to implement
-  TranslatorIndonesian            1.4.6 	23 methods to implement
-  TranslatorHungarian             1.4.6 	24 methods to implement
-  TranslatorArabic                1.4.6 	23 methods to implement
-  TranslatorAfrikaans             1.4.6 	24 methods to implement
-  TranslatorUkrainian             1.4.1 	24 methods to implement
-  TranslatorSerbian               1.4.1 	24 methods to implement
-  TranslatorRomanian              1.4.1 	24 methods to implement
-  TranslatorPortuguese            1.3.3 	35 methods to implement
-  TranslatorSlovak                1.2.18	44 methods to implement
+  TranslatorJapanese              1.5.4 	23 methods to implement
+  TranslatorGreek                 1.5.4 	23 methods to implement
+  TranslatorFrench                1.5.4 	23 methods to implement
+  TranslatorDanish                1.5.4 	23 methods to implement
+  TranslatorCatalan               1.5.4 	23 methods to implement
+  TranslatorSwedish               1.4.6 	25 methods to implement
+  TranslatorSlovene               1.4.6 	25 methods to implement
+  TranslatorPolish                1.4.6 	24 methods to implement
+  TranslatorNorwegian             1.4.6 	24 methods to implement
+  TranslatorLithuanian            1.4.6 	25 methods to implement
+  TranslatorIndonesian            1.4.6 	24 methods to implement
+  TranslatorHungarian             1.4.6 	25 methods to implement
+  TranslatorArabic                1.4.6 	24 methods to implement
+  TranslatorAfrikaans             1.4.6 	25 methods to implement
+  TranslatorUkrainian             1.4.1 	25 methods to implement
+  TranslatorSerbian               1.4.1 	25 methods to implement
+  TranslatorRomanian              1.4.1 	25 methods to implement
+  TranslatorPortuguese            1.3.3 	36 methods to implement
+  TranslatorSlovak                1.2.18	45 methods to implement
 
 ----------------------------------------------------------------------
 The following translator classes derive directly from the
@@ -76,7 +78,7 @@
 
 
 
-TranslatorAfrikaans   (TranslatorAdapter_1_4_6)  24 methods to implement
+TranslatorAfrikaans   (TranslatorAdapter_1_4_6)  25 methods to implement
 -------------------
 
   Implements 192 of the required methods.
@@ -106,10 +108,11 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorArabic   (TranslatorAdapter_1_4_6)  23 methods to implement
+TranslatorArabic   (TranslatorAdapter_1_4_6)  24 methods to implement
 ----------------
 
   Implements 193 of the required methods.
@@ -138,6 +141,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -153,7 +157,17 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorCatalan   (TranslatorAdapter_1_5_4)  22 methods to implement
+TranslatorBrazilian   (TranslatorAdapter_1_5_6)  1 method to implement
+-------------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorCatalan   (TranslatorAdapter_1_5_4)  23 methods to implement
 -----------------
 
   Implements 194 of the required methods.
@@ -181,10 +195,51 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorDanish   (TranslatorAdapter_1_5_4)  22 methods to implement
+TranslatorChinese   (TranslatorAdapter_1_5_6)  1 method to implement
+-----------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorChinesetraditional   (TranslatorAdapter_1_5_6)  1 method to implement
+----------------------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorCroatian   (TranslatorAdapter_1_5_6)  1 method to implement
+------------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorCzech   (TranslatorAdapter_1_5_6)  1 method to implement
+---------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorDanish   (TranslatorAdapter_1_5_4)  23 methods to implement
 ----------------
 
   Implements 194 of the required methods.
@@ -212,10 +267,21 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorFrench   (TranslatorAdapter_1_5_4)  22 methods to implement
+TranslatorDutch   (TranslatorAdapter_1_5_6)  1 method to implement
+---------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorFrench   (TranslatorAdapter_1_5_4)  23 methods to implement
 ----------------
 
   Implements 194 of the required methods.
@@ -243,10 +309,21 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorGreek   (TranslatorAdapter_1_5_4)  22 methods to implement
+TranslatorGerman   (TranslatorAdapter_1_5_6)  1 method to implement
+----------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorGreek   (TranslatorAdapter_1_5_4)  23 methods to implement
 ---------------
 
   Implements 194 of the required methods.
@@ -274,6 +351,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -289,7 +367,7 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorHungarian   (TranslatorAdapter_1_4_6)  24 methods to implement
+TranslatorHungarian   (TranslatorAdapter_1_4_6)  25 methods to implement
 -------------------
 
   Implements 192 of the required methods.
@@ -319,10 +397,11 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorIndonesian   (TranslatorAdapter_1_4_6)  23 methods to implement
+TranslatorIndonesian   (TranslatorAdapter_1_4_6)  24 methods to implement
 --------------------
 
   Implements 193 of the required methods.
@@ -351,6 +430,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -366,7 +446,17 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorJapanese   (TranslatorAdapter_1_5_4)  22 methods to implement
+TranslatorItalian   (TranslatorAdapter_1_5_6)  1 method to implement
+-----------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorJapanese   (TranslatorAdapter_1_5_4)  23 methods to implement
 ------------------
 
   Implements 194 of the required methods.
@@ -394,6 +484,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -409,7 +500,7 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorJapaneseEn   (TranslatorEnglish)  211 methods to implement
+TranslatorJapaneseEn   (TranslatorEnglish)  212 methods to implement
 --------------------
 
   Implements 5 of the required methods.
@@ -423,7 +514,17 @@
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorKoreanEn   (TranslatorEnglish)  211 methods to implement
+TranslatorKorean   (TranslatorAdapter_1_5_6)  1 method to implement
+----------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorKoreanEn   (TranslatorEnglish)  212 methods to implement
 ------------------
 
   Implements 5 of the required methods.
@@ -437,7 +538,7 @@
     virtual QCString latexLanguageSupportCommand()
 
 
-TranslatorLithuanian   (TranslatorAdapter_1_4_6)  24 methods to implement
+TranslatorLithuanian   (TranslatorAdapter_1_4_6)  25 methods to implement
 --------------------
 
   Implements 192 of the required methods.
@@ -467,10 +568,11 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorMacedonian   (TranslatorAdapter_1_4_6)  22 methods to implement
+TranslatorMacedonian   (TranslatorAdapter_1_4_6)  23 methods to implement
 --------------------
 
   Implements 194 of the required methods.
@@ -498,10 +600,11 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorNorwegian   (TranslatorAdapter_1_4_6)  23 methods to implement
+TranslatorNorwegian   (TranslatorAdapter_1_4_6)  24 methods to implement
 -------------------
 
   Implements 193 of the required methods.
@@ -530,6 +633,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -545,7 +649,17 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorPolish   (TranslatorAdapter_1_4_6)  23 methods to implement
+TranslatorPersian   (TranslatorAdapter_1_5_6)  1 method to implement
+-----------------
+
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorPolish   (TranslatorAdapter_1_4_6)  24 methods to implement
 ----------------
 
   Implements 193 of the required methods.
@@ -574,6 +688,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -589,7 +704,7 @@
     QCString trNoDescriptionAvailable()
 
 
-TranslatorPortuguese   (TranslatorAdapter_1_3_3)  35 methods to implement
+TranslatorPortuguese   (TranslatorAdapter_1_3_3)  36 methods to implement
 --------------------
 
   Implements 181 of the required methods.
@@ -626,6 +741,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSourceFile(QCString & filename)
     virtual QCString trDirReference(const char * dirName)
     virtual QCString trDir(bool first_capital, bool singular)
@@ -645,7 +761,7 @@
     QCString trNoDescriptionAvailable()
 
 
-TranslatorRomanian   (TranslatorAdapter_1_4_1)  24 methods to implement
+TranslatorRomanian   (TranslatorAdapter_1_4_1)  25 methods to implement
 ------------------
 
   Implements 192 of the required methods.
@@ -675,6 +791,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -690,9 +807,19 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorSerbian   (TranslatorAdapter_1_4_1)  24 methods to implement
+TranslatorRussian   (TranslatorAdapter_1_5_6)  1 method to implement
 -----------------
 
+  Implements 216 of the required methods.
+
+  Missing methods (should be implemented):
+
+    virtual QCString trProgression()
+
+
+TranslatorSerbian   (TranslatorAdapter_1_4_1)  25 methods to implement
+-----------------
+
   Implements 192 of the required methods.
 
   Missing methods (should be implemented):
@@ -720,6 +847,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
@@ -735,7 +863,7 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorSlovak   (TranslatorAdapter_1_2_18)  44 methods to implement
+TranslatorSlovak   (TranslatorAdapter_1_2_18)  45 methods to implement
 ----------------
 
   Implements 172 of the required methods.
@@ -780,6 +908,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSourceFile(QCString & filename)
     virtual QCString trDirReference(const char * dirName)
     virtual QCString trDir(bool first_capital, bool singular)
@@ -800,7 +929,7 @@
     virtual QCString trNoDescriptionAvailable()
 
 
-TranslatorSlovene   (TranslatorAdapter_1_4_6)  24 methods to implement
+TranslatorSlovene   (TranslatorAdapter_1_4_6)  25 methods to implement
 -----------------
 
   Implements 192 of the required methods.
@@ -830,16 +959,21 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorSpanish   (TranslatorAdapter_1_5_4)
+TranslatorSpanish   (TranslatorAdapter_1_5_4)  1 method to implement
 -----------------
 
   Implements 216 of the required methods.
 
+  Missing methods (should be implemented):
 
-TranslatorSwedish   (TranslatorAdapter_1_4_6)  24 methods to implement
+    virtual QCString trProgression()
+
+
+TranslatorSwedish   (TranslatorAdapter_1_4_6)  25 methods to implement
 -----------------
 
   Implements 192 of the required methods.
@@ -869,10 +1003,11 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
 
-TranslatorUkrainian   (TranslatorAdapter_1_4_1)  24 methods to implement
+TranslatorUkrainian   (TranslatorAdapter_1_4_1)  25 methods to implement
 -------------------
 
   Implements 192 of the required methods.
@@ -902,6 +1037,7 @@
     virtual QCString trType(bool first_capital, bool singular)
     virtual QCString trModule(bool first_capital, bool singular)
     virtual QCString trCompoundMembersFortran()
+    virtual QCString trProgression()
     virtual QCString trSubprogramDocumentation()
 
   Obsolete methods (should be removed, never used):
Index: doc/commands.doc
===================================================================
--- doc/commands.doc	(revision 637)
+++ doc/commands.doc	(working copy)
@@ -130,6 +130,8 @@
 \refitem cmd_php_only \\protected (PHP only)
 \refitem cmd_php_only \\protectedsection (PHP only)
 \refitem cmdprotocol \\protocol
+\refitem cmdprogression \\progression
+\refitem cmdprogression \\ps
 \refitem cmd_php_only \\public (PHP only)
 \refitem cmd_php_only \\publicsection (PHP only)
 \refitem cmdref \\ref
@@ -645,6 +647,25 @@
   \sa section \ref cmdclass "\\class".
 
 <hr>
+\section cmdprogression \\progression {text}
+
+  \addindex \\progression
+  Starts or adds to a paragraph describing the progression of events
+  within a function, class or otherwise. All instances of this command
+  encountered within a documentation block will be merged into
+  a single paragraph in the resulting documentation. 
+  
+  The paragraph will be indented and each progression command
+  encountered will be placed on a new line. The text of the paragraph 
+  has no special internal structure. All visual enhancement commands 
+  may be used inside the paragraph.
+  The \c \\progression command ends when a blank line or some other 
+  sectioning command is encountered. See section \ref cmdpar "\\par" 
+  for an example.
+
+  \sa section \ref cmdpar "\\par".
+
+<hr>
 \section cmdrelates \\relates <name>
 
   \addindex \\relates
Index: doc/config.doc
===================================================================
--- doc/config.doc	(revision 637)
+++ doc/config.doc	(working copy)
@@ -111,6 +111,7 @@
 \refitem cfg_extract_static EXTRACT_STATIC
 \refitem cfg_file_patterns FILE_PATTERNS
 \refitem cfg_file_version_filter FILE_VERSION_FILTER
+\refitem cfg_grouped_sections GROUPED_SECTIONS
 \refitem cfg_filter_patterns FILTER_PATTERNS
 \refitem cfg_filter_source_files FILTER_SOURCE_FILES
 \refitem cfg_formula_fontsize FORMULA_FONTSIZE
@@ -928,6 +929,44 @@
 FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
 \endverbatim
 
+\anchor cfg_grouped_sections
+<dt>\c GROUPED_SECTIONS <dd>
+ \addindex GROUPED_SECTIONS
+ The \c GROUPED_SECTIONS option can be used to modify the way certain
+ elements in the documentation should be organized. In a default configuration
+ each of the section commands (including \c return, \c author, \c authors,
+ \c version, \c since \c date, \c note, \c warning, \c pre, \c post,
+ \c invariant, \c remark, \c attention, and \c par) is placed into
+ the output file linearly in the order they are encountered. Adding
+ certain values to the \c GROUPED_SECTIONS option will cause all instances
+ of these grouped sections to be combined regardless of their location
+ in the documentation. In this case each section will be placed in the
+ resulting output in the same location that it was first encountered. All
+ commands after the first are treated as an (addendum) to the already
+ defined sections.
+
+For all but the \c par command the command name is exactly what needs to be
+specified in the configuration file. Some examples:
+\verbatim
+GROUPED_SECTIONS += return
+GROUPED_SECTIONS += note
+GROUPED_SECTIONS += attention remark
+\endverbatim
+
+The par command is treated differently, and makes it possible to create
+sections with custom headings. (See the Special Commands section of this
+manual for more information). To associate a \c par command as being
+grouped the entire paragraph heading must be specified. Some examples
+\verbatim
+GROUPED_SECTIONS += par:MyHeading
+GROUPED_SECTIONS += "par:My Heading That Has Spaces"
+\endverbatim
+
+The same rules that apply to other doxygen configuration lists apply, and
+therefore quotation characters are needed in the case that spaces
+must be used. And one or more than one commands may be specified
+in the same line.
+
 \anchor cfg_recursive
 <dt>\c RECURSIVE <dd>
  \addindex RECURSIVE
Index: examples/progress.cfg
===================================================================
--- examples/progress.cfg	(revision 0)
+++ examples/progress.cfg	(revision 0)
@@ -0,0 +1,11 @@
+PROJECT_NAME     = "Progress Command"
+OUTPUT_DIRECTORY = progress
+GENERATE_LATEX   = NO
+GENERATE_MAN     = NO
+GENERATE_RTF     = NO
+GENERATE_XML = NO
+CASE_SENSE_NAMES = NO
+INPUT            = progress.cpp
+QUIET            = YES
+JAVADOC_AUTOBRIEF = YES
+EXTRACT_ALL = YES
Index: examples/progress.cpp
===================================================================
--- examples/progress.cpp	(revision 0)
+++ examples/progress.cpp	(revision 0)
@@ -0,0 +1,37 @@
+class Progression_Example
+{
+  public:
+    /**
+     * \brief Compute The Fibonacci Number
+     *
+     * Generates A Fibonacci Number
+     *
+     * \param pNum the fibonacci number to calculate.
+     * \return a fibonacci number
+     */
+    int fibonacci(int pNum) {
+
+      //! \ps Base case return either zero or one
+      if( pNum <= 1 ) return pNum;
+
+      //! \todo Take advantage of memoization
+      
+      //! \ps Recursive case return the result of the two
+      //!     lower fibonacci numbers
+      return fibonacci(pNum-1) + fibonacci(pNum-2);
+    };
+
+    /**
+     * \brief Displays a hello world message
+     * 
+     */
+    void helloWorld() {
+      //! \ps Print hello world
+      cout << "Hello World!" << endl;
+
+      //! \todo collect input here
+      
+      //! \ps Generate the fibonacci number for five
+      cout << fibonacci(5) << endl;
+    }
+};
